找回密码
 立即注册
查看: 308|回复: 12

请教在AI8051U擎天柱板子上好用的程序下载到8H8K64U中不好用了,请高手指点【已解决】

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-2-21 21:01:00 | 显示全部楼层 |阅读模式
一段I/O口模拟SPI驱动墨水屏的程序下载到AI8051U以8bit模式运行时刷屏没问题,程序中换了8H.h并且主函数中注释掉WTST=0;CKCON=0;这两句后下载到8H8K64U中刷屏失败(实验板为开天斧三),给所有涉及控制的I/O口都配置内部上拉电阻也没效果(擎天柱板子I/O有外部上拉电阻),最近这两款芯片我都在用,在8bit工作模式下感觉两者的代码一直是可以通用的,这次有些蒙,弄了两天了也没弄出头绪。用简易的逻辑分析仪检测SPI数据完全正常,请各位高手指点下是哪里不对劲了。
下面是主函数代码:(keil uv3编译)
  1. #include "STC8H.h"
  2. #include "SSD1680EPD.h"
  3. #include "delay.h"
  4. #include "Ap_29demo.h"
  5. //---------------------------------------------------
  6. void main()
  7. {
  8.   EAXSFR();//允许访问扩展RAM区特殊功能寄存器( XFR)
  9.   //WTST  = 0;
  10.   //CKCON = 0;
  11.   GPIO_set();//预置所有I/O口全部为准双向口
  12.   P1M0 = 0x28;//P1.3、P1.5推挽输出(SPI通道1)
  13.   P1M1 = 0x00;
  14.   P1PU |= 0x28;//P1.3、P1.5配置上拉电阻
  15.   P3M0 = 0x2c;//P3.2、P3.3、P3.5推挽输出,P3.4高阻输入
  16.   P3M1 = 0x10;
  17.   P3PU = 0x3c;
  18.   delay_500ms();
  19.   EPD_HW_Init(Hor);
  20.   EPD_WhiteScreen_White();
  21.   EPD_sleep();
  22.   delay_500ms();
  23.   P20 = 1;
  24.   while(1)
  25.   {
  26.     P20 = ~P20;
  27.     delay_500ms();
  28.   }
  29. }
复制代码
以下为SPI代码:
  1. //----I/O模拟SPI总线发送字节数据函数--------------------
  2. void SPI_WriteByte(u8 value)
  3. {
  4.   u8 i, dat;
  5.   dat = value;
  6.   SPI_CLK = 0;
  7.   for(i = 0; i < 8; i++)
  8.   {
  9.     if(dat & 0x80)
  10.     {
  11.       SPI_SDA = 1;
  12.     }
  13.     else
  14.     {
  15.       SPI_SDA = 0;
  16.     }
  17.     SPI_CLK = 1;
  18.     NOP7();
  19.     dat = dat << 1;
  20.     SPI_CLK = 0;
  21.   }
  22. }
  23. //----写指令-------------------------------------------
  24. void Write_command(u8 command)
  25. {
  26.   CS = 0;
  27.   NOP10();
  28.   DC = 0;
  29.   SPI_WriteByte(command);
  30.   NOP5();
  31.   CS = 1;
  32.   NOP30();
  33. }
  34. //----写数据-------------------------------------------
  35. void Write_data(u8 dat)
  36. {
  37.   CS = 0;
  38.   NOP10();
  39.   DC = 1;
  40.   SPI_WriteByte(dat);
  41.   NOP5();
  42.   CS = 1;
  43.   NOP30();
  44. }
复制代码
端口定义如下:
  1. //----EPD端口设置---------------------------------------------------
  2. sbit CS = P3 ^ 2;
  3. sbit DC = P3 ^ 3;
  4. sbit BY = P3 ^ 4;
  5. sbit RST = P3 ^ 5;
  6. sbit SPI_SDA = P1 ^ 3;
  7. sbit SPI_CLK = P1 ^ 5;
