【蓝桥杯单片机】共阳数码管
一、电路图
段选 位选 通过Y6选择八个数码管的一个或多个,再通过Y7进行数码管的显示。 段码:共阳数码管 数字1的显示: dp=1 g=1 f=1 e=1 d=1 c=0 b=0 a=1(亮为0,灭为1) 1111 1001(二进制) 0xf9(十六进制) 其他类似,段码表为: duanma[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}
二、实现代码
1.静态显示
例题:实现每一个数码管0-9的显示,再进行所有数码管0-15的显示。
#include "reg52.h"
unsigned char code duanma[18] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//code不会占用内存
void Delay(t)
{
while(t--);
while(t--);
}
void selectHC573(unsigned char n)
{
switch(n)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
void showSMG_Bit(unsigned char dat,unsigned char pos)
{
selectHC573(6); //数码管位置
P0=0x01 << pos;
selectHC573(7); //数码管内容
P0=dat;
}
void smg_Static()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
for(j=0;j<10;i++)
{
showSMG_Bit(duanma[j],i);
Delay(5000);
Delay(5000);
}
}
for(i=0;i<16;i++)
{
selectHC573(6); //数码管位置
P0=0xff;
selectHC573(7); //数码管内容
P0=duanma[i];
Delay(5000);
Delay(5000);
}
}
void main()
{
while(1)
{
smg_Static();
}
}
2.动态显示
例题:使八个数码管同时分别显示1-8。
#include "reg52.h"
unsigned char code duanma[18] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//code不会占用内存
void selectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
void diaplaysmg_bit(unsigned char value,unsigned char pos)
{
selectHC573(6);
P0 = 0x01 << pos;
selectHC573(7);
P0 = value;
}
void Delay(unsigned int t)
{
while(t--);
}
void display()
{
diaplaysmg_bit(duanma[1],0);
Delay(300);
diaplaysmg_bit(duanma[2],1);
Delay(300);
diaplaysmg_bit(duanma[3],2);
Delay(300);
diaplaysmg_bit(duanma[4],3);
Delay(300);
diaplaysmg_bit(duanma[5],4);
Delay(300);
diaplaysmg_bit(duanma[6],5);
Delay(300);
diaplaysmg_bit(duanma[7],6);
Delay(300);
diaplaysmg_bit(duanma[8],7);
Delay(300);
//利用视觉残留的原理,只要切换的够快,在人眼中就是静止的。
}
void main()
{
while(1)
{
display();
}
}
