数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 221|回复: 17

[C51] stc8h8k64u利用硬件SPI模式驱动ST7567液晶12864屏幕

[复制链接]
发表于 19 小时前 | 显示全部楼层 |阅读模式
本帖最后由 nokia5320 于 2025-7-26 01:09 编辑

2023年在数码之家论坛申请了 开天斧三的开发板,试了一次就吃灰了。前几天打算做个小东西,利用红包买了几个STC8H8K64U的单片机,之前大学就玩过STC89系列的,看了下stc8系列的使用前要初始化引脚,因为没系统学过,在这里载了大跟头。买了本丁向荣老师的“单片微机原理与接口技术-基于stc8h8k64u”,感觉比文档分了条理。拿出来在数码之家那里收集的屏幕,就是建设 银行优盾拆的屏幕 ST7567,128x64像素,带背光很适合再次利用。

cog是st7567已经明确了,驱动就好办了。但是之前一直是89系列模拟SPI时序驱动,这次想玩玩硬件驱动的,可惜《单片微机原理与接口技术-基于stc8h8k64u》里的范例给的是SPI管理25系列ROM,可以参考但有限,网上搜也没找到这个型号的,那就自己折腾。


  • // 单片机和液晶引脚连接
  • LCD_CS  = P2^0;   // 片选 (CS)
  • LCD_RST = P2^1;   // 复位 (RST)
  • LCD_DC  = P1^0;   // 数据/命令选择 (A0/DC)
  • LCD_SCL=P2^5  LCD_SDA=P2^3


注意st6567电压1.8--3.3v,开天斧三5v输入 5 or 3.3v作为系统电压,按道理可以直接改3.3v,但是后续实验万一需要两路电压呢,所以直接在1117 3.3v的输出电容上焊接了3.3v插针,作为lcd的供电。这个板子为啥没提前预留。

