我们做一个电子产品,往往需要实现人机交互的功能。那么人机交互的方式除了输出到上位机通过电脑去显示,显示器也是一个很不错的方式,可用于一些不能使用电脑的场合。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函数先将变量存在字符串里面,然后我们去调用显示字符串函数就行了。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』