轉自:http://www.zg4o1577.cn/mcu/2655.html
一般數碼管需要接7個腳才能顯示,如果用單片機本身的I/O口,雖然可以但是浪費寶貴的i/O口資源。本例用移位寄存器74HC164作為數碼管驅動進行控制。
74HC164特性 是一種8位串轉并口的控制芯片,用于數碼管和液晶顯示等.
工作電壓2--6V
管腳定義:

1) A,B管腳:與門數據輸入引腳。
2)QA---QH 數據并口輸出引腳
3) CLR 低電平時,數據清零,不能輸入
4) CLK 數據輸入時鐘,上升沿讀取串口數據


:
時序圖:

注意脈沖寬度:


本51單片機用的是12MHZ晶振,每條指令最小執行時間1uS》》1ns ,可以根據時序圖隨便使用.
原理圖:

程序代碼:
完整的keil工程文件下載地址: http://www.zg4o1577.cn/f/k164.rar
ORG 00H ;程序起始地址00H
START:
MOV 50H,#9 ;立即數9放入50H單元 第一個數碼管顯示9
MOV 51H,#4 ;立即數4放入51H單元 第二個數碼管顯示4
MOV R0,#50H ;R0=50
MOV R1,#60H ;R1=60
MOV R2,#2
DP0:
MOV DPTR,#TABLE ;將碼表首地址給DPTR指針
MOV A,@R0 ;將50H單元中的9給A
MOVC A,@A+DPTR ;查表得到(9+碼表首地址)合成的地址中的數給累加器A
MOV @R1,A ;把立即數9的段碼,放入 60H單元中
INC R1 ;R1=61H
INC R0 ;R0=51H
DJNZ R2,DP0 ;如果R2不等于0,則跳轉到DP0
//---------------從上面計算可得到: (60H)=10H,(61H)=19H
MOV R0,#60H ;R0=60重新建立映射關系
MOV R1,#2 ;數碼管有2個段碼
DP1:
MOV R2,#8 ;一個71HC164移位寄存器需要移動8次,以產生并口輸出數據給數碼管
MOV A,@R0 ;(60H)中的數9的段碼,賦給累加器A
DP2:
RLC A ;帶進位標志的左移操作
MOV P2.0,C ;串行輸出一位段碼數據
CLR P2.1 ;
SETB P2.1 ;來個上升沿以產生移位時鐘, 每次來這個脈沖,移位寄存器上的數往后面移動一位,原來A=1,
;來個脈沖后B=1,在來個脈沖后,C=1,以此類推。。。。。
DJNZ R2,DP2 ;判斷8位段碼是否輸出完整
INC R0 ;下一個需要輸出的段碼地址加1
DJNZ R1,DP1 ;判斷2個段碼是否輸出完畢
JMP $ ;程序停在此處
TABLE: ;數碼管碼表
DB 40H,79H,24H,30H,19H ;0,1,2,3,4
DB 12H,02H,78H,00H,10H ;5,6,7,8,9
END

|