st7567.c文件:
  1. #include "STC8H.H"
  2. #include "font16.h"
  3. // 引脚定义
  4. sbit LCD_CS  = P2^0;   // 片选 (CS)
  5. sbit LCD_RST = P2^1;   // 复位 (RST)
  6. sbit LCD_DC  = P1^0;   // 数据/命令选择 (DC)
  7. // LCD_SCL=P2^5  LCD_SDA=P2^3
  8. extern void delay_ms(unsigned int ms);
  9. extern void delay_us(unsigned int ms);
  10. /******************** SPI初始化函数(优化CS控制) ********************/
  11. void SPI_Init() {
  12.     // 1. 开启扩展寄存器访问
  13.     P_SW2 = 0x80;       // EAXFR=1   
  14.     // 2. 配置SPI引脚组选择
  15.     P_SW1 = 0x04;       // SPI_S[1:0]=01,选择第二组(P2.2/3/4/5)   
  16.     // 3. 配置SPI控制寄存器
  17.     SPCTL = 0xDC;       // 11011100:
  18.                         // SPEN=1, SSIG=1, CPHA=0, CPOL=1, MSTR=1
  19.                         // DORD=0, SPR1=1, SPR0=0 -> F_OSC/16 (24MHz/16=1.5MHz)
  20.     // 4. 配置引脚模式
  21.     P2M0 = 0x2B;        // 00101011: P2.0(CS), P2.1(RST), P2.3(MOSI), P2.5(SCLK)推挽输出
  22.     P2M1 = 0x00;        // 所有P2引脚设置为模式0(推挽输出)   
  23.     P1M0 = 0x01;        // P1.0(DC)推挽输出
  24.     P1M1 = 0x00;        // 所有P1引脚设置为模式0(推挽输出)   
  25.     // 5. 初始状态设置
  26.     LCD_CS = 1;         // 初始片选无效
  27.     LCD_DC = 0;         // 命令模式
  28.     LCD_RST = 1;        // 不复位   
  29.     SPDAT = 0;          // 清空数据寄存器
  30.     SPSTAT = 0xC0;      // 清除状态标志   
  31.     // 6. 关闭扩展寄存器访问
  32.     P_SW2 = 0x00;       // EAXFR=0
  33. }

  34. /******************** SPI发送函数 ********************/
  35. void SPI_SendByte(unsigned char dat) {
  36.     SPDAT = dat;                // 写入数据
  37.     while (!(SPSTAT & 0x80));   // 等待传输完成
  38.     SPSTAT = 0xC0;              // 清除标志位
  39. }

  40. /******************** LCD写命令函数(简化CS) ********************/
  41. void LCD_Write_Command(unsigned char cmd) {
  42.     LCD_DC = 0;           // 命令模式
  43.     SPI_SendByte(cmd);    // 发送命令
  44.     delay_us(1);          // 短延时确保稳定
  45. }

  46. /******************** LCD写数据函数(简化CS) ********************/
  47. void LCD_Write_Data(unsigned char dat) {
  48.     LCD_DC = 1;           // 数据模式
  49.     SPI_SendByte(dat);    // 发送数据
  50.     delay_us(1);
  51. }

  52. /******************** lcd显示清屏 ********************/
  53. void LCD_Claer() {
  54.    unsigned char x,y;
  55.          for(y=0;y<8;y++)
  56.                         {
  57.                                  LCD_Write_Command(0xb0+y);//页地址
  58.                                  LCD_Write_Command(0x00);//低地址
  59.                                  LCD_Write_Command(0x10);//高地址
  60.                                 for(x=0;x<128;x++)
  61.                                         LCD_Write_Data(0x00);
  62.                         }
  63.         }


  64. /******************** LCD初始化函数(优化CS控制) ********************/
  65. void LCD_Init() {
  66.     // 硬件复位
  67.     LCD_RST = 0;
  68.     delay_us(15);
  69.     LCD_RST = 1;
  70.    delay_us(15);
  71.     // 开始通信:永久拉低CS
  72.     LCD_CS = 0;   
  73.     // 初始化序列
  74.     LCD_Write_Command(0xE2);  // 软复位
  75.     delay_us(100);   
  76.     LCD_Write_Command(0xA2);  // 1/9 bias
  77.     LCD_Write_Command(0xA0);  // ADC正常方向
  78.     LCD_Write_Command(0xC8);  // COM输出反向   
  79.     LCD_Write_Command(0xA4);  // 正常显示(非全亮)
  80.     LCD_Write_Command(0xA6);  // 正常显示(非反白)
  81.     LCD_Write_Command(0x24);  // V0电阻设置   
  82.     // 对比度设置
  83.     LCD_Write_Command(0x81);
  84.     LCD_Write_Command(0x28);  // 对比度值   
  85.     // 升压电路设置
  86.     LCD_Write_Command(0xF8);
  87.     LCD_Write_Command(0x00);  // 升压比2x   
  88.     // 分步开启电源
  89.     LCD_Write_Command(0x2C);  // Booster on
  90.     delay_us(22);
  91.     LCD_Write_Command(0x2E);  // Regulator on
  92.     delay_us(22);
  93.     LCD_Write_Command(0x2F);  // Follower on
  94.    delay_us(8);
  95.      LCD_Claer() ;
  96.     LCD_Write_Command(0x40);  // 显示起始行0
  97.     LCD_Write_Command(0xAF);  // 开启显示
  98. }
  99. /******************** 设置显示位置 ********************/
  100. void LCD_SetPosition(unsigned char x, unsigned char y) {
  101.     LCD_Write_Command(0xB0 | y);      // 设置页地址
  102.     LCD_Write_Command(0x10 | (x >> 4)); // 设置列地址高4位
  103.     LCD_Write_Command(x & 0x0F);      // 设置列地址低4位
  104. }
  105. /******************** 显示字符调用font文件的函数 ********************/
  106. //x横坐标,y页地址=纵坐标除以8,注意每个字符高度占用16bit=2page,最多完整显示4page,y不是座标!
  107. //如果用font文件,那么只能完美显示4行y=0-1,2-3,4-5,6-7page.bit 这个参数是反显一个像素,没有用st7567的命令而是用像素取反运算
  108. void Display_Char(unsigned char x, unsigned char y, unsigned char ch_index,bit b) {
  109.     unsigned char i;
  110.     LCD_SetPosition(x, y);
  111.     ch_index= ch_index-32;
  112.          for(i=0;i<8;i++)
  113.                         {
  114.                                 if(b)
  115.                                         LCD_Write_Data(~F8X16[ch_index*16+i]);
  116.   else
  117.                                         LCD_Write_Data(F8X16[ch_index*16+i]);
  118.                         }//P8x16上半部分显示
  119.   LCD_SetPosition(x,y+1);
  120.         for(i=0;i<8;i++)
  121.                         {
  122.                                 if(b)
  123.                                         LCD_Write_Data(~F8X16[ch_index*16+i+8]);
  124.         else
  125.                                         LCD_Write_Data(F8X16[ch_index*16+i+8]);
  126. }//P8x16下半部分显示
  127. }

  128. /******************** 显示字符串调用font文件的函数 ********************/
  129. /*函数名称:Display_Chars
  130. 功能:Lcd显示字符串
  131. 输入:x坐标,y坐标其实是8y行,因为每Page占用8行,字符串,b反显
  132. 输出:无
  133. 备注:x<=128,y<=64
  134. *********************************/
  135. void Display_Chars(unsigned char x,y,unsigned char *ch,bit b)
  136. {
  137. while(*ch!='\0')
  138. {
  139.   if(x>120){x=0;y+=2;}//如果x在最右边,则回到左边且下移1页=8行
  140.         Display_Char(x,y,*ch++,b);
  141.   x+=8;
  142. }
  143. }
  144. /*********************************
  145. 函数名称:Display_pic
  146. 功能:Lcd显示图片
  147. 输入:x起始坐标,y起始坐标,x终止坐标,y终止坐标,图片数组
  148. 输出:无
  149. 备注:x<=128,y<=64,x1<x2,y1<y2
  150. *********************************/
  151. void Display_pic(unsigned char x0,y0,x1,y1,unsigned char *pic)
  152. {
  153.         unsigned char x,y;

  154.   if(y1%8==0) y=y1/8;      
  155.   else y=y1/8+1;
  156.         for(y=y0;y<y1;y++)
  157.         {
  158.                 LCD_SetPosition(x0,y);
  159.     for(x=x0;x<x1;x++)
  160.             {      
  161.                     LCD_Write_Data(*pic++);
  162.             }
  163.         }
  164. }
