实现秒表计数功能,使用定时器和外部中断实现。8号按键代表计时开始/结束,C号按键代表重置为0,为了演示方便,这里上限定为15秒。
代码中有详细的注释:
#include <reg52.h> sbit WEI=P2^7; sbit DUAN=P2^6; sbit L1=P3^4; unsigned char code dofly_DuanMa[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 void delay(int t) { while(t--); } //第一个参数i代表控制第几个数码管,n代表要显示的数字 void Screen(int i,int n) { P0=0; DUAN=1; DUAN=0; P0=dofly_WeiMa[i]; WEI=1; WEI=0; P0=dofly_DuanMa[n]; DUAN=1; DUAN=0; } int sec; int num; int i; int flag; int main() { flag=1; i=0; num=0; sec=0; WEI=0; DUAN=0; //开中断 EX0=1; IT0=1; EX1=1; IT1=1; //定时器初始化 TMOD |= 0x01; EA=1; ET0=1; TR0=1; L1=0; while(1) { if(num>=10) Screen(3,num/10); Screen(4,num%10); delay(10); Screen(5,10); Screen(6,sec/10); Screen(7,sec%10); } return 0; } void Timer_0() interrupt 1 using 1 { TH0=(65536-10000)/256; TL0=(65535-10000)%256; if(flag==1) { i++; sec++; if(sec==100) //0.1ms sec=0; if(i==101)//1s { i=0; num++; if(num==15) num=0; } } } void ACTION1() interrupt 0 { flag=!flag; } void ACTION2() interrupt 2 { if(flag==0) { Screen(7,0); num=0; sec=0; } }
时间: 2024-12-31 03:33:20