1、让数码管前4位以0.5秒的速递从0-F循环,要求利用定时器实现定时。当按下独立键盘S2时数码管停止跑数,当松开S2时数码管继续跑数。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6; //段选锁存端
sbit wei=P2^7; //位选锁存端
sbit key=P3^0;
uchar num;tt;
uchar code tableduan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z){ //延时
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化位锁存端,前四位显示0,初始化定时器0
{
wei=1;
P0=0xf0;
wei=0;
duan=1;
P0=0x3f;
duan=0;
TMOD=0x01;
TH0=(65536-50000)/256; //50ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(key==0)
{
delay(5); //消抖
if(key==0) //按键按下
{
TR0=0; //关闭定时器0
}
}else{TR0=1;} //打开定时器0
}
}
void time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==10) //50*10=500ms
{
tt=0;
num++;
duan=1; //段锁存端打开
if(num<17)
{
P0=tableduan[num-1]; //0-F显示
}else{num=0;}
duan=0;
}
}
2、让后四位数码管以0.01秒(利用定时器)的速度从0显示到9999。按下S1开始跑数。按下S2停止跑数。按下S3数码管的数值从1(需要在停止跑数时执行才有效)。按下S4数码管的数值减1(需要在停止跑数时执行才有效)。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit duan=P2^6; //段选锁存端
sbit wei=P2^7; //位选锁存端
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
uchar tt;
uint num;
uchar code tableduan[]={ //段数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,};
uchar code tablewei[]={ //位数组
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(uint z){ //延时
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
P0=0xff; //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选 消隐
wei=1;
P0=tablewei[4];
wei=0;
duan=1;
P0=tableduan[num/1000]; //千位
duan=0;
delay(5); //视觉暂留
P0=0xff;
wei=1;
P0=tablewei[5];
wei=0;
duan=1;
P0=tableduan[num/100%10]; //百位
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=tablewei[6];
wei=0;
duan=1;
P0=tableduan[num/10%10]; //十位
duan=0;
delay(5);
P0=0xff;
wei=1;
P0=tablewei[7];
wei=0;
duan=1;
P0=tableduan[num%10]; //个位
duan=0;
delay(5);
}
void S1() //按键1
{
if(key1==0)
{
delay(5); //消抖
if(key1==0)
{
TR0=1; //定时器0打开数字跳动
while(!key1) //判断是否按键抬起
{
display(); //按下时保持显示
}
}
}
}
void S2() //按键2
{
if(key2==0)
{
delay(5);
if(key2==0)
{
TR0=0; //定时器0关闭数字停止跳动
while(!key2)
{
display();
}
}
}
}
void S3() //按键3
{
if(key3==0)
{
delay(5);
if(key3==0 && TR0==0)
{
num++; //停止时数字加1
while(!key3)
{
display();
}
}
}
}
void S4() //按键4
{
if(key4==0)
{
delay(5);
if(key4==0 && TR0==0)
{
num--; //停止时数字减一
while(!key4)
{
display();
}
}
}
}
void init() //定时器0初始化
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
}
void main()
{
init();
while(1)
{
S1();
S2();
S3();
S4();
display();
}
}
void time() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
if(tt==1) //0.1s
{
tt=0;
num++;
if(num>9999)
{
num=0;
}
}
}