复制代码


CPHA=0, CPOL=1, 我的理解是这样的:(为了简单测试成功。我采用单片机做主机,lcd从机,忽略ss引脚,cs一直拉低)

LCD_Init里初始化st7567的参数是来自数码之家 ID:lizi 的st7565源码,修改了对比度值为0x28,
Display_Char函数是为了显示font16.h文件内字符设计的。Display_Chars顾名思义显示字符串,

main.c文件:
  1. #include "STC8H.H"
  2. #include <intrins.h>
  3. #include "ST7567.H"
  4. unsigned char code  BMP0[1024] = { /* 单色bmp文件,不要文件头信息,此图片是数码之家logo */
  5. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  6. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  7. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  8. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  9. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  10. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  11. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  12. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  13. 0X00,0X00,0X00,0X00,0XE0,0X04,0X06,0X02,0X02,0X02,0X02,0X02,0X02,0X02,0X02,0XC2,
  14. 0XFA,0XFA,0XFA,0XFE,0XFE,0XFE,0XFE,0X7E,0X7E,0X7E,0X7E,0X7E,0X7E,0XFE,0XFE,0XFE,
  15. 0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFC,0XF8,
  16. 0X00,0X00,0X00,0X00,0X00,0X00,0XA0,0XF0,0XE0,0XC0,0XF8,0XF0,0XE0,0XF0,0XB0,0X00,
  17. 0XE0,0XF8,0XF8,0XD0,0XC0,0XC0,0XC0,0X00,0X70,0XF0,0XF0,0XF0,0X70,0X70,0X70,0X70,
  18. 0XF0,0XF0,0X70,0X70,0X70,0XF0,0XF0,0XF0,0X00,0X00,0X00,0X80,0X80,0X80,0X80,0X80,
  19. 0X90,0XF0,0XF8,0XF0,0XC0,0X80,0X80,0X80,0X80,0X80,0X00,0X00,0XC0,0XE0,0XE0,0XE0,
  20. 0XE0,0XE0,0XE0,0XF0,0XF0,0XF0,0XE0,0XE0,0XE0,0XE0,0XE0,0XE0,0XE0,0X00,0X00,0X00,
  21. 0X00,0X00,0X00,0X00,0XFF,0X00,0X00,0X00,0X80,0XC0,0XC0,0XF0,0XF0,0XF8,0XFF,0X7F,
  22. 0X3F,0X1F,0X0F,0X07,0X03,0X01,0X80,0XC0,0XE0,0XF0,0XF0,0XE0,0XC0,0X80,0X01,0X03,
  23. 0X07,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  24. 0X00,0X00,0X00,0X00,0X00,0X04,0X7D,0XEF,0XF7,0XFF,0X7F,0XEF,0XE7,0XEF,0X0F,0X1F,
  25. 0X3F,0XFF,0XF0,0XE1,0XFF,0X1F,0X01,0X10,0X7C,0XFF,0XFF,0X1F,0XFC,0XFC,0XF8,0X80,
  26. 0X9F,0X9F,0X98,0X98,0X9C,0X3F,0XFF,0XF8,0XF8,0X00,0X00,0X01,0X01,0X01,0X81,0XC1,
  27. 0XC1,0XE1,0XF1,0X79,0X79,0X1F,0X0F,0X07,0X03,0X01,0X00,0X00,0X01,0X91,0XB9,0XDB,
  28. 0XDF,0XEF,0X7F,0XBF,0XFF,0XFB,0XF3,0XF3,0XFB,0XFB,0XFD,0X09,0X01,0X00,0X00,0X00,
  29. 0X00,0X00,0X00,0X00,0XFF,0XFE,0XFE,0XFF,0XFF,0XFF,0XFF,0X07,0X03,0X01,0X00,0X00,
  30. 0XE0,0XF0,0X18,0X0C,0X0F,0X0F,0X0F,0X0F,0X0F,0X0F,0X1F,0X1F,0X1F,0X1F,0X3F,0X7E,
  31. 0XFC,0XF8,0XF8,0XE0,0XC0,0X00,0X01,0X03,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  32. 0X00,0X00,0X00,0X00,0X00,0X00,0X09,0X0F,0X0F,0X0F,0X07,0X07,0X0F,0X0F,0X0C,0X1C,
  33. 0X0E,0X07,0X07,0X07,0X0F,0X0E,0X00,0X00,0X00,0X0F,0X0F,0X06,0X0F,0X0F,0X0F,0X01,
  34. 0X01,0X03,0X0D,0X0D,0X09,0X0C,0X0F,0X0F,0X03,0X00,0X0E,0X0F,0X07,0X07,0X07,0X0F,
  35. 0X0F,0X0D,0X0C,0X0C,0X0C,0X0C,0X0C,0X0C,0X0C,0X0C,0X0C,0X00,0X0C,0X0D,0X0D,0X07,
  36. 0X06,0X0F,0X1F,0X1F,0X19,0X1F,0X0F,0X07,0X00,0X03,0X07,0X07,0X06,0X00,0X00,0X00,
  37. 0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0XC0,
  38. 0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0XFE,0XFE,0XFE,0XFE,0X00,0X00,0X00,0X00,
  39. 0X00,0X87,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  40. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE0,0XE0,0XE0,0X00,0X00,0X00,0X00,0XC0,
  41. 0XE0,0XE0,0XE0,0X00,0X00,0X80,0X00,0X00,0X00,0X00,0X80,0X00,0X00,0XE0,0XE0,0XE0,
  42. 0X60,0X60,0XE0,0XE0,0XC0,0X00,0X00,0X20,0X20,0X20,0X00,0X00,0X00,0X80,0X80,0X00,
  43. 0X80,0X80,0X00,0X00,0XA0,0X20,0X00,0X00,0X80,0XC0,0XA0,0X00,0X00,0X00,0X00,0X00,
  44. 0X00,0X00,0X00,0X80,0X80,0X80,0X00,0X00,0X80,0X00,0X00,0X80,0X80,0X00,0X00,0X00,
  45. 0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X80,0XC0,0XFF,
  46. 0XFF,0XFF,0XE0,0XE0,0XE0,0XE0,0XE0,0XE0,0XE1,0XE1,0XE1,0XE1,0XE0,0XF0,0XF0,0XF8,
  47. 0XFC,0XFF,0XFF,0XFF,0XFF,0XC0,0X80,0X80,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
  48. 0X00,0X00,0X00,0X00,0X00,0X00,0X40,0X7F,0X3F,0X03,0X03,0X7F,0X78,0X3C,0X0F,0X43,
  49. 0XFF,0X7F,0X0F,0X00,0X01,0XFF,0XFC,0XF8,0X3E,0X0F,0X03,0X00,0X7C,0X7F,0X7F,0X60,
  50. 0X60,0X70,0X3C,0X1F,0X0F,0X00,0X7C,0X7F,0X1F,0X00,0X38,0X7E,0XE3,0X61,0XE3,0XFF,
  51. 0XFF,0X07,0X00,0X7E,0X3F,0X00,0X00,0X3F,0X7F,0XFF,0X41,0X01,0XE0,0X60,0X00,0X00,
  52. 0X3C,0X7F,0XE3,0XC1,0X61,0X01,0X40,0X7E,0X3F,0X0F,0X03,0X3F,0X7F,0X1F,0X00,0X00,
  53. 0X00,0X00,0X00,0X00,0X07,0X1F,0X1F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,
  54. 0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,
  55. 0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X1F,0X0F,0X07,
  56. 0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,
  57. 0X01,0X01,0X03,0X03,0X03,0X03,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,
  58. 0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X03,0X03,0X03,0X03,0X03,0X03,0X01,0X01,
  59. 0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,
  60. 0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X01,0X00,0X00,
  61. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  62. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  63. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  64. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  65. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  66. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  67. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  68. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  69. };

  70. //// 简单延时函数//@24.000MHz
  71. void delay_ms(unsigned int ms) {
  72.         unsigned char data i, j;
  73.         while(ms--){
  74.         i = 24;
  75.         j = 85;
  76.         do
  77.         {
  78.                 while (--j);
  79.         } while (--i);}
  80. }
  81. void delay_us(unsigned int us)        //@24.000MHz
  82. {
  83.         unsigned char data i;
  84.         while(us--){
  85.         _nop_();
  86.         _nop_();
  87.         i = 3;
  88.         while (--i);}
  89. }

  90. /******************** 主函数 ********************/
  91. void main() {
  92.     /* 时钟设置 */
  93. //    P_SW2 = 0x80;        // 开启扩展寄存器访问
  94. //   
  95. //    // 设置24MHz主时钟
  96. //    IRCBAND = 0x01;      // 内部24MHz时钟
  97. //   
  98. //    // 时钟分频器设置
  99. //    #if defined(CLKDIV)
  100. //        CLKDIV = 0x00;   // 不分频
  101. //    #elif defined(CKDIV)
  102. //        CKDIV = 0x00;    // 不分频
  103. //    #else
  104. //        // 直接地址访问作为备选
  105. //        unsigned char xdata *clkdiv = (unsigned char xdata *)0xFE00;
  106. //        *clkdiv = 0x00;
  107. //    #endif
  108.    
  109.     P_SW2 = 0x00;        // 关闭扩展寄存器访问
  110.    
  111.     SPI_Init();          // 初始化SPI
  112.     LCD_Init();          // 初始化LCD
  113.    
  114.     // 显示"HELLO"

  115. //     Display_Char(0,0,'H',1); Display_Char(0,2,'e',0);
  116. //                  Display_Char(0,4,'&',1); Display_Char(0,6,'@',0);
  117. //                        Display_Chars(8,3,"hello,STC8H",0);
  118.                 Display_pic(0,0,128,8,BMP0);

  119.     while(1) {
  120.         // 主循环
  121.                 Display_pic(0,0,128,8,BMP0);
  122.                 delay_ms(1000);LCD_Claer();
  123.                 Display_Chars(0,0,"hello,STC8H8K64U",0);
  124.                 Display_Chars(0,2,"   ST7567-SPI   ",1);
  125.                 Display_Chars(0,4,"www.mydigit.cn",0);
  126.                 delay_ms(1000);LCD_Claer();
  127.     }
  128. }
