数码管进阶应用
让8个数码管依次先单独显示0-9 ,然后在让8个数码管一起显示0-F。
同样还是在B站小蜜蜂老师那里的题,因为开发板的不一样所以显示方式也有所不同】
我开发板实现的功能,通过138译码器来全部同时打开8个数码管的时候一直有问题,只能通过缩小延时来显示8个数码管同时亮的假象。希望各位博客大佬帮忙指正一下。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
//通过以下三个引脚来控制138译码器控制数码管的选择
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
//共阴极
u8 code smg_duan[17]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay_smg(u16 t)
{
while(t--);
}
void delay(u16 t)
{
while(t--);
}
//数码管显示函数
void DigDisplay( u8 dat , u8 pos)
{
u8 i;
for(i=0;i<8;i++)
{
switch(pos) //传入pos进行数码管的选择
{
case(0):
LSA=1;LSB=1;LSC=1; break;第7位
case(1):
LSA=0;LSB=1;LSC=1; break;//第六位
case(2):
LSA=1;LSB=0;LSC=1; break;//ÏÔʾµÚ5λ
case(3):
LSA=0;LSB=0;LSC=1; break;//ÏÔʾµÚ4λ
case(4):
LSA=1;LSB=1;LSC=0; break;//ÏÔʾµÚ3λ
case(5):
LSA=0;LSB=1;LSC=0; break;//ÏÔʾµÚ2λ
case(6):
LSA=1;LSB=0;LSC=0; break;//ÏÔʾµÚ1λ
case(7):
LSA=0;LSB=0;LSC=0; break;//ÏÔʾµÚ0λ
}
P0=dat;//将数码管断传入P0口
delay(3000); //¼ä¸ôÒ»¶Îʱ¼äɨÃè
P0=0x00;//消影
}
}
//最终数码管显示
void smg_result()
{
u8 i,j,k ;
for( i = 0;i< 8 ;i++)
{
for( j = 0 ; j< 10 ;j++)
{
DigDisplay(smg_duan[j] ,i);
delay(200);
}
}
delay(200);
for( j = 0 ; j< 10 ;j++)
{
for( i = 0 ;i <8 ;i++)
{
DigDisplay(smg_duan[j] ,i);
}
}
}
void main()
{
while(1)
{
smg_result();
}
}
每天记录学习过程,一起进步(加油)!