1. 程式人生 > 其它 >微控制器:按秒計時 進入程式自動開始計時 K2暫停 K1繼續 K3重新開始

微控制器:按秒計時 進入程式自動開始計時 K2暫停 K1繼續 K3重新開始

#include<reg51.h>
#define uchar unsigned char;
#define uint unsigned int;
uchar position;           
uchar tt;             
uint second;       
uchar minute;
uchar hour;    
uint bz=0,bza=0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//?--9
sbit smg_q = P2^0;  //數碼管?
sbit smg_b = P2^1; 
sbit smg_s 
= P2^2; sbit smg_g = P2^3; sbit key1=P3^2; //開關 sbit key2=P3^3; sbit key3=P3^4; sbit key4=P3^5; void keyscan(); //檢查是否按鍵,開啟 暫停 K1繼續 K2暫停 K3 重新開始 void display(unsigned int second);//顯示時分 void delay(unsigned int timer);//延時 void init(); //初始化 void main() { tt=0; init();
while(1) { if(tt==20) { tt=0; second++; } keyscan(); display(second); delay(1); } } void keyscan() { if(key1==0) //如果按鍵1 { //TR0=0; TR0=1; } if(key2==0) // ??? { TR0=0;
//TR0=1; } if(key3==0) // ??? { tt=0; init(); TR0=1; //TR0=1; } } void init() { //tt=0; position=0; second=0; minute=0; hour=0; smg_q=1; smg_b=1; smg_s=1; smg_g=1; key1=1; key2=1; TMOD=0X01; TH0=0x4c; TL0=0x00; EA=1; ET0=1; TR0=1; } void t0() interrupt 1//中斷服務程式:0為外部中 0 ,1定時器0,2外部中斷1,3定時器1,4序列中斷 { TH0=0x4c; TL0=0x00; //TH0=(65536-50000)/256; //定時器T0重新賦值:0X3C //TL0=(65536-50000)%256;//0XB0 15536轉成16進製為:3CB0 tt++; } void display(unsigned int second) { P0=0XFF; switch(position) { case 0: smg_g=1; smg_q=0; P0=table[second/1000]; break; case 1: smg_q=1; smg_b=0; P0=table[(second-second/1000*1000)/100]; //if(tt>=10) //P0&=0xff; //第二數碼管右下角的點(0x7f) break; case 2: smg_b=1; smg_s=0; P0=table[(second-second/100*100)/10]; break; case 3: smg_s=1; smg_g=0; P0=table[(second-second/100*100)%10]; if(tt>=10) P0&=0x7f; //第二數碼管右下角的點(0x7f) break; } position++; if(position>3) position=0; } void delay(unsigned int time) { unsigned int x,y; for(x=time;x>0;x--) for(y=110;y>0;y--); }