复制代码

字模头文件:
font16.h
  1. /*
  2. 常用字母及其符号字模,8*16像素大小。使用时每个显示的字符占用16Byte,分为上下半部分显示,
  3. 前8Byte是字符上半部分,后8Byte是下班部分。和ascii的顺序相差32,所以要显示的ascii
  4. ascii[n]= F8X16[n-32]
  5. */
  6. code unsigned char F8X16[]=
  7. {
  8. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
  9. 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
  10. 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
  11. 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
  12. 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
  13. 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
  14. 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
  15. 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
  16. 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
  17. 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
  18. 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
  19. 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
  20. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
  22. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
  23. 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
  24. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
  25. 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
  26. 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
  27. 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
  28. 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
  29. 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
  30. 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
  31. 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
  32. 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
  33. 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
  34. 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
  35. 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
  36. 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
  37. 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
  38. 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
  39. 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
  40. 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//[url=home.php?mod=space&uid=3057940]@[/url] 32
  41. 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
  42. 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
  43. 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
  44. 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
  45. 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
  46. 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
  47. 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
  48. 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
  49. 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
  50. 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
  51. 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
  52. 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
  53. 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
  54. 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
  55. 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
  56. 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
  57. 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
  58. 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
  59. 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
  60. 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
  61. 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
  62. 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
  63. 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
  64. 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
  65. 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
  66. 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
  67. 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
  68. 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
  69. 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
  70. 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
  71. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
  72. 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
  73. 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
  74. 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
  75. 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
  76. 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
  77. 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
  78. 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
  79. 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
  80. 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
  81. 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
  82. 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
  83. 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
  84. 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
  85. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
  86. 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
  87. 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
  88. 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
  89. 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
  90. 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
  91. 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
  92. 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
  93. 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
  94. 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
  95. 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
  96. 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
  97. 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
  98. 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
  99. 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
  100. 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
  101. 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
  102. 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
  103. };
  104. //unsigned char code F16x16[]={

  105. //};
