VHDL言语是一种用于电路规划的高档言语。它在80年代的后期呈现。开端是由美国国防部开发出来供美军用来进步规划的可靠性和减缩开发周期的一种使用范围较小的规划言语 。
VHDL翻译成中文便是超高速集成电路硬件描绘言语,首要是使用在数字电路的规划中。它在我国的使用多数是用在FPGA/CPLD/EPLD的规划中。当然在一些实力较为雄厚的单位,它也被用来规划ASIC。
VHDL首要用于描绘数字体系的结构,行为,功用和接口。除了含有许多具有硬件特征的句子外,VHDL的言语方式、描绘风格以及语法是非常类似于一般的计算机高档言语。VHDL的程序结构特点是将一项工程规划,或称规划实体(可所以一个元件,一个电路模块或一个体系)分红外部(或称可视部分,及端口)和内部(或称不可视部分),既触及实体的内部功用和算法完结部分。在对一个规划实体界说了外部界面后,一旦其内部开发完结后,其他的规划就可以直接调用这个实体。这种将规划实体分红表里部分的概念是VHDL体系规划的基本点。
本文为我们带来vhdl数码管中的倒计时程序介绍
完成功用
按下发动暂停按键时,倒计时开端作业,再按一次发动暂停按键时,则暂停倒计时。在任何时分,按下复位按键,倒计时将暂停作业,而且康复倒计时当时默认值99。
源代码
源代码解说如下:
#include “REG52.H”
#define const_voice_short 40 //蜂鸣器短叫的持续时刻
#define const_voice_long 200 //蜂鸣器长叫的持续时刻
#define const_key_TIme1 20 //按键去颤动延时的时刻
#define const_key_TIme2 20 //按键去颤动延时的时刻
#define const_dpy_TIme_half 200 //数码管闪耀时刻的半值
#define const_dpy_TIme_all 400 //数码管闪耀时刻的全值 必定要比const_dpy_time_half 大
/* 注释一:
* 怎么知道1秒钟需求多少个守时中止?
* 这个需求编写一段小程序测验,得到测验的成果后再按份额批改。
* 过程:
* 第一步:在程序代码上先写入1秒钟大约需求200个守时中止。
* 第二步:把程序烧录进单片机后,上电开端测验,手上同步翻开手机里的秒表。
* 假如单片机倒计时跑完了99秒,而手机上的秒表才走了45秒。
* 第三步:那么终究得出1秒钟需求的守时中止次数是:const_1s=(200*99)/45=440
*/
#define const_1s 440 //大约一秒钟所需求的守时中止次数
void initial_myself();
void initial_peripheral();
void delay_short(unsigned int uiDelayShort);
void delay_long(unsigned int uiDelaylong);
//驱动数码管的74HC595
void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
void display_drive(); //显现数码管字模的驱动函数
void display_service(); //显现的窗口菜单服务程序
//驱动LED的74HC595
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
void T0_time(); //守时中止函数
void key_service(); //按键服务的使用程序
void key_scan();//按键扫描函数 放在守时中止里
sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
sbit key_gnd_dr=P0^4; //模仿独立按键的地GND,因而有必要一向输出低电平
sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
sbit led_dr=P3^5; //作为半途暂停指示灯 亮的时分表明半途暂停
sbit dig_hc595_sh_dr=P2^0; //数码管的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; //被触发的按键编号
unsigned int uiKeyTimeCnt1=0; //按键去颤动延时计数器
unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
unsigned int uiKeyTimeCnt2=0; //按键去颤动延时计数器
unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时刻计数器
unsigned char ucDigShow8; //第8位数码管要显现的内容
unsigned char ucDigShow7; //第7位数码管要显现的内容
unsigned char ucDigShow6; //第6位数码管要显现的内容
unsigned char ucDigShow5; //第5位数码管要显现的内容
unsigned char ucDigShow4; //第4位数码管要显现的内容
unsigned char ucDigShow3; //第3位数码管要显现的内容
unsigned char ucDigShow2; //第2位数码管要显现的内容
unsigned char ucDigShow1; //第1位数码管要显现的内容
unsigned char ucDigDot8; //数码管8的小数点是否显现的标志
unsigned char ucDigDot7; //数码管7的小数点是否显现的标志
unsigned char ucDigDot6; //数码管6的小数点是否显现的标志
unsigned char ucDigDot5; //数码管5的小数点是否显现的标志
unsigned char ucDigDot4; //数码管4的小数点是否显现的标志
unsigned char ucDigDot3; //数码管3的小数点是否显现的标志
unsigned char ucDigDot2; //数码管2的小数点是否显现的标志
unsigned char ucDigDot1; //数码管1的小数点是否显现的标志
unsigned char ucDigShowTemp=0; //暂时中心变量
unsigned char ucDisplayDriveStep=1; //动态扫描数码管的过程变量
unsigned char ucWd=1; //本程序的中心变量,窗口显现变量。类似于一级菜单的变量。代表显现不同的窗口。
unsigned char ucWd1Update=1; //窗口1更新显现标志
unsigned char ucCountDown=99; //倒计时的当时值
unsigned char ucStartFlag=0; //暂停与发动的标志位
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; //中心过渡变量
//依据原理图得出的共阴数码管字模表
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(); //按键服务的使用程序
display_service(); //显现的窗口菜单服务程序
}
}