單片機(jī)學(xué)習(xí)——數(shù)碼管的動(dòng)態(tài)顯示(自用)
基礎(chǔ)知識(shí):靜態(tài)和動(dòng)態(tài)的區(qū)別
一般來說,靜態(tài)是由一個(gè)P0口控制多個(gè)com口,所以顯示的都是P0端輸出的內(nèi)容

如果要實(shí)現(xiàn)不同com口輸出不同的數(shù)值,則分別用不同的IO口控制輸入

這樣的方法占用了多個(gè)IO口資源,為了解決這個(gè)問題,引入了動(dòng)態(tài)顯示,即所有com口由一個(gè)P0口控制,既能顯示不同的數(shù)值又能節(jié)省IO口資源。
動(dòng)態(tài)顯示的實(shí)質(zhì)就是輪流點(diǎn)亮單個(gè)數(shù)碼管實(shí)現(xiàn)多位數(shù)碼管整體顯示的效果。
訓(xùn)練目標(biāo):
在8位數(shù)碼管中,前面四位顯示年份“2018”,后面四位顯示“--月份”,從一月份開始,每隔一段時(shí)間增加一個(gè)月,到十二月之后又從一月開始遞增。
軟件部分:
#include "reg52.h"
unsigned char yue=1;
?
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x80,
0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//(0-9? A-F? -? .)
void InitHC138(unsigned char n)
{
?switch(n) //選擇工作的鎖存器
?{
?case 4:
?P2=(P2 & 0x1f) | 0x80; ? //0x1f為00011111
?break; ? ? ? //&是為了給前三項(xiàng)清零
?case 5: ? ? ? //|為了輸入二進(jìn)制數(shù)
?P2=(P2 & 0x1f) | 0xa0;
?break;
?case 6:
?P2=(P2 & 0x1f) | 0xc0;
?break;
?case 7:
?P2=(P2 & 0x1f) | 0xe0;
?break;
?}
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)//點(diǎn)亮的數(shù)值與位置
?{
? ?InitHC138(6); //選擇控制位置的寄存器
? ?P0=0x01<<pos; //調(diào)整亮的位置
? ?InitHC138(7); //選擇控制數(shù)字的寄存器
? ?P0=value; //選擇輸入的數(shù)字(數(shù)字由16位段碼控制)
? }
void delaySMG(unsigned int t)
? {
? while(t--);
? }//數(shù)碼管顯示專用的delay函數(shù)
void Display_Dynamic() ?
? {
? DisplaySMG_Bit(SMG_duanma[2],0);
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[0],1);
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[1],2);
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[8],3);
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[16],4);
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[16],5); ? //以上為固定輸入
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[yue/10],6);
? delaySMG(500);
? DisplaySMG_Bit(SMG_duanma[yue%10],7);
? delaySMG(500);
} //對(duì)各個(gè)位置數(shù)碼管的輸入分別實(shí)現(xiàn)動(dòng)態(tài)控制
void delay(unsigned char t)
{
?while(t--);
?Display_Dynamic(); //還不懂為什么要在delay函數(shù)里添加動(dòng)態(tài)顯示函數(shù)
}
void main()
{
while(1)
{
?Display_Dynamic();
?yue++;
?if(yue>12)
?{
?yue=1;
?}
?delay(100);
}
}
相比靜態(tài),main函數(shù)中多了一個(gè)控制兩位顯示月份的for循環(huán)