|
;系統(tǒng)晶振是 11.0592 MHz ;上位機(jī)用串口調(diào)試助手來(lái)配合實(shí)驗(yàn) Z8279 EQU 0FF82H ;8279 狀態(tài)/命令口地址 D8279 EQU 0FF80H ;8279 數(shù)據(jù)口地址 LEDMOD EQU 00H ;左邊輸入 八位字符顯示 ;外部譯碼鍵掃描方式,雙鍵互鎖 LEDFEQ EQU 33H ;掃描速率 LEDCLS EQU 0C1H ;清除顯示 RAM LEDWR0 EQU 80H ;設(shè)定的將要寫入的顯示RAM地址 READKB EQU 40H ;讀 FIFO RAM 地址 0 的命令字 ORG 0000H AJMP START ORG 0040H START: MOV SP,#60H LCALL INIT8279 ;初始化8279 MOV SCON,#50H ;串口 方式 1 MOV TMOD,#20H ;T1 方式 1 MOV TL1,#0FDH ;波特率 9600 的常數(shù) MOV TH1,#0FDH SETB TR1 SETB EA WAIT: JBC RI,DIS_REC ;是否接收到數(shù)據(jù) LCALL GETKEY ;讀鍵盤 CJNE A,#0FFH,WAIT ;是否有鍵輸入 MOV SBUF,B ;串口輸出鍵盤輸入的值 NOP SS: JBC TI,WAIT ;是否發(fā)送完畢 SJMP SS DIS_REC: MOV A,SBUF ;讀串口接收到的數(shù)據(jù) CLR C SUBB A,#30H ;以下判定輸入是否在0-F JC ERROR SUBB A,#0AH JNC DIS_REC1 ADD A,#0AH SJMP DIS_REC2 DIS_REC1: SUBB A,#7H JC ERROR SUBB A,#6H JNC ERROR ADD A,#10H DIS_REC2: MOV R4,#00H MOV R5,A LCALL DISLED ;顯示輸入的數(shù)字(0-F) ERROR: AJMP WAIT INIT8279: ;8279初始化子程序 PUSH DPH ;保存現(xiàn)場(chǎng) PUSH DPL PUSH ACC LCALL DELAY ;延時(shí) MOV DPTR ,#Z8279 MOV A,#LEDMOD ;置8279工作方式 MOVX @DPTR,A MOV A,#LEDFEQ ;置鍵盤掃描速率 MOVX @DPTR,A MOV A,#LEDCLS ;清除 LED 顯示 MOVX @DPTR,A POP ACC ;恢復(fù)現(xiàn)場(chǎng) POP DPL POP DPH RET ;讀取鍵盤子程序 ;輸入: 無(wú) ; 輸出: B: 讀到的鍵碼 A: 按鍵的標(biāo)志 GETKEY: PUSH DPH ;保存現(xiàn)場(chǎng) PUSH DPL PUSH PSW MOV DPTR,#Z8279 MOVX A,@DPTR ;讀8279狀態(tài) ANL A,#07H ;屏蔽D7-D3 JNZ GETVAL ;判斷是否有鍵輸入 MOV A,#0H ;置標(biāo)志(無(wú)鍵輸入) SJMP NKBHIT GETVAL: MOV A,#READKB ;讀 FIFO RAM 命令 MOVX @DPTR,A MOV DPTR,#D8279 MOVX A,@DPTR ;讀鍵 ANL A,#0FH ;屏蔽 SHIFT 和 CTRL 鍵 MOV DPTR,#KEYCODE ;鍵碼表起始地址 MOVC A,@A+DPTR ;查表 MOV B,A ;置返回鍵值 MOV A,#0FFH ;置標(biāo)志(有鍵輸入) NKBHIT: POP PSW ;恢復(fù)現(xiàn)場(chǎng) POP DPL POP DPH RET ;顯示字符子程序 ;輸入: R4,位置 R5,值 DISLED: PUSH DPH ;保存現(xiàn)場(chǎng) PUSH DPL PUSH ACC MOV A,#LEDWR0 ;置顯示起始地址 ADD A,R4 ;加位置偏移量 MOV DPTR,#Z8279 MOVX @DPTR,A ;設(shè)定顯示位置 MOV DPTR,#LEDSEG ;置顯示常數(shù)表起始位置 MOV A,R5 MOVC A,@A+DPTR ;查表 MOV DPTR,#D8279 MOVX @DPTR,A ;顯示數(shù)據(jù) POP ACC ;恢復(fù)現(xiàn)場(chǎng) POP DPL POP DPH RET DELAY: ;延時(shí)子程序 PUSH 0 ;保存現(xiàn)場(chǎng) PUSH 1 MOV 0,#0H DELAY1: MOV 1,#0H DJNZ 1,$ DJNZ 0,DELAY1 POP 1 ;恢復(fù)現(xiàn)場(chǎng) POP 0 RET ;LED顯示常數(shù)表 LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H DB 0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H DB 6DH,02H,08H,00H,59H,0FH,76H ;鍵盤鍵碼表 KEYCODE:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H DB 47H,48H,49H,4AH,4BH,4CH,4DH,4EH END
|