复制代码

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2025-2-22 00:14:36 | 显示全部楼层
1、设置推挽输出的管脚,关闭内部上拉;
2、初始化时,RES和D0两个管脚,先置低再置高。
然后再试下呢?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-2-22 10:29:36 | 显示全部楼层
Yim_*** 发表于 2025-2-22 00:14
1、设置推挽输出的管脚,关闭内部上拉;
2、初始化时,RES和D0两个管脚,先置低再置高。
然后再试下呢?

多谢,首先关于我的内部上拉是在测试失败后添加的,关闭了也应该还是有问题,其次关于屏幕复位在屏幕初始化中是有操作的:
  1.   RST = 0;
  2.   delay_ms(100);
  3.   RST = 1;
  4.   delay_ms(100);
  5.   read_BUSY();
  6.   Write_command(0x12); // soft reset
  7.   read_BUSY();
  8.   Write_command(0x01); //Driver output control
  9.   Write_data((EPD_WIDTH - 1) % 256);
  10.   Write_data((EPD_WIDTH - 1) / 256);
  11.   Write_data(0x00);
  12.   Write_command(0x11); //data entry mode
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2025-2-22 15:34:56 | 显示全部楼层
软件spi和iic驱动oled屏最近都用,不论8h、还是8051u-32bit我都在正常用,而且也做到了8051u-32bit的spi和iic的同时显示不同内容,我看你的代码了,我之前也遇到了跟你一样的问题,但rst和d0在gpio初始化时经过我这样的配置,就没问题了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-2-22 22:04:49 | 显示全部楼层
Yim_*** 发表于 2025-2-22 15:34
软件spi和iic驱动oled屏最近都用,不论8h、还是8051u-32bit我都在正常用,而且也做到了8051u-32bit的spi和i ...

按照你说的方法我在主函数中加入了SPI_SDA=0;RST=0;但仍然没能解决问题,其实这两年我用20引脚的STC8H8K64U也驱动了几块4.2寸的墨水屏了也是第一次遇到这种情况。
这次的经历先是在STC8H8K64U中调试这个2.13寸墨水屏的驱动程序、弄了好久没能正常刷屏显示,后来把代码换了头文件下载到AI8051U中竟然显示正常毫无问题,程序运行非常稳定,既然程序没问题为什么下载到STC8H8K64U中就不正常工作,百思不得其解。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2025-2-22 22:09:45 | 显示全部楼层
咱俩可能说的不是一回事,你试下我这样。
/*将D0、D1、RES、DC和CS引脚初始化为推挽输出模式*/
                P2_MODE_OUT_PP(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
               
                /*置引脚默认电平*/
                OLED_W_RES(0);
                OLED_W_D0(0);
                OLED_W_D1(1);
                OLED_W_RES(1);
                OLED_W_DC(1);
                OLED_W_CS(1);
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2025-2-22 22:11:13 | 显示全部楼层
目前,我在8h、8051u-8、8051u-32模式,同一套改吧改吧都能正常用。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-2-23 10:59:07 | 显示全部楼层
Yim_*** 发表于 2025-2-22 22:09
咱俩可能说的不是一回事,你试下我这样。
/*将D0、D1、RES、DC和CS引脚初始化为推挽输出模式*/
                P2_MODE_O ...

不知道你的屏幕接口定义中的D0、D1的含义,我一直以为你说的D0是单片机侧的DO(MOSI)引脚、我的定义为SPI_SDA。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2025-2-23 11:06:08 | 显示全部楼层
Yim_*** 发表于 2025-2-22 22:11
目前,我在8h、8051u-8、8051u-32模式,同一套改吧改吧都能正常用。

确实如此,我一直喜欢玩屏最近痴迷玩电子价签的墨水屏,因为我编程很菜所以我都是找例程来修改应用,很多时候都是移植arduino-ESP8266或SMT32F1**的例程到STC单片机中来用也玩的挺顺手的,这次在这个很小的墨水屏上翻车了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-2-23 11:35:48 | 显示全部楼层
看到代码里用NOP控制时序,有逻辑分析仪的话抓下波形吧,可能两个芯片快慢不一样NOP导致的时序不一样?之前移植51程序遇到过类似现象
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:08 , Processed in 0.124260 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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