nokia 发表于 2025-7-26 00:11:53

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

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



cog是st7567已经明确了,驱动就好办了。但是之前一直是89系列模拟SPI时序驱动,这次想玩玩硬件驱动的,可惜《单片微机原理与接口技术-基于stc8h8k64u》里的范例给的是SPI管理25系列ROM,可以参考但有限,网上搜也没找到这个型号的,那就自己折腾。
<font size="4">// 单片机和液晶引脚连接
LCD_CS= P2^0;   // 片选 (CS)
LCD_RST = P2^1;   // 复位 (RST)
LCD_DC= P1^0;   // 数据/命令选择 (A0/DC) </font>st7567.c文件:
<font size="4">#include "STC8H.H"
#include "font16.h"
// 引脚定义
sbit LCD_CS= P2^0;   // 片选 (CS)
sbit LCD_RST = P2^1;   // 复位 (RST)
sbit LCD_DC= P1^0;   // 数据/命令选择 (DC)
// LCD_SCL=P2^5LCD_SDA=P2^3
extern void delay_ms(unsigned int ms);
extern void delay_us(unsigned int ms);
//// 简单延时函数
//void delay_ms(unsigned int ms) {
//    unsigned int i, j;
//    for(i = 0; i < ms; i++)
//      for(j = 0; j < 1000; j++);
//}

/******************** SPI初始化函数(优化CS控制) ********************/
void SPI_Init() {
    // 1. 开启扩展寄存器访问
    P_SW2 = 0x80;       // EAXFR=1
   
    // 2. 配置SPI引脚组选择
    P_SW1 = 0x04;       // SPI_S=01,选择第二组(P2.2/3/4/5)
   
    // 3. 配置SPI控制寄存器
    SPCTL = 0xDC;       // 11011100:
                        // SPEN=1, SSIG=1, CPHA=0, CPOL=1, MSTR=1
                        // DORD=0, SPR1=1, SPR0=0 -> F_OSC/16 (24MHz/16=1.5MHz)
   
    // 4. 配置引脚模式
    P2M0 = 0x2B;      // 00101011: P2.0(CS), P2.1(RST), P2.3(MOSI), P2.5(SCLK)推挽输出
    P2M1 = 0x00;      // 所有P2引脚设置为模式0(推挽输出)
   
    P1M0 = 0x01;      // P1.0(DC)推挽输出
    P1M1 = 0x00;      // 所有P1引脚设置为模式0(推挽输出)
   
    // 5. 初始状态设置
    LCD_CS = 1;         // 初始片选无效
    LCD_DC = 0;         // 命令模式
    LCD_RST = 1;      // 不复位
   
    SPDAT = 0;          // 清空数据寄存器
    SPSTAT = 0xC0;      // 清除状态标志
   
    // 6. 关闭扩展寄存器访问
    P_SW2 = 0x00;       // EAXFR=0
}

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

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

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

/******************** lcd显示清屏 ********************/
void LCD_Claer() {
   unsigned char x,y;
       for(y=0;y<8;y++)
                        {
                               LCD_Write_Command(0xb0+y);//页地址
                               LCD_Write_Command(0x00);//低地址
                               LCD_Write_Command(0x10);//高地址
                                for(x=0;x<128;x++)
                                        LCD_Write_Data(0x00);
                        }
        }


/******************** LCD初始化函数(优化CS控制) ********************/
void LCD_Init() {
    // 硬件复位
    LCD_RST = 0;
    delay_us(15);
    LCD_RST = 1;
   delay_us(15);
   
    // 开始通信:永久拉低CS
    LCD_CS = 0;
   
    // 初始化序列
    LCD_Write_Command(0xE2);// 软复位
    delay_us(100);
   
    LCD_Write_Command(0xA2);// 1/9 bias
    LCD_Write_Command(0xA0);// ADC正常方向
    LCD_Write_Command(0xC8);// COM输出反向
   
    LCD_Write_Command(0xA4);// 正常显示(非全亮)
    LCD_Write_Command(0xA6);// 正常显示(非反白)
    LCD_Write_Command(0x24);// V0电阻设置
   
    // 对比度设置
    LCD_Write_Command(0x81);
    LCD_Write_Command(0x28);// 对比度值
   
    // 升压电路设置
    LCD_Write_Command(0xF8);
    LCD_Write_Command(0x00);// 升压比2x
   
    // 分步开启电源
    LCD_Write_Command(0x2C);// Booster on
    delay_us(22);
    LCD_Write_Command(0x2E);// Regulator on
    delay_us(22);
    LCD_Write_Command(0x2F);// Follower on
   delay_us(8);
   LCD_Claer() ;
    LCD_Write_Command(0x40);// 显示起始行0
    LCD_Write_Command(0xAF);// 开启显示
}

