C51编程9-数码管(显示)

 根据项目需求可以用I/O外部上拉,用来驱动数码管;也可以74HC138(38译码器)+74HC245(8路信号收发器)驱动数码管。本文会以后者为数码管驱动电路,在代码上实现数码管的显示。

 

驱动电路:

    

 

 

    电路讲解:

    1)数码管元件采用共阴数码管,如果需要某位数码管被点亮,位选引脚需要被拉成电平;   

    2)八个数码管有8个位选引脚,8个段选引脚。为了将节省I/O口,使用74HC138将3位(CBA)选择,转换为8位二值代码,例如CBA值为000时,Y0输出低电平,其余为高电平,由于Y0连接到数码1位选引脚(图中的LED1网络标号),数码管1被选中。

 

 

    3)74HC138控制的是位选引脚,而74HC245控制的是段选引脚,增强驱动能力。电路原理图中将DIR接高电平,OE接GND,使得其工作状态为An输入Bn输出。当P0输出0x00时,Bn端也会输出0x00;

 

 

代码实现:

 

 

1)数码管显示数值,有对应的编码(编码对应段选被点亮或不亮);

2)数码管编码按照一定的关系(一般为顺序0~F),存储在一维数组里面;

3)74HC245收发器,主要用来驱动数码管,根据数码管显示可以看做P0数据直接到达数码管;

4)调用一维数的元素,将编码值通过I/O口输出,控制段选信号,显示对应数值;

5)数字选择数码管,数字转换为38译码器的3路输入信号,选中某个数码管显示。

 

实现数码管显示函数:

void showsmg(uchar selsmg,uchar num){
  //选择显示数码管第几个,拆解为38译码器对应编码
  smg0 = selsmg&0x01;
  smg1 = (bit)((selsmg>>1)&0x01);
  smg2 = (bit)((selsmg>>2)&0x01);
  //将数码管编码(一维数组)赋值给P0口,显示对用数字
  P0 = table[num];
​
}

    

具体显示代码:

    功能:8个(7~0)数码管,从高到底显示7~0;

/********************************************************************************
* @File name: main.c
* @Author: AdamChen
* @Version: 1.1
* @Date: 2020-08-07
* @Description: LED display 
* @contact:975805363@qq.com
********************************************************************************/
​
#include "reg52.h"
​
typedef unsigned char uchar;
typedef unsigned int uint;
​
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};
sbit smg2 = P2^4;
sbit smg1 = P2^3;
sbit smg0 = P2^2;
​
/*******************************************************
* Function name :delay
* Description        : 延时函数
* Parameter         :
  @ms        millisecond(毫秒)    
* Return          :None 
**********************************************************/
void delay(unsigned int ms) // ms代表需要延时的毫秒数
{
  uint x,y;
  for(x=ms;x>0;x--)
  for(y=110;y>0;y--);
​
}
​
/*******************************************************
*
* Function name :showsmg
* Description        : 数码管显示
* Parameter         :
  @selsmg      选择数码管第几个
  @num      显示数值
*        
* Return          :None 
**********************************************************/
void showsmg(uchar selsmg,uchar num){
  //选择显示数码管第几个,拆解为38译码器对应编码
  smg0 = selsmg&0x01;
  smg1 = (bit)((selsmg>>1)&0x01);
  smg2 = (bit)((selsmg>>2)&0x01);
  //将数码管编码(一维数组)赋值给P0口,显示对用数字
  P0 = table[num];
​
}
​
/*******************************************************
*
* Function name :main
* Description        : 8数码管,从高到低显示7到0。
* Parameter         :None
* Return          :None 
**********************************************************/
void main(){
  uchar i;
  while(1){
  //循环选中,8个数码管,显示7~0
    for(i=0;i<8;i++)
    {
     showsmg(i,i);
      delay(1);
    }         
  }
}

---------------------------------------------------------

如果觉得文章还不错,那就扫码关注吧!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颖川初尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值