1、12864B V2.0液晶显示块,有不同时期生产的,他们在硬件上有可能不一样,串、并口的转换在硬件上的设置有可能不太一样。本实验所用实物如图所示:
液晶正面
液晶背面
2、程序
/********************************************************************
* 文件名 : 硬件串行12864B v2.0显示.c
* 描述 : 该程序实现了12864以串行的方式进行通信。
***********************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^7; //片选信号 第4脚
sbit SID=P2^6; //数据信号 第5脚
sbit SCLK=P2^5; //时钟信号 第6脚
/***********************************************************************
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置
**********************************************************************/
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void lcdinit()
{
delay(2000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
***********************************************************************/
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
//注意,如果有“数”这个字,会出现乱码。
//注意,如果有“数”这个字,会出现乱码。
//注意,如果有“数”这个字,会出现乱码。
//注意,如果有“数”这个字,会出现乱码。**
***********************************************************************/
void Test()
{
write_com(0x03);
delay(50);
write_com(0x80);
hzkdis("电动汽车与电网互");
write_com(0x90);
hzkdis("动停车场:Floor3");
write_com(0x88);
hzkdis("充电车辆 3 辆");
write_com(0x98);
hzkdis("136.5A 372.2V");
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
delay(10);
lcdinit();
delay(10);
while(1)
{
Test();
delay(50000);
write_com(0x01);//清屏
delay(20000);
}
}
## 3、液晶描述
