找回密码
 立即注册
查看: 1340|回复: 10

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 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 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
DebugLab
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 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);
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-04-27 17:49:08
已绑定手机

5

主题

15

回帖

131

积分

注册会员

积分
131
发表于 2025-4-1 11:39:17 | 显示全部楼层
请问这2条设置指令发送了2次,是因为有时会有发送不成功的现象吗。

截图202504011137239750.jpg

点评

忘记了,可能是数据手册要求的  详情 回复 发表于 2025-4-1 13:45
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-1 13:45:06 | 显示全部楼层
Robi*** 发表于 2025-4-1 11:39
请问这2条设置指令发送了2次,是因为有时会有发送不成功的现象吗。

忘记了,可能是数据手册要求的
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 20:17 , Processed in 0.150295 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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