数码管静态显示时,4个数码管的显示是一样的,要使得4个数码管显示不同数值,需采用动态扫描显示方法,即在某一瞬间,只点亮一个数码管,快速变化,每一次点亮一个数码管时输入不同值,由于人眼的视觉暂留现象,感觉上4个数码管是同时亮的,而4个数码管的显示值则是各自不同的。
下面为扫描显示的关键代码,采用一个循环计数器,按照0111-1011-1101-1110-0111的顺序进行循环,这样做到依次点亮一个数码管,每次输入值不同,数码管显示亦不同。
PROCESS(CT)
BEGIN
IF CT'EVENT AND CT='1' THEN
CASE QQ IS
WHEN "0111"=>AN<=QQ; SW<=1; QQ<="1011"; --点亮最左边数码管,输入值为1;计数器跳转,准备点亮左边第2个数码管
WHEN "1011"=> AN<=QQ;SW<=2; QQ<="1101";
WHEN "1101"=> AN<=QQ;SW<=3; QQ<="1110";
WHEN OTHERS=> AN<=QQ;SW<=4; QQ<="0111"; --点亮最右边数码管,输入值为4;计数器跳转,准备点亮最左边数码管
END CASE;
END IF;
可在数码管静态显示的程序上进行修改,去掉Port中的SW输入,改为signal,同时增加QQ和CT作为signal,其中CT为扫描频率,建议取值在100-1000Hz之间,由50MHz时钟分频获得。
注意:开发板上数码管的位选顺序丝印是错的,反掉了。
参考上述代码和数码管静态显示程序,调通程序,正确显示1234,并进行以下扩展:
1)对8位拨位开关进行译码显示,显示数字范围为00-01-02-..-10-11-..-F0-F1-..-FF(16进制)
提示:拨位开关作为输入
2)按照0000-0001-0002-0003-....000F-1000-1001-....-F001-F002-....-FFFF(16进制)的顺序,以10Hz左右递增,显示变化的4位数
提示:要实现递增数字效果,需要增加一个计数器,由于每一位数码管对应一个4位2进制数,所以这个计数器应该是16位2进制
3)对8位拨位开关进行译码显示,显示数字范围为000-001-002-...009-100-101-...-200-...-255(10进制)
提示:之前数码管显示方式为16进制,要转换为10进制