数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示。如果程序编写不当,数码管动态扫描容易出现亮度不均匀、亮度过低、重影等现象。很多初学者会在主函数中使用while(1)循环,结合delay函数不断扫描,但这样得不断调用display扫描,如果单片机还要执行别的程序时,就会由于扫描不及时,导致各种问题。此外,在控制段选位选的先后顺序上,如果程序不当,则会造成显示重影等问题。在此给出一个稳定可靠的程序方案。
电路连接:P1口通过两个74HC573分别连接到八位数码管的段选和片选,段选、位选由P3.4和P3.5控制,低电平锁存
#include <reg52.h>
#define DIGI_PORT P1 // 宏定义数码管端口,如果端口改变,只需修改这一句即可
#define DIGI_NUM 8 // 宏定义数码管个数
sbit DULA = P3^4;
sbit WELA = P3^5;
unsigned char digiBuf[DIGI_NUM]; //数码管缓冲区
unsigned char code DigiTable[] = {
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x00,/* */
};
/*
初始化定时器0,方式1,11.0592MHz晶振时,每5ms进一次中断,
如果只有4位数码管,10ms即可,