?? 數碼管動態顯示.c
字號:
#include <REG51.H>
unsigned char code LEDDATA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff,0x8e,0x86};
//數碼管顯示的代碼表,后三個為滅燈、"F"、"E"
unsigned char code LEDBITDATA[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};
//數碼管掃描代碼表
unsigned char LEDBuffer[6]; //定義顯示緩沖區數組
unsigned char Second; //秒單元
unsigned char Minute; //分單元
unsigned char Hour; //時單元
unsigned char Beepflag; //定時響鈴標志
unsigned char Minuterom; //定時分單元
unsigned char Hourrom; //定時時單元
unsigned char SETFlag=0; //模式標志
unsigned char second_tick; //閃動標志
unsigned char Time; //超時計數
unsigned char ALMFlag; //定時開啟標志
sbit SET_KEY=P3^3; //模式鍵
sbit DOWN_KEY=P3^4; //加計數鍵
sbit UP_KEY=P3^5; //減計數鍵
sbit ALM_KEY=P3^2; //顯示定時時間按鍵
sbit Beep=P1^7; //蜂鳴器接口引腳
void init()
{ TMOD=0x01; //T0初始化方式1,定時
TH0=(65536-2000)/256; //TH0,TL0裝入定時2mS的初值
TL0=(65536-2000)%256;
TR0=1; //啟動T0工作
ET0=1; //允許T0溢出中斷
EA=1; //CPU開中斷
}
void Delay(unsigned int t) //延時子程序
{ while(t)t--;
}
void key() //鍵盤操作子程序
{ unsigned char i; //緩沖數組位數標志
char Num; //臨時數字,存儲數組合并值
if(SET_KEY==0) //判斷模式鍵是否按下
{ Delay(500); //去按鍵抖動
if(SET_KEY==0) //再判斷是否真得按下了
{ SETFlag++; //狀態改變
if(SETFlag==7) SETFlag=0; //返回正常模式
if(SETFlag==1) i=4; //調節讀取顯示數組的位數
if(SETFlag==2) i=2;
if(SETFlag==3) i=0;
if(SETFlag==4) i=4;
if(SETFlag==5) i=2;
if(SETFlag==6) i=0;
}
while(SET_KEY==0); //等按鍵釋放
}
if((UP_KEY==0)&&(SETFlag!=0)) //判斷加計數鍵是否按下
{
Delay(5000); //去按鍵抖動
if(UP_KEY==0) //再判斷是否真得按下了
{ Num=(LEDBuffer[i+1]*10+LEDBuffer[i]);
Num++; //時單元的數值加1
if(Num==60) Num=0; //加到60歸0
if((Num==24)&&((SETFlag==1)||(SETFlag==4))) Num=0; //加到24歸0
switch(SETFlag) //把修改值寫回
{ case 0: ;break;
case 1: Hour=Num;break;
case 2: Minute=Num;break;
case 3: Second=Num;break;
case 4: Hourrom=Num;break;
case 5: Minuterom=Num;break;
case 6: ALMFlag=!ALMFlag;break;
}
}
}
if((DOWN_KEY==0)&&(SETFlag!=0)) //判斷減計數鍵是否按下
{
Delay(5000); //去按鍵抖動
if(DOWN_KEY==0) //再判斷是否真得按下了
{ Num=(LEDBuffer[i+1]*10+LEDBuffer[i]);
Num--; //時單元的數值減1
if((Num<0)&&((SETFlag==1)||(SETFlag==4))) Num=23; //到24歸0
if((Num<0) )Num=59; //到60歸0
switch(SETFlag) //把修改值寫回
{ case 0: ;break;
case 1: Hour=Num;break;
case 2: Minute=Num;break;
case 3: Second=Num;break;
case 4: Hourrom=Num;break;
case 5: Minuterom=Num;break;
case 6: ALMFlag=!ALMFlag;break;
}
}
}
if(ALM_KEY==0)
{ SETFlag=0; //狀態返回
if(ALMFlag==0)LEDBuffer[0]=11; //根據鬧鈴狀態顯示F或者E
else LEDBuffer[0]=12; //將時,分,秒單元內容送入暫存區
LEDBuffer[1]=10; //關閉該數碼管顯示
LEDBuffer[2]=Minuterom%10;
LEDBuffer[3]=Minuterom/10;
LEDBuffer[4]=Hourrom%10;
LEDBuffer[5]=Hourrom/10;
if(ALMFlag==1)
{ Beep=1;
Beepflag=0;
}
}
}
void display(void) //顯示暫存區內容對應的代碼顯示
{ unsigned char LEDScanCount,i; //位選掃描計數器
P0=0xff; //適應仿真需要
if((UP_KEY==0)||(DOWN_KEY==0)) i=0x00; //加減鍵有操作放棄閃爍
else i = 0xff*second_tick; //設定閃爍變量
P2= LEDBITDATA[LEDScanCount]; //送出位選數據
switch(SETFlag)
{ case 0: P0=LEDDATA[LEDBuffer[LEDScanCount]];break; //送出段選數據
case 1: if(LEDScanCount>=4) //判斷出最高兩位
P0=i|LEDDATA[LEDBuffer[LEDScanCount]]; //使小時閃爍
else P0=LEDDATA[LEDBuffer[LEDScanCount]];break; //低位正常顯示
case 2: if((LEDScanCount==2)||(LEDScanCount==3)) //判斷出中間位
P0=i|LEDDATA[LEDBuffer[LEDScanCount]]; //使分鐘閃爍
else P0=LEDDATA[LEDBuffer[LEDScanCount]];break; //其他位正常顯示
case 3: if(LEDScanCount<=1)
P0=i|LEDDATA[LEDBuffer[LEDScanCount]];
else P0=LEDDATA[LEDBuffer[LEDScanCount]];break;
case 4: if(LEDScanCount>=4)
P0=i|LEDDATA[LEDBuffer[LEDScanCount]];
else P0=LEDDATA[LEDBuffer[LEDScanCount]];break;
case 5: if((LEDScanCount==2)||(LEDScanCount==3))
P0=i|LEDDATA[LEDBuffer[LEDScanCount]];
else P0=LEDDATA[LEDBuffer[LEDScanCount]];break;
case 6: if(LEDScanCount<=1)
P0=i|LEDDATA[LEDBuffer[LEDScanCount]];
else P0=LEDDATA[LEDBuffer[LEDScanCount]];break;
}
LEDScanCount++; //掃描指針加計數
if(LEDScanCount==6)LEDScanCount=0 ; //掃描完從頭開始;
}
void timer0_isr(void) interrupt 1
{ unsigned int SecondCount;
unsigned int timercp; //秒計數器
TH0=(65536-2000)/256; //TH0,TL0裝入定時2mS的初值
TL0=(65536-2000)%256;
display(); //調用顯示函數
timercp++;
if(SETFlag!=0) //10秒不操作自動返回
{ if((SET_KEY==0)||(UP_KEY==0)||(DOWN_KEY==0)) Time=0; //任意鍵有操作放棄計時
if (Time>=10){SETFlag=0;Time=0;}
}
if (timercp == 250)
{ timercp= 0;
second_tick = !second_tick; //設定0.5秒閃動一次
SecondCount++;
if(SecondCount==2) //1秒的時間
{ SecondCount=0; //計數器清零
Time++;
Second++; //時間的秒加1
if(Second==60)
{ Second=0; //秒清零
Minute++; //分進一
if(Minute==60)
{ Minute=0;
Hour++;
if(Hour==24)Hour=0; //小時清零
}
}
}
if(SETFlag<=3) //狀態模式小于3是加載時鐘時間
{ LEDBuffer[0]=Second%10;
LEDBuffer[1]=Second/10;
LEDBuffer[2]=Minute%10;
LEDBuffer[3]=Minute/10;
LEDBuffer[4]=Hour%10;
LEDBuffer[5]=Hour/10;
}
else //調整鬧鐘時間時加載鬧鐘時間
{ if(ALMFlag==0)LEDBuffer[0]=11; //顯示鬧鐘激活狀態
else LEDBuffer[0]=12;
LEDBuffer[1]=10; //關閉倒數第二位
LEDBuffer[2]=Minuterom%10;
LEDBuffer[3]=Minuterom/10;
LEDBuffer[4]=Hourrom%10;
LEDBuffer[5]=Hourrom/10;
}
}
}
void main(void)
{ init(); //初始化
while(1)
{ key(); //調用鍵盤
if(ALMFlag==1)
{ if(Minute!=Minuterom) Beepflag=1; //定時和現在不同,關閉蜂鳴器
if((Hour==Hourrom)&&(Minute==Minuterom)&&(Beepflag==1)) Beep=0;
//時分相同并鬧鈴打開就響鈴
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -