如果你对开发板原理图上译码器和锁存器和还有与非门连接的电路还不够了解,那么请看:
蓝桥杯单片机(一)流水灯
首先我们分析数码管依旧从原理图开始:


蓝桥杯单片机开发板上一共有8根数码管,与上图一一对应,我们先单独讲第一排数码管,数码管下面一共有两排引脚,a1-dp1和com1-4,其中数码管a1-dp1是对应一个数码管上的每一段(图中也标识出来了),所以如果想显示0,a1-dp1=1100 0000,当然这是共阳数码管,如果是共阴数码管则是0011 1111,蓝桥杯开发板上是共阳数码管。然后com1-4对应的是数码管未选,比如com1等于1,第一个数码管就被选上了,然后以此类推。

a1-dp1接到了a-dp然后接到了锁存器的Q1-Q8,锁存器另外一端是P0口,所以数码管依然由P0控制,com1-4接到了另外一个锁存器,锁存器另外一端也仍然由P0控制,所以数码管的位选(亮几根数码管)和怎么亮都由P0控制,但是每个锁存器的控制端LE接到了与非门然后连接到了译码器,译码器的输入就是P2的高三位。

所以控制数码管就是先打开P2到数码管位选,使用P0控制显示几根数码管,再又用P2到单根数码管来使用P0显示对应的符号。

所以对应的程序为:

P2=0XC0;//P2打开数码管位选锁存器
P0=0XFF;//FF=1111 1111 意为打开所有数码管
P2=0XE0;//P2打开数码管锁存器
P0=0xC0;//C0=1100 0000 意为所有数码管显示0

最后效果如下:

但是如果所有数码管都只能显示一样的数字,那么这样八根数码管的设计显得毫无意义。

所以接下来介绍动态数码管。
动态数码管就是利用人眼的视觉缺陷来显示数码管,例如:平时生活中的灯其实都是在快速闪烁,只是频率太高,人眼看不见。
动态数码管也是如此,每次只打开一根数码管,显示数字,然后快速切换到第二个数码管,然后依次循环,这样人眼就能看见数码管显示不同的数字了。

下面是动态数码管的程序:

unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//tab数组存放了数码管0-9和全熄
unsigned char SMG[8];
//SMG数组用于存放数码管显示tab的数字几
void SMG_output(void)
{unsigned char i;for(i=0;i<8;i++){P2=(P2&0X1F)|0Xc0;P0=(1<<i);P2=(P2&0X1F)|0Xe0;P0=tab[SMG[i]];delayms(1);}//最后消隐P2=(P2&0X1F)|0Xc0;P0=0Xff;P2=(P2&0X1F)|0Xe0;P0=0Xff;
}

当然也可以使用定时器来写数码管

unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//tab数组存放了数码管0-9和全熄
unsigned char SMG[8];
//SMG数组用于存放数码管显示tab的数字几
unsigned char num=0;void SMG_output() interrupt 1
{P2=(P2&0X1F)|0Xc0;P0=(1<<num);P2=(P2&0X1F)|0Xe0;P0=tab[SMG[num]];if(++num==8)num=0;
}void Timer0Init(void)      //500微秒@11.0592MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0x66;       //设置定时初值TH0 = 0xEA;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时
}

首先定义tab和SMG两个数组。进入数码管显示函数,用循环来对应0-7个数码管,首先用P2选中位选锁存器,P0=(1<<i)就是选中0-7根数码管,比如i=1,P0=0000 0010,就对应第二根数码管(0是第一根数码管)。然后又用P2选中数码管显示锁存器,P0=tab[SMG[i]],比如想在第一个数码管显示1,那么先让SMG[0]=1,这样P0=tab[1]=0xf9,就是显示一了。

接下来使用数码管写一个99秒倒计时程序:

#include<stc15f2k60s2.h>
#include"intrins.h"#define uchar unsigned charvoid SMG_output(void);
void init(void);
void Delay1ms(void);uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar SMG[8]={10,10,10,10,10,10,10,10};
uchar time=99;
uchar num=0;void main(void)
{init();while(1){num++;if(num==1000/8){num=0;time--;}SMG[0]=time/10;SMG[1]=time%10;      SMG_output();}
}void SMG_output(void)
{uchar i;for(i=0;i<8;i++){P2=(P2&0X1F)|0Xc0;P0=(1<<i);P2=(P2&0X1F)|0Xe0;P0=tab[SMG[i]];Delay1ms();}P2=(P2&0X1F)|0Xc0;P0=0Xff;P2=(P2&0X1F)|0Xe0;P0=0Xff;
}void Delay1ms(void)        //@11.0592MHz
{unsigned char i, j;_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);
}//初始化程序,上电关闭LED,蜂鸣器,继电器,数码管
void init(void)
{P2=(P2&0X1F)|0XA0;P0=0X00;P2=(P2&0X1F)|0X80;P0=0Xff;P2=(P2&0X1F)|0Xc0;P0=0Xff;P2=(P2&0X1F)|0Xe0;P0=0Xff;
}

由于数码管每次选择都会延时1ms,所以每次进入SMG_output都会延时8ms,每次主函数循环num++,记为一次8ms,当num==1000ms/8ms时,也就是1m时,num=0,然后时间变量time减一,由于时没有用定时器来计时,所以实际显示时间可能不是特别准确。
效果如下:


