電路圖
注:實際中,我單片機的74HC573電路接法與P0端接反了
138譯碼器資料:https://pan.baidu.com/s/1COTcutsnMxMSc8tq0M2yVw 密碼:1jww
138譯碼器的真值表:
74HC573資料:https://pan.baidu.com/s/1b5OJXniyd6gODyf_eA_sXA 密碼:m7zx
如果學過數電,上面可以簡單看下。如果沒有,建議學過數電後再接觸單片機,也可以直接看下面。
過程
一、 首先,得知道如何正确點亮一個數位管(靜态顯示)。
數位管内部由七個條形發光二極管和一個小圓點發光二極管組成,根據各管的亮暗組合成字元。常見數位管有10跟管腳。其中有兩個公共端,根據内部發光二極管的接線形式可分為共陰極和共陽極兩種。使用時,共陰極數位管公共端接地,共陽極數位管公共端接電源。參照下圖:
通過給每個管腳高低電平即可控制數位管的亮滅。還是舉個例子吧,以共陰極數位管為例,讓數位管顯示數字0,隻要abcdef六個管腳輸入一個高電平即可讓數位管顯示數字0,此時用十六進制即為0011 1111(dp、g、f、e、d、c、b、a)0x3f。将上面的0x3f送入74HC573鎖存器,鎖存器再送到數位管,即點亮數位管。(來自:https://blog.csdn.net/fanyuqa/article/details/47395333)。本次使用的是共陰極。
二、 上面知道如何點亮一個數位管。下面接着介紹,點亮8個數位管中的哪一個。
這就要用到138譯碼器。其中,G1=vcc,G2A=G2B=0,買來的電路已經預設接好。上面的電路中,ABC分别P22,P23,P24;
如果,P22=0,P23=0,P24=1(0代表低電平,1代表高電平),即001,對應真值表為4。即第4序号的數位管被選中。
會了選中點亮某個數位管,就可以開始寫程式了。
#include "reg52.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
void main()
{
LSA=0;
LSB=0;
LSC=0;
P0=smgduan[0];
}
程式比較簡單,有兩個地方要注意。
1、不能直接令P2^2=0;
2、code+數組後,數組不能改變。https://zhidao.baidu.com/question/121263820.html
這裡有個靜态數位管的視訊,講的挺好:https://pan.baidu.com/s/1I7Gz55NCO_yqopAWOr07QA 密碼:3p7r
3、動态數位管,在靜态數位管的基礎上,隻是每次讓不同的數位管被點亮。當間隔時間很短時,人眼睛分辨不出來,就會感覺同時在亮。
#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar out[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint num)
{
while(num--);
}
void display()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數位管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P0=out[i];//發送段碼
delay(100); //間隔一段時間掃描
P0=0x00;//消隐
}
}
void main()
{
while(1)
{
display();
}
}
動态數位管視訊教程: https://pan.baidu.com/s/1fLopEJvdCpouLziTaSWxmg 密碼:7szd