找回密码
 立即注册
查看: 606|回复: 8

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

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 126 天

    [LV.7]常住居民III

    26

    主题

    312

    回帖

    1136

    积分

    荣誉版主

    Cyber Hamster

    积分
    1136
    发表于 2023-12-13 21:48:16 | 显示全部楼层 |阅读模式
    SPI-LCD12864, 单工 : ST7920,AIP31020 串口模式
    截图202312231548058220.jpg
    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延时
    }

    1702474411489.jpg

    1702474411501.jpg

    1702474411511.jpg

    1702474411539.jpg




    声明:该装置正常通过民航安检,没有在起飞降落阶段使用,没有任何锂电池处于充电状态,没有发射无线电信号的功能,没有导体意外接触裸露电极,没有影响其他人员或造成不良后果,请勿模仿。
    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    (=・ω・=)
    回复 送花

    使用道具 举报

    该用户从未签到

    565

    主题

    9911

    回帖

    1万

    积分

    管理员

    积分
    14417
    发表于 2023-12-14 08:16:09 | 显示全部楼层
    帮发几个 STC32G/STC8H, SPI/I2C 控制 LCD12864的例子
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 94 天

    [LV.6]常住居民II

    13

    主题

    50

    回帖

    453

    积分

    中级会员

    积分
    453
    发表于 2024-3-20 17:29:53 | 显示全部楼层
    你这个是用软件模拟SPI  能不能做内部SPI驱动

    点评

    有空一定弄(咕咕咕)  发表于 2024-3-21 11:47
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    682

    积分

    高级会员

    积分
    682
    发表于 2024-6-1 03:58:26 | 显示全部楼层
    没有工程文件吗?好麻烦哦

    点评

    工程文件包含大量其他无关内容,无法提供  发表于 2024-6-3 18:14
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    682

    积分

    高级会员

    积分
    682
    发表于 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---RESET  L-->Enable

    #define LCD12864_SID   LCD_RW
    #define LCD12864_SCLK  LCD_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);
            }
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    682

    积分

    高级会员

    积分
    682
    发表于 2024-6-5 01:19:41 | 显示全部楼层
    截图202406050119389708.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    682

    积分

    高级会员

    积分
    682
    发表于 2024-6-5 01:25:06 | 显示全部楼层
    不知道为啥,我试了不行。 上面是我的代码和连接图
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-13 14:20 , Processed in 0.070780 second(s), 57 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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