复制代码
ST7567.h文件
  1. #ifndef _ST7565_H
  2. #define _ST7565_H
  3. #include <STC8h.h>

  4. extern void delay_ms(unsigned int ms);
  5. extern void delay_us(unsigned int us);
  6. void  SPI_Init();
  7. void  SPI_SendByte(unsigned char dat);
  8. void  LCD_Write_Command(unsigned char cmd);
  9. void         LCD_Write_Data(unsigned char dat);
  10. void  LCD_Claer();
  11. void  LCD_Init();
  12. void LCD_SetPosition(unsigned char x, unsigned char y);
  13. void Display_Char(unsigned char x, unsigned char y, unsigned char ch_index,bit b);
  14. void Display_Chars(unsigned char x,y,unsigned char *ch,bit b);
  15. void Display_pic(unsigned char x0,y0,x1,y1,unsigned char *pic);
  16. //void Lcd_P8x16char(unsigned char x,y,char_,bit b);
  17. //void Lcd_P8x16Str(unsigned char x,y,unsigned char *ch,bit b);
  18. //void Lcd_P16x16Ch(unsigned char x, y, N);
  19. #endif
复制代码
最终显示效果:显示数码之家logo[取模方式在图片上]和字符串循环显示。

源码,取模软件,st7567.pdf 已打包,keil5测试没问题。

