这里是我的数码管的学习笔记,欢迎大家一起进步
数码管的初始化原理参照以下链接
(本人写的博客)初始化原理
请务必多看一下,里面还有关于P0口的一些信息
那么看一下原理图,了解一下数码管的工作原理
可以看到我所画的大致示意图,也就是Y6C控制com一系列引脚来选择要显示的数码管
然后选择哪个灯管亮的是Y7C控制的abcdefg。
也就是说,先用Y6C位选数码管,Y7C位选亮的数码管
比如Y6C开启,P0=0xff,也就是选中所有的数码管展示
然后Y7C开启,P01=0;所有的数码管的a管亮,也就是全是最上面的灯管亮。
数码管也分为共阴极数码管,和共阳极数码管,如图:
我们的蓝桥杯的数码管是共阳极的数码管,所以得控制abcdefgdp的口输出为零,他才会亮
所以很明显,也就是选中之后,通过P0口控制abcdefg来显示数字,比如显示“1”,就是bc亮也就是P02,P03=0;
但是这样每次要展示都要看一下怎么设计是不是太麻烦了,我们蓝桥杯的资料里面又这么一份资料是直接提供了0-9的数字显示的十六进制表示数
如图
啊,说这么多是不是觉得我有点罗里吧嗦的?
好,下面是实践,我们先来设计个程序,让所有数码管先直接显示1:
#include "reg52.h"
void main(){
P2=0xa0;P0=0x00;
P2=0xc0;P0=0xff;//位选状态,选中所有数码管
P2=0xff;P0=0xc0;//Y7为L,选择abcdefg展示
}
大概就是这样。
下一步呢,我们来实现一下从0到9的隔一秒轮换展示
#include "reg52.h"
unsigned int code tab[10]={
0xc0,
0xf9,
0xa4,
0xb0,
0x99,
0x92,
0x82,
0xf8,
0x80,
0x90
};//利用数组保存各个数字的位置方便我们直接使用
void delayms(int ms){
unsigned int i;
while(ms--){
for(i=0;i<628;i++);
}
}//延时函数
void main(){
unsigned int i;
P2=0xa0;P0=0x00;//关闭继电器关闭蜂鸣器
P2=0xc0;P0=0xff;//选中所有数码管
P2=0xff;
i=0;
while(1){
P0=tab[i%10]//想一想为什么取余;
delayms(1000);
i++;
}//循环交换数字
}
以下视频效果
抱歉自己的视频传不上去,请自行复制代码,烧录查看效果
现在就是利用我之前写的定时器的博客的知识来实现一下,这个程序:
这里是我的定时器笔记
#include "reg52.h"
sfr AUXR =0x8E;
unsigned int tt;
unsigned int i;
unsigned int code tab[10]={
0xc0,
0xf9,
0xa4,
0xb0,
0x99,
0x92,
0x82,
0xf8,
0x80,
0x90
};
void delayms(int ms){
unsigned int j;
while(ms--){
for(j=0;j<628;j++);
}
}
void Timer0Init(void) //1ms@12.000MHz
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x20;
TH0 = 0xD1;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer() interrupt 1{
tt++;
if(tt==1000){
i++;
tt=0;
}
}
void main(){
P2=0xa0;P0=0x00;
P2=0xc0;P0=0xff;
P2=0xff;
i=0;
Timer0Init();
while(1){
P0=tab[i%10];
}
}
两个效果是一样的,不过下面的定时器1秒更精准一些
好了我的数码管的笔记到这就没了,下一个笔记是动态数码管