题目:用数码管的前两位显示一个十进制的数,00~59变化,开始显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再按下S5键,数值停止自动加1,保持显示原数。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint); //声明延迟函数
uchar numt0, num;
void display(uchar numdis)
//显示函数,display用的是numdis,实际调用display(num),把num带入替代numdis做说明用。keyscan函数一直用的num参数,num连接了keyscan()和display()。
{
uchar shi,ge;
shi=numdis/10;
ge=numdis%10;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
void delayms(uint xms) //延迟函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init() //初始化函数
{
TMOD=0x01; //设置定时器0为工作方式1 (0000 0001)
TH0=(65536-45872)/256; //装初值,50ms一次中断
TL0=(65536-45872)%256;
EA=1;
ET0=1;
//开总中断,开定时器0中断。是不是少一个启动定时器0 TR0=1?不是,因为这次不是直接开始中断执行的。在按一下时候,才开始显示/执行什么的,所以一开始没开中断。
}
//设置一个扫描函数,把4种按键的情况都在这里进行说明,主函数直接调用该keyscan()函数就好了,用的就是num所以不用加参数。按键延迟10ms,再判断按键==0情况。
void keyscan()
{
if(key1==0) //按下key1的时候,num++,数字不断+1,判断num=60时候置为0。
{
delayms(10);
if(key1==0)
{
num++;
if(num==60) //当到60时重新归0
num=0;
while(!key1);
//等待按键释放。按键释放后才去执行相应的代码,而不是检测到按键就执行。
}
}
if(key2==0) //按下key2的时候,num--,数字不断-1,判断num=0时候置为60
{
delayms(10);
if(key2==0)
{
if(num==0) //当到0时重新归60
num=60;
num--;
while(!key2);
}
}
if(key3==0) //按下key3的时候,num=0 清零
{
delayms(10);
if(key3==0)
{
num=0;
while(!key3);
}
}
if(key4==0) //按下key4的时候,把TR0取反,也就是开始/结束自动计时功能。
{
delayms(10);
if(key4==0)
{
while(!key4);
TR0=~TR0; //启动或停止定时器0
}
}
}
void main() //主函数,很简单,一个初始化函数,一个while循环,不断的调用keyscan和display就好了。把任务分解成2大块,第一块是数码管显示一个两位数;第二块是按键操作导致的值的变化情况讨论。
{
init();
while(1)
{
keyscan();
display(num);
}
}
void T0_time() interrupt 1 //设置一个中断定时器,T0定时器, 1s为单位计数;生成的数num在00-59间循环。
{
TH0=(65536-45872)/256; //装初值
TL0=(65536-45872)%256;
numt0++;
if(numt0==20)
{
numt0=0;
num++;
if(num==60)
num=0;
}
}