[其他ST产品] STM32——库函数版——12864点阵显示屏驱动

[复制链接]
48813|27
 楼主| hehhehee 发表于 2023-9-29 19:04 | 显示全部楼层 |阅读模式
12864点阵显示屏驱动

我用的主控是STM32F103ZET6

程序里面有两种发法:一个是并行发送数据,另一个是串行发送数据

完整工程链接:12864完整驱动工程https://download.csdn.net/download/qq_45844792/18936216
12864学习资料和取模软件链接:12864学习资料和取模软件
https://download.csdn.net/download/qq_45844792/18936368


 楼主| hehhehee 发表于 2023-9-29 19:05 | 显示全部楼层
引脚连接看led12864.h里面的设置
程序运行效果图:

1.并行发送数据效果图
848386516af76e2686.png
请自动忽略错别字
 楼主| hehhehee 发表于 2023-9-29 19:06 | 显示全部楼层
2.串行发送数据效果图 662676516af9b163a3.png
 楼主| hehhehee 发表于 2023-9-29 19:06 | 显示全部楼层
程序如下:

main.c
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "led12864.h"

  4. /*2020.11.20*/

  5. unsigned char defchar[] = {0x00,0x40,0x78,0x40,0x48,0x44,0x57,
  6. 0xFE,0x50,0x80,0x60,0xA0,0x51,0x20,
  7. 0x4A,0x28,0x4B,0xFC,0x48,0x20,0x69,
  8. 0x28,0x51,0x24,0x42,0x26,0x44,0x22,
  9. 0x40,0xA0,0x40,0x40};    //自定义字符数组,这里是陈
 楼主| hehhehee 发表于 2023-9-29 19:06 | 显示全部楼层
  1. int main(void)
  2. {

  3.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        //系统时钟设置PLL作为系统时钟
  4.         delay_init();
  5.         
  6.         lcd12864_Pin_Init();  //引脚初始化共用
  7. /*-----------并行发送数据------------------*/
  8. //        LED_Init();          //led12864并行初始化
  9. //        delay_ms(20);

  10.         //任意位置显示字符串(写DDRAM中的数据)
  11. //        display_DDRAM(0,0,"人之出,性本善。苟不教,性乃迁。性相近,习相远,教之道,贵以专");

  12. //        display_CGRAM(1,2,0x20,defchar);    //任意位置显示自定义字符串(写CGRAM中的数据)

 楼主| hehhehee 发表于 2023-9-29 19:07 | 显示全部楼层
  1.       
  2. /*-----------串行发送数据------------------*/
  3.         Lcd_Init();       //led12864串行初始化
  4.         delay_ms(10);
  5.         LCD_Display_Words(0,0,"怕什么天道轮回");
  6. /*-------------------------------------*/      

  7. while(1);
  8.                
  9.                
  10.        

  11. }
 楼主| hehhehee 发表于 2023-9-29 19:07 | 显示全部楼层
