📄 1602lcm.c
字号:
/*============================================================
1602LCD 串口驱动程序 2004/12/23
声明:
1、部分函数取自磁动力工作室 明皓
2、欢迎大家测试和改进
3、转贴请注明出处
接线图:
S51 LS164 1602LCD
P2.3 --第1脚
P2.4 --- 8
P2.5 ----------------- E
P2.6 ----------------- RS
RW 接地
3 ----------- D0
4 ----------- D1
5 ----------- D2
6 ----------- D3
10 ---------- D4
11 ---------- D5
12 ---------- D6
13 ---------- D7
2 接Vcc
7 GND
14 Vcc
[注:AT89S51使用12M晶振]
=============================================================*/
#include <regx51.h>
#define rs P2_6 //定义引脚
#define e P2_5
#define clk P2_4
#define d P2_3
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
void writelcd(bit command,unsigned char ddata)
{
unsigned char i;
if(command==0) rs = 0; else rs=1; //0 指令,1 数据
for(i=0;i<8;i++)
{
d=ddata&0x80; //取出最高位
clk=1;
clk=0;
ddata<<=1; //左移
}
e=1;
e=0;
}
void LCMInit(void) //LCM初始化
{
writelcd(0,0x38); //三次显示模式设置
Delay5Ms();
writelcd(0,0x38);
Delay5Ms();
writelcd(0,0x38);
Delay5Ms();
writelcd(0,0x38); //显示模式设置,开始要求每次检测忙信号
Delay5Ms();
writelcd(0,0x0c); // 显示开及光标设置
Delay5Ms();
writelcd(0,0x01); //显示清屏
Delay5Ms();
writelcd(0,0x06); // 显示光标移动设置
Delay5Ms();
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
writelcd(0,X);
writelcd(1,DData);
}
void main(void)
{
unsigned char j,k;
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
while(1)
{
for(k=0;k<40;k++)
{
for(j=0;j<16;j++) DisplayOneChar(j,0,0x30+j+k);
Delay400Ms();Delay400Ms();Delay400Ms();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -