;=======================================
;跳線設置:默認
;晶振:12M
;試驗結果8*8點陣上出現流水燈
;74hc164芯片可實現串-并,所以常用他來擴展單片機io口,51hei板子上的8*8點陣有8行8列
;本來是需要8個io口來控制行數據的,現在我們用74hc164后只需要2個io口便能實現
;===========預定義======================
SDA BIT P2.5 ;74HC164的AB端串行輸入
SCL BIT P2.4 ;74HC164的CLK端,上升沿有效
dds EQU 48H
ORG 0000H
AJMP MAIN
ORG 0100H
;============主程序開始=======================
MAIN:
clr P2.7 ;關數碼管
mov ACC,#0FFH ;送SHIFT子程序的參數
ACALL SHIFT ;調74hc164移位輸出子程序,把FF輸出到8*8點陣的所有行
;因51hei開發板采用共陽點陣,這時只要哪一列為0,這一列便可被點亮
mov dds,#0feH ;二進制為11111110,供RL指令移位用
huqin:
mov P0,dds ;輸出到8*8點陣的列,每一次只有一列被點亮
mov dds,P0 ;P0現在的值保存到48H里去
mov a,dds ;由于RAM中不能直接RL移位,所以先送人A
RL a ;移位
mov dds,a ;移位之后的數據保存到48H里去
ACALL DELAY_1S ;延時1.002035秒
jmp huqin ;死循環
;============74hc164移位輸出子程序==============================
; 子程序名: SHIFT
; 功能描述: 移位程序,將8位數據依次移進74LS164芯片中
; 控制方式就是數據引腳的數據在時鐘引腳的脈沖下一位一位的移入芯片
; 程序作者: 胡琴 網站:www.raoushi.com
;===============================================================
SHIFT: push ACC ;A進棧暫存
MOV R2,#8 ;串輸出數據8位
CLR C ;把C清0
hei: CLR SCL ;拉低SCL,以便下次拉高便可產生上升沿
RLC A ;A的最高位移到C,C原值移到A最低位
MOV SDA,C ;C中的數據先送入74hc164,等待clk上升沿的到來
SETB SCL ;低電平到高電平邊沿觸發到來,并行數據輸出至164的Q0-Q7
DJNZ R2,hei ;判斷輸出完畢了沒有
pop ACC ;出棧恢復A值
RET
;============延時子程序=============
DELAY_1S: ;延時子程序,12M晶振延時1.002035秒
MOV R4,#10
L3: MOV R2 ,#200 ;1指令周期
L1: MOV R3 ,#249 ;1指令周期
L2: DJNZ R3 ,L2 ;2指令周期
DJNZ R2 ,L1 ;2指令周期
DJNZ R4 ,L3 ;2指令周期
RET ;2指令周期
;循環體延時時間: [(249*2+1+2)*200+1+2]*10*12/12000000=1.002030s
;加上ACALL指令和第一條mov指令以及最后一條RET指令算出來整個函數的時間為1.002035s
;===================================================
END ;匯編結束偽指令
c語言的版本由于分為幾個文件不方便在論壇貼出,用戶可從以下地址獲得
源代碼與hex文件下載:
匯編語言:http://www.raoushi.com/ziliao/51hei-5/74HC164串-并_asm.rar
C 語言:http://www.raoushi.com/ziliao/51hei-5/74HC164串-并_c.rar
[此貼子已經被作者于2010-7-4 2:35:19編輯過]
|