51微控制器按鍵控制數碼管加減和秒錶
阿新 • • 發佈:2018-12-24
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit k1=P3^4; sbit k2=P3^5; sbit k3=P3^6; sbit k4=P3^7; sbit du=P2^6; sbit we=P2^7; uchar counter,num; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };//數碼管的段選 uchar code list[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數碼管的位選 void delay_ms(uint ms) { uint i; uint j; for(i=0;i<ms;i++); for(j=0;j<200;j++); } void display(uchar i) { uchar shi,ge; shi = i / 10; //取十位 ge = i % 10; //求餘,取各位 P0 = 0xff; we = 1; P0 = list[0]; //點亮第一位數碼管 we = 0; du = 1; P0 = table[shi]; du = 0; delay_ms(1); P0 = 0xff; we = 1; P0 = list[1];//點亮第二位數碼管 we = 0; du = 1; P0 = table[ge]; du = 0; delay_ms(1); } void init() { TMOD=0x10; TH1=(65535-45827)/256; TL1=(65535-45827)%256; //定時50ms //TR1=1; //啟動定時器 } void key() { if(k1==0) { delay_ms(10); if(k1==0) { num++; if(num==60) num=0; while(!k1); //等待按鍵釋放 } } if(k2==0) { delay_ms(10); if(k2==0) { if(num==0) num=60; num--; while(!k2); //等待按鍵釋放 } } if(k3==0) { delay_ms(10); if(k3==0) { num=0; while(!k3); //等待按鍵釋放 } } if(k4==0) { delay_ms(10); if(k4==0) { init(); TR1=1; while(1) { if(TF1==1) { TF1=0; TH1=(65535-45827)/256; TL1=(65535-45827)%256; //定時50ms counter++; } if(counter==20) { counter=0; num++; } if(num==60) { num=0; } display(num); } } } } void main() { init(); while(1) { key(); display(num); } }