有问题可以评论和私信

蓝桥杯单片机(四)动态数码管相关推荐

  1. 蓝桥杯单片机KBD控制数码管

    蓝桥杯单片机组中矩阵按键通过P3^0~P3^5以及P4^2.P4^4控制. 矩阵按键一般的控制方法为单个io检测赋值,这样代码烦长且重复工作量大,直接取IO值相比来说更加简洁.而蓝桥杯并不好直接取IO ...

  2. 蓝桥杯单片机学习3——数码管静态显示

    上期我们学习了如何控制蜂鸣器和继电器,那么这次就开始来学习数码管的静态显示 效果展示 结果就是在数码管上显示了一列数字,当然也可以显示一部分字母,至于怎么显示,接着往下看,心急吃不了热豆腐 原理图 数 ...

  3. [蓝桥杯单片机 八位共阳数码管](4)

    [蓝桥杯单片机 共阳数码管] 一.数码管原理图 开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极):a–dp分别控制数码管每一位的八个段.它们两又分别被锁存器U6和U7控制着 ...

  4. 【蓝桥杯—单片机学习笔记(四)】共阳数码管的动态显示

    一.要求 在CT107D单片机训练综合平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份"2022",接着是2个分隔符"--",最后两位是月份,从1 ...

  5. 【第十四届蓝桥杯单片机组客观题1】

    第十四届蓝桥杯单片机组客观题1 以下客观题来自4T测评的模拟题,希望可以帮助到大家,加油丫 1.C 若希望将IAP15F2K61S2单片机的IO口输出电流能力较强,应将IO配置为( )模式. A : ...

  6. 【蓝桥杯-单片机学习笔记(六)】矩阵键盘控制数码管显示0~F

    一.要求 在CT107D单片机训练平台上,首先将J5处的跳线帽接到1~2引脚,使按键S4~S19组成4*4的矩阵键盘.在扫描按键的过程中,发现有按键触发信号后,待按键松开后,数码管显示相应的数字.按键 ...

  7. 【第十四届蓝桥杯单片机组模拟赛1】

    第十四届蓝桥杯单片机组模拟赛1 距第十四届蓝桥杯单片机还有不到一个月的时间啦,加油 源码 /*------------------------------第十四届蓝桥杯单片机模式赛---------- ...

  8. 蓝桥杯单片机设计点1:按键长按触发,数码管被选中闪烁动画

    目录 附上工程下载地址: 附上最新更改后的工程下载地址: 蓝桥杯设计点1介绍: 实践上的实现与解析: 1.add分位的处理.按键短按: 2.矩阵按键长按触发的写法: 3.数码管被选中的亮灭闪烁动画: ...

  9. 蓝桥杯单片机学习过程记录(十四)第六届温度记录

    蓝桥杯单片机学习过程记录(十四)第六届温度记录 应用的内容: 定时器 数码管 时钟ds1302 温度传感器ds18b20 独立按键 结果实现的问题: 时钟和定时器两个时间走的不同,定时器5ms下200 ...

最新文章

  1. Python基础23_os,sys,序列化,pickle,json
  2. 用python画动态皮卡丘_利用Python绘制萌萌哒的皮卡丘
  3. 银行工作人员违规发放贷款要坐牢吗?
  4. 劈尖等厚干涉条纹matlab,劈尖等厚干涉实验中,k=0级的干涉条纹是条纹,与k级暗条纹对应的空气薄膜的厚度为...
  5. PHP操作MongoDB GridFS 存储文件
  6. Linux逻辑运算优先级,linux中的逻辑运算和正则表达式
  7. java动态录音_java实现动态录音,声卡有声音进来就自动录音
  8. java大数据开发工程师,面试题附答案
  9. 2020杭电多校6 1006A Very Easy Graph Problem血泪史
  10. Atitit 图像处理 调用opencv 通过java  api   attilax总结
  11. 怎么更改AD域用户账号和密码_AD域管理中那些实用的软件
  12. 图扑软件 | 数字孪生智慧选煤厂
  13. 关于python中的三个点【...】
  14. flyway java使用_Flyway的Java原生版操作
  15. 刘同——谁的青春不迷茫,给你冬日满满正能量
  16. java定时执行bat_windows定时器配置执行java jar文件的方法详解
  17. MA8601 无需更改电路直接pin√pin替代FE8.1s方案
  18. Python下载酷狗音乐歌曲
  19. 通用接口开放平台设计与实现——(2)功能架构
  20. composer类库—汉字转拼音

热门文章

  1. 【数字视音频处理】复习笔记 (。・∀・)ノ゛
  2. 关于ext each的理解
  3. 互联网 Java 工程师面试题之Spring(二)
  4. python循环语句格式_Python基础-10循环语句
  5. 集五福,我用 Python
  6. NOJ-求广义表深度-西工大数据结构
  7. 大数据开发技术与实践期末复习(HITWH)
  8. 跳子游戏--最少跳跃次数
  9. springboot 对接sap接口,不生成连接配置文件文件的方法。
  10. u201d java_从制动系统看新能源汽车\u201c油改电\u201d的进阶