;************************************************** ; 平凡單片機(jī)工作室 ;作者:周堅(jiān) ;功能描述: ;P3.2:開始,按此鍵則燈開始流動(由上而下) ;P3.3:停止,按此鍵則停止流動,所有燈為暗 ;P3.4:上,按此鍵則燈由上向下流動 ;P3.5:下,按此鍵則燈由下向上流動 ;本例可用TOP51-2005/TOPAV-2008單片機(jī)開發(fā)平臺驗(yàn)證 ;**************************************************
UpDown EQU 00H ;上下行標(biāo)志 StartEnd EQU 01H ;起動及停止標(biāo)志 LAMPCODE EQU 21H ;存放流動的數(shù)據(jù)代碼 ORG 0000H AJMP MAIN ORG 30H MAIN: MOV SP,#5FH MOV P1,#0FFH CLR UpDown ;啟動時(shí)處于向上的狀態(tài) CLR StartEnd ;啟動時(shí)處于停止?fàn)顟B(tài) MOV LAMPCODE,#0FEH ;單燈流動的代碼 LOOP: ACALL KEY ;調(diào)用鍵盤程序 JNB F0,LNEXT ;如果無鍵按下,則繼續(xù) ACALL KEYPROC ;否則調(diào)用鍵盤處理程序 LNEXT: ACALL LAMP ;調(diào)用燈顯示程序 AJMP LOOP ;反復(fù)循環(huán),主程序到此結(jié)束 ;--------------------------------------- DELAY: MOV R7,#10 D1: MOV R6,#100 DJNZ R6,$ DJNZ R7,D1 RET ;---------延時(shí)程序,鍵盤處理中調(diào)用 KEYPROC: MOV A,B ;從B寄存器中獲取鍵值 JB ACC.2,KeyStart ;分析鍵的代碼,某位被按下,則該位為1 JB ACC.3,KeyOver JB ACC.4,KeyUp JB ACC.5,KeyDown AJMP KEY_RET KeyStart: SETB StartEnd ;第一個鍵按下后的處理 AJMP KEY_RET KeyOver: CLR StartEnd ;第二個鍵按下后的處理 AJMP KEY_RET KeyUp: SETB UpDown ;第三個鍵按下后的處理 AJMP KEY_RET KeyDown: CLR UpDown ;第四個鍵按下后的處理 KEY_RET: RET
KEY: CLR F0 ;清F0,表示無鍵按下。 ORL P3,#00111100B ;將P3口的接有鍵的四位置1 MOV A,P3 ;取P3的值 ORL A,#11000011B ;將其余4位置1 CPL A ;取反 JZ K_RET ;如果為0則一定無鍵按下 ACALL DELAY ;否則延時(shí)去鍵抖 ORL P3,#00111100B MOV A,P3 ORL A,#11000011B CPL A JZ K_RET MOV B,A ;確實(shí)有鍵按下,將鍵值存入B中 SETB F0 ;設(shè)置有鍵按下的標(biāo)志 K_RET: ORL P3,#00111100B ;此處循環(huán)等待鍵的釋放 MOV A,P3 ORL A,#11000011B CPL A JZ K_RET1 ;直到讀取的數(shù)據(jù)取反后為0說明鍵釋放了,才從鍵盤處理程序中返回 AJMP K_RET K_RET1: RET ;----------------------------------- D500MS: ;流水燈的延遲時(shí)間 PUSH PSW SETB RS0 MOV R7,#5 ;如果用實(shí)驗(yàn)仿真板,該值可根據(jù)你的機(jī)器運(yùn)行情況更改,在1-255之間 D51: MOV R6,#250 D52: MOV R5,#200 D53: DJNZ R5,D53 DJNZ R6,D52 DJNZ R7,D51 POP PSW RET ;----------------------------------- LAMP: JB StartEnd,LampStart ;如果StartEnd=1,則啟動 MOV P1,#0FFH AJMP LAMPRET ;否則關(guān)閉所有顯示,返回 LampStart: JB UpDown,LAMPUP ;如果UpDown=1,則向上流動 MOV A,LAMPCODE RL A ;向上移動實(shí)際就是左移位 MOV LAMPCODE,A MOV P1,A LCALL D500MS AJMP LAMPRET LAMPUP: MOV A,LAMPCODE RR A ;向下流動實(shí)際就是右移 MOV LAMPCODE,A MOV P1,A LCALL D500MS LAMPRET: RET END |
|