液晶显示时钟文档格式.docx
《液晶显示时钟文档格式.docx》由会员分享,可在线阅读,更多相关《液晶显示时钟文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
sbiten=P3^4;
//使能信号控制端
sbitrs=P3^5;
//数据/命令选择端(H/L)
sbitrw=P3^6;
//读/写控制端(H/L)
//定义开发板上的四个独立按键所接的IO口
sbits2=P3^0;
//每按一次分加1
sbits3=P3^1;
//每按一次分减1
sbits4=P3^2;
//每按一次时加1
sbits5=P3^3;
//每按一次时减1
sbitp3_7=P3^7;
//让其置0时,s9、s13、s17、s21相当于独立按键
ucharcount;
//定义无符号字符型数据“count”,用于计数20次达到20*50ms=1s
uintshi,fen,miao,shis,shig,fens,feng,miaos,miaog;
//定义时、分、秒以及时、分、秒的十位和个位
/******************************I2C总线子程序*********************************/
voiddelay3()
{;
;
}
voidstart()//起始信号,SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号
{
sda=1;
delay3();
scl=1;
sda=0;
}
voidstop()//终止信号,SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
{
voidrespons()//应答信号,每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),
//每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
uchari;
while((sda==1)&
&
(i<
250))i++;
scl=0;
voidinit1()
voidwrite_byte(uchardate)
uchari,temp;
temp=date;
for(i=0;
i<
8;
i++)
{
temp=temp<
<
1;
scl=0;
//只有在时钟线上的信号为低电平期间,数据才允许变化。
sda=CY;
delay3();
scl=1;
//时钟信号为高电平期间,数据线上的数据必须保持稳定
ucharread_byte()
uchari,k;
k=(k<
1)|sda;
returnk;
voiddelay4(ucharx)
uchara,b;
for(a=x;
a>
0;
a--)
for(b=100;
b>
b--);
//单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),
//发送完后释放SDA线并在SCL线上产生第9个时钟信号
//被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,
//单片机收到应答后就可以传送数据了
voidwrite_add(ucharaddress,uchardate)
start();
write_byte(0xa0);
//AT24C系列E2PROM芯片地址的固定部分为1010,开发板上的A2、A1、A0引脚接低
//电平所以形成的7位编码即为该器件的地址码a0。
respons();
write_byte(address);
write_byte(date);
stop();
//单片机先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放
//SDA线并在SCL线上产生第9个时钟信号。
被选中的存储器器件在确认是自己
//的地址后,在SDA线上产生一个应答信号作为回应。
然后,再发一个字节的
//要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并
//发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节
ucharread_add(ucharaddress)
uchardate;
write_byte(0xa1);
date=read_byte();
returndate;
/***********************************************************************************/
//延时子程序1用于读写操作时序图上的的短暂延时
voiddelay1(uintz)
uintx,y;
for(x=z;
x>
x--)
for(y=10;
y>
y--);
//延时子程序2用于控制整屏移动速度的快慢
voiddelay2(uintz)
//写指令子程序
voidwrite_com(ucharcom)
P0=com;
//将命令传至P0口
rs=0;
//写的是命令故将其置零
en=0;
//根据写操作时序图,传命令前en=0
delay1(10);
//根据写操作时序图,延时一小会
en=1;
//en=1时开始传输命令
//延时一会待命令传完
//命令传完再将其置0
//写数据子程序
voidwrite_date(uchardate)
P0=date;
//将数据传至P0口
rs=1;
//写的是数据故将其置1
//根据写操作时序图,传数据前en=0
//en=1时开始传输数据
//延时一会待数据传完
//数据传完再将其置0
//液晶初始化子程序
voidinit()
p3_7=0;
//让其置0时,s9、s13、s17、s21相当于独立按键
P0=0;
//P0初始化为0
dula=0;
//防止将数据传到数码管
wela=0;
rw=0;
//程序牵涉写操作没有读操作,直接置0
write_com(0x38);
//设置16*2显示模式
delay1(20);
//传完命令适当延时一会
write_com(0x0c);
//设置开显示、不显示光标
delay1(20);
write_com(0x06);
//当读或写一个字符后地址指针加1,且光标加1
//write_com(0x01);
//显示清屏去掉这条指令后屏幕就不会出现闪烁现象
//显示子程序
voiddisplay()
uchara,b,c;
init();
write_com(0x80+5);
//选择数据地址指针
for(a=0;
a<
a++)//一共要显示8位,所以写八次
write_date(table1[table2[a]]);
//在第一行显示时钟
voidprocess()//时、分、秒处理子程序
table2[7]=miao%10;
table2[6]=miao/10;
table2[4]=fen%10;
table2[3]=fen/10;
table2[1]=shi%10;
table2[0]=shi/10;
//定时器中断函数,定时50ms,每隔1秒,miao++;
voidtimer0()interrupt1using1
count++;
//每50ms,count就+1
if(count==20)//当count=20时即计数到1s的时候执行if大括号内的语句
{
count=0;
miao++;
if(miao==60)
{
miao=0;
//当到60秒的时候,分+1,同时秒从0重新开始计时
fen++;
if(fen==60)
fen=0;
//当到60分的时候,时+1,同时分从0重新开始计时
shi++;
if(shi==12)
shi=0;
//当到12小时的时候,时从0重新开始计
}
}
}
TH0=0x3c;
//到了50ms后重新装入初值
TL0=0xb0;
voidkey()//按键判断子程序
if(s2==0)//判断s2是否按下键盘
delay2(100);
//延时,软件消抖
if(s2==0)//确认按键按下
fen++;
//分加1
if(fen==60)//加到60时返回0继续加
}
while(s2==0);
//等待按键放开.即每按一次只加1
if(s3==0)//判断s3是否按下键盘
{
delay2(100);
if(s3==0)//确认按键按下
{
fen--;
//分减1
if(fen==-1)//减到0时返回60继续减
fen=60;
}
while(s3==0);
if(s4==0)//判断s4是否按下键盘
if(s4==0)//确认按键按下
shi++;
//时加1
if(shi==12)//加到12时返回0继续加
shi=0;
while(s4==0);
}
if(s5==0)//判断s2是否按下键盘
if(s5==0)//确认按键按下
shi--;
//时减1
if(shi==-1)//减到0时返回12继续减
shi=12;
while(s5==0);
}
//主函数
voidmain()
init1();
miao=read_add(23);
//读秒
delay4(100);
fen=read_add(24);
//读分
shi=read_add(25);
//读时
//将矩阵键盘的这个接口一直呈低电平后s9、s13、s17、s21相当于独立按键
TMOD=0x01;
//选择T0定时器工作方式1
ET0=1;
//开中断
EA=1;
//开总中断
//设置初值,定时50ms
TR0=1;
//开启计数
while
(1)
process();
//调用时、分、秒处理子程序
key();
//调用键盘扫描子程序
display();
//调用液晶显示子程序
write_add(23,miao);
//保存秒
delay4(100);
write_add(24,fen);
//保存分
write_add(25,shi);
//保存时