VHDL語言是一種用于電路設(shè)計的高級語言。它在80年代的后期出現(xiàn)。最初是由美國國防部開發(fā)出來供美軍用來提高設(shè)計的可靠性和縮減開發(fā)周期的一種使用范圍較小的設(shè)計語言 。
VHDL翻譯成中文就是超高速集成電路硬件描述語言,主要是應(yīng)用在數(shù)字電路的設(shè)計中。它在中國的應(yīng)用多數(shù)是用在FPGA/CPLD/EPLD的設(shè)計中。當(dāng)然在一些實力較為雄厚的單位,它也被用來設(shè)計ASIC。
VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式、描述風(fēng)格以及語法是十分類似于一般的計算機高級語言。VHDL的程序結(jié)構(gòu)特點是將一項工程設(shè)計,或稱設(shè)計實體(可以是一個元件,一個電路模塊或一個系統(tǒng))分成外部(或稱可視部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實體的內(nèi)部功能和算法完成部分。在對一個設(shè)計實體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其他的設(shè)計就可以直接調(diào)用這個實體。這種將設(shè)計實體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計的基本點。
本文為大家?guī)韛hdl數(shù)碼管中的倒計時程序介紹
實現(xiàn)功能
按下啟動暫停按鍵時,倒計時開始工作,再按一次啟動暫停按鍵時,則暫停倒計時。在任何時候,按下復(fù)位按鍵,倒計時將暫停工作,并且恢復(fù)倒計時當(dāng)前默認(rèn)值99。
源代碼
源代碼講解如下:
#include “REG52.H”
#define const_voice_short 40 //蜂鳴器短叫的持續(xù)時間
#define const_voice_long 200 //蜂鳴器長叫的持續(xù)時間
#define const_key_time1 20 //按鍵去抖動延時的時間
#define const_key_time2 20 //按鍵去抖動延時的時間
#define const_dpy_time_half 200 //數(shù)碼管閃爍時間的半值
#define const_dpy_time_all 400 //數(shù)碼管閃爍時間的全值 一定要比const_dpy_time_half 大
/* 注釋一:
* 如何知道1秒鐘需要多少個定時中斷?
* 這個需要編寫一段小程序測試,得到測試的結(jié)果后再按比例修正。
* 步驟:
* 第一步:在程序代碼上先寫入1秒鐘大概需要200個定時中斷。
* 第二步:把程序燒錄進單片機后,上電開始測試,手上同步打開手機里的秒表。
* 如果單片機倒計時跑完了99秒,而手機上的秒表才走了45秒。
* 第三步:那么最終得出1秒鐘需要的定時中斷次數(shù)是:const_1s=(200*99)/45=440
*/
#define const_1s 440 //大概一秒鐘所需要的定時中斷次數(shù)
void initial_myself();
void initial_peripheral();
void delay_short(unsigned int uiDelayShort);
void delay_long(unsigned int uiDelaylong);
//驅(qū)動數(shù)碼管的74HC595
void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
void display_drive(); //顯示數(shù)碼管字模的驅(qū)動函數(shù)
void display_service(); //顯示的窗口菜單服務(wù)程序
//驅(qū)動LED的74HC595
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
void T0_time(); //定時中斷函數(shù)
void key_service(); //按鍵服務(wù)的應(yīng)用程序
void key_scan();//按鍵掃描函數(shù) 放在定時中斷里
sbit key_sr1=P0^0; //對應(yīng)朱兆祺學(xué)習(xí)板的S1鍵
sbit key_sr2=P0^1; //對應(yīng)朱兆祺學(xué)習(xí)板的S5鍵
sbit key_gnd_dr=P0^4; //模擬獨立按鍵的地GND,因此必須一直輸出低電平
sbit beep_dr=P2^7; //蜂鳴器的驅(qū)動IO口
sbit led_dr=P3^5; //作為中途暫停指示燈 亮的時候表示中途暫停
sbit dig_hc595_sh_dr=P2^0; //數(shù)碼管的74HC595程序
sbit dig_hc595_st_dr=P2^1;
sbit dig_hc595_ds_dr=P2^2;
sbit hc595_sh_dr=P2^3; //LED燈的74HC595程序
sbit hc595_st_dr=P2^4;
sbit hc595_ds_dr=P2^5;
unsigned char ucKeySec=0; //被觸發(fā)的按鍵編號
unsigned int uiKeyTimeCnt1=0; //按鍵去抖動延時計數(shù)器
unsigned char ucKeyLock1=0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
unsigned int uiKeyTimeCnt2=0; //按鍵去抖動延時計數(shù)器
unsigned char ucKeyLock2=0; //按鍵觸發(fā)后自鎖的變量標(biāo)志
unsigned int uiVoiceCnt=0; //蜂鳴器鳴叫的持續(xù)時間計數(shù)器
unsigned char ucDigShow8; //第8位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow7; //第7位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow6; //第6位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow5; //第5位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow4; //第4位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow3; //第3位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow2; //第2位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow1; //第1位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigDot8; //數(shù)碼管8的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot7; //數(shù)碼管7的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot6; //數(shù)碼管6的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot5; //數(shù)碼管5的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot4; //數(shù)碼管4的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot3; //數(shù)碼管3的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot2; //數(shù)碼管2的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigDot1; //數(shù)碼管1的小數(shù)點是否顯示的標(biāo)志
unsigned char ucDigShowTemp=0; //臨時中間變量
unsigned char ucDisplayDriveStep=1; //動態(tài)掃描數(shù)碼管的步驟變量
unsigned char ucWd=1; //本程序的核心變量,窗口顯示變量。類似于一級菜單的變量。代表顯示不同的窗口。
unsigned char ucWd1Update=1; //窗口1更新顯示標(biāo)志
unsigned char ucCountDown=99; //倒計時的當(dāng)前值
unsigned char ucStartFlag=0; //暫停與啟動的標(biāo)志位
unsigned int uiTimeCnt=0; //倒計時的時間計時器
unsigned char ucTemp1=0; //中間過渡變量
unsigned char ucTemp2=0; //中間過渡變量
unsigned char ucTemp3=0; //中間過渡變量
unsigned char ucTemp4=0; //中間過渡變量
unsigned char ucTemp5=0; //中間過渡變量
unsigned char ucTemp6=0; //中間過渡變量
unsigned char ucTemp7=0; //中間過渡變量
unsigned char ucTemp8=0; //中間過渡變量
//根據(jù)原理圖得出的共陰數(shù)碼管字模表
code unsigned char dig_table[]=
{
0x3f, //0 序號0
0x06, //1 序號1
0x5b, //2 序號2
0x4f, //3 序號3
0x66, //4 序號4
0x6d, //5 序號5
0x7d, //6 序號6
0x07, //7 序號7
0x7f, //8 序號8
0x6f, //9 序號9
0x00, //無 序號10
0x40, //- 序號11
0x73, //P 序號12
};
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
key_service(); //按鍵服務(wù)的應(yīng)用程序
display_service(); //顯示的窗口菜單服務(wù)程序
}
}