1.数码管介绍
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
2.位选
选第几位显示,G1,G2A,G2B为使能端,有效就工作。图片中已经接好了,就不用理了。ABC是输入端,其中C是高位A是低位。Y1到Y7为输出端;当P22=0;P23=0;P24=1;时,因为C是高位,相当于输入1 0 0,转化为10进制为4,Y4输出,即选中了LED5;在编程中要注意LED1到LED8是从右到左排列的,所以我们现实中看到开发板的第一位(左一)实际上是LED8。
3.段选
一段一段拼起来就成字母或者数字了;开发板一般为共阴极连接;例如要显示6,则要选中A,F,E,D,C,G;由于为共阴极连接,1就为中。输入应为 ABCD EFG DP: 1011 1110 ;P00~P07也为1011 1110 由于数据高位是对端口的高位的,所以读取数据要从下往上读的,所以输入应为 0111 1101;也就是0X7D;
数码管段码表:
0 | 0x3F |
1 | 0x06 |
2 | 0x5B |
3 | 0x4F |
4 | 0x66 |
5 | 0x6D |
6 | 0x7D |
7 | 0x07 |
8 | 0x7F |
9 | 0x6F |
A | 0X77 |
B | 0X7C |
C | 0X39 |
D | 0X5E |
E | 0X79 |
F | 0X71 |
空 | 0X00 |
4.代码
现象:第一位显示1;第二位显示2...第八位显示8;
由于单片机运行速度快,当同时显示多位时,上个数据会串到下一个数据里去(位选,段选,位选......),产生重影。在第一个段选与下一个位选中加入0X00(清零)可以解决问题;(位选,段选,清零,...)。
#include <REGX52.H>
unsigned char Table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Xian_Shi(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=Table[Number];
Delay(1);
P0=0x00; //消影
}
void main()
{
while(1)
{
Xian_Shi(1,1);
Xian_Shi(2,2);
Xian_Shi(3,3);
Xian_Shi(4,4);
Xian_Shi(5,5);
Xian_Shi(6,6);
Xian_Shi(7,7);
Xian_Shi(8,8);
}
}