一般动态数码管都是通过 74HC138 译码器来实现,而本文反其道,通过定义数组,使用单片机 P1 口直接控制数码管位选
控制显示 1314-520代码如下:
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};// 显 示0~F 的值
uchar code smgwei[8]={0x7f,0xbf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar disp[8];
void delay_10us(uint i)
{
while(i--);
}
void Digdisplay()
{
uchar i;
for(i=0;i<8;i++)
{
switch(i)//控制位选信号
{
case 0:P1=smgwei[0];break;
case 1:P1=smgwei[1];break;
case 2:P1=smgwei[2];break;
case 3:P1=smgwei[3];break;
case 4:P1=smgwei[4];break;
case 5:P1=smgwei[5];break;
case 6:P1=smgwei[6];break;
case 7:P1=smgwei[7];break;
}
P0=disp[i];
delay_10us(100);
P0=0x00;
}
}
void pros()
{
disp[0]=smgduan[1];
disp[1]=smgduan[3];
disp[2]=smgduan[1];
disp[3]=smgduan[4];
disp[4]=smgduan[17];
disp[5]=smgduan[5];
disp[6]=smgduan[2];
disp[7]=smgduan[0];
}
void main()
{
while(1)
{
Digdisplay();
pros();
}
}
控制其进行计算
#include <reg52.h>
typedef unsigned long u32; //对数据类型进行声明定义
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG P0 //定义数码管段数据接口P0
u8 buff[8]; //显示缓冲数组
u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//分别显示0 1 2 3 4 5 6 7 8 9
u8 code smgwei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay_ms(u16 t)
{
u16 i,j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void update(u32 val) //更新缓冲数组
{
buff[0]=val%10; //12345678/10000000%10=1;
buff[1]=val/10%10; //12345678/1000000%10=2;
buff[2]=val/100%10; //12345678/100000%10=3;
buff[3]=val/1000%10; //12345678/10000%10=4;
buff[4]=val/10000%10; //12345678/1000%10=5;
buff[5]=val/100000%10; //12345678/100%10=6;
buff[6]=val/1000000%10; //12345678/10%10=7;
buff[7]=val/10000000%10; //12345678%10=8;
}
void display(void) //显示函数
{
u8 n;
for(n=0; n<8; n++)
{
switch(n) //先位选
{
case 0:P1=smgwei[0];break;
case 1:P1=smgwei[1];break;
case 2:P1=smgwei[2];break;
case 3:P1=smgwei[3];break;
case 4:P1=smgwei[4];break;
case 5:P1=smgwei[5];break;
case 6:P1=smgwei[6];break;
case 7:P1=smgwei[7];break;
}
SMG=a[buff[n]]; //后发送段数据
delay_ms(1); //小延时,显示更稳定
}
}
void main(void)
{
u32 num=0; //要显示的数据
u16 t; //延时用
while(1)
{
update(num); //更新显示缓冲数组
for(t=0; t<50; t++) //用for循环来延时不然显示不正常
{
display(); //显示缓冲数组
}
num++; //显示数据自加
}
}
欢迎交流