打印
[单片机类]

【一个小小的个人经验分享】【三】数码管静态、动态显示

[复制链接]
1276|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
enderman1|  楼主 | 2019-2-6 21:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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"这个东西,其实这个本人也没用过,有兴趣的可以研究一下哈~






总之,数码管这个东西主要还是是和其它设备一起使用的,单独实现感觉很简单,但是实际使用的时候往往会遇到各种问题,比如说数码管消隐,和其它外设结合起来不会亮,或者说按下按键的时候就亮一个等等这样的问题,我会在接下来的帖子当中提到,并且解决这些问题的。总之单片机这个东西本身不难,重要的是多练习多练习多练习,不要总是无脑借鉴其它人的代码,一定要多思考啊;,欢迎提出建议,评论留言,再见~~

相关帖子

沙发
Zhangqiankun| | 2019-3-3 10:00 | 只看该作者
第六行第一个i应该是0x01吧

使用特权

评论回复
板凳
enderman1|  楼主 | 2019-3-3 10:55 | 只看该作者
Zhangqiankun 发表于 2019-3-3 10:00
第六行第一个i应该是0x01吧

啊,是的,也没烧进去实验,秀逗了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

71

帖子

12

粉丝