//采用8位數碼管動態顯示程序
//使用AT89C51單片機,12MHz晶振,P0輸出字段碼,P2口輸出位選碼
//用共陽極LED數碼管,key0為調時分位選擇鍵,key1為加1鍵,key2為減1鍵,key3為確定鍵
#include "reg51.h"
//包含頭文件
#define char unsigned char
//定義無符號字符型
char code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//共陽極LED數碼管"0~9","-"的字段碼
char code scan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//位選擇碼
char data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//顯示緩沖區,時、分、秒初始為0,0x0b為"-"的編碼
char data timedata[3]={0x00,0x00,0x00};
//分別為秒、分和小時的值
char data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
//定義四個按鍵
//1ms延時函數
delay1ms(int t)
{
int i,j;
for (i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
//按鍵處理函數
keyscan()
{
EA=0;
//關總中斷
if (key0==0) //判斷第一個按鍵是否按下
{
delay1ms(10);
//按鍵消抖
while (key0==0);
//再次判斷按鍵是否按下
con++;
TR0=0;
ET0=0;
//關定時/計數器,關T0中斷
if (con>=3)
{
con=0;
TR0=1;
ET0=1;
}
}
if (con!=0)
{
if (key1==0)
//如果第二個按鍵按下
{
delay1ms(10);
while (key1==0);
timedata[con]++;
//加一功能
if (con==2)
con1=24;
else con1=60;
if (timedata[con]>=con1)
{timedata[con]=0;}
}
}
if (con!=0)
{
if (key2==0)
//如果第三個按鍵按下
{
delay1ms(10);
while (key2==0);
timedata[con]--;
//減一功能
if (con==2)
con2=23;
else con2=59;
if (timedata[con]<=0)
{
timedata[con]=con2;
}
}
}
if(key3==0)
//如果第四個按鍵按下
{
delay1ms(10);
while(key3==0);
EA=1;
TR0=1;
ET0=1;
}
EA=1;
//開總中斷
}
//數碼管顯示函數
scan()
{
char k;
dis[0]=timedata[0]%10;
dis[1]=timedata[0]/10;
dis[3]=timedata[1]%10;
dis[4]=timedata[1]/10;
dis[6]=timedata[2]%10;
dis[7]=timedata[2]/10;
for (k=0;k<8;k++)
{
P0=dis_7[dis[k]];
P2=scan_con[k];
delay1ms(1);
P2=0x00;
}
}
//主函數
main()
{
TH0=0x3c;
TL0=0xb0;
TMOD=0x01;
//選擇工作方式1
ET0=1;
TR0=1;
EA=1;
while (1)
{
scan();
//調用數碼管顯示scan()子函數
keyscan();
//調用按鍵處理keyscan()子函數
}
}
//定時器/計數器T0中斷服務函數
void time_intt0(void) interrupt 1
{
ET0=0;
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ms50++;
if (ms50==20)
{
ms50=0x00;
timedata[0]++;
if (timedata[0]==60)
{
timedata[0]=0;
timedata[1]++;
if (timedata[1]==60)
{
timedata[1]=0;
timedata[2]++;
if (timedata[2]==24)
{
timedata[2]=0;
}
}
}
}
ET0=1;
//開T0中斷
}
|