數碼管顯示,按鍵控制秒表
中斷鍵控制,數碼管顯示,中斷0控制定時和停止,中斷1復位。
- */
# include & ltreg52.h & gt//包含頭文件,壹般不需要更改。頭文件包含特殊功能寄存器的定義。
無符號整數秒;//定義全局變量
位GoFlag//定義停止和計時標誌
#define DataPort P0 //如果在數據端口定義程序中遇到壹個數據端口,它將被P0替換。
sbit latch1=p2^2;//定義鎖存使能端口段鎖存。
sbit latch2=p2^3;//位鎖存
無符號char碼dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };//顯示段代碼值0~9。
無符號char codedofly _馬薇[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f };//對應的數碼管分別亮起,即位碼。
無符號字符TempData[8];//存儲顯示值的全局變量。
void DelayUs2x(無符號char t);//函數聲明
void DelayMs(無符號字符t);
void顯示(無符號字符FirstBit,無符號字符Num);
void Init _ timer 0(void);
void CLR(void);
/* -
主要功能
- */
無效總管(無效)
{
無符號字符數= 0;
EX0 = 1;//外部中斷0開啟
IT0 = 1;//IT1=0表示邊沿觸發。
ex 1 = 1;//外部中斷1開啟
it 1 = 1;//IT1=1表示邊沿觸發。
init _ timer 0();
While (1) //主循環
{
TempData[0]= do fly _ DuanMa[秒/10];//分解顯示信息。如果要顯示68,則68/10=6 68%10=8。
TempData[1]= do fly _ DuanMa[秒% 10];
//在主循環中加入其他需要壹直工作的程序。
}
}
/* -
顯示功能,用於動態掃描數碼管。
輸入參數FirstBit表示要顯示的第壹位。例如,賦值2表示顯示從第三個數碼管開始。
如果輸入0,則表示從第壹次顯示開始。
Num表示要顯示的位數。如果需要顯示99個兩位數的值,請為該值輸入2。
- */
void顯示(無符號字符FirstBit,無符號字符Num)
{
靜態無符號字符I = 0;
數據端口= 0;//清除數據以防止交替重影。
latch 1 = 1;//段鎖存
latch 1 = 0;
DataPort = dofly _馬薇[I+first bit];//訪問代碼
latch 2 = 1;//位鎖存
latch 2 = 0;
data port = TempData[I];//獲取顯示數據和段代碼。
latch 1 = 1;//段鎖存
latch 1 = 0;
i++;
if(i==Num)
I = 0;
}
/* -
定時器初始化子程序
- */
void Init_Timer0(void)
{
TMOD | = 0x 01;//使用1和16位定時器,使用多個定時器時使用“|”符號不受影響。
//TH0 = 0x 00;//給定初始值
//TL0 = 0x 00;
EA = 1;//總中斷打開
ET0 = 1;//定時器中斷打開
TR0 = 1;//定時器開關打開
}
/* -
定時器中斷子程序
- */
無效定時器0_isr(無效)中斷1
{
靜態無符號字符數;
TH0 =(65536-20000)/256;//重新分配20毫秒的值
TL0 =(65536-20000)% 256;
顯示(0,8);
if(GoFlag)
{
num++;
如果(數量==5)
第二個++;//秒加1
if(秒==10)
秒= 0;
}
}
/* -
外部中斷0程序
- */
void ISR_INT0(void)中斷0
{
GoFlag=!GoFlag//使用外部中斷來打開和關閉開始和停止計時的計時標誌。
}
/* -
外部中斷1程序
- */
void ISR_INT1(void)中斷2
{
If(GoFlag==0)//只有停止時才能清零。
CLR();
}/* -
數字結算
- */
void CLR(無效)
{
秒= 0;//通過外部中斷清除
ms second = 0;
}