×
单片机 > 单片机程序设计 > 详情

STM32驱动LCD12864显示屏

发布时间:2020-08-21 发布时间:
|

我们做一个电子产品,往往需要实现人机交互的功能。那么人机交互的方式除了输出到上位机通过电脑去显示,显示器也是一个很不错的方式,可用于一些不能使用电脑的场合。LCD12864显示器中的一种,具有价格低廉,操作简单的优点。今天就为大家带来一个STM32驱动12864的例程,使用SPI串行通信,仅仅需要三根数据线就可以完成通信。废话不多说,进入正题。

接线:         RS----PB15
RW----PB14
EN----PB13
PSB---GND

1.初始化IO口以及显示屏

void Lcd_Init(void)   

{   

    GPIO_InitTypeDef  GPIO_InitStructure;  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能端口时钟  

      

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;            //端口配置  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz  

    GPIO_Init(GPIOA, &GPIO_InitStructure);       //根据设定参数初始化GPIO  

    GPIO_SetBits(GPIOA,GPIO_Pin_0);              //输出高  

      

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//端口配置  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                //推挽输出  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口速度为50MHz  

    GPIO_Init(GPIOB, &GPIO_InitStructure);                   //根据设定参数初始化GPIO  

    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);     //输出高  

      

    LCD_PSB_0; //一直拉低,用串口方式驱动 (可直接接地)  

    LCD_RS_1;  //CS一直拉高,使能液晶(可直接接VCC)  

  

    Lcd_Write_Cmd(0x30);   

    delay_us(10000);  

    Lcd_Write_Cmd(0x01);  

    delay_us(10000);  

    Lcd_Write_Cmd(0x02);  

    delay_us(10000);  

    Lcd_Write_Cmd(0x06);  

    delay_us(10000);  

    Lcd_Write_Cmd(0x0c);  

    delay_us(10000);  

    Lcd_Write_Cmd(0x34); //图形开启(不显示)  

    delay_us(10000);  

    Lcd_Fill(0x00);    //清空屏内RAM  

    delay_us(10000);  

    Lcd_Write_Cmd(0x36); //图形开启(开显示)  

    delay_us(10000);  

      

}  

2.向LCD12864写字节函数


void SendByte(uchar Dbyte)    

{  

     uchar i;  

     for(i=8;i>0;i--)  

     {  

       if (Dbyte&0x80)  LCD_SID_1;  

       else  LCD_SID_0;   

       LCD_SCLK_1;   //如果显示有问题,则需在此后加延迟  

       delay_us(1);     //72MHZ速度太快,M0的48MHZ就无需加  

[cpp] view plain copy

  LCD_SCLK_0;  

  Dbyte<<=1;  

}  

3.写命令和数据函数


void Lcd_Write_Cmd(uchar Cbyte )  

{  

      

     SendByte(0xf8);              //11111,RW(0),RS(0),0  

     SendByte(0xf0&Cbyte);          

     SendByte(0xf0&Cbyte<<4);     

      

}  

  

void Lcd_Write_Data(uchar Dbyte )  

{      

     SendByte(0xfa);              //11111,RW(0),RS(1),0  

     SendByte(0xf0&Dbyte);          

     SendByte(0xf0&Dbyte<<4);    

}  

4.设置显示起始地址函数


void LCD_Set_XY(uchar x,uchar y)   

{  

    unsigned char k = 0;     

    switch(x)  

    {  

     case 1:   

            k = 0x80 + y;  

                break;    

        case 2:   

            k = 0x90 + y;  

                break;      

    case 3:   

            k = 0x88 + y;  

                break;     

        case 4:   

            k = 0x98 + y;  

                break;    

    default:  

            k = 0x80 + y;  

    }  

    Lcd_Write_Cmd(k);  

}  

5.显示汉字函数


void hanzi_Disp(unsigned char x,unsigned char y,unsigned char *s)  

{   

    Lcd_Write_Cmd(0x30); //进入标准模式  

    LCD_Set_XY(x,y);  

    while (*s)    

    {  

        Lcd_Write_Data(*s);  

        s++;  

    }  

    Lcd_Write_Cmd(0x36); //返回图形模式  

}  

6.再写一个清屏函数

[cpp] view plain copy

void Lcd_Fill(uchar color) //填充屏内RAM  

{    

  uchar x,y,i;  

  Lcd_Write_Cmd(0x34);    

   for(i=0;i<9;i=i+8)     

   for(y=0;y<0x20;y++)  

   {       

   for(x=0;x<8;x++)  

       {   

        Lcd_Write_Cmd(y+0x80);         

        Lcd_Write_Cmd(x+0x80+i);        

        Lcd_Write_Data(color);     

        Lcd_Write_Data(color);     

       }  

   }   

  Lcd_Write_Cmd(0x36);  

}  

上面是一些函数的定义,最后我们在主函数里点用这些函数,就能显示我们想要显示的内容了。

最后补充一个显示变量的小技巧,采用sprintf函数先将变量存在字符串里面,然后我们去调用显示字符串函数就行了。


关键字:STM32  驱动LCD12864  显示屏

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会