单个数码管
共阳极数码管: 即VCC从数码管处进入,低电平驱动
共阴极数码管: 即从单片机获得拉电流,高电平驱动
所谓数码管,其实就是将八个LED灯放在了一起而已,我们对对应管脚传入电流就可以让对应的灯亮起来,请看下图以及部分解释
- 下面表示三种典型的数码管管脚分布图,型号不同管脚对应的LED不同,这个需要你一一测试得出
- 数码管上有八个LED,其中七个用来显示主要数字,如abcdefg
- 右下角的LED用来表示小数点,它对应的管脚为dp
- 管脚“-”表示公共端口
看见图中的蓝色小方块了吗?他表示该管脚指向的LED是激活状态,对应低电平0(因为当前的数码管为共阳极状态)
在proteus中的数码管表示
在proteus元件库里面的类别optoelectronics可以找到所有的数码管包括液晶显示器类型,下图我们使用的是“10管脚一位数码管”,对应英文为7SEG-COM-ANODE
该数码管右上角为正极接口(因为我们使用共阳极数码管)VCC,左边的管脚自上而下分别对应LED为abcdefg;因为从上面我们不难发现所有一位数码管的LED布局都是一致的,只是管脚位置不同,所以参考原图即可!
让数码管循环显示0-9数字
开启数码管对应的LED即可显示不同的数字,该方法和我们开启流水灯代码是基本一致的,思路也相同,具体内容这里不再赘述,详细可看“单片机”分类下的文章:《Proteus电路基础》
打开keil uvision5开始编写代码
有两处新增不同之处,这里做出解释
- #define out P0 定义一个输出IO口P0的宏,它的名称为out
- uchar code seg[]是一个数组,注意code关键词不可以漏掉!seg才是该数组的标识符
- 这里使用数组类似于程序设计的“打表法”,也就是把显示对应LED的十六进制代码都放进数组里面,等到我们需要显示对应数字时,直接调用数组元素即可!
- 0xc0对应显示数字0,0xf9显示数学1,以此类推直到0x01,它是复位标志,下文会讲
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};
添加一个delay延迟函数,这里不细说他家自己写就好
循环显示代码详解:
- out=seg[i]更改IO口P0下属管脚的电平,来显示对应的LED数字
- i++ 每次i都递增一次,以便下次取出数组下一位来显示下一个数字
- if(seg[i]==0x01) i=0当检测到复位标志后,立即将i设置为0,这样子就可以循环重复从0开始再走一遍了!
void main(){
uchar i;
while(1){
out=seg[i];
delay(100);
i++;
if(seg[i]==0x01) i=0;
}
}
完整代码
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x01};
void delay(uint k){
uchar i,j;
while(k--){
for(i=0;i<255;i++);
for(j=0;j<255;j++);
}
}
void main(){
uchar i;
while(1){
out=seg[i];
delay(100);
i++;
if(seg[i]==0x01) i=0;
}
}