
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.9 数码管闪烁显示
本例电路与前一案例相同,程序稍有差异,形成了显示内容的闪烁效果,即所有字符同时显示,同时关闭,如此循环。
程序设计调试与实训:
上一案例中对数码管的循环选通采用了循环左移函数,本例中则专门提供了位选通的索引数组DSY_IDX(位码表),每字节展开为二进制数时,其中仅有一位为1,这表示每次只有一只数码管被选通。这样设计虽然占用了更多的空间,但每次输出位码时不需要再执行移位运算。
完成本例学习与调试后,读者可修改代码,在数码管上闪烁显示由3~5个数字构成的数字串。
源程序代码:
//----------------------------------------------------------------- // 名称: 8只数码管闪烁显示数字串 //----------------------------------------------------------------- // 说明: 数码管闪烁显示由0~7构成的一串数字。 // 本例用动态刷新法显示了一串数字,在停止刷新时所有数字显示消失。 //----------------------------------------------------------------- #include <reg51.h> #define uchar unsigned char #define uint unsigned int //数字0~9的数码管段码表 uchar code DSY_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管的选通索引表(位码表) uchar data DSY_IDX [] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //----------------------------------------------------------------- // 延时 //----------------------------------------------------------------- void DelayMS(uint x) { uchar i; while(x--) for(i = 0; i < 120; i++); } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { uchar i,j; P0 = 0xFF; P2 = 0x00; while(1) { //动态扫描显示,刷新30次,实际上实现了8只数码管的保持显示延时 for(i = 0; i < 30; i++) { for(j = 0; j < 8; j++) { P2 = DSY_IDX [j]; P0 = DSY_CODE[j]; DelayMS(2); } } P2 = 0x00; //所有数码管共阳极与+5V断开 DelayMS(1000); //关闭持续一段时间 } }