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


蓝桥杯单片机开发板上一共有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. 省市县三级级联(模块化开发)
  2. java lambda 局部变量_java Lambda表达式访问局部变量详细介绍
  3. android动画效果 translate,Android利用translate、scale、alpha、rotate实现动画效果
  4. [转]订制CentOS自安装光盘
  5. 用dotnet自带的mail类发邮件出现的问题
  6. android 模拟器read-only file system,WAC启动Android模拟器 transfer error: Read-only file system错误解决方法...
  7. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
  8. mysql初体验学习笔记_【MySQL】mycli初体验
  9. AIDL Service
  10. 【物联网智能网关-16】成功移植SQLite(STM32 .NET MF平台)
  11. iOS autoreleasePool 深入理解
  12. 加密卡华为怎么模拟_华为手机NFC模拟加密的门禁卡详细教程
  13. GoldenDict音标乱码
  14. android恢复删除文件,如何恢复手机删除的文件
  15. 蓝牙耳机能否用于台式计算机,为什么台式机不能连接蓝牙耳机?只要它就可以实现!-蓝牙耳机怎么连接电脑...
  16. [附源码]java+ssm计算机毕业设计java磐基建筑机械租赁有限公司机械租赁系统41c32【源码、数据库、LW、部署】
  17. 如何在Excel表格中给某一列添加固定筛选项
  18. HSI、HSV、RGB、CMY、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV等颜色模型简介
  19. 面试表演了手写HashMap,把面试官给秀到了
  20. 清华大学丁霄汉:深度网络重参数化——让你的模型更快更强

热门文章

  1. 《花开半夏》--1 约定(1)
  2. 42 位专家,12 场演讲,龙蜥社区系统安全 MeetUp 精彩回顾来啦
  3. Ansible第一章:ansible的安装及部署
  4. Golang数据库编程(MySQL)
  5. 前端vue与后端golang数据库mysql 实现登录操作
  6. 超酷黑金配色OPPO R11 TFBOYS限量版9月8日正式预约
  7. android qq skype,Skype更新改进了反应选择器 并在安卓上添加了背景模糊
  8. C语言中voliate关键字的作用
  9. 59万想在广州买房,房子是买黄埔好还是南沙好?
  10. Sublime下的python配置