实验目标:使8个数码管依次显示01234567。
动态数码管的原理图如下图所示:两个四位一体的数码管,其段选接在P0端口上。下表以数字0为例,描述端口输出值与数码管显示的对照关系。
dp | g | f | e | d | c | b | a |
P07 | P06 | P05 | P04 | P03 | P02 | P01 | P00 |
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0x3f,表示数字0,dp小数点和g不亮。 |
下图为三八译码器的原理图,其控制数码管的位选信号。轮流想各数码管输出段码和位选信号,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各数码管同时在显示。
其真值表如下图所示:红色框中表示Y7是低电平有效,对应LED8,即第1个数码管的位选信号。
软件实现:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#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};
//延时10微秒
void delay_10us(u16 ten_us){
while(ten_us--);
}
void smg_display(){
u16 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); //延时1ms
SMG_A_DP_PORT = 0x00;//消音
}
}
void main(){
while(1){
smg_display();
}
}