led12864.c
  1. #include "led12864.h"
  2. #include "delay.h"

  3. /***************************************************************************************
  4. * 2020.11.20
  5. * LED12864模块
  6. * 管脚号          管脚名称                LEVER                 管脚功能描述
  7. *  1                VSS                  0                    电源地
  8. *  2                VDD                +5.0V                  电源电压
  9. *  3                V0                  -                    液晶显示器驱动电压
  10. *  4                D/I(RS)            H/L                    D/I=“H”    表示DB7∽DB0为显示数据
  11. *                                         D/I=“L”        表示DB7∽DB0为显示指令数据
  12. *  5                R/W(SID)    H/L                    R/W=“H”,E=“H”数据被读到DB7∽DB0
  13. *                                         R/W=“L”,E=“H→L”数据被写到IR或DR
  14. *  6                E(CLK)            H/L                    R/W=“L”,E信号下降沿锁存DB7∽DB0
  15. *                                         R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
  16. *  7                DB0                H/L                    数据线
  17. *  8                DB1                H/L                    数据线
  18. *  9                DB2                H/L                   数据线
  19. *  10                DB3                H/L                    数据线
  20. *  11               DB4               H/L                    数据线
  21. *  12                DB5                H/L                    数据线
  22. *  13               DB6                H/L                    数据线
  23. *  14                DB7                H/L                    数据线
  24. *  15                PSB(CS1)    H/L                    并/串行接口选择:H-并行 L-串行
  25. *  16                NC(CS2)                                   空脚
  26. *  17                RST               H/L                    复位信号,低电平复位
  27. *  18                VOUT             -10V                    LCD驱动负电压
  28. *  19                LED+              +                      LED背光板电源
  29. *  20                LED-              -                      LED背光板电源
  30. *********************************************************************************************/
 楼主| hehhehee 发表于 2023-9-29 19:07 | 显示全部楼层
  1. /**************************************************
  2. * 函数功能  : 引脚初始化
  3. **************************************************/
  4. void lcd12864_Pin_Init(void)
  5. {
  6.         GPIO_InitTypeDef  GPIO_InitStructure;
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);         //使能GPIOD/GPIOA端口时钟
  8.         //数据/命令选择
  9.         //读/写选择rw       
  10.         //使能信号en
  11.         //复位rst
  12.         GPIO_InitStructure.GPIO_Pin  = RS|RW|E|RST;   
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  14.         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHz       
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);  //IO口初始化
  16.        
  17.         //数据引脚
  18.         GPIO_InitStructure.GPIO_Pin  = LCD_DATA;   
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  20.         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHz       
  21.         GPIO_Init(GPIOD, &GPIO_InitStructure);  //IO口初始化

  22. }
 楼主| hehhehee 发表于 2023-9-29 19:08 | 显示全部楼层
/*************************************************
* 函数功能 : LED12864数据口引脚配置为输出模式
**************************************************/
void LED12864_DB_outputMode(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        //数据引脚
        GPIO_InitStructure.GPIO_Pin  = LCD_DATA;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  //最高输出速率50MHz       
        GPIO_Init(GPIOD, &GPIO_InitStructure);  //IO口初始化


}
 楼主| hehhehee 发表于 2023-9-29 19:08 | 显示全部楼层
/*************************************************
* 函数功能 : LED12864数据口引脚配置为上拉输入模式
**************************************************/
void LED12864_DB_inputMode(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        //数据引脚
        GPIO_InitStructure.GPIO_Pin  = LCD_DATA;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //推挽输出
        GPIO_Init(GPIOD, &GPIO_InitStructure);  //IO口初始化


}
 楼主| hehhehee 发表于 2023-9-29 19:08 | 显示全部楼层
/*************************************************
* 函数功能 : 写数据/命令
**************************************************/
void write_LCD12864_DB(uint8_t data)
{
        GPIO_Write(GPIOD,data);
}

//
/*************************************************
* 函数功能 : 读DB0-7的数据
**************************************************/
uint8_t read_LCD12864_DB(void)
{
        uint8_t value;
        value=GPIO_ReadInputData(GPIOD);
        return value;
}
 楼主| hehhehee 发表于 2023-9-29 19:08 | 显示全部楼层
/*************************************************
* 函数功能 : DB7引脚  忙信号检测
**************************************************/
void LCD_ReadyWait(void)
{
        uint8_t state;
       
        delay_ms(10);
        GPIO_WriteBit(GPIOA,RS,Bit_RESET);  //写指令  RS=0
        GPIO_WriteBit(GPIOA,RW,Bit_SET);  //写操作  R/W=1
        do
        {
                GPIO_WriteBit(GPIOA,E,Bit_SET);    //使能    E=1
                LED12864_DB_inputMode();     //配置数据口为上拉输入模式       
                state =read_LCD12864_DB();   //查忙标志位,等待标志位为0,表示写入完毕;为1,表示忙状态       
                LED12864_DB_outputMode();            //配置数据口为输出模式
                GPIO_WriteBit(GPIOA,E,Bit_RESET);    //不使能    E=0
        }        while( state & 0x80);  
       
}
 楼主| hehhehee 发表于 2023-9-29 19:08 | 显示全部楼层
