蓝桥杯学习记录3数码管显示
操作数码管无非就是操作了很多流水灯,代码比较简单。
但是从原理上讲,数码管的连接对于初学者不好解释明白,这是头痛的一点。
蓝桥杯用的数码管是两个4位共阳数码管
___a
f|_g_|b
e|___|c.dp
d
数码管的段选是这样的:
段 | dp | g | f | e | d | c | b | a |
---|---|---|---|---|---|---|---|---|
码 | 8(最高位) | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
码值为0时对应的数码管点亮,也就是说如果你想显示数字“1”时,你的段码为0xf9
板子上的位码是这样排列的
位 | 口 | 口 | 口 | 口 | 口 | 口 | 口 | 口 |
---|---|---|---|---|---|---|---|---|
码 | 1 | 2 | 4 | 8 | 1 | 2 | 4 | 8 |
标记文本是低四位,就是说当你想点亮最右边的数码管你的位码为0x80
必要的介绍完了,上代码
/*****************************
author: 风行天
time:2020.01.16
*****************************/
#include <stc15f2k60s2.h>
#define uint unsigned int
#define uchar unsigned char
uint gid[]=
{
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0xff//灭
};
void delay_ms(uint sec)
{
uint x,y;
for (;sec>0;sec--)
{
for (x=0;x<5;x++)
{
for (y=0;y<157;y++)
{}
}
}
}
void init ()
{
P2=0xa0;//1010 0000
P0=0x00;
P2=0x80;//1000 0000
P0=0xff;
P2=0xc0;
P0=0x00;//打开段选 选中
P2=0xff;
P0=0xff;//打开为选选通数字
}
void display(uint num)//最大65535
{
uint a,b,c,d,e;
a=num/10000;
b=(num%10000)/1000;
c=(num%1000)/100;
d=(num%100)/10;
e=num%10;
if (a)
{
P2=0xc0;
P0=0x08;//打开段选 选中第五位
P2=0xff;
P0=gid[a];//打开为选选通数字a
delay_ms(1);
}
if (b||(a!=0))
{
P2=0xc0;
P0=0x10;//打开段选 选中第四位
P2=0xff;
P0=gid[b];//打开为选选通数字b
delay_ms(1);
}
if (c||(b!=0)||(a!=0))
{
P2=0xc0;
P0=0x20;//打开段选 选中第三位
P2=0xff;
P0=gid[c];//打开为选选通数字c
delay_ms(1);
}
if (d||(b!=0)||(a!=0)||(c!=0))
{
P2=0xc0;
P0=0x40;//打开段选 选中第二位
P2=0xff;
P0=gid[d];//打开为选选通数字d
delay_ms(1);
}
P2=0xc0;//最后一位必须显示
P0=0x80;//打开段选 选中最后一位
P2=0xff;
P0=gid[e];//打开为选选通数字e
delay_ms(1);
}
void main ()
{
init ();
while (1)
{
display(9999);//靠右显示9999
}
}
代码虽然简单,但是还是要多练习