第六篇 C51定时器控制数码管刷新
前面我们用的数码管程序有个小问题,数码管刷新一位然后延时1ms,再刷新下一位再延时1ms,这样会导致显示一次8位数码管需要8ms时间。在这8ms延时之内cpu别的啥事都干不了,只是原地踏步耗时间,会导致程序暂停在延时这里造成阻塞—这种 肠梗阻编程风格 应该避免。
编程原则: ms级别及其以上的nop延时应该避免出现。
现在问题:显示要稳定必须间隔1ms左右刷新下一位数码管,又不能用延时。
解决方案:51单片机有定时器可用,就像闹钟一样,间隔一段时间闹铃一次提醒你做某事。可以用定时器控制来完成所需功能。
方案示例:定时器设置为1ms间隔,每次计时满1ms置位数码管的刷新使能标志,通知数码管可以显示下一位了。为了演示效果增加两个独立按钮,通过按钮增减数码管末位数字(每次按下操作±1)。在主程序中只管调用数码管显示等任务,不会有任何阻塞。
仿真电路图:
源代码:
/*
教学使用
演示定时器、数码管和独立按键配合工作
作者:李枝蔚 西峰职业中专 lzwhjx@163.com
*/
#include <REG52.H>
//数码管硬件连接
#define seg_data P1
sbit seg_cs1 = P2 ^ 6;
sbit seg_cs2 = P2 ^ 7;
sbit seg_cp = P2 ^ 5;
sbit keyup=P3^0;
sbit keydn=P3^1;
//---------------------
int num;
bit seg_refresh_en=0; //数码管刷新使能标志,每1ms置1.
unsigned char xian[8]={
0,0,0,0,0,0,17,17};
unsigned char code shuma[] = {
0xC0