/*************************************************
* 函数功能 : 向LCD12864写入命令
* 函数参数 :com写入的命令
**************************************************/
void LCD_Write_com(uchar com)
{
        delay_ms(5);
        LCD_ReadyWait();
        delay_ms(10);
        GPIO_WriteBit(GPIOA,RS,Bit_RESET);  //写指令  RS=0
        GPIO_WriteBit(GPIOA,RW,Bit_RESET);  //写操作  R/W=0
        GPIO_WriteBit(GPIOA,E,Bit_SET);    //使能    E=高电平
        write_LCD12864_DB(com);              //写命令
        GPIO_WriteBit(GPIOA,E,Bit_RESET);    //不使能
       


}
 楼主| hehhehee 发表于 2023-9-29 19:09 | 显示全部楼层
  1. /*************************************************
  2. * 函数功能 : 向LCD12864写入数据
  3. * 函数参数 :data写入的数据
  4. **************************************************/
  5. void LCD_Write_data(uchar data)
  6. {
  7.         delay_ms(10);
  8.         GPIO_WriteBit(GPIOA,RS,Bit_SET);  //写数据   RS=1
  9.         GPIO_WriteBit(GPIOA,RW,Bit_RESET);  //写操作 R/W=0
  10.         GPIO_WriteBit(GPIOA,E,Bit_SET);    //使能   E=高电平
  11.         write_LCD12864_DB(data);            //写数据
  12.         GPIO_WriteBit(GPIOA,E,Bit_RESET);    //不使能
  13. }

  14. /*************************************************
  15. * 函数功能 : 清屏
  16. *************************************************/
  17. void LCD_clear(void)
  18. {
  19.         LCD_Write_com(0x01);    //写清屏指令0x01  
  20.   delay_ms(10);
  21. }
 楼主| hehhehee 发表于 2023-9-29 19:09 | 显示全部楼层
  1. /*************************************************
  2. * 函数功能 : 任意位置显示字符串(写DDRAM中的数据)
  3. * 函数参数 :x第几列,y第几行,s输入的数据
  4. *************************************************/
  5. void display_DDRAM(uchar x,uchar y,uchar *s)
  6. {
  7.         switch(y)
  8.         {
  9.                 case 0:  
  10.                         LCD_Write_com(0x80+x);     //第一行
  11.                 break;
  12.                 case 1:  
  13.                         LCD_Write_com(0x90+x);     //第二行
  14.                 break;
  15.                 case 2:  
  16.                         LCD_Write_com(0x88+x);     //第三行
  17.                 break;
  18.                 case 3:  
  19.                         LCD_Write_com(0x98+x);     //第四行
  20.                 break;       
  21.         }
  22.         while(*s>0)
  23.         {
  24.                 LCD_Write_data(*s++);
  25.                 delay_ms(10);       
  26.         }
  27. }
 楼主| hehhehee 发表于 2023-9-29 19:09 | 显示全部楼层
//unsigned char defchar[] = {0x09,0x00,0xFD,0x08,0x09,0x08,0x09,
//0x10,0x09,0x20,0x79,0x40,0x41,0x04,
//0x47,0xFE,0x41,0x40,0x79,0x40,0x09,
//0x20,0x09,0x20,0x09,0x10,0x09,0x4E,
//0x51,0x84,0x21,0x00};    //自定义字符数组,这里是张


