📄 液晶.c
字号:
#include<reg51.h> //头文件
#define uchar unsigned char //定义uchar为无符号字符型
#define uint unsigned int //定义uchar为无符号字符型
sbit rs=P3^4; //定义液晶数据/指令选择端rs为P3口位4
sbit r_w=P3^5; //定义液晶读/写选择端r_w为P3口位5
sbit lcden=P3^3; //定义液晶使能控制端lcden为P3口位3
sbit s1=P3^0; //定义功能按键为P3口位0
sbit s2=P3^1; //定义加数按钮为P3口位1
sbit s3=P3^2; //定义减数按钮为P3口位2
sbit s4=2^7;
uchar count,s1num; //定义无符号字符变量,slnum为功能键按下次数,1设置秒,2设置分,3设置时,4跳出设置
char shi,fen,miao; //定义字符型变量
uchar code table[]=" 2008-7-24 MON"; //显示的数组table
uchar code table1[]=" 00:00:00"; //显示的数组table1
void delay(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//写液晶指令(参考时序图)
{
rs=0; // 数据/指令选择端rs低电平,写指令
lcden=0;//为允许写做准备,拉低电平
P1=com;//显示所写指令的功能
r_w=0; //选择写功能
delay(5);//延迟5ms,有充足时间给使能端
lcden=1;// 使能端lcden高电平,允许写进
delay(5);//延迟5ms,有充足时间
lcden=0;//写指令完成
}
void write_date(uchar date)//写液晶数据(参考时序图)
{
rs=1; // 数据/指令选择端rs低电平,写数据
lcden=0;//为允许写做准备,拉低电平
P1=date;//显示所写数据
r_w=0;//选择写功能
delay(5);//延迟5ms,有充足时间给使能端
lcden=1;// 使能端lcden高电平,允许写进
delay(5);//延迟5ms,有充足时间给使能端
lcden=0;//写指令完成
}
void init()//初始化液晶(液晶说明书)
{
uchar num;//循环时需要的变量
lcden=0;//使能端lcden高电平,不允许写进
write_com(0x38);//显示模式设置,设置16*2,5*7点阵,8位数据接口
write_com(0x0c);//显示开/关及光标设置,设置为,D=1开显示,C=0不显示光标,B=0光标不显示
write_com(0x06);//显示光标移动设置,写一个字符后地址指针加一,且光标加一
write_com(0x01);//显示清屏
write_com(0x80);//数据指针设置80H(地址码0-27H,40H-67H),默认的
for(num=0;num<15;num++)//把table的16个字符逐位写进第一行
{
write_date(table[num]);//写数据
delay(5);
}
write_com(0x80+0x40);//把table1的12个字符逐位写进第二行
for(num=0;num<12;num++)
{
write_date(table1[num]);//写数据
delay(5);
}
TMOD=0x01;//定时器为方式一
TH0=(65536-50000)/256;//50ms的高8位初值
TL0=(65536-50000)%256;//50ms的低8位初值
EA=1;//允许开总中断
ET0=1;//允许定时器0开中断
TR0=1;//定时器0开始计时
}
void write_sfm(uchar add,uchar date)//显示数据程序
{
uchar shi,ge; //定义个位,十位变量
shi=date/10;//取数据十位
ge=date%10;//取数据个位
write_com(0x80+0x40+add);//写指令,将要写数据的地址
write_date(0x30+shi);//写数据十位,参考说明书
write_date(0x30+ge);//写数据个位,参考说明书
}
void keyscan()//按键扫描
{
if(s1==0)//功能键s1按下
{ s4=0;//s4键没用
delay(5);//按键抖动
if(s1==0)//再次确定s1按下
{ s1num++;//Slnum为功能键按下次数,1设置秒,2设置分,3设置时,4跳出设置
while(!s1);//按键松手
if(s1num==1)//1设置秒
{
TR0=0;//停止计时
write_com(0x80+0x40+10);//写秒地址指令,第二行10
write_com(0x0f);//显示开/关及光标设置,设置为,D=1开显示,C=1显示光标,B=1光标显示
}
if(s1num==2)//2设置分,不用设置显示开/关及光标设置,上面已经设置
{
write_com(0x80+0x40+7);//写分地址指令,第二行7
}
if(s1num==3)//3设置时
{
write_com(0x80+0x40+4);//写时地址指令,第二行4
}
if(s1num==4)//4跳出设置
{
s1num=0;//清零
write_com(0x0c);//显示开/关及光标设置,设置为,D=1开显示,C=0不显示光标,B=0光标不显示
TR0=1;//开始计时
}
}
}
if(s1num!=0)//确定s1按下,判断其它按键是否按下
{
if(s2==0)//判断s2加数按键是否按下
{
delay(5);//去抖动
if(s2==0);//确定s2按下
while(!s2); //按键松手
if(s1num==1)//slnum==1设置秒
{
miao++;//miao变量按一次加1
if(miao==60)//如果秒为60,miao为零
miao=0;
write_sfm(10,miao);//显示数据程序,10为0x80+0x40+10地址,miao为显示的数据
write_com(0x80+0x40+10);//写完后指针会指到11,所以要写会10,保持光标不变
}
if(s1num==2)//slnum==2设置分
{
fen++;//fen变量按一次加1
if(fen==60)//如果分为60,fen为零
fen=0;
write_sfm(7,fen);//显示数据程序,7为0x80+0x40+7地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -