STC89C52单片机数码管介绍以及代码示例
目录
一,数码管介绍
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
二,数码管引脚定义
我们首先对单个引脚进行说明:
数码管分为共阳极连接和共阴极连接两种:
1,共阴极连接就是说3,8这一头连得是负极,所以在下面的那头给上高电平(即置1)就可以使二极管发光
2,共阳极连接就是说3,8这一头连得是正极,所以在下面的那头给上低电平(即置0)就可以使二极管发光
注意:在实际编写代码的时候这一点一定要搞清楚,或者进行实验后发现亮光的二极管的位置和预想的不对,那么对赋值的I/O口使用取反符号~也行
其次,我们对多个引脚管进行说明:
在这里的显示方式我们简单的归纳为这么几步:位选 段选 清零 位选 段选 清零
首先说明什么是扫描数码管,我们发现,数码管在构造时为了节省端口(单片机就40个引脚,不能全用来显示数码管吧,嘿嘿)把一排的数码管端口都共用了,所以为了同时显示四个数字,我们是不是得这样:
1,先在DIG1,DIG2,DIG3,DIG4,选一个
2,在端口用二进制代码或者十六进制代码显示我们想要显示的字符
3,最后将端口清零,就是全灭,因为端口是共用的,所以这样可以避免扫描过快时,第二个位置也显示相同的字符;
最后利用定时器以很快地速度重复这三个步骤,就可以实现数码管的扫描操作了
然后我们之前解释的显示方式就一一对应了即1就表示位选,2就表示段选,3,就表示清零。
最后我们来详细说说如何进行位选还有段选
首先还是由于节省I/O口的原因,所以在这里我们在位选的时候要用到这个74HC138译码器:
他的所用很简单,看图就可以知道,他是将p22,p23,p24三个引脚转换为LED1到LED8,这8个接口,刚刚好来控制我们板子上从左到右的8位数码管
接着是段选
就比较方便:可以看到下面的原理图上每个“8”字型的数码管上都有a,b,c,d,e,f,g,dp接口,分别对应的是P0_0到P0_7的8个接口。这里根据调试发现数码管是共阴极。所以置P0_0到P0_7为1即可
三,数码管段码表
鉴于数码管的特殊构造,所以只能显示一部分字母
四,数码管驱动方式
在本节我们所说的数码管的驱动实际上是由软件(代码)来驱动的,但是一但有比数码管更加高的优先级的硬件时,我们就需要“外挂”即自带驱动扫描芯片的数码管显示器
五,代码演示
在8,7,6位置分别连续显示1,2,3
#include <REGX52.H>
void xianshi(unsigned char location,number);
void Delay1ms(unsigned int xms) ;
void main()
{
while(1){
xianshi(8,1);
xianshi(7,2);
xianshi(6,3);
}
}
void xianshi(unsigned char location,number){
switch(location){
case 1: P2_4=0;P2_3=0;P2_2=0; break;
case 2: P2_4=0;P2_3=0;P2_2=1; break;
case 3: P2_4=0;P2_3=1;P2_2=0; break;
case 4: P2_4=0;P2_3=1;P2_2=1; break;
case 5: P2_4=1;P2_3=0;P2_2=0; break;
case 6: P2_4=1;P2_3=0;P2_2=1; break;
case 7: P2_4=1;P2_3=1;P2_2=0; break;
case 8: P2_4=1;P2_3=1;P2_2=1; break;
}
switch (number){
case 0: P0=0x3F ; break;//0011 1111
case 1: P0=0x06 ; break;//0000 0110
case 2: P0=0x5B ; break;//0101 1011
case 3: P0=0x4F ; break;//0100 1111
case 4: P0=0x66 ; break;//0110 0110
case 5: P0=0x6D ; break;//0110 1101
case 6: P0=0x7D ; break;//0111 1101
case 7: P0=0x07 ; break;//0000 0111
case 8: P0=0x7F ; break;//0111 1111
case 9: P0=0x6F ; break;//0110 1111
}
Delay1ms(1);
P0=0x00;
}
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms){
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
xms--;
}
}