八位数码管原理图如下:
通过原理图,我们可以知道,数码管和led灯存在公用的线路。要使led灯能发亮,P2.3引脚就要置“1”,但是P2.3引脚为“1”时,数码管是不能正常显示的,所以要使数码管正常显示,要对P2.3引脚置“0”。
同时P2.0、P2.1和P2.2引脚对数码管显示也很重要(位置选择),三个引脚的状态(0或1)对应的三位二进制数可以表示0~7(分别对应从左到右的数码管) 。
与led灯一样,只要通过对P0口赋不同的值就可以显示不同的字符。
不同的段(A、B、C、D、E、F、G、DP)对应不同的引脚
A:P0^0 B:P0^1 C:P0^2 D:P0^3 E:P0^4 F:P0^5
G:P0^6 DP:P0^7
置“0”该段不亮,置“1”该段亮。如想要显示一个“1”,需要B段和C段亮,其他段不亮,所以P0口赋值为0x06。
DP/P0^7 G/P0^6 F/P0^5 E/P0^4 D/P0^3 C/P0^2 B/P0^1 A/P0^0
二进制 0 0 0 0 0 1 1 0
0x 0 //前四位转换16进 6 //后四位转换16进制
同理要想显示“7”,P0口就赋值为0x07(0000 0111)。
以下显示代码(效果为从左至右显示0~8)
#include
#define uint unsigned int
#define uchar unsigned char
uint i=0;
uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
uchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void Init()
{
P2M0=0xff;
P2M1=0x00;
P0M0=0xff;
P0M1=0x00;
}
void Delay(int n)
{
while(n--);
}
void main()
{
Init();
while(1)
{
for(i=0;i<8;i++)
{
P0=0;
P2=weixuan;
P0=duanxuan;
Delay(600);
}
}
}
虽然8个数码管都亮了,但并不是同时亮的,而是快速地选择不同的数码管(位选)点亮熄灭,也就是动态扫描。
八位数码管原理图如下:
通过原理图,我们可以知道,数码管和led灯存在公用的线路。要使led灯能发亮,P2.3引脚就要置“1”,但是P2.3引脚为“1”时,数码管是不能正常显示的,所以要使数码管正常显示,要对P2.3引脚置“0”。
同时P2.0、P2.1和P2.2引脚对数码管显示也很重要(位置选择),三个引脚的状态(0或1)对应的三位二进制数可以表示0~7(分别对应从左到右的数码管) 。
与led灯一样,只要通过对P0口赋不同的值就可以显示不同的字符。
不同的段(A、B、C、D、E、F、G、DP)对应不同的引脚
A:P0^0 B:P0^1 C:P0^2 D:P0^3 E:P0^4 F:P0^5
G:P0^6 DP:P0^7
置“0”该段不亮,置“1”该段亮。如想要显示一个“1”,需要B段和C段亮,其他段不亮,所以P0口赋值为0x06。
DP/P0^7 G/P0^6 F/P0^5 E/P0^4 D/P0^3 C/P0^2 B/P0^1 A/P0^0
二进制 0 0 0 0 0 1 1 0
0x 0 //前四位转换16进 6 //后四位转换16进制
同理要想显示“7”,P0口就赋值为0x07(0000 0111)。
以下显示代码(效果为从左至右显示0~8)
#include
#define uint unsigned int
#define uchar unsigned char
uint i=0;
uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
uchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void Init()
{
P2M0=0xff;
P2M1=0x00;
P0M0=0xff;
P0M1=0x00;
}
void Delay(int n)
{
while(n--);
}
void main()
{
Init();
while(1)
{
for(i=0;i<8;i++)
{
P0=0;
P2=weixuan;
P0=duanxuan;
Delay(600);
}
}
}
虽然8个数码管都亮了,但并不是同时亮的,而是快速地选择不同的数码管(位选)点亮熄灭,也就是动态扫描。
举报