根據項目需求可以用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);
}
}
}
-
收發器
+關注
關注
10文章
3454瀏覽量
106235 -
數碼管
+關注
關注
32文章
1883瀏覽量
91401 -
譯碼器
+關注
關注
4文章
312瀏覽量
50462 -
驅動電路
+關注
關注
153文章
1533瀏覽量
108741 -
引腳
+關注
關注
16文章
1220瀏覽量
50895
發布評論請先 登錄
相關推薦
評論