/******************** 设置显示位置 ********************/
void LCD_SetPosition(unsigned char x, unsigned char y) {
    LCD_Write_Command(0xB0 | y);      // 设置页地址
    LCD_Write_Command(0x10 | (x >> 4)); // 设置列地址高4位
    LCD_Write_Command(x & 0x0F);      // 设置列地址低4位
}


/******************** 显示字符调用font文件的函数 ********************/
//x横坐标,y页地址=纵坐标除以8,注意每个字符高度占用16bit=2page,最多完整显示4page,y不是座标!
//如果用font文件,那么只能完美显示4行y=0-1,2-3,4-5,6-7page,bit 这个参数是反显一个像素,没有用st7567的命令而是用像素取反运算
void Display_Char(unsigned char x, unsigned char y, unsigned char ch_index,bit b) {
    unsigned char i;

    LCD_SetPosition(x, y);
    ch_index= ch_index-32;
       for(i=0;i<8;i++)
                        {
                                if(b)
                                        LCD_Write_Data(~F8X16);
else
                                        LCD_Write_Data(F8X16);
                        }//P8x16上半部分显示
LCD_SetPosition(x,y+1);
        for(i=0;i<8;i++)
                        {
                                if(b)
                                        LCD_Write_Data(~F8X16);
        else
                                        LCD_Write_Data(F8X16);
}//P8x16下半部分显示
}

/******************** 显示字符串调用font文件的函数 ********************/
/*函数名称:Display_Chars
功能:Lcd显示字符串
输入:x坐标,y坐标其实是8y行,因为每Page占用8行,字符串,b反显
输出:无
备注:x<=128,y<=64
*********************************/
void Display_Chars(unsigned char x,y,unsigned char *ch,bit b)
{
while(*ch!='\0')
{
if(x>120){x=0;y+=2;}//如果x在最右边,则回到左边且下移1页=8行
        Display_Char(x,y,*ch++,b);
x+=8;
}
}

/*********************************
函数名称:Display_pic
功能:Lcd显示图片
输入:x起始坐标,y起始坐标,x终止坐标,y终止坐标,图片数组
输出:无
备注:x<=128,y<=64,x1<x2,y1<y2
*********************************/
void Display_pic(unsigned char x0,y0,x1,y1,unsigned char *pic)
{
        unsigned char x,y;

if(y1%8==0) y=y1/8;      
else y=y1/8+1;
        for(y=y0;y<y1;y++)
        {
                LCD_SetPosition(x0,y);
    for(x=x0;x<x1;x++)
          {      
                  LCD_Write_Data(*pic++);
          }
        }
}
</font>CPHA=0, CPOL=1, 我的理解是这样的:(为了简单测试成功。我采用单片机做主机,lcd从机,忽略ss引脚,cs一直拉低)





LCD_Init里初始化st7567的参数是来自数码之家 ID:lizi 的st7565源码,修改了对比度值为0x28,

Display_Char函数是为了显示font16.h文件内字符设计的。Display_Chars顾名思义显示字符串,

main文件:
<font size="4">#include "STC8H.H"
#include <intrins.h>
#include "ST7567.H"
unsigned char codeBMP0 = { /* 单色bmp文件,不要文件头信息,此图片是stc炼丹炉 */
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X10,0X20,0X20,0X60,
0XE0,0X10,0X08,0X18,0X1C,0X3E,0X1C,0X1C,0X0C,0X18,0X18,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X40,0XC0,0X80,0XC0,0XF0,0XEC,0XFC,0XFC,0X7C,0X00,
0X00,0X00,0X00,0X00,0X08,0X00,0X00,0X04,0X06,0X0F,0X07,0X01,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X00,0XF7,0X0F,0X0F,0X0F,0X05,0X04,0X00,
0X00,0X00,0X00,0X00,0X04,0X00,0X00,0XC0,0X00,0X00,0X07,0X00,0X00,0XC0,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X04,0X1C,0XAC,
0XFC,0X8C,0X0C,0XEC,0XFC,0XFE,0XFE,0XFF,0XFE,0XFF,0XDF,0XFE,0XFE,0XFC,0XFE,0XDE,
0XDE,0X38,0XD8,0X90,0X98,0X14,0X05,0X05,0X14,0XB4,0XB4,0XB4,0X25,0X25,0X24,0X10,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X00,0XC0,0X10,0X02,0X8B,
0X9B,0X96,0XDE,0X07,0X5F,0X1F,0XD7,0X9B,0X7F,0X9F,0X3E,0X5F,0XB6,0XB6,0XEF,0X86,
0X34,0XF2,0X12,0X22,0X02,0X02,0X41,0XE1,0X03,0X30,0X71,0X81,0X02,0X81,0X10,0X00,
0XC0,0XF0,0X80,0X00,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X1F,0X3E,0X1D,0X52,0X7E,0X7C,
0XFD,0XFF,0XFA,0XFC,0XFC,0XFA,0XFF,0XFC,0XF4,0XFC,0XFF,0XFC,0XFC,0XFF,0XFE,0XFA,
0X7C,0XFF,0XFC,0XFE,0XFE,0XFC,0XFC,0XF7,0XFC,0XF3,0XFC,0XE5,0XEC,0X6F,0XBE,0X1E,
0X23,0X00,0X02,0X02,0X07,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X11,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0X03,0X01,0X7F,0X80,0XEC,0XF8,0XFA,0XDA,
0XD8,0XF8,0XF8,0XC8,0X80,0X3F,0X01,0X7F,0XFF,0XFF,0XFF,0XFF,0XFA,0X28,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
0X03,0X07,0X07,0X07,0X07,0X03,0X03,0X00,0X00,0X00,0X00,0X01,0XC3,0XE7,0XE7,0XE7,
0XE7,0XC5,0X05,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X07,0X07,0X02,0X02,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};



//// 简单延时函数//@24.000MHz
void delay_ms(unsigned int ms) {
        unsigned char data i, j;
        while(ms--){
        i = 24;
        j = 85;
        do
        {
                while (--j);
        } while (--i);}
}
void delay_us(unsigned int us)        //@24.000MHz
{
        unsigned char data i;
        while(us--){
        _nop_();
        _nop_();
        i = 3;
        while (--i);}
}

/******************** 主函数 ********************/
void main() {
    /* 时钟设置 */
//    P_SW2 = 0x80;      // 开启扩展寄存器访问
//   
//    // 设置24MHz主时钟
//    IRCBAND = 0x01;      // 内部24MHz时钟
//   
//    // 时钟分频器设置
//    #if defined(CLKDIV)
//      CLKDIV = 0x00;   // 不分频
//    #elif defined(CKDIV)
//      CKDIV = 0x00;    // 不分频
//    #else
//      // 直接地址访问作为备选
//      unsigned char xdata *clkdiv = (unsigned char xdata *)0xFE00;
//      *clkdiv = 0x00;
//    #endif
   
    P_SW2 = 0x00;      // 关闭扩展寄存器访问
   
    SPI_Init();          // 初始化SPI
    LCD_Init();          // 初始化LCD
   
    // 显示"HELLO"

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

//unsigned char code F16x16[]={



//};</font>


最终显示效果:显示stc炼丹炉[取模方式在图片上]和字符串循环显示。


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


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

nokia 发表于 2025-7-26 00:21:28

下载时6-24Mhz都可以,应该是我对st7567没看完,也不知道F_OSC/16 (24MHz/16=1.5MHz)怎么取值,就按照模拟spi随意取大的,估计浪费了单片机时间。页请交大佬,这个屏幕的SPI时钟到底怎么看,我脑子晕晕的。

ercircle 发表于 2025-7-28 17:23:54

nokia 发表于 2025-7-26 00:21
下载时6-24Mhz都可以,应该是我对st7567没看完,也不知道F_OSC/16 (24MHz/16=1.5MHz)怎么取值,就按照模拟s ...


一般手册里有这种时序图,只要时序在规定范围内都可以。
另外硬件spi当然模拟spi优先使用,无论是节省mcu时间还是配合dma\p2p(Ai8051U系列)等功能使用。
延时阅读:
AiCube图形化程序自动生成【SPI,SPI-DMA,I2C,I2C-DMA】代码,驱动OLED-12864 - AiCube-ISP , 程序自动生成工具, 支持STC89/15/8H/32/AI8051U 国芯人工智能技术交流网站 - AI32位8051交流社区
用AiCube配置硬件SPI和DMA点亮OLED12864 | 跟帖问OLED12864程序给您全搞定 - AiCube-ISP , 程序自动生成工具, 支持STC89/15/8H/32/AI8051U 国芯人工智能技术交流网站 - AI32位8051交流社区

页: [1]
查看完整版本: stc8h8k64u利用硬件SPI模式驱动ST7567液晶12864屏幕