您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子元器件>数码管>

源代码 - vhdl数码管中的倒计时程序介绍

2018年01月29日 13:42 电子发烧友整理 作者: 用户评论(0

/* 注释二:

*鸿哥首次提出的“一二级菜单显示理论”:

*凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,

*每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用ucWd变量表示。

*局部就是二级菜单,用ucPart来表示。不同的窗口,会有不同的更新显示变量ucWdXUpdate来对应,

*表示整屏全部更新显示。不同的局部,也会有不同的更新显示变量ucWdXPartYUpdate来对应,表示局部更新显示。

*/

void display_service() //显示的窗口菜单服务程序

{

//由于本程序只有一个窗口,读者在做实际项目的时候,可以省略switch(ucWd)

switch(ucWd) //本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。

{

case 1: //显示窗口1的数据

if(ucWd1Update==1) //窗口1要全部更新显示

{

ucWd1Update=0; //及时清零标志,避免一直进来扫描

ucTemp8=10; //显示空

ucTemp7=10; //显示空

ucTemp6=10; //显示空

ucTemp5=10; //显示空

ucTemp4=10; //显示空

ucTemp3=10; //显示空

ucTemp2=ucCountDown/10; //倒计时的当前值

ucTemp1=ucCountDown%10;

ucDigShow8=ucTemp8;

ucDigShow7=ucTemp7;

ucDigShow6=ucTemp6;

ucDigShow5=ucTemp5;

ucDigShow4=ucTemp4;

ucDigShow3=ucTemp3;

if(ucCountDown<10)

{

ucDigShow2=10;

}

else

{

ucDigShow2=ucTemp2;

}

ucDigShow1=ucTemp1;

}

break;

}

}

void key_scan()//按键扫描函数 放在定时中断里

{

if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位

{

ucKeyLock1=0; //按键自锁标志清零

uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。

}

else if(ucKeyLock1==0)//有按键按下,且是第一次被按下

{

uiKeyTimeCnt1++; //累加定时中断次数

if(uiKeyTimeCnt1>const_key_time1)

{

uiKeyTimeCnt1=0;

ucKeyLock1=1; //自锁按键置位,避免一直触发

ucKeySec=1; //触发1号键

}

}

if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位

{

ucKeyLock2=0; //按键自锁标志清零

uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。

}

else if(ucKeyLock2==0)//有按键按下,且是第一次被按下

{

uiKeyTimeCnt2++; //累加定时中断次数

if(uiKeyTimeCnt2>const_key_time2)

{

uiKeyTimeCnt2=0;

ucKeyLock2=1; //自锁按键置位,避免一直触发

ucKeySec=2; //触发2号键

}

}

}

void key_service() //按键服务的应用程序

{

switch(ucKeySec) //按键服务状态切换

{

case 1:// 启动和暂停按键 对应朱兆祺学习板的S1键

//由于本程序只有一个窗口,读者在做实际项目的时候,可以省略switch(ucWd)

switch(ucWd) //在不同的窗口下,设置不同的参数

{

case 1:

if(ucStartFlag==0) //如果原来处于暂停的状态,则启动

{

ucStartFlag=1; //启动

}

else //如果原来处于启动的状态,则暂停

{

ucStartFlag=0; //暂停

}

break;

}

uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。

ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发

break;

case 2:// 复位按键 对应朱兆祺学习板的S5键

//由于本程序只有一个窗口,读者在做实际项目的时候,可以省略switch(ucWd)

switch(ucWd) //在不同的窗口下,设置不同的参数

{

case 1:

ucStartFlag=0; //暂停

ucCountDown=99; //恢复倒计时的默认值99

uiTimeCnt=0; //倒计时的时间计时器清零

ucWd1Update=1; //窗口1更新显示标志 只要ucCountDown变化了,就要更新显示一次

break;

}

uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。

ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发

break;

}

}

void display_drive()

{

//以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路

switch(ucDisplayDriveStep)

{

case 1: //显示第1位

ucDigShowTemp=dig_table[ucDigShow1];

if(ucDigDot1==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xfe);

break;

case 2: //显示第2位

ucDigShowTemp=dig_table[ucDigShow2];

if(ucDigDot2==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xfd);

break;

case 3: //显示第3位

ucDigShowTemp=dig_table[ucDigShow3];

if(ucDigDot3==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xfb);

break;

case 4: //显示第4位

ucDigShowTemp=dig_table[ucDigShow4];

if(ucDigDot4==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xf7);

break;

case 5: //显示第5位

ucDigShowTemp=dig_table[ucDigShow5];

if(ucDigDot5==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xef);

break;

case 6: //显示第6位

ucDigShowTemp=dig_table[ucDigShow6];

if(ucDigDot6==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xdf);

break;

case 7: //显示第7位

ucDigShowTemp=dig_table[ucDigShow7];

if(ucDigDot7==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0xbf);

break;

case 8: //显示第8位

ucDigShowTemp=dig_table[ucDigShow8];

if(ucDigDot8==1)

{

ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点

}

dig_hc595_drive(ucDigShowTemp,0x7f);

break;

}

ucDisplayDriveStep++;

if(ucDisplayDriveStep>8) //扫描完8个数码管后,重新从第一个开始扫描

{

ucDisplayDriveStep=1;

}

}

//数码管的74HC595驱动函数

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

( 发表人:李建兵 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!