DebugLab 发表于 2023-12-13 21:48:16

SPI-LCD12864, 单工: ST7920 AIP31020 串口模式

SPI-LCD12864, 单工 : ST7920,AIP31020 串口模式
STC8F1K08
#define         Write_Command                                                                        0xf8#define         Write_Data                                                                              0xfa#define         Read_Command                                                                        0xfc#define                Read_Data                                                                              0xfe#define                Setting_Basic_Instruction_Set                                        0x30#define                Setting_Extended_Instruction_Set_Drawing_Off      0x34#define                Setting_Extended_Instruction_Set_Drawing_On                0x36#define                Clear_Display                                                                        0x01#define                Entry_Mode_Cursor_Left                                                      0x04#define                Entry_Mode_Entire_Right                                                      0x05#define                Entry_Mode_Cursor_Right                                                      0x06#define                Entry_Mode_Entire_Left                                                      0x07#define                Display_Off                                                                              0x08#define                Display_On_Cursor_Off_Inverse_Off                              0x0c#define                Display_On_Cursor_Off_Inverse_On                              0x0d#define                Display_On_Cursor_On_Inverse_Off                              0x0e#define                Display_On_Cursor_On_Inverse_On                                        0x0f#define                Cursor_Move_Left                                                                0x10#define                Cursor_Move_Right                                                                0x14#define                Display_Move_Left                                                                0x18#define                Display_Move_Right                                                                0x1c
/*----------------------------写1字节命令或数据----------------------------*/void LCD12864_Write_Byte(unsigned char temp){      unsigned char i;      for(i=0;i<8;i++)      {                if((temp<<i)&0x80)                        LCD12864_SID=1;                else                        LCD12864_SID=0;                LCD12864_SCLK=0;                LCD12864_SCLK=1;      }}
/*----------------------------传送数据或者命令----------------------------*/void LCD12864_Write(unsigned char Command,unsigned char temp){      LCD12864_Write_Byte(Command);      LCD12864_Write_Byte(temp&0xf0);      LCD12864_Write_Byte((temp<<4)&0xf0);}
/*----------------------------清空GDRAM----------------------------*/void Clear_GDRAM(void){      unsigned char i,j,k;      LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off);      k=0x80;      for(i=0;i<32;i++)      {                LCD12864_Write(Write_Command,k++);                LCD12864_Write(Write_Command,0x80);                for(j=0;j<16;j++)                {                        LCD12864_Write(Write_Data,0x00);                }      }      k=0x80;      for(i=0;i<32;i++)      {                LCD12864_Write(Write_Command,k++);                LCD12864_Write(Write_Command,0x88);                for(j=0;j<16;j++)                {                        LCD12864_Write(Write_Data,0x00);                }      }      LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);}
/*----------------------------整页显示字符----------------------------*/void Display_Text(unsigned char code *addr){      unsigned char i;      LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);      LCD12864_Write(Write_Command,0x80);      //设置DDRAM地址      Delay_10us();      for(i=0;i<16;i++)      {                LCD12864_Write(Write_Data,*addr);                addr++;      }      LCD12864_Write(Write_Command,0x90);      //设置DDRAM地址      Delay_10us();      for(i=0;i<16;i++)      {                LCD12864_Write(Write_Data,*addr);                addr++;      }      LCD12864_Write(Write_Command,0x88);      //设置DDRAM地址      Delay_10us();      for(i=0;i<16;i++)      {                  LCD12864_Write(Write_Data,*addr);                addr++;      }      LCD12864_Write(Write_Command,0x98);      //设置DDRAM地址      Delay_10us();      for(i=0;i<16;i++)      {                LCD12864_Write(Write_Data,*addr);                addr++;      }}
/*----------------------------指定位置显示字符----------------------------*/void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2){      LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);      switch(y)      {                case 0:                        LCD12864_Write(Write_Command,0x80+x);      //设置DDRAM地址                        Delay_10us();                        LCD12864_Write(Write_Data,Data1);                        LCD12864_Write(Write_Data,Data2);                        break;                case 1:                        LCD12864_Write(Write_Command,0x90+x);      //设置DDRAM地址                        Delay_10us();                        LCD12864_Write(Write_Data,Data1);                        LCD12864_Write(Write_Data,Data2);                        break;                case 2:                        LCD12864_Write(Write_Command,0x88+x);      //设置DDRAM地址                        Delay_10us();                        LCD12864_Write(Write_Data,Data1);                        LCD12864_Write(Write_Data,Data2);                        break;                case 3:                        LCD12864_Write(Write_Command,0x98+x);      //设置DDRAM地址                        Delay_10us();                        LCD12864_Write(Write_Data,Data1);                        LCD12864_Write(Write_Data,Data2);                        break;      }}
/*----------------------------初始化12864----------------------------*/void LCD12864_Init(void){      Delay_x10ms(4);                        //40mS延时      LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);      Delay_x10us(10);                //100uS延时      LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);      Delay_x10us(4);                        //40uS延时      LCD12864_Write(Write_Command,Clear_Display);                                                //显示光标闪烁完全关闭      Delay_x10us(10);                //100uS延时      LCD12864_Write(Write_Command,Clear_Display);                                                //清除显示      Delay_x10ms(1);                        //10mS延时      LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right);                              //光标右移模式      Delay_x10us(10);                //100uS延时      LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off);      //开显示,无光标,光标不闪烁      Delay_x10us(10);                //100uS延时      Clear_GDRAM();                        //清空GDRAM      Delay_x10us(10);                //100uS延时}








声明:该装置正常通过民航安检,没有在起飞降落阶段使用,没有任何锂电池处于充电状态,没有发射无线电信号的功能,没有导体意外接触裸露电极,没有影响其他人员或造成不良后果,请勿模仿。

神农鼎 发表于 2023-12-14 08:16:09

帮发几个 STC32G/STC8H, SPI/I2C 控制 LCD12864的例子{:4_196:}

zhang32568 发表于 2024-3-20 17:29:53

你这个是用软件模拟SPI能不能做内部SPI驱动

durongze 发表于 2024-6-1 03:58:26

没有工程文件吗?好麻烦哦

durongze 发表于 2024-6-5 01:17:24


#include "./comm/STC32G.H"

#define   MAIN_Fosc       24000000L   //?????

typedef   unsigned char   u8;
typedef   unsigned int    u16;
typedef   unsigned long   u32;

#define LCD_Data P2
sbit    LCD_RS = P0^1;//????
sbit    LCD_RW = P0^2;
sbit    LCD_E= P0^3;
sbit    PSB    = P0^4;      //PSB??12864??????????,????8?????,PSB=1
sbit    LCD_RESET   =   P4^5;   //17---RESETL-->Enable

#define LCD12864_SID   LCD_RW
#define LCD12864_SCLKLCD_E

#define Busy    0x80 //????LCD?????Busy??

#define         Write_Command                                     0xf8
#define         Write_Data                                        0xfa
#define         Read_Command                                    0xfc
#define         Read_Data                                       0xfe
#define         Setting_Basic_Instruction_Set                     0x30
#define         Setting_Extended_Instruction_Set_Drawing_Off      0x34
#define         Setting_Extended_Instruction_Set_Drawing_On       0x36
#define         Clear_Display                                     0x01
#define         Entry_Mode_Cursor_Left                            0x04
#define         Entry_Mode_Entire_Right                           0x05
#define         Entry_Mode_Cursor_Right                           0x06
#define         Entry_Mode_Entire_Left                            0x07
#define         Display_Off                                       0x08
#define         Display_On_Cursor_Off_Inverse_Off               0x0c
#define         Display_On_Cursor_Off_Inverse_On                  0x0d
#define         Display_On_Cursor_On_Inverse_Off                  0x0e
#define         Display_On_Cursor_On_Inverse_On                   0x0f
#define         Cursor_Move_Left                                  0x10
#define         Cursor_Move_Right                                 0x14
#define         Display_Move_Left                                 0x18
#define         Display_Move_Right                              0x1c

void Delay_10us()
{
        u32 i;
        u16 us = 10;
        do {
                i = MAIN_Fosc / 13;
                while(--i)    ;   //14T per loop
        } while(--us);
}

void Delay_x10us(u16 tm)
{
        u16 i = tm;
        do {
                Delay_10us();   //14T per loop
        } while(--i);
}

void Delay_10ms()
{
        u16 i;
        u16 ms = 10;
        do {
                i = MAIN_Fosc / 1300;
                while(--i)    ;   //14T per loop
        } while(--i);
}

void Delay_x10ms(u16 tm)
{
        u16 i = tm;
        do {
                Delay_10ms();   //14T per loop
        } while(--i);
}

/*----------------------------?1???????----------------------------*/
void LCD12864_Write_Byte(unsigned char temp)
{
        unsigned char i;
        for(i=0; i<8; i++) {
                if((temp<<i)&0x80)
                        LCD12864_SID=1;
                else
                        LCD12864_SID=0;
                LCD12864_SCLK=0;
                LCD12864_SCLK=1;
        }
}

/*----------------------------????????----------------------------*/
void LCD12864_Write(unsigned char Command,unsigned char temp)
{
        LCD12864_Write_Byte(Command);
        LCD12864_Write_Byte(temp&0xf0);
        LCD12864_Write_Byte((temp<<4)&0xf0);
}

/*----------------------------??GDRAM----------------------------*/
void Clear_GDRAM(void)
{
        unsigned char i,j,k;
        LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_Off);
        k=0x80;
        for(i=0; i<32; i++) {
                LCD12864_Write(Write_Command,k++);
                LCD12864_Write(Write_Command,0x80);
                for(j=0; j<16; j++) {
                        LCD12864_Write(Write_Data,0x00);
                }
        }
        k=0x80;
        for(i=0; i<32; i++) {
                LCD12864_Write(Write_Command,k++);
                LCD12864_Write(Write_Command,0x88);
                for(j=0; j<16; j++) {
                        LCD12864_Write(Write_Data,0x00);
                }
        }
        LCD12864_Write(Write_Command,Setting_Extended_Instruction_Set_Drawing_On);
}

/*----------------------------??????----------------------------*/
void Display_Text(unsigned char code *addr)
{
        unsigned char i;
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        LCD12864_Write(Write_Command,0x80);      //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
        LCD12864_Write(Write_Command,0x90);      //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
        LCD12864_Write(Write_Command,0x88);      //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
        LCD12864_Write(Write_Command,0x98);      //??DDRAM??
        Delay_10us();
        for(i=0; i<16; i++) {
                LCD12864_Write(Write_Data,*addr);
                addr++;
        }
}

/*----------------------------????????----------------------------*/
void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2)
{
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        switch(y) {
        case 0:
                LCD12864_Write(Write_Command,0x80+x);      //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 1:
                LCD12864_Write(Write_Command,0x90+x);      //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 2:
                LCD12864_Write(Write_Command,0x88+x);      //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 3:
                LCD12864_Write(Write_Command,0x98+x);      //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        }
}

/*----------------------------???12864----------------------------*/
void LCD12864_Init(void)
{
        Delay_x10ms(4);                        //40mS??
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        Delay_x10us(10);                //100uS??
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        Delay_x10us(4);                        //40uS??
        LCD12864_Write(Write_Command,Clear_Display);                                                //??????????
        Delay_x10us(10);                //100uS??
        LCD12864_Write(Write_Command,Clear_Display);                                                //????
        Delay_x10ms(1);                        //10mS??
        LCD12864_Write(Write_Command,Entry_Mode_Cursor_Right);                              //??????
        Delay_x10us(10);                //100uS??
        LCD12864_Write(Write_Command,Display_On_Cursor_Off_Inverse_Off);      //???,???,?????
        Delay_x10us(10);                //100uS??
        Clear_GDRAM();                        //??GDRAM
        Delay_x10us(10);                //100uS??
}


unsigned char code LCD_STR[]    = {"HELLO"};

void main(void)
{
        P0M1 = 0x00;
        P0M0 = 0x00;   //???????
        P1M1 = 0x00;
        P1M0 = 0x00;   //???????
        P2M1 = 0x00;
        P2M0 = 0x00;   //???????
        P3M1 = 0x00;
        P3M0 = 0x00;   //???????
        P4M1 = 0x00;
        P4M0 = 0x00;   //???????
        P5M1 = 0x00;
        P5M0 = 0x00;   //???????
        P6M1 = 0x00;
        P6M0 = 0x00;   //???????
        P7M1 = 0x00;
        P7M0 = 0x00;   //???????

        LCD12864_Init(); //LCM???
        Delay_x10ms(5); //????(???)
        while(1) {
                Display_Text(LCD_STR);
        }
}

durongze 发表于 2024-6-5 01:19:41

durongze 发表于 2024-6-5 01:25:06

不知道为啥,我试了不行。 上面是我的代码和连接图

RobinHou 发表于 2025-4-1 11:39:17

请问这2条设置指令发送了2次,是因为有时会有发送不成功的现象吗。

DebugLab 发表于 2025-4-1 13:45:06

RobinHou 发表于 2025-4-1 11:39
请问这2条设置指令发送了2次,是因为有时会有发送不成功的现象吗。

忘记了,可能是数据手册要求的
页: [1]
查看完整版本: SPI-LCD12864, 单工: ST7920 AIP31020 串口模式