📄 1602_display.c
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCDRS = P3^3;
sbit LCDRW = P3^4;
sbit LCDEN = P3^5;
uchar code NumTable[]="0123456789";
/*
void snop()
{
;;
}
*/
void delay(uint time)
{
uchar i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //写命令
{
LCDRS = 0;
LCDRW = 0;
LCDEN = 0;
P1 = com;
LCDEN = 1;
delay(5);
LCDEN = 0;
}
void write_data(uchar dat) //写数据
{
LCDRS = 1;
LCDRW = 0;
LCDEN = 0;
P1 = dat;
LCDEN = 1;
delay(5);
LCDEN = 0;
}
//以下内容未用,进行屏蔽
/*
void read_com() //读状态
{
LCDRS = 0;
LCDRW = 1;
LCDEN = 1;
snop();
LCDEN = 0;
}
void read_data() //读数据
{
LCDRS = 1;
LCDRW = 1;
LCDEN = 1;
snop();
LCDEN = 0;
}
*/
//以下对读写函数进行测试
void init()
{
//初始化P2口,准备接收矩阵键盘输入
P2 = 0xff;
//初始化LCD
/*
delay(15); //延时15毫秒
write_com(0x38);//初始化:设置16X2显示,5X7点阵,8位数据接口
delay(5); //延时5毫秒
write_com(0x38);//初始化:设置16X2显示,5X7点阵,8位数据接口
delay(5); //延时5毫秒
write_com(0x38);//初始化:设置16X2显示,5X7点阵,8位数据接口
delay(5); //延时5毫秒
write_com(0x0f);//开显示,开光标,光标闪烁
delay(5);
write_com(0x07);//读写后地址指针和光标均加一,整屏显示左移
delay(5);
write_com(0x80);//数据指针初始化
*/
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
uchar key_scan()
{
uchar temp,hor,row;
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
if(temp != 0xf0)//扫描到按键动作
{
delay(5);
//开始进行列检查
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
if(temp != 0xf0)//确认有按键动作
{
temp = ~temp;
temp >>= 4; //列值在temp的低四位
switch(temp)//列值转换,并保存在row中
{
case 1 : row = 1; break;
case 2 : row = 2; break;
case 4 : row = 3; break;
case 8 : row = 4; break;
default: break;
}
//列检查结束
//开始进行行检查
P2 = 0x0f;
temp = P2;
temp = ~temp;
temp &= 0x0f;//行值在temp的低四位
switch(temp)//行值转换,并保存在hor中
{
case 1 : hor = 1; break;
case 2 : hor = 2; break;
case 4 : hor = 3; break;
case 8 : hor = 4; break;
default: break;
}
//行检查结束
//检查按键动作是否结束,否则程序在此等待
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
while(temp != 0xf0)
{
P2 = 0xf0;
temp = P2;
temp &= 0xf0;
}
//按键动作结束,程序往下进行
//计算键值并返回
return ((hor-1)*4 + row);
}
}
//没有按键动作,返回0;
return 0;
}
void main()
{
uchar key,char_seat,shi,ge;
init();
while(1)
{
key = key_scan();
if(key != 0)
{
shi = key/10;
ge = key%10;
if(char_seat==16) //第一行显示满格,进入第二行显示
{
write_com(0x80+0x40);
}
if(char_seat==32) //第二行显示满格,进行清屏,从第一行开始显示
{
char_seat=0;
write_com(0x01);
write_com(0x80);
}
if(shi!=0)
{
write_data(NumTable[shi]);
char_seat++;
}
write_data(NumTable[ge]);
char_seat++;
}
}
}
//测试结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -