📄 timer02.c
字号:
/* 程序能够正常运行,问题出现在keyscan()函数s2和s3的级数弄错了*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar s1num=0;
uchar count;
char shi=23,fen=58,miao=25;
uint i;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
uchar code table[]=" dianzishizhong";//第一行显示
uchar code table1[]=" 23:58:25";//第二行 共12个字符,地址从零开始计0~11
/*液晶内延时函数*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*1602液晶写指令初始化,条件是rs为低电平,E为高脉冲*/
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;//写入指令
delay(5);//延时5ms
lcden=1;
delay(5);
lcden=0;
}
/*1602液晶写数据初始化,条件是rs为高电平电平,E为高脉冲*/
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;//写入指令
delay(5);//延时5ms
lcden=1;
delay(5);
lcden=0;
}
/*初始化液晶1602,说明书上有初始化设置,设置液晶的显示方式*/
void init()
{
lcden=0;
write_com(0x38);//显示模式设置,设置为16*2,5*7点阵,8位数据接口
write_com(0x0c);//开显示,不显示光标,光标不显示。
write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1。
write_com(0x01);//刷新,数据指针清零、所有显示清零,不写的话刚显示会有一个黑团
write_com(0x80);//初始化地址,默认地址80H从第二行开始显示write_com(0x80+0x40h)
TMOD=0x01;
TH0=(65536-50000)/256;//12mhZ
TL0=(65536-50000)%256;//50MS
EA=1;
ET0=1;
TR0=1;
for (i=0;i<=15;i++)
write_date(table[i]);
write_com(0x80+0x40);
for(i=0;i<12;i++)
write_date(table1[i]);
}
void write_sfm(uchar add ,uchar date)//时分秒函数,add为地址变量,date为写入的时分秒
{
uchar shi ,ge;
shi=date/10;
ge=date%10;//分离date时分秒的十位和个位用数码管也得分离
write_com(0x80+0x40+add);//时分秒的地址
write_date(0x30+shi);//跟据acs码,先送十位
write_date(0x30+ge);
}
/*键盘扫描函数,s1是一级,s2和s3是一级的比S1第一级*/
void keyscan()
{
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!s1);
switch(s1num)
{
case 1:
{
write_com(0x80+0x40+11);
write_com(0x0f);
TR0=0;
} break;
case 2:
{
write_com(0x80+0x40+8) ;
write_com(0x0f);
TR0=0;
} break;
case 3:
{
write_com(0x80+0x40+5);
write_com(0x0f);
TR0=0;
} break;
default:
{
write_com(0x0c);
TR0=1;
}
}
}//s1键被按下
}
if(s1num!=0)
{
if(s2==0)//第二个键被按下,让时或分或秒加一
{
while(!s2);//等待松手
if(s1num==1)//秒针按下
{
miao++;
if(miao==60) miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);//驳回指针
}
if(s1num==2)
{
fen++;
if(fen==60) fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)//小时
{
shi++;
if(shi==24) shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
/*时分秒减*/
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1) miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1) fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1) shi=59;
write_sfm(4,fen);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)//1s
{
count=0;
miao++;
if(miao==60)// 判断秒是否到达60
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if (shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);//根据table1[]中秒的十位的地址
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -