- RS EQU P2^6
- RW EQU P2^5
- E EQU P2^7
- LCD EQU P0
- BF EQU P0^7
- ORG 0000H
- LJMP INIT
- ORG 000BH
- LJMP MAIN
- ORG 0060H
- ;初始化
- INIT:
- CLR P2^7// 使能清0
- MOV R0,#0
- MOV R1,#0
- MOV R0,#38H //設置16乘2顯示,5乘7點陣,8位數據接口
- ACALL WRITE_COM
- MOV R0,#0
- MOV R0,#0CH //設置開顯示,不顯示光標
- ACALL WRITE_COM
- MOV R0,#0
- MOV R0,#06H // 寫一個字符后地址指針加1
- ACALL WRITE_COM
- MOV R0,#0
- MOV R0,#01H //顯示清0,數據指針清0
- ACALL WRITE_COM
- RET
- ;寫指令函數,調用前先把指令碼放到R0中
- DELAY:
- MOV R6,#5
- W2:MOV R7,#239
- W1:DJNZ R7,W1
- DJNZ R6,W2
- RET
- WRITE_COM:
- CLR P2^6//RS清0
- MOV P0,R0 //R0中放指令代碼
- ACALL DELAY
- SETB P2^7//使能置1
- ACALL DELAY
- CLR P2^7
- RET
- ;寫數據函數,調用前先把指令放到R1中
- WRITE_DATA:
- SETB P2^6
- MOV P0,R1
- ACALL DELAY
- SETB P2^7
- ACALL DELAY
- CLR P2^7
- RET
- MAIN:MOV SP,#70H
- MOV TMOD,#11H //定時器初始化
- SETB EA
- SETB ET0
- MOV DPTR,#TAB
- CLR A
- ACALL INIT
- MOV R0,#80H//定位到第一行
- ACALL WRITE_COM
- ACALL DELAY
- ACALL KEYSCAN
- JMP $
- ;線反轉法找被按下的鍵
- KEYSCAN:
- MOV P1,#0F0H //給P1賦值,為了讀列線
- MOV A,P1 //此時按鍵的狀態
- ANL A,#0F0H //與
- // 找出被按下的列線
- JNZ DELAY10MS
- DELAY10MS: ;誤差 0us
- MOV R7,#01H
- DL1:
- MOV R6,#26H
- DL0:
- MOV R5,#82H
- DJNZ R5,$
- DJNZ R6,DL0
- DJNZ R7,DL1
- RET //延時去抖
- MOV A,P1
- ANL A, #0F0H
- MOV R0,A //此時列線狀態記錄在R0
- JNZ KEYSCAN1
- LJMP KEYSCAN
- KEYSCAN1:
- MOV A,#00H //清零
- MOV P1,#0FH //置位讀行線
- MOV A ,P1 //此時按鍵的狀態
- ANL A ,#0FH
- MOV R1,A //此時行線狀態記錄在R1
- ANL A ,#0FH
- JNZ NUM
- LJMP KEYSCAN
- NUM:
- MOV A ,R0
- MOV B,R1
- ORL A,B//A或上B,數據保存在A
- SJMP DISP0
- DISP0:
- CJNE A,#0EEH,DISP1
- MOV A ,#01H
- MOVC A ,@A+DPTR
- MOV P0,A//LCD1602顯示屏輸出音律
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#22H
- MOV TH0,#0FEH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DISP1:
- CJNE A ,#0EDH,DISP2
- MOV A ,#02H
- MOVC A,@A+DPTR
- MOV P0,A
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#4FH
- MOV TH0,#0FEH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DISP2:
- CJNE A ,#0EBH,DISP3
- MOV A ,#03H
- MOVC A ,@A+DPTR
- MOV P0,A
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#85H
- MOV TH0,#0FEH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DISP3:
- CJNE A,#0E7H,DISP4
- MOV A,#04H
- MOVC A ,@A+DPTR
- MOV P0,A
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#9AH
- MOV TH0,#0FEH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DISP4:
- CJNE A,#0DEH,DISP5
- MOV A, #05H
- MOVC A ,@A+DPTR
- MOV P0,A
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#0C1H
- MOV TH0,#0FEH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DISP5:
- CJNE A,#0DDH,DISP6
- MOV A ,#06H
- MOVC A ,@A+DPTR
- MOV P0,A
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#0E4H
- MOV TH0,#0FEH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DISP6:
- CJNE A,#0DBH,KEY
- MOV A ,#07H
- MOVC A ,@A+DPTR
- MOV P0,A
- ACALL WRITE_DATA
- ACALL DELAY
- MOV TL0,#03H
- MOV TH0,#0FFH
- LCALL DELAY1
- LCALL SOUND
- LJMP KEYSCAN
- DELAY1:MOV R2,#0FH
- LOOP10:MOV R3,0FAH
- LOOP20:DJNZ R3,LOOP20
- DJNZ R2,LOOP10
- RET
- SOUND:
- SETB TR0
- SETB P3^0 //輸出高電平,開始鳴叫
- MOV R4,#4H
- LOOP:MOV R3,#0F9H
- LOOP1: DJNZ R3,LOOP1
- DJNZ R4,LOOP
- CLR P3^0 //輸出低電平,停止鳴叫
- RETI
- KEY:LJMP MAIN
-
- TAB:DB 31H,32H,33H,34H,35H,36H,37H
- END
復制代碼
|