一,现象描述:(1)秒钟可以正常读数(2)S1按键需要长按3秒才可以停止读秒和开始读秒,我需要一按下松开,就停止和开始。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sdi=P1^0;//定义595数据输入口
sbit lck=P1^4;//定义595数据位移缓存器并行输出时钟
sbit sck=P2^3;//定义595数据存入缓存器时钟
sbit rs=P2^5; //段选
sbit rw=P2^6; //位选
sbit s1=P3^7;
sbit s2=P3^6;
sbit s3=P3^5;
sbit s4=P3^4;
sbit lcden=P2^4;
uchar code table[]=" 2020-11-29 Sat.";
uchar code table1[]=" 23:59:55 ";
uchar temp,flag,shi,fen,miao,s1num;//temp定数计数器变量,flag开启中断标志位
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--)
{
}
}
}
void delay1(uint z)
{
uchar x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
{
}
}
void write_595(uchar date2)
{
uchar i;
sck=0;
for(i=0;i<8;i--)
{
lck=0;
sdi=(date2<<i)&0x80;
lck=1;
}
sck=1;
sdi=1;
}
void write_com(uchar com)//写指令子函数
{
rs=0;
rw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)//写数据子函数
{
rs=1;
rw=0;
P0=date;
delay(500);
lcden=1;
delay(500);
lcden=0;
}
void write_sfm(uchar add,uchar date3)
{
uchar shi,ge;//分离用变量
shi=date3/10;
ge=date3%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
write_com(0x80+0x40+14);//光标换行,为时钟输入:
write_data(0x20+0);
delay(5);
write_com(0x80+0x40+15);//光标换行,为时钟输入:
write_data(0x20+0);
delay(5);
write_com(0x80+0x40+16);//光标换行,为时钟输入:
write_data(0x20+0);
delay(5);
}
/*void delete()
{
write_com(0x80+0x40+14);//光标换行,为时钟输入:
write_data(0x20+0);
delay(5);
write_com(0x80+0x40+15);
write_data(0x20+0);
delay(5);
write_com(0x80+0x40+16);
write_data(0x20+0);
delay(5);
}*/
void init()//初始化函数
{
uchar num;
lcden=0;
write_595(0x40);
write_com(0x38);//设置显示屏
write_com(0x0c);//开启显示屏以及设置光标开启且闪烁
write_com(0x80);//设置光标位置为0
write_com(0x06);//设置光标书写后右移一位
write_com(0x01);//清除显示屏原有数据
EA=1;//打开总中断
TMOD=0x01;//定时计数器工作方式为8位移位计数器
ET0=1;//打开定时计数定时计数器中断;
TR0=0;//打开定数计数器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
temp=1;
s1num=0;
shi=23;
fen=59;
miao=55;
for(num=0;num<16;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40+7);//光标换行,为时钟输入:
write_data(':');
delay(5);
write_com(0x80+0x40+10);
write_data(':');
delay(5);
/* for(num1=0;num1<12;num1++)
{
write_data(table1[num1]);
delay(5);
}
*/
/* write_com(0x01);//显示屏清零
write_com(0x80);//写指针位置
write_com(0x0c);//开启显示屏显示
write_com(0x0a);//开启光标显示
write_com(0x09);//开启光标闪烁
write_com(0x06);*/
}
void display()
{
write_sfm(5,shi);
write_sfm(8,fen);
write_sfm(11,miao);
}
void keyscan()
{
if(s1==0)
{
delay1(10);
if(s1==0)
{
s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
}
if(s1num==2)
{
s1num=0;
TR0=1;
}
}
}
}
void main()
{
init();
TR0=1;
while(1)
{
keyscan();
display();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
temp++;
if(temp==20)
{
temp=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(5,shi);
}
write_sfm(8,fen);
}
write_sfm(11,miao);
}
}