找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2311|回复: 14
收起左侧

STC15W408AS程序移植到STC8G1K17单片机上出错

  [复制链接]
ID:965189 发表于 2021-10-15 22:59 | 显示全部楼层 |阅读模式
同样的程序,用STC15W408AS驱动12864液晶屏运行正常。移植到STC8G1K17上,12864液晶屏就没有字符显示。望有经验的朋友指教。谢谢!
回复

使用道具 举报

ID:213173 发表于 2021-10-16 05:44 | 显示全部楼层
STC8G的速度要比STC15W快,这就可能影响驱动12864液晶屏的时序,再者STC8G除P3.0、P3.1外初始端口模式准双向,其它端口都是高阻,需要根据需要设置。
回复

使用道具 举报

ID:554500 发表于 2021-10-16 09:17 | 显示全部楼层
IO口工作模式设置了没,STC8 上电默认IO为高阻模式。这点很关键
回复

使用道具 举报

ID:155507 发表于 2021-10-16 09:27 | 显示全部楼层
STC15 是8051指令集 STC-Y5,  STC8 是8051指令集 STC-Y6

相同的程序在不同时钟周期的单片机下延时是不同的,所以当我们在不同时钟周期的单片机中移植程序的时候要注意软件延时需要修改成适当的程序,否则会造成不必要的错误。
回复

使用道具 举报

ID:965189 发表于 2021-10-16 11:50 | 显示全部楼层
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P3M0 = 0xB2;
sfr P3M1 = 0xB1;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr  AUXR = 0x8e;       //辅助寄存器
sfr P5=0xC8;


sbit CS=P3^5;                           //液晶屏          
sbit SID=P3^6;                           //液晶屏          
sbit CLK=P3^7;                           //液晶屏          

////====延时函数=============================
  void delay(uint ms)         //12864液晶屏使用
    {
      uchar t;                                                                                                                                       
      while(ms--)
       {
         for(t=0;t<110;t++);
       }
    }

void main()
{
       P1M0 = 0x00;
       P1M1 = 0x0F;                //P1.0高阻输入。作为ADC口,0x40;
       P3M0 = 0x00;                //
       P3M1 = 0x00;                //P3,准双向口
       P5M0 = 0x00;
       P5M1 = 0x00;
           TN_itin();                //所有中断、定时器初始化
           lcdinit();                //液晶屏初始化
           key=0;
           TB=0;
       while (1);
           {
                     lcd_pos(1,0);                    //第一行,第1位        
              hzkdis(dis1);                    //1输入
              write_data(0x3A);

          
           }
}
回复

使用道具 举报

ID:965189 发表于 2021-10-16 11:52 | 显示全部楼层
定时器,外中断,都可以正常运行了,就是12864液晶屏未能显示。
回复

使用道具 举报

ID:965189 发表于 2021-10-16 12:30 | 显示全部楼层
lcd_pos(1,0);                    //第一行,第1位   
如果正常的话,在第二行第一位显示:“输入:”
回复

使用道具 举报

ID:965325 发表于 2021-10-16 13:07 | 显示全部楼层
我最近刚把STC15W408AS上的程序移植到STC8A8K上了,主要是液晶屏驱动需要在最底层读写函数部分加额外延时。

楼主可以先试验一下,STC8G1K工作频率降低到5M左右,如果能正常运行,那么基本上就是液晶屏驱动速度过快和延时函数不正确的的问题了。
回复

使用道具 举报

ID:123289 发表于 2021-10-16 14:37 | 显示全部楼层
程序不是自己写的!
回复

使用道具 举报

ID:213173 发表于 2021-10-16 14:58 | 显示全部楼层
君工创 发表于 2021-10-16 11:52
定时器,外中断,都可以正常运行了,就是12864液晶屏未能显示。

“void delay(uint ms)//12864液晶屏使用”函数明显不对
回复

使用道具 举报

ID:965325 发表于 2021-10-16 15:47 | 显示全部楼层
楼主,我给你贴个我的实际修改例子,修改前STC15W工作在12M,驱动IIC口的OLED完全正常,换成STC8A8K,工作频率降低到6M,OLED显示才正常,下面的所有延时命令“_nop_();”都是修改后增加的 在STC15W下是不需要的,修改后OLED可以在STC8@12M下正常运行了,但是24M下还是不行,还需要继续增加延时。
基本上修改这几个最底层读写和控制总线的函数就行了,另外我用的OLED,init的第一条命令需要延时150ms左右,否则可能不正常,你的液晶初始化前是否需要延时,延时多少,自己参考液晶的资料文档吧。



所有_nop_();都是修改后增加的。在STC15下不需要。
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
    SCL = high;
          _nop_();
    SDA = high;
          _nop_();
    SDA = low;
          _nop_();
    SCL = low;
          _nop_();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
    SCL = low;
          _nop_();
    SDA = low;
          _nop_();
    SCL = high;
          _nop_();
    SDA = high;
          _nop_();
}

/**********************************************
// 通过I2C总线写一个字节
**********************************************/
void Write_IIC_Byte(uchar IIC_Byte)
{
    uchar i;
    for(i=0; i<8; i++)
    {
        if(IIC_Byte&0x80)
                                {SDA=high;
                                    _nop_();}
        else
            SDA=low;
            _nop_();
                                    SCL=high;
                                    _nop_();
            SCL=low;
                                    _nop_();
            IIC_Byte<<=1;
    }
    SDA=1;
                _nop_();
    SCL=1;
                _nop_();
    SCL=0;
                _nop_();
}

/*********************OLED写数据************************************/
void OLED_WrDat(uchar IIC_Data)
{
    IIC_Start();
    Write_IIC_Byte(0x78);
          Write_IIC_Byte(0x40);                        //写数据
    Write_IIC_Byte(IIC_Data);
          IIC_Stop();
}
/*********************OLED写命令************************************/
void OLED_WrCmd(uchar IIC_Command)
{
    IIC_Start();
    Write_IIC_Byte(0x78);
          Write_IIC_Byte(0x00);                         //写指令
          Write_IIC_Byte(IIC_Command);
          IIC_Stop();
}


评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:382454 发表于 2021-10-16 16:26 | 显示全部楼层
这样移植,一大半都要写过的。
回复

使用道具 举报

ID:965189 发表于 2021-10-16 17:34 来自手机 | 显示全部楼层
岳耳 发表于 2021-10-16 15:47
楼主,我给你贴个我的实际修改例子,修改前STC15W工作在12M,驱动IIC口的OLED完全正常,换成STC8A8K,工作 ...

好的,今晚试下。谢谢你!
回复

使用道具 举报

ID:748788 发表于 2021-10-16 18:02 | 显示全部楼层
回复

使用道具 举报

ID:57657 发表于 2021-10-16 19:14 | 显示全部楼层
君工创 发表于 2021-10-16 11:50
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P3M0 = 0xB2;

像你这样 sfr 定义的寄存器地址,不同型号都有可能不一样。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表