;16x2 LCD測試程式 LCD_RS EQU P1.0 ;定義LCD接線位置 LCD_RW EQU P1.1 LCD_E EQU P1.2 LCD_DATA EQU P2 KB EQU P0 KB_BUF EQU 30H ; MOV R5,#1 ;如果電源關掉重開時,LCD無法正常顯示 ; CALL DELAY ;請加上此延遲程式, 等LCD穩定後, 再設定LCD CLR LCD_RW ;習慣上直接將LCD的RW接腳直接接地, MOV A,#00111000B ;設定LCD介面為8位元, 2行, 5x7字型 CALL WRIR MOV A,#00001111B ;設定要LCD顯示, 要有游標, 要閃爍 CALL WRIR MOV A,#00000110B ;設定寫資料進入LCD時, 顯示器不要動, 游標向右移一格 CALL WRIR MOV A,#1 ;清除LCD CALL WRIR MOV R5,#1 ;延遲等清除LCD命令處理完畢 CALL DELAY AGAIN: MOV R4,#4 MOV KB_BUF,#11111110B ;掃描訊號 NEXT: MOV KB,KB_BUF ;送至鍵盤 MOV A,KB ;讀回鍵盤訊號 ANL A,#11110000B ;將後4位元清為0 CJNE A,#11110000B,RECHECK ;判斷是否按鍵盤(前4位元有不為0的情況) MOV A,KB_BUF ;若無則將KB_BUF內的資料左旋 RL A ; MOV KB_BUF,A ;準備掃描下一行 DJNZ R4,NEXT ;R4內的資料減一,判斷是否掃瞄4次 JMP AGAIN ;重新開始掃描 RECHECK: MOV R5,#3 ;延遲,除彈跳 CALL DELAY MOV A,KB ;重新讀回按鍵訊號 ANL A,#11110000B CJNE A,#11110000B,KEY_IN ;判斷是否按鍵盤 JMP AGAIN ;若無則為彈跳訊號, 重新開始掃描 KEY_IN: MOV A,KB ;讀回鍵盤訊號 CALL KEY ;執行判斷按鍵副程式 WAIT: MOV A,KB ;重新讀回按鍵訊號 ANL A,#11110000B CJNE A,#11110000B,WAIT ;判斷按鍵是否放開 JMP AGAIN ;------ 判斷按鍵副程式, 並將該鍵對應的值顯示在LCD ----------- ;-------------- (位置有錯自行修改' '內的值) ---------------- KEY: CJNE A,#11101110B,S1 MOV A,#'0' CALL WRDR RET S1: CJNE A,#11101101B,S2 MOV A,#'1' CALL WRDR RET S2: CJNE A,#11101011B,S3 MOV A,#'2' CALL WRDR RET S3: CJNE A,#11100111B,S4 MOV A,#'3' CALL WRDR RET S4: CJNE A,#11011110B,S5 MOV A,#'4' CALL WRDR RET S5: CJNE A,#11011101B,S6 MOV A,#'5' CALL WRDR RET S6: CJNE A,#11011011B,S7 MOV A,#'6' CALL WRDR RET S7: CJNE A,#11010111B,S8 MOV A,#'7' CALL WRDR RET S8: CJNE A,#10111110B,S9 MOV A,#'8' CALL WRDR RET S9: CJNE A,#10111101B,S10 MOV A,#'9' CALL WRDR RET S10: CJNE A,#10111011B,S11 MOV A,#'A' CALL WRDR RET S11: CJNE A,#10110111B,S12 MOV A,#'B' CALL WRDR RET S12: CJNE A,#01111110B,S13 MOV A,#'C' CALL WRDR RET S13: CJNE A,#01111101B,S14 MOV A,#'D' CALL WRDR RET S14: CJNE A,#01111011B,S15 MOV A,#'E' CALL WRDR RET S15: CJNE A,#01110111B,SEND MOV A,#'F' CALL WRDR SEND: RET WRiR: CLR LCD_RS ;寫命令到LCD副程式 SETB LCD_E MOV LCD_DATA,A MOV R7,#50 ;延遲等訊號穩定 DJNZ R7,$ CLR LCD_E ;讓Enable接腳產生負緣訊號 MOV R7,#60 ;延遲等訊號處裡完畢 DJNZ R7,$ RET WRDR: SETB LCD_RS ;寫資料到LCD副程式 SETB LCD_E MOV LCD_DATA,A MOV R7,#50 ;延遲等訊號穩定 DJNZ R7,$ CLR LCD_E ;讓Enable接腳產生負緣訊號 MOV R7,#60 ;延遲等訊號處裡完畢 DJNZ R7,$ RET DELAY: MOV R6,#100 DEL: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEL DJNZ R5,DELAY RET END