㈠ 單片機字母顯示
從DISP知道,這是一個顯示子程序
從SJMP DISP知道,這個是一個死循環,不停的在顯示
那麼顯示在哪裡
從P1可知,應該是P1口接了數碼管。
那麼顯示了什麼?
從#3CH可知,接了共陰極數碼管
顯示的是字母「b」且小數點不亮(可查閱段選碼)
然後為什麼這里是一個死循環?
應該是程序中有中斷,一直在等待中斷跳出。
SJMP DISP 跳到DISP:MOV P1,#3CH 這句,DISP是一個標號。也就是如果沒有中斷產生
那就一直在執行
DISP:MOV P1,#3C
-----SJMP DISP
可以看到你的程序是有中斷的
MOV IE,#85H中斷開放
-----SETB PX1
-----SETB IT0
-----SETB IT1
㈡ 共陰極單片機數碼管我不明白排列順序為何是hgfedcba這個順序,而不是從abcdefgh這個
不管是共陰還是共陽,都是按,dp,g,f,e,d,c,b,a的順序顯示。
只是對於共陰1代表亮,0代表滅。共陽正好相反。比如想用共陰顯示0,那按照順序就是0011 1111,轉換為16進制就是3f,所以ox3f就代表零。
㈢ 單片機數碼管顯示的原理(CA CC) 字型的顯示 動態顯示的原理 大概的說下 採納的再加分
數碼管,舉個例子,8段共陰極數碼管。其實它的結構很簡單,就是8個LED發光二極體,這8個LED發光二極體的正極就是a b c d e f g dp(小數點)這8個,負極就8個LED連接在一起。
單片機I/O口比如P0什麼的不是有8個?正好連接到8個發光二極體的正極。然後把數碼管負極接地。當你要顯示數字,比如2時,2對應a b d e g這幾個字母對應的LED亮,所以只要單片機接到abdeg的IO口置高電平就行了,正高負低,LED不就亮了?對應的LED亮了,不就顯示對應的數字了?
至於動態顯示,一般是8個數碼管吧?段的介面不變,還是P0口,而它們的負極呢,不再接地了,而是接到P2口(P1什麼的都行)。P2口來控制哪個數碼管亮。只有當P2口為低電平的時候,LED才有可能導通並亮。
比如你要顯示12345678,你可以先把P0口的段碼調到1,也就是bc亮,P1.1、P1.2置高電平,這樣就是顯示1了,然後就是位選了,1是顯示在第一位,所以你應該把P2.0置低電平,其他位置高電平,這樣,第一個數碼管就顯示1了。顯示2,則把P2.1拉低,其他拉高。這樣弄一個循環,數碼管不就從1依次顯示到8了?
不過由於單片機執行指令很快,如果直接12345678這樣顯示,由於太快,會導致數碼管很暗,所以,你可以在切換數碼管的時候,加上一點點的延時,不過不能太長,不然就會閃了。當然你也可以把顯示程序放到中斷里,比如沒過10ms就顯示一次,這樣會更好一點。
懂了嗎?
㈣ 單片機四位數碼管顯示中間一行字母
51單片機(四位數碼管蘆襪的顯示)程序基於單片機V1或V2實驗系統,編寫一個程序,實現以下功能:1)首先在數碼管 上顯示P 」個字元;2)等待按鍵,如按了任何一個鍵,則將這 4個字元清除, 改為顯示0000」個字元(為數字的0)。E3最佳答案下面這個程序是4x4距陣鍵拍或盤丄ED數碼管顯示,一共可以到0-F顯示,你可以稍微改一下就可以實現你的功能了,如還有問題請發信息,希望能幫上你!#i nclude<at89x52.h> un sig ned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //gongyang 數碼管 0-F 代碼
un sig ned char k;//設置全局變數k為鍵盤的鍵值鍵盤延時函數
//延時函數
void key_delay(void) {int t;for(t=0;t<500;t++);}
鍵盤掃描函數******************************/
//鍵盤掃描函數
void keyscan(void)
{unsigned char a;P2 = 0xf0;if(P2!=0xf0){key_delay();if(P2!=0xf0){P2 = 0xfe; key_delay();a = P2;switch (a)
//鍵盤初始化//有鍵按下?//延時//確認真的有鍵按下?//使行線 P2.4 為低電平,其餘行為高電平//a 作為緩存/陪賀激/開始執行行列掃描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行線 P2.5 為低電平,其餘行為高電平a = P2;switch (a)
case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行線 P2.6 為低電平,其餘行為高電平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行線P2.7為低電平,其餘行為高電平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;
}} break;}}}}
**************************** ***主函數 ***********************************
void main(void){while(1)
//調用鍵盤掃描函數//查找按鍵對應的數碼管顯示代碼
{keyscan(); switch(k){case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;
case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break; default:break; // 退出}}}
end
Welcome ToDownload !!!歡迎您的下載,資料僅供參考!
¥
5.9
網路文庫VIP限時優惠現在開通,立享6億+VIP內容
立即獲取
51單片機(四位數碼管的顯示)程序[1]
51單片機(四位數碼管的顯示)程序
基於單片機V1或V2實驗系統,編寫一個程序,實現以下功能:1)首先在數碼管 上顯示P 」個字元;2)等待按鍵,如按了任何一個鍵,則將這 4個字元清除, 改為顯示0000」個字元(為數字的0)。
E3最佳答案
下面這個程序是4x4距陣鍵盤丄ED數碼管顯示,一共可以到0-F顯示,你可以稍微
改一下就可以實現你的功能了,如還有問題請發信息,希望能幫上你!
㈤ 單片機數碼管管碼的意義是什麼
單片機數碼管是由8個LED組成的,根據「共陰」還是「共陽」,這個碼正好相反,如果共陰,那麼發「高」也就是1點亮,如果是共陽,發「低」也就是0點亮。每個LED是按如下圖的方式排列的,於是「碼」就按這個順序來給定一個控制狀態值。
㈥ 單片機開關控制LED數碼管的編碼
一,什麼是數碼管
數碼管,其實就是由多個led組合在一起的組合顯示塊;有共陰極的,也有共陽極的。使用的數碼管不同,裡麵包含的led個數也會有相關的差異。我們通常使用的數碼管,裡面有8個led燈,大家可以參照生活中的數碼管器件就一目瞭然了,你會發現,數碼管顯示的每一個數字或字母,都是一段一段組合拼接起來的,並不是像寫的那樣圓滑。其中,組合的每一個段,就是一個led燈。
二,點亮一個數碼管
2.1.在點亮數碼管之前,你還必須弄清楚,改數碼管的接是共陰極還是共陽極的接法;其次,還得弄清楚是那幾個(或一個) IO口是IO口 的斷選位(也就是控制顯示哪一個數碼管,通常由IO口控制一個解碼器來實現,因為這樣更節約IO口資源)。
2.2.弄清楚斷選位之後,還得知道,是哪些IO口控制我們的數碼管上的led;
比如:
P0.0 控制數碼管上的led.0;(注意:數碼管上對應的led位,可以參照原理圖上的或查閱相關資料獲得,這里僅僅舉列)
P0.1-->led.1 P0.2-->led2 ......
2.3.想要點亮數碼管很容易,只要開啟對應的數碼管斷選位,再設置數碼管上led的值為點亮(有的數碼管是共陰極接法,有的是共陽極接法,根據具體的設計,給出相關的高或低電平即可)就OK了。但是,我們要在數碼管上顯示我們想要的數字增么辦呢?這個時候,就是考研創造力的時候了,有的數碼管的資料會直接給出它的真值表,但有的卻不一定找得到。在這個時候,我們就得根據我們想要顯示的數字,點亮並熄滅對應數碼管上的led來實現。(推薦:你可以自己先實驗,找出0-9,或其他想要顯示的字元所對應的IO口的值,來保存起來,這樣你就可以重復利用啦!)
三,點亮多個數碼管
3.1 我們想要點亮多個數碼管,首先可以根據2.1,弄清楚你的數碼管的斷選位,然後周期性的改變斷選位的值,以此動態逐個顯示你的數碼管。
3.2 在顯示多個數碼管時,建議周期大於100hz,這樣人眼難以識別起關和開的瞬間,我們看起來就像時很多個數碼管同時點亮了一樣。
四,動態顯示數碼管
4.1 ,在動態顯示數碼管的值時,建議先根據2.2和2.3,把對應的數碼管顯示參數照準,並保存下來,這樣你用起來也方便。
4.2, 動態顯示數碼管,我們可以在規定的時間周期,改變數碼管對應led的開關個數來實現,比如說:
0 在數碼管中顯示的值為0xc0 1是0xf9
那麼我們就可以在規定的時間里,切換該值,從而達到動態效果。
4.3 我們應該注意的時,掃描數碼管(即顯示多個數碼管)應該與設置數碼管的值(數碼管中led的狀態更新)區分開,掃描周期我們可以放短一點,而改變它的值的周期我們可以一秒或者是2秒改變一次。
4.4 消除余暉,大家實驗後,可能會發現,你顯示的值有的時候並不是想要的,它會跳動或者是亮滅不清晰,這個我們就叫做余暉效應。
產生余暉效應的原因是因為你在選則下一個數碼管的時候,還保留了上一個數碼管的顯示值,所以我們消除余暉,只需要在改變數碼管顯示值的時候,先關閉所有數碼管的顯示,在值跟新完成後我們再打開顯示。這里你不用擔心關閉和開啟會有閃爍,更新值的時間會很短,肉眼時幾乎察覺不到滴。
5,示列代碼
/*
晶元:stc89c52
器件:38解碼器等
編譯環境:UV4,C語言
*/
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {undefined
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};//數碼管顯示值真值表緩存數組
unsigned char LedBuff[6] = {undefined
0xff,0xff,0xff,0xff,0xff,0xff
};//數碼管顯示值緩存數組
void main()
{undefined
unsigned char i =0;
unsigned int cnt = 0;
unsigned long sec = 0;
ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
while(1)
{undefined
if(TF0==1)
{undefined
TF0 = 0;
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
if(cnt>=1000)
{undefined
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
switch(i)
{undefined
case 0:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];ENLED = 0;break;
case 1:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];ENLED = 0;break;
case 2:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];ENLED = 0;break;
case 3:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];ENLED = 0;break;
case 4:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];ENLED = 0;break;
case 5:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];ENLED = 0;break;
default:break;
}
}
}
}
以上代碼,僅供參考,您需要根據自己原理圖的設計來實現。
㈦ 用89c51單片機寫一個數碼管顯示HELLO的程序,是在一個七段數碼管上依次出現幾個字母
在數碼管依次排列好這一句話,首先取模,然後寫顯示函數,寫完函數放置while(1)中無限循環下去
代碼如下:
#include; //用的是單獨操作,沒有用匯流排
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6; //看清楚自己的管腳,不一定對應,這里採用P0對應段選
code unsigned char led_paly[5] = {0x76,0x79,0x38,0x38,0x5c};// H E L L O
void delay(unsigned int um)//延時函數
{
int i,j;
for(i = 0;i < um;i++)
{
for(j = 0;j < 200;j++);
}
}
void display()
{
P0 = led_paly[0];//顯示局尺桐H
led2 = 0;
delay(50);
led2 = 1;
P0 = led_paly[1];//顯示E
led3 = 0;
delay(50);
led3 = 1;
P0 = led_paly[2];//顯示L
led4 = 0;
delay(50);
led4 = 1;
P0 = led_paly[3];//顯示E
led5 = 0;
delay(50);
led5 = 1;
P0 = led_paly[4];//顯示O
led6 = 0;
delay(50);
led6 = 1;
}
void main(void)
{
while(1)
{
display();
}
}
(7)單片機數碼管字母擴展閱讀:
51單片機的介面作用
P0口:可以被定義為桐坦數據/地址的低八位,能夠用於外部程序/數據存儲器。在FIASH編程時,P0口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口:標准輸入輸出I/O,P1口管腳寫入1後,被內部上拉為高,可用作輸入。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口:既困棗可用於標准輸入輸出I/O,也可用於外部程序存儲器或數據存儲器訪問時的高八位地址。
P3口:既可以做標准輸入輸出I/O,也可作為AT89C51的一些特殊功能口。