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