通过网盘分享的文件:st7567-spi 测试.zip
链接: https://pan.baidu.com/s/13ha_AQ0_4wsVe0vSxJJnIQ?pwd=ug9a 提取码: ug9a 复制这段内容后打开百度网盘手机App,操作更方便哦


有一个问题,我怎么感觉硬件spi和软件spi没啥区别啊,能节省多少资源呢?因为我是爱好者不知道实际开发中存在的问题,我想做的是STC8H8K64 + HWL8110(uart通信,电量统计的芯片)+st7567+UART蓝牙无线发送一点数据。这个工程我需要注意什么?欢迎赐教。
最终感谢stc公司送我的开天斧三开发板,好像那个送我id的号被封了。。。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +30 收起 理由
8139 + 30 原創內容

查看全部打赏

发表于 18 小时前 | 显示全部楼层
硬件SPI往往搭配DMA,刷屏快很多。如不搞视频,仅仅显示些数值的话,软件SPI足够用了。
软件SPI极容易移植,可以说只要在一个MCU上跑通,其他的就没问题了,毕竟只需要会GPIO高高低低就能驱动了。
个人觉得硬件SPI定位有些尴尬,真的需要高速刷新的往往会用到8080及MIPI这些。
如用到外接 SPI 的 DAC做波形发生器,硬件SPI 则是刚需。
回复 支持 反对

使用道具 举报

发表于 12 小时前 | 显示全部楼层
kpj001 发表于 2025-7-26 01:38
硬件SPI往往搭配DMA,刷屏快很多。如不搞视频,仅仅显示些数值的话,软件SPI足够用了。
软件SPI极容易移植 ...