/*************************************************
* 函数功能 : 任意位置显示自定义字符串(写CGRAM中的数据)
* 函数参数 :x第几列,y第几行,addr 自编字符编码首地址,s输入的数据
* 声明     :12864具有4个自编字符,每个字符编码为0000H,0002H,0004H,0006H,4个自定义字符       
* CGRAM地址分别为00H~0FH、10H~1FH、20H~2FH、30H~3FH
 楼主| hehhehee 发表于 2023-9-29 19:10 | 显示全部楼层
  1. void display_CGRAM(uchar y,uchar x,uchar addr,uchar *s)
  2. {
  3.         unsigned char i,*address;
  4.         address = s;   
  5.         LCD_Write_com(0x40+addr);    //写CGRAM首行地址,创建第几个自编字符就写第几个自编字符的地址
  6.         for(i = 0;i<32;i++)
  7.         {
  8.                 LCD_Write_data(*address++);
  9.         }
  10.         switch(y)
  11.         {
  12.                 case 0:  
  13.                         LCD_Write_com(0x80+x);     //第一行
  14.                 break;
  15.                 case 1:  
  16.                         LCD_Write_com(0x90+x);    //第二行
  17.                 break;
  18.                 case 2:  
  19.                         LCD_Write_com(0x88+x);    //第三行
  20.                 break;
  21.                 case 3:  
  22.                         LCD_Write_com(0x98+x);   //第四行
  23.                 break;       
  24.         }
  25.         LCD_Write_data(0x00);     //写自定义字符编码的高字节
  26.        
  27.         switch(addr)
  28.         {
  29.                 case 0x00:  
  30.                         LCD_Write_data(0x00);           //写第一个自定义字符编码的低字节
  31.                 break;
  32.                 case 0x10:  
  33.                         LCD_Write_data(0x02);     //写第二个自定义字符编码的低字节
  34.                 break;
  35.                 case 0x20:  
  36.                         LCD_Write_data(0x04);     //写第三个自定义字符编码的低字节
  37.                 break;
  38.                 case 0x30:  
  39.                         LCD_Write_data(0x06);     //写第四个自定义字符编码的低字节
  40.                 break;       
  41.         }
  42. }
 楼主| hehhehee 发表于 2023-9-29 19:10 | 显示全部楼层

  1. //led12864并行初始化
  2. void LED_Init(void)
  3. {
  4.         GPIO_WriteBit(GPIOA,RST,Bit_SET);    //复位置高
  5.         delay_ms(10);       
  6.         GPIO_WriteBit(GPIOA,RST,Bit_RESET);  //复位
  7.         delay_ms(10);       
  8.         GPIO_WriteBit(GPIOA,RST,Bit_SET);    //复位结束
  9.         delay_ms(10);       
  10.        
  11.         LCD_Write_com(0x30);    //设置为基本指令集动作
  12.         delay_ms(10);
  13.         LCD_Write_com(0x08);    //设置显示、光标、闪烁全关。
  14.        
  15.         LCD_Write_com(0x01);      //清屏,并且DDRAM数据指针清零
  16.         LCD_Write_com(0x06);      //进入模式设置
  17.         LCD_Write_com(0x0c);      //开显示
  18.         delay_ms(10);       

  19. }

 楼主| hehhehee 发表于 2023-9-29 19:10 | 显示全部楼层
  1. /*----------------------------------12864串行发送数据----------------------------------------------------*/
  2. /*
  3. * PSB引脚接低,串行模式
  4. * RS引脚,拉高数据才能发送
  5. */
  6. /*---------串行----------------*/
  7. /* 字符显示RAM地址4行8列 */
  8. uint8_t LCD_addr[4][8]={
  9.         {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87},          //第一行
  10.         {0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97},                //第二行
  11.         {0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F},                //第三行
  12.         {0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F}                //第四行
  13.         };
 楼主| hehhehee 发表于 2023-9-29 19:10 | 显示全部楼层
//led串行发送一个字节
void SendByte(u8 byte)
{
        u8 i;
        for(i = 0; i< 8; i++)
        {
                if((byte <<i)&0x80)
                {
                        GPIO_WriteBit(GPIOA,RW,Bit_SET);  //读操作 R/W=1
                }
                else
                {
                        GPIO_WriteBit(GPIOA,RW,Bit_RESET);  //写操作 R/W=0               
                }
        GPIO_WriteBit(GPIOA,E,Bit_RESET);    //不使能
        delay_us(5); //延时使数据写入
        GPIO_WriteBit(GPIOA,E,Bit_SET);    //使能       
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1252

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部