專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機IO并行口直接驅動LED顯示技術

作者:89s51   來源:不詳   點擊數:  更新時間:2007年05月18日   【字體:

1.     實驗任務

如圖13所示,利用AT89S51單片機的P0端口的P0.0-P0.7連接到一個共陰數碼管的a-h(huán)的筆段上,數碼管的公共端接地。在數碼管上循環(huán)顯示0-9數字,時間間隔0.2秒。

 

 

2.     電路原理圖

圖4.7.1

3.     系統(tǒng)板上硬件連線

把“單片機系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數碼顯示模塊”區(qū)域中的任一個數碼管的a-h(huán)端口上;要求:P0.0/AD0與a相連,P0.1/AD1與b相連,P0.2/AD2與c相連,……,P0.7/AD7與h相連。

4.     程序設計內容

(1.       LED數碼顯示原理

七段LED顯示器內部由七個條形發(fā)光二極管和一個小圓點發(fā)光二極管組成,根據各管的極管的接線形式,可分成共陰極型和共陽極型。

LED數碼管的g~a七個發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不以發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,下面給出共陰極的字形碼見表2

“0”

3FH

 

“8”

7FH

 

“1”

06H

 

“9”

6FH

 

“2”

5BH

 

“A”

77H

 

“3”

4FH

 

“b”

7CH

 

“4”

66H

 

“C”

39H

 

“5”

6DH

 

“d”

5EH

 

“6”

7DH

 

“E”

79H

 

“7”

07H

 

“F”

71H

 

(2.       由于顯示的數字0-9的字形碼沒有規(guī)律可循,只能采用查表的方式來完成我們所需的要求了。這樣我們按著數字0-9的順序,把每個數字的筆段代碼按順序排好!建立的表格如下所示:TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

5.程序框圖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

圖4.7.2

6.匯編源程序

                            ORG 0

START:               MOV R1,#00H

NEXT:                MOV A,R1

                            MOV DPTR,#TABLE

                            MOVC A,@A+DPTR

                            MOV P0,A

                            LCALL DELAY

                            INC R1

                            CJNE R1,#10,NEXT

                            LJMP START

DELAY:              MOV R5,#20

D2:                      MOV R6,#20

D1:                      MOV R7,#248

                            DJNZ R7,$

                            DJNZ R6,D1

                            DJNZ R5,D2

                            RET

TABLE:              DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

                            END

7. C語言源程序

#include <AT89X51.H>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,

                            0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char dispcount;

 

void delay02s(void)

{

  unsigned char i,j,k;

  for(i=20;i>0;i--)

  for(j=20;j>0;j--)

  for(k=248;k>0;k--);

}

 

void main(void)

{

  while(1)

    {

      for(dispcount=0;dispcount<10;dispcount++)

        {

          P0=table[dispcount];

          delay02s();

        }

    }

}  

關閉窗口