根据项目需求可以用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路输入信号,选中某个数码管显示。
实现数码管显示函数:
voidshowsmg(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~0for(i=0;i< 8;i++) { showsmg(i,i); delay(1); } } }
全部0条评论
快来发表一下你的评论吧 !