3.3.2 数码管动态显示01234567
官方代码
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void smg_display(void)
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0: LSC=1;LSB=1;LSA=1;break;
case 1: LSC=1;LSB=1;LSA=0;break;
case 2: LSC=1;LSB=0;LSA=1;break;
case 3: LSC=1;LSB=0;LSA=0;break;
case 4: LSC=0;LSB=1;LSA=1;break;
case 5: LSC=0;LSB=1;LSA=0;break;
case 6: LSC=0;LSB=0;LSA=1;break;
case 7: LSC=0;LSB=0;LSA=0;break;
}
SMG_A_DP_PORT=gsmg_code[i];
delay_10us(100);
SMG_A_DP_PORT=0x00;
}
}
void main()
{
while(1)
{
smg_display();
}
}
修改代码
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^2;
sbit wela=P2^3;
sbit sela=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{
while(1)
{
dula=1;
wela=1;
sela=1;
P0=table[1];
delayms(500);
P0=0x00;
dula=0;
wela=1;
sela=1;
P0=table[2];
delayms(500);
P0=0x00;
dula=1;
wela=0;
sela=1;
P0=table[3];
delayms(500);
P0=0x00;
dula=0;
wela=0;
sela=1;
P0=table[4];
delayms(500);
P0=0x00;
dula=1;
wela=1;
sela=0;
P0=table[5];
delayms(500);
P0=0x00;
dula=0;
wela=1;
sela=0;
P0=table[6];
delayms(500);
P0=0x00;
dula=1;
wela=0;
sela=0;
P0=table[7];
delayms(500);
P0=0x00;
dula=0;
wela=0;
sela=0;
P0=table[8];
delayms(500);
P0=0x00;
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
动态数码管轮流显示1到8八位数字的修正实验基本完成。
经验教训
1.从官方代码中可以看出,普中51实验板用于控制动态数码管的锁存端有三个,这也代表着之前只使用了两个锁存端的修正实验从根本上就注定失败;
2.官方代码使用了更加高级而简练的函数,但是其功能与教程代码使用的更复杂但是也更基础的函数完全相同,这也是本次修正实验修改官方代码的目的,即从根本上理解动态数码管显示数字的基础原理。