/*******************************************
* 本节实验,需要加深理解锁存器,位选线,
* 段选线等,以及防止重影的方法;和keil中数
* 组的定义;
*另外想让8个数码管同时显示不同的数字,
*靠的是程序的快速运行,和人眼的短时间缓冲原理实现的
*本例的延时设定是1ms,可以分别用100ms
*等尝试一下
******************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6; //锁存器的段选线
sbit wela = P2^7;//锁存器位选线
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71, //定义一个数组,每一个元素分别是0-f;
};
void delayms(uint);
void main()
{
while(1){
dula = 1;//打开端选线
P0 = table[0];//写入数组的第一个元素,即数字0
dula = 0;//关闭端选线,防止打开位选线时混乱
P0 = 0xff;//将数码管重置清楚,防止有重影发生,所以这步操作也叫做消影
wela = 1;//打开位选线
P0 = 0xfe;//选择位,需要点亮的数码管,当前选择的是第一个数码管
wela = 0;//关闭位选线
delayms(1);1ms的延迟。防止读写速率太快出现重影
dula = 1;
P0 = table[1];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delayms(1);
dula = 1;
P0 = table[2];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb;
wela = 0;
delayms(1);
dula = 1;
P0 = table[3];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xf7;
wela = 0;
delayms(1);
}
}
void delayms(i)
{
uint j,k;
for(j = i;j > 0;j--){
for(k = 110;k > 0;k--);
}
}