【blue bridge cup】控制数码管

数码管显示几乎是每次蓝桥杯单片机设计与开发组竞赛的必考部分,相对于使用LCD1602作为显示设备,使用数码管来显示能够更好的考察参赛选手的单片机基本功,因为CT107D开发平台的设计使得数码管的显示不仅牵扯到数码管显示的 基本内容,还涉及到74HC573锁存器,74HC02异或门,74HC138译码器,以及中断的知识,所以这是值得我们重视的一个部分。

一、原理分析 
根据CT107D的原理图我们可以看出,数码管显示同样涉及到74HC573、74HC138和74HC02,这与上一节中的LED灯、继电器和蜂鸣器的控制大同小异。如下图,蓝色标注为位选控制端口,由锁存器U6来控制,需配置红色标注的Y6C来控制锁存;黄色标注为段选控制端口,由锁存器U7来控制,需配置红色标注的Y7C来控制锁存。

这里写图片描述

而,控制Y6C与Y7C则需要通过74HC18和74HC02来进行控制,如下图,Y6C由Y6和WR共同控制,74HC02是一个4路2输入或非门功能,WR为低电平,要使Y6C为高,则Y6必须为低电平,即74HC138译码器的三个输入端应该为100,即P2^7=1,P2^6=0,P2^5=0。又只需要操作P2口的这三位,不需要配置其他的五位,所以P2端口应该配置为:P2 = ((P2&0x1f)|0xC0)。同理,控制Y7C时P2端口应该置为:P2 = ((P2&0x1f)|0xE0)。 
这里写图片描述

二、示例程序 
这里采用前后台的编程思想,即使用定时器中断来处理显示部分,作为前台,而逻辑处理与数据采集部分等则在主程序流程中来完成,作为后台。在下面这段程序中,定时器每隔2ms中断一次执行一次显示程序,然后继续执行主程序的任务,我们只要修改需要显示的数组即可实现显示不同的数值,使显示部分模块化,程序显示部分只提供外部接口(数组),不修改显示函数,这样不容易出错,而且能够使显示更方便。

//J13跳线帽选择IO#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int

uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};   //共阳极数码管段选编码数组
uchar dspbuf[] = {10,10,10,10,10,10,10,10};   //显示数据的数组
uchar dspcom = 0;   //位选控制变量


void display()  //显示函数
{   
    P2 = ((P2&0x1f)|0xE0);    //段选消隐
    P0 = 0xff;
    P2 &= 0x1f;

    P2 = ((P2&0x1f)|0xC0);   //位选
    P0 = 1<<dspcom;    //共阳极数码管位选
    P2 &= 0x1f;

    P2 = ((P2&0x1f)|0xE0);   //段选
    P0 = tab[dspbuf[dspcom]];
    P2 &= 0x1f;

    if(++dspcom == 8){      //位选编码,循环显示8位
        dspcom = 0;
    }    
}

void main()
{
   TMOD = 0x01;   //定时器0工作方式1
   TH0 = (65536-2000)/256;   //初始化
   TL0 = (65536-2000)%256;
   ET0 = 1;     //开定时器0中断允许位
   EA = 1;      //开总中断
   TR0 = 1;     //开定时器0

   while(1)
   {
      dspbuf[0] = 1;   //要显示不同的数据只需要修改此数组的值即可
      dspbuf[1] = 2;
      dspbuf[2] = 3;
      dspbuf[3] = 4;
      dspbuf[4] = 5;
      dspbuf[5] = 6;
      dspbuf[6] = 7;
      dspbuf[7] = 8;
   }   
}

void timer0() interrupt 1   //定时器0中断服务函数
{
   TH0 = (65536-2000)/256;
   TL0 = (65536-2000)%256;
   display();   //2ms显示一次
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是Python代码实现七彩数码管的绘制: ```python import turtle import time # 数码管的编码,0~9 digitals = ( (1, 1, 1, 1, 1, 1, 0), # 0 (0, 1, 1, 0, 0, 0, 0), # 1 (1, 1, 0, 1, 1, 0, 1), # 2 (1, 1, 1, 1, 0, 0, 1), # 3 (0, 1, 1, 0, 0, 1, 1), # 4 (1, 0, 1, 1, 0, 1, 1), # 5 (1, 0, 1, 1, 1, 1, 1), # 6 (1, 1, 1, 0, 0, 0, 0), # 7 (1, 1, 1, 1, 1, 1, 1), # 8 (1, 1, 1, 1, 0, 1, 1), # 9 ) # 数码管的颜色 colors = ('red', 'orange', 'yellow', 'green', 'blue', 'purple') # 绘制单个数码管 def draw_single_digital(digital, size, color): turtle.pencolor(color) turtle.pensize(size) turtle.penup() turtle.fd(size * 2) turtle.pendown() for i in range(7): if digital[i]: turtle.fd(size) else: turtle.penup() turtle.fd(size) turtle.pendown() if i == 2 or i == 4: turtle.right(90) else: turtle.right(180) turtle.penup() turtle.left(90) turtle.fd(size * 4) turtle.right(90) # 绘制七彩数码管 def draw_colorful_digital(number, size): turtle.speed(0) turtle.hideturtle() turtle.penup() turtle.bk(size * 4 * len(str(number))) turtle.pendown() for i in range(len(str(number))): draw_single_digital(digitals[int(str(number)[i])], size, colors[i % 6]) turtle.done() # 测试 if __name__ == '__main__': number = input('请输入数字:') size = int(input('请输入数码管大小:')) draw_colorful_digital(number, size) ``` 运行代码后,会提示输入数字和数码管大小。输入完后,就会绘制出七彩数码管。 效果如下图所示: 注:本代码使用Python的turtle库进行绘制,需要安装该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值