?? 01-15.asm
字號:
CLR SDA ;發送應答信號的數據信號
SETB SCL ;發送應答信號的時鐘信號
NOP ; 等待》4.0US(即應答信號建立的時間大于4.0US)
NOP
NOP
NOP
NOP
;發送應答信號完畢,數據線和時鐘線復位
CLR SCL
RET
END
;================================================================
;名稱:MNACK
;描述:發送反應答確認信號/ACK---讀完所有字節后發,這樣才能產生
;停止條件
;================================================================
PROC MNACK
MNACK:
SETB SDA ;發送反應答信號的數據信號
SETB SCL
;發送應答信號的時鐘信號
NOP ;等待》4.0US(即非應答信號建立的時間大于4.0US)
NOP
NOP
NOP
NOP ;
CLR SCL
RET
END
;================================================================
;名稱:CHECKACK
;描述:檢查是否有應答位---本程序,是單片機產生額外的第九個時鐘脈
;沖 ,在脈沖高電平時讀應答位,有正常ACK置F0為0,否則為1
;================================================================
PROC CHECKACK
CHECKACK:
SETB SDA ;拉高數據線
NOP
NOP
SETB SCL ;拉高時鐘線,第九個時鐘脈沖開始
NOP
NOP
MOV C,SDA ;讀數據線的狀態
MOV FINISH,C ;轉存到F0中(應答信號SDA為0,即F0=0有應答信號,F0=1沒應答信號)
NOP
NOP
CLR SCL ;拉低時鐘線,第九個時鐘脈沖結束
RET
END
;--------------------------------------------------------------
; 星期顯示子程序
;--------------------------------------------------------------
PROC CONVER
CONVER:MOV A,#8DH ; //星期顯示地址
LCALL WRITE_COM
MOV R7,#00H
GODIS: CLR A
MOV A,R7
MOVC A,@A+DPTR
JZ LOOP
LCALL WRITE_DATA
INC DPTR
CJNE A,#04H,GODIS
LOOP: RET
END
;===========================
;LCD顯示程序
;===========================
PROC DISP
DISP:
MOV 60H,#20H
MOV 65H,#3AH ; //':'ASCII代碼
MOV 67H,#3AH ; //':'ASCII代碼
MOV A,46H
MOV 61H,A
MOV A,45H
MOV 62H,A
MOV A,43H
MOV 63H,A
MOV A,42H
MOV 64H,A
MOV A,41H
MOV 66H,A
MOV A,40H
MOV 68H,A
MOV A,44H
MOV 69H,A
;--------------------------------------------------------------
; RT1602C開始顯示程序
;--------------------------------------------------------------
MOV A,#81H ;//年顯示地址,第一行第二位置開始
LCALL WRITE_COM
MOV R5,60H ;//'20'送R5
LCALL BREAK
;--------------------------------------------------------------
MOV A,#83H ;//年顯示地址
LCALL WRITE_COM
MOV R5,61H ;//'06'
LCALL BREAK
;--------------------------------------------------------------
MOV A,#85H ;顯示"/"
LCALL WRITE_COM
MOV A,#02FH
LCALL WRITE_DATA
;-------------------------------------------------------------
MOV A,#86H ;//月顯示地址
LCALL WRITE_COM
MOV R5,62H ;//'09'
LCALL BREAK
;--------------------------------------------------------------
MOV A,#88H ;顯示"/"
LCALL WRITE_COM
MOV A,#02FH
LCALL WRITE_DATA
;--------------------------------------------------------------
MOV A,#89H ;//日顯示地址
LCALL WRITE_COM
MOV R5,63H ;//'09'
LCALL BREAK
;--------------------------------------------------------------
MOV A,#0C4H ;//時顯示地址
LCALL WRITE_COM
MOV R5,64H ;//'00'
LCALL BREAK
;--------------------------------------------------------------
MOV A,#0C6H ;//":"顯示地址
LCALL WRITE_COM
MOV A,65H ;//':'
LCALL WRITE_DATA
;--------------------------------------------------------------
MOV A,#0C7H ;//分顯示地址
LCALL WRITE_COM
MOV R5,66H ;//'00'
LCALL BREAK
;--------------------------------------------------------------
MOV A,#0C9H ;//":"顯示地址
LCALL WRITE_COM
MOV A,67H ;//':'
LCALL WRITE_DATA
;--------------------------------------------------------------
MOV A,#0CAH ;//秒顯示地址
LCALL WRITE_COM
MOV R5,68H ;//'00'
LCALL BREAK
;--------------------------------------------------------------
MOV R6,69H ;=========星期顯示,轉換成字母顯示
SUNDAY:CJNE R6,#00H,MONDAY
MOV DPTR,#TAB0
LCALL CONVER
MONDAY:CJNE R6,#01H,TUESDAY
MOV DPTR,#TAB1
LCALL CONVER
TUESDAY:CJNE R6,#02H,WEDSDAY
MOV DPTR,#TAB2
LCALL CONVER
WEDSDAY:CJNE R6,#03H,THURSDAY
MOV DPTR,#TAB3
LCALL CONVER
THURSDAY:CJNE R6,#04H,FRIDAY
MOV DPTR,#TAB4
LCALL CONVER
FRIDAY:CJNE R6,#05H,SATURDAY
MOV DPTR,#TAB5
LCALL CONVER
SATURDAY:CJNE R6,#06H,ENDDISP
MOV DPTR,#TAB6
LCALL CONVER
ENDDISP:
RET
END
;--------------------------------------------------------------
; 把要顯示的內容拆開分別送LCD顯示子程序
;--------------------------------------------------------------
PROC BREAK
BREAK:MOV A,R5
SWAP A ;//=====顯示十位
ANL A,#0FH
ADD A,#30H
LCALL WRITE_DATA
MOV A,R5 ; //=====顯示個位
ANL A,#0FH
ADD A,#30H
LCALL WRITE_DATA
RET
END
;---------------------------------------------
;鍵盤輸入子程序
;---------------------------------------------
PROC KEY
KEY:
LCALL KEYCHECK ;讀鍵盤狀態
;檢查鍵盤有無輸入
MOV A, KEYNAME
JNB ACC.7, NEXT ;ACC.7為0,鍵盤按鍵無效,就返回主程序
;ACC.7為1,進入按鍵處理子程序
MOV A, KEYNAME ;讀按鍵值
ANL A, #1FH ;保留
MOV KEYNAME, A ;清除按鍵處理標志
LCALL KEYDO ;進入按鍵處理子程序
NEXT:RET
END
;-----------------------------------------------
;鍵盤檢測子程序
;-----------------------------------------------
PROC KEYCHECK
KEYCHECK:
MOV DPTR, #PORTD ;U105口地址送DPTR
MOV A, PORTDR ;讀U105口在內存中的映象地址
ANL A, #0E0H ;輸出全為低電平的掃描信號
MOVX @DPTR, A ;數據送U105輸出口,將PD4~PD0置為低電平
MOV DPTR, #PORTB ;8255(U107)B口地址送DPTR
MOVX A, @DPTR ;讀出B口
ANL A, #0FH ;屏蔽高4位
CJNE A, #0FH, NEXT1
;等于0F,說明沒有按鍵被按下
SETB C ;將C標志置1
SJMP NEXT21
NEXT1:
CLR C ;C標志清0
NEXT21:
MOV A, KEYSTU
RLC A ;左移一位,記錄最新的按鍵狀態
ANL A, #07H ;保留按鍵狀態
MOV KEYSTU, A ;保存按鍵狀態
;判別按鍵狀態,決定是否執行按鍵掃描
CJNE A, #2, NEXT3
;處于010態,視為按鍵過程中的無意松動,應作000態處理
ANL KEYSTU, #0F8H
SJMP NEXT4
NEXT3:
CJNE A, #4, NEXT4
;處于100態,說明按鍵已穩定閉合,可進行按鍵掃描
LCALL KEYSCAN ;執行鍵盤掃描,確定哪一按鍵被按下
NEXT4:
;將PD4~PD0置為高電平,使74HC273輸出級截止,降低功耗。
MOV DPTR, #PORTD ;U105口地址送DPTR
MOV A, PORTDR ;讀U105口在內存中的映象地址
ORL A, #1FH
MOVX @DPTR, A ;數據送U105輸出口
RET
END
;------------------------------------------------
;鍵盤掃描子程序
;-------------------------------------------------
PROC KEYSCAN ;鍵盤掃描程序
KEYSCAN:
MOV R7, #5 ;定義掃描次數
MOV R1, #0 ;初始化列地址
MOV R3, #01111111B ;掃描碼初值
LOOP1:
;生成掃描碼
MOV A, R3
RL A ;左移一位(從PD0開始掃描)
MOV R3, A ;保存掃描碼
ANL A, #00011111B ;保留掃描碼
MOV B, A ;暫時保存在B寄存器中
MOV DPTR, #PORTD ;U105口地址送DPTR
MOV A, PORTDR ;讀U105口在內存中的映象地址
ANL A, #0E0H ;保留與鍵盤掃描無關的b7~b5位。
ORL A, B ;與掃描碼或
MOVX @DPTR, A ;數據送U105輸出口,將PD4~PD0置為低電平
NOP ;延遲一個機器周期等待輸出口狀態穩定
MOV DPTR, #PORTB ;B口地址送DPTR
MOVX A, @DPTR ;讀B口
ANL A, #0FH ;屏蔽高4位
XRL A, #0FH ;與0FH異或
JNZ NEXT1 ;不為0,說明該列上有鍵被按下
;反之,該列上沒有按鍵被按下
INC R1 ;列地址加+1,繼續掃描
DJNZ R7, LOOP1
;已掃描了所有列,均沒發現有鍵被按下,本次掃描無效
SJMP EXIT
NEXT1:
JNB ACC.0, NEXT22
;ACC.0位為1,說明0行有按鍵被按下
MOV R2, #0 ;行地址為0
SJMP NEXT5
NEXT22:
JNB ACC.1, NEXT3
;ACC.1位為1,說明1行有按鍵被按下
MOV R2, #1 ;行地址為1
SJMP NEXT5
NEXT3:
JNB ACC.2, NEXT4
;ACC.2位為1,說明2行有按鍵被按下
MOV R2, #2 ;行地址為2
SJMP NEXT5
NEXT4:
;Acc.2~Acc.0均為0,則可肯定是Acc.3為1
MOV R2, #3 ;行地址為3
NEXT5:
;計算行列地址,查表取得鍵名
MOV A, R1
RL A
RL A ;列地址乘4(每列對應4行)
ADD A, R2 ;加行地址
MOV DPTR, #KEYTAB
MOVC A, @A+DPTR ;查表獲取鍵值
MOV KEYNAME, A ;按鍵值送鍵名寄存器
ORL KEYNAME, #80H ;按鍵有效標志置1
;開蜂鳴器,響一短聲
MOV DPTR, #8000H ;開蜂鳴器
MOV A, #0FFH
MOVX @DPTR, A
LCALL DEL10MS ;響10ms,即250Ms
MOV A,#0FFH
MOVX @DPTR,A
EXIT:
RET
END
;****** 啟動LCM子程序******
PROC INITIAL
INITIAL:
MOV A,#01H
LCALL WRITE_COM
MOV A,#00111000B
LCALL WRITE_COM
MOV A,#00001100B
LCALL WRITE_COM
MOV A,#00000110B
LCALL WRITE_COM
RET
END
;******查詢忙碌標志信號子程序******
PROC CHECK_BUSY
CHECK_BUSY: PUSH ACC
BUSY_LOOP:
MOV P2,#0FFH
CLR E
SETB R_W
CLR RS
SETB E
MOV A, DB0_DB7
CLR E
JB ACC.7,BUSY_LOOP
POP ACC
RET
END
;****** 寫指令到LCM子程序******
PROC WRITE_COM
WRITE_COM:
LCALL CHECK_BUSY
CLR E
CLR RS
CLR R_W
SETB E
MOV DB0_DB7,A
CLR E
RET
END
;****** 寫數據到LCM子程序******
PROC WRITE_DATA
WRITE_DATA:
LCALL CHECK_BUSY
CLR E
SETB RS
CLR R_W
SETB E
MOV DB0_DB7,A
CLR E
RET
END
;===========================
;延時子程序
;==========================
PROC DEL10MS
DEL10MS:MOV R3,#10H
TX1: MOV R4,#0FFH
DJNZ R4,$
DJNZ R3,TX1
RET
END
PROC DEL5S
DEL5S: MOV DPTR ,#8000H
MOV A,#01FH
MOVX @DPTR,A
MOV R7,#100
TX2: LCALL KEYWAIT
MOV A,KEYNAME
CJNE A,#00H,EXIT
LCALL DEL10MS
DJNZ R7,TX2
EXIT:
MOV DPTR,#8000H
MOV A,#0FFH
MOVX @DPTR,A
MOV A,KEYNAME
RET
END
PROC DEL2S
DEL2S:MOV R7,#50
TX3: LCALL KEYCHECK
MOV A,KEYNAME
CJNE A,#00H,EXIT
LCALL DEL10MS
DJNZ R7,TX3
EXIT: MOV A,KEYNAME
RET
END
TAB0:DB"Sun.",00H
TAB1:DB"Mon.",00H
TAB2:DB"Tue.",00H
TAB3:DB"Wed.",00H
TAB4:DB"Thu.",00H
TAB5:DB"Fri.",00H
TAB6:DB"Sat.",00H
;***********按鍵掃描碼、鍵值對應關系******************
KEYTAB:
DB 0FH ;掃描碼為0,即PD0與PB0交叉點對應數字鍵"F"
DB 0EH ;掃描碼為1,即PD0與PB1交叉點對應數字鍵"E"
DB 0DH ;掃描碼為2,即PD0與PB2交叉點對應數字鍵"D"
DB 0CH ;掃描碼為3,即PD0與PB3交叉點對應數字鍵"C"
DB 09H ;掃描碼為4,即PD1與PB0交叉點對應數字鍵"9"
DB 06H ;掃描碼為5,即PD1與PB1交叉點對應數字鍵"6"
DB 03H ;掃描碼為6,即PD1與PB2交叉點對應數字鍵"3"
DB 0BH ;掃描碼為7,即PD1與PB3交叉點對應數字鍵"B"
DB 08H ;掃描碼為8,即PD2與PB0交叉點對應數字鍵"8"
DB 05H ;掃描碼為9,即PD2與PB1交叉點對應數字鍵"5"
DB 02H ;掃描碼為A,即PD2與PB2交叉點對應數字鍵"2"
DB 15H ;掃描碼為B,即PD2與PB3交叉點對應數字鍵"0"
DB 07H ;掃描碼為C,即PD3與PB0交叉點對應數字鍵"7"
DB 04H ;掃描碼為D,即PD3與PB1交叉點對應數字鍵"4"
DB 01H ;掃描碼為E,即PD3與PB2交叉點對應數字鍵"1"
DB 0AH ;掃描碼為F,即PD3與PB3交叉點對應數字鍵"A"
DB 13H ;掃描碼為10,即PD4與PB0交叉點對應"↑"
DB 12H ;掃描碼為11,即PD4與PB1交叉點對應"Enter"
DB 11H ;掃描碼為12,即PD4與PB2交叉點對應"ESC"
DB 10H ;掃描碼為13,即PD4與PB3交叉點對應"↓"
;-----------------------------------------------------
;字符串
;----------------------------------------------------
LINE1:DB "ENTER:SETTING", 00H
LINE2:DB "ESC:EXIT",00H
LINE3:DB "ERROR INPUT",00H
LINE4:DB "1:TIME",00H
LINE5:DB "2:CLOCK ",00H
LINE6:DB "ESC:EXIT ",00H
LINE7:DB "TIME OUT" ,00H
LINE8:DB " ANY KEY TO EXIT",00H
LINE9:DB"ALARM( )",00H
LINE10:DB"OK",00H
LINE11:DB"NO",00H
LINE12:DB"1:SET",00H
LINE13:DB"2:DEL ESC:EXIT",00H
LINE14:DB"1:WEAKLY",00H
LINE15:DB"2:ONCE 3:DAILY",00H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -