本帖最后由 enderman1 于 2019-3-3 10:56 编辑
写在前面的话:啊,过年真的是好忙好忙啊,不知道大家忙不忙;总之今天抽空更新一下吧~;关于数码管是蓝桥杯51单片机比赛的重中之重,我个人认为它的地位和键盘的使用不相上下,而且都是数码管动态显示,至于静态显示,简单的铺垫一下就行了~
【一】数码管静态显示
从本质上来讲,数码管的静态显示与点亮流水灯无异,唯一的区别仅仅是同一个总线IO口,要送两次数据,分别是位选和段选(不论先后);
关于代码,要么总线操作,要么用之前的函数:
总线操作:
P2&=0x1f;
P2|=0xc0;//位选
P0=wDat;//送入位数据
P2&=0x1f;
P2|=0xe0;//段选
P0=dDat;//送入段数据
函数方法(位操作):
switch_138(6);//位选
P0=wDat;//送入位数据
switch_138(7);//段选
P0=dDat;//送入段数据
PS.switch_138();这个函数的实体在这里:https://bbs.21ic.com/icview-2622096-1-1.html
【二】数码管动态显示
数码管的静态显示是动态显示的一部分;关于动态显示的方法我已知的有三种:
1、第一种,最笨的方法,将数码管显示写成一个函数,一个位一个位的送数据
void display(unsigned char dat){
switch_138(6);//位选
P0=0xfe;//送入位数据
switch_138(7);//段选
P0=dat/100;//送入段数据
switch_138(6);//位选
P0=0xfd;//送入位数据
switch_138(7);//段选
P0=dat/10%10;//送入段数据
switch_138(6);//位选
P0=0xfb;//送入位数据
switch_138(7);//段选
P0=dat%10;//送入段数据
}
2、第二种,第一种的升级版,结合了数组的使用,可以使用for循环,对数据进行逐个处理
unsigned char dat_buf[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void display(){
unsigned char i=0x01;
for(i=0;i<8;i++){
switch_138(6);//位选
P0=~(i<<i);//送入位数据
switch_138(7);//段选
P0=dat_buf[i];//送入段数据
}
}
这样做的好处是可以控制哪一位不亮,而且避免了代码臃肿的问题;
3、第三种XBYTE[]的使用,使用的时候要先#include"absacc.h"这个东西,其实这个本人也没用过,有兴趣的可以研究一下哈~
总之,数码管这个东西主要还是是和其它设备一起使用的,单独实现感觉很简单,但是实际使用的时候往往会遇到各种问题,比如说数码管消隐,和其它外设结合起来不会亮,或者说按下按键的时候就亮一个等等这样的问题,我会在接下来的帖子当中提到,并且解决这些问题的。总之单片机这个东西本身不难,重要的是多练习多练习多练习,不要总是无脑借鉴其它人的代码,一定要多思考啊;,欢迎提出建议,评论留言,再见~~
|