个人网站:Geek交流圈
单位数码管
a,b,c,d,e,f,g,dp 都是LED灯,正好八个,可以将数码管的a,b,c,d,e,f,g,dp按照顺序接到某一个I/O 口上,这里连接到P2引脚上,共阴(高电平有效)。
例如让单个数码管显示0
单个数码管显示0,应该是 a b c d e f亮,g 和 dp灭
按照顺序 P0 = 00111111;(高位 低位)
a是最右边的1,dp是最左边的0
循环显示0 - 8
//断码
u8 code smgduan[17]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
while(1)
{
for(i = 0; i < 9; i++)
{
P0 = segment[i]; //P0接数码管
delay(50000); //延时函数
}
}
断码就是将对应显示的数据存放进数组中,使用时直接调用就行
比如0x3f,0x06,0x5b,0x4f,0x6d,0x7d,0x07,0x7f,0x6f
对应就是 0 1 2 3 4 5 6 7 8
想要显示对应数字,就直接调用数组的值给对应的I/O口赋值
多位数码管
静态显示:
就是用多个单个数码管组成,例如四个数码管,静态的话要占用4个I/O,非常占I/O资源。
动态显示:
要动态控制多位数码管,就需要涉及段选和位选
段选:段选就是让数码管怎么亮,利用断码
位选:就是让哪一个数码管亮
例如四位一体的数码管
由图中我们发现,段选的abcdefg dp是接在P0口上,位选的1234分别接在P1.0,P1.1,P1.2,P1.3上
断码表
u8 code smgduan[17]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit LSA=P1^0; //控制位选
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit LSD=P1^3;
程序的流程
因为用的是四位一体的数码管,所以要循环四次
第一步
i = 0, 0 < 4 ,为假,进入循环
因为 i = 0;Switch(i)中会case(0),执行
P1.0 = 0
P1.1 = 1
P1.2 = 1
P1.3 = 1
位选是低电平有效,所以是第一个数码管亮
P0=smgduan[1]; 是给P0送断码
所以P0 = smgduan[1] = 0x06;//第一位数码管 显示 1
先要了解单位数码管如何亮
第二步
i++,i = 1, 1 < 4 ,为假,进入循环
因为 i = 1;Switch(i)中会case(1),执行
P1.0 = 1
P1.1 = 0
P1.2 = 1
P1.3 = 1
位选是低电平有效,所以是第二个数码管亮
P0=smgduan[3]; 是给P0送断码
P0 = smgduan[3] = 0x4f;//数码管第二位显示 3
依次类推,要显示
需要依次控制第一位显示1,第二位显示3,第三位显示1,第四位显示4。由于1314闪烁频率很快,眼睛暂流作用,会让人觉得1314是一起显示的。