怎么可能尴尬呢,硬件spi ,一句spdat=xx;就丢给spi硬件自己处理了,cpu可以去做别的,而软件模拟的,你还在那 for 半天。。。
回复 支持 反对

使用道具 举报

发表于 12 小时前 | 显示全部楼层
那个发送数据的延时可以去掉,应该是没有问题的。

打赏

参与人数 1家元 +12 收起 理由
nokia5320 + 12 测试过了,你说的很对!

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
STC的新号,来了!微信:19952583740,欢迎咨询
回复 支持 反对

使用道具 举报

 楼主| 发表于 11 小时前 来自手机浏览器 | 显示全部楼层
void SPI_SendByte(unsigned char dat) {
    SPDAT = dat;                // 写入数据
    while (!(SPSTAT & 0x80));   // 等待传输完成
    SPSTAT = 0xC0;              // 清除标志位
}
while不也是空等待处理器哪啊
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
nokia5320 发表于 2025-7-26 08:47
void SPI_SendByte(unsigned char dat) {
    SPDAT = dat;                // 写入数据
    while (!(SPST ...

典型的照抄例程 不看说明书,spi还有中断呢,不用傻等,,何况硬件spi速度很快,等也不用多久,远比模拟的 for循环快的多啊,,一个程序 尽量不要delay,这是最原始的新人标志,正常设计成状态机模式就可以了,无需delay,即使不得不用,也尽可能时间短,反正cpu就像发动机一直运转的,不要它做无用的delay

打赏

参与人数 1家元 +9 收起 理由
nokia5320 + 9 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
家园,没了没了
回复 支持 反对

使用道具 举报

发表于 11 小时前 | 显示全部楼层
你仿真一下 自己程序 看看时间就知道了。。。换不同的写法,再仿真,如果有示波器,可以实测 硬件spi 和模拟的 时间差距,通常stc硬件spi  4分频,自己可以算出 传输一个字节耗时多久。。
回复 支持 反对

使用道具 举报

发表于 10 小时前 | 显示全部楼层
谢谢分享,我看不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 10 小时前 | 显示全部楼层
szb314 发表于 2025-7-26 09:04
典型的照抄例程 不看说明书,spi还有中断呢,不用傻等,,何况硬件spi速度很快,等也不用多久,远比模拟 ...

多教教我这等小白
回复 支持 反对

使用道具 举报

发表于 9 小时前 | 显示全部楼层
不会单片机,看不大懂。
回复 支持 反对

使用道具 举报

发表于 9 小时前 | 显示全部楼层
本帖最后由 茶壹杯 于 2025-7-26 10:51 编辑

应该还是模拟SPI 吧
标题现在还有时间改
回复 支持 反对

使用道具 举报

 楼主| 发表于 8 小时前 | 显示全部楼层
本帖最后由 nokia5320 于 2025-7-26 11:49 编辑
茶壹杯 发表于 2025-7-26 10:48
应该还是模拟SPI 吧
标题现在还有时间改

并不是呦,我折腾好几天才搞定。代码里我也没有把发送字节拆开扔引脚上,我只要扔到寄存器 SPDAT = dat就自动发送了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 8 小时前 | 显示全部楼层
银河小铁骑 发表于 2025-7-26 08:34
STC的新号,来了!微信:19952583740,欢迎咨询

谢谢给的样品哈~
回复 支持 反对

使用道具 举报

发表于 8 小时前 | 显示全部楼层
【SPI,SPI-DMA,I2C,I2C-DMA】代码
驱动OLED-12864开源:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 8 小时前 | 显示全部楼层
如果要实现最终要实现的功能,建议:
(1)这个程序结构不好,要么用系统,要么用简易状态机。
(2)开启通讯相关中断(SPI、UART),减少CPU空转等待。
(3)拆分功能做成模块,不同模块写在不同c、h文件对中,根据描述,大概需要计时、显示、通讯这几个模块。如果想方便以后移植到其它芯片,最好分成硬件层和应用层,以显示这张图为例,硬件层负责通过SPI接口把显示数据发给显示芯片,应用层把待显示数据准备到一个缓冲区中。

打赏

参与人数 1家元 +9 收起 理由
nokia5320 + 9

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 20 分钟前 | 显示全部楼层
看不懂,谢谢分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-26 20:34 , Processed in 0.156000 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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