📄 8279.asm
字号:
NAME MPU51A_8279
;/* 8279的A0连接到A0 */
CMD_8279 EQU 0F001H ;8279命令字、状态字地址
DATA_8279 EQU 0F000H ;8279读写数据口的地址
EXTRN CODE(T_61C1024,T_25045)
EXTRN CODE(START_8155,A_D,D_A,START_232,START_485,START_PHO,R485_Send_Receive0)
EXTRN CODE(Read_Time, Write_Time, ReadAlarm, WriteAlarm,Init_12887,DELAY500MS,ALARM)
EXTRN CODE(START0,Send_Receive0,INIT8155,Test8155Ram,Test8155IO)
EXTRN CODE(START_8250)
PUBLIC START_8279,INIT8279,SCAN_KEY,KKK
bit_seg SEGMENT BIT
RSEG bit_seg
WR_FLAG: DBIT 1
RD_FLAG: DBIT 1
TEMP_FLAG: DBIT 1
data_seg SEGMENT DATA
RSEG data_seg
WR_COUNTER: DS 1
NUM_COUNTER: DS 1
DATA_LED: DS 1
code_seg SEGMENT CODE
RSEG code_seg
START_8279: ACALL INIT8279
LCALL ALARM ;CLOSE SPEAKER
CLR WR_FLAG ;清理标志位
CLR RD_FLAG
CLR TEMP_FLAG
MOV NUM_COUNTER,#00H
MOV DATA_LED,#84H
MOV A,#90H ;指向第一位数码管,下次写自动指向下一位
ACALL WRITE_CMD
RE_SCAN: ACALL SCAN_KEY ;扫键,所得键值
CJNE A,#0FFH,KEY_DEPR
SJMP RE_SCAN ;无键按下
KEY_DEPR: ACALL KEY_NUM ;键值转换为键号
CJNE A,#10H,$+3
JC LOW1
ANL A,#0FH ;功能键处理程序段
MOV B,A
RL A
ADD A,B
MOV DPTR,#FUNC_KEY
JMP @A+DPTR ;根据键值跳至功能程序跳转列表
LOW1: ;数字键处理程序段
MOV B,A ;B暂存键号
CLR RD_FLAG
CLR WR_FLAG
INC NUM_COUNTER
MOV A,NUM_COUNTER
CJNE A,#5,$+3
JNC NEQ4
MOV A,B
ACALL LED_DISP
JMP RE_SCAN
NEQ4: MOV A,DATA_LED
MOV C,TEMP_FLAG
MOV ACC.0,C
MOV DATA_LED,A
ACALL WRITE_CMD
MOV A,B
ACALL LED_DISP
CPL TEMP_FLAG ;在84H和85H中循环修改
JMP RE_SCAN
;功能跳转列表
FUNC_KEY: LJMP MON
LJMP RD_FUNC
LJMP WR_FUNC
LJMP EXE
;8279初始化
INIT8279: MOV A,#00H ;模式设置命令
MOV DPTR,#CMD_8279 ;CMD_8279为写命令地址、读状地址
MOVX @DPTR,A
MOV A,#34H ;可编程时钟设置,设置分频系数
MOVX @DPTR,A
ACALL CLEAR
MOV A,#90H
LCALL WRITE_CMD
MOV A,#00H
MOV R6,#6 ;检查数码管是否都正常
RE8279: LCALL WRITE_DATA
DJNZ R6,RE8279
LCALL DELAY500MS
ACALL CLEAR
mov a,#80h
movx @dptr,a ;在第一位显示‘P’
mov dptr,#DATA_8279
mov a,#0Eh ;"P"
movx @dptr,a
RET
;清屏程序
CLEAR: PUSH DPL
PUSH DPH
PUSH ACC
MOV A,#0DFH ; 清除命令
MOV DPTR,#CMD_8279
MOVX @DPTR,A
WAIT1: MOVX A,@DPTR
JB ACC.7,WAIT1 ; 显示RAM清除完毕吗?
POP ACC
POP DPH
POP DPL
RET
;写命令
WRITE_CMD: PUSH DPL ;命令设置,参数A
PUSH DPH
MOV DPTR,#CMD_8279
MOVX @DPTR,A
POP DPH
POP DPL
RET
;写数据
WRITE_DATA: PUSH DPL ;命令设置,参数A
PUSH DPH
MOV DPTR,#DATA_8279
MOVX @DPTR,A
POP DPH
POP DPL
RET
;读数据
READ_DATA: PUSH DPL ;读数据,存在A中
PUSH DPH
MOV DPTR,#DATA_8279
MOVX A,@DPTR
POP DPH
POP DPL
RET
;读状态
READ_STA: PUSH DPL ;读数据,存在A中
PUSH DPH
MOV DPTR,#CMD_8279
MOVX A,@DPTR
POP DPH
POP DPL
RET
;键扫程序
SCAN_KEY: MOV DPTR,#CMD_8279
MOVX A,@DPTR
READ_FIFO: ANL A,#7 ;有键按下
JZ NO_KEY
READ: MOV A,#40H
ACALL WRITE_CMD
ACALL READ_DATA
RET
NO_KEY: MOV A,#0FFH ;无键按下,返回FFH
RET
;查表程序,返回被查数据(在A中)在表(首址由DPTR指出)中的位置A
NUM_QUERY: PUSH B
PUSH 07H
MOV B,A
MOV R7,#0 ;键号计数器
SJMP REP3
CMP_NEXT: INC R7
INC DPTR
REP3: CLR A
MOVC A,@A+DPTR
CJNE A,B, CMP_NEXT ;不等,比较下一个
MOV A,R7
POP 07H
POP B
RET
;查询键号
KEY_NUM: PUSH DPL
PUSH DPH
MOV DPTR,#KEY_TAB
ACALL NUM_QUERY
POP DPH
POP DPL
RET
;查询LED显示的数据,由段码到键号
RAM_TO_NUM: PUSH DPL
PUSH DPH
MOV DPTR,#LED_TAB
ACALL NUM_QUERY
POP DPH
POP DPL
RET
;显示0~F ,A给出参数 送 10H消隐
LED_DISP: PUSH DPL
PUSH DPH
MOV DPTR,#LED_TAB
MOVC A,@A+DPTR
ACALL WRITE_DATA
POP DPH
POP DPL
RET
;显示由DPTR指出的内容于数据数码管(最后两个数码管)
DATA_DISP: PUSH DPL
PUSH DPH
MOV A,#94H
LCALL WRITE_CMD
MOVX A,@DPTR
PUSH ACC
ANL A,#0F0H
SWAP A
LCALL LED_DISP
POP ACC
ANL A,#0FH
LCALL LED_DISP
POP DPH
POP DPL
RET
;参数A给出第几个数码管,返回A显示的数据(0~F)
GET_LED: ORL A,#60H
ACALL WRITE_CMD
ACALL READ_DATA
ACALL RAM_TO_NUM
RET
WR_LED?: ORL A,#80H
ACALL WRITE_CMD
RET
;显示DPTR的内容
DISP_DPTR: PUSH DPL
PUSH DPH
MOV A,#90H
ACALL WRITE_CMD
MOV A,DPH
ANL A,#0F0H
SWAP A
ACALL LED_DISP
MOV A,DPH
ANL A,#0FH
ACALL LED_DISP
MOV A,DPL
ANL A,#0F0H
SWAP A
ACALL LED_DISP
MOV A,DPL
ANL A,#0FH
ACALL LED_DISP
POP DPH
POP DPL
RET
LED_TAB: DB 048H,0EBH,8CH,89H,2BH,19H,18H,4BH,08H,09H,0AH,38H
DB 5CH,0A8H,1CH,1EH,0FFH,0BFH
;0~F字型码、消隐、“-”
KEY_TAB: DB 0D0H,0D1H,0D2H,0D3H,0D5H,0D6H,0D7H,0C8H,0CAH,0CBH
DB 0CCH,0CDH,0CFH,0C0H,0C1H,0C2H,0C3H,0CEH,0C9H,0D4H
;键值表,按照要求排列成键号,功能键在最后,
;最后四个依次为EXE,RD,WR,MON
;读LED buffer
ReadLED: ACALL READ_DATA
CJNE A,#0FFH,ReadLED1
CLR A ;为FFH则说明没有按键输入地址中某位,默认为输入0
RET
ReadLED1: ACALL RAM_TO_NUM ;读到的RAM中的数据转换为键号A
RET
;将从显存中取出的数组合成两个字节的DPTR
GET_DPTR: MOV A,#70H
ACALL WRITE_CMD
ACALL READ_DATA
CJNE A,#0EH,TRUE_READ ;发现是0EH则说明没有按键
MOV DPTR,#0000 ;没有给出地址要读写就从0000开始
RET
TRUE_READ: MOV A,#70H ;从第一个数码管开始读
ACALL WRITE_CMD
RE_READ: CALL ReadLED
SWAP A
MOV B,A
CALL ReadLED
ORL A,B
PUSH ACC
CALL ReadLED
SWAP A
MOV B,A
CALL ReadLED
ORL A,B
MOV DPL,A
POP DPH
RET
CL_DATALED: MOV A,#84H ;消隐数据数码管,等待输入
ACALL WRITE_CMD
MOV A,#10H
ACALL LED_DISP
MOV A,#85H
ACALL WRITE_CMD
MOV A,#10H
ACALL LED_DISP
RET
WR_OVER: MOV A,#84H ;数据数码管 显示“--”,等待输入
ACALL WRITE_CMD
MOV A,#11H
ACALL LED_DISP
MOV A,#85H
ACALL WRITE_CMD
MOV A,#11H
ACALL LED_DISP
RET
;*****************MESSAGE***************
OK1: ACALL CLEAR ;SHOW 'oh'
MOV A,#94H
ACALL WRITE_CMD
MOV A,#0B8H
ACALL WRITE_DATA
MOV A,#3AH
ACALL WRITE_DATA
LCALL DELAY250MS
RET
ERR_SHOW: ACALL CLEAR ;show 'err'
MOV A,#93H
ACALL WRITE_CMD
MOV A,#01CH
ACALL WRITE_DATA
MOV A,#0BEH
ACALL WRITE_DATA
MOV A,#0BEH
ACALL WRITE_DATA
RET
KKK: LCALL SCAN_KEY
CJNE A,#0FFH,JUDGE1
CLR C
JMP RET_KKK
JUDGE1: CJNE A,#0C3H,RET_KKK
SETB C
RET_KKK: RET
DELAY250MS: MOV R5,#5
DEL: MOV R7,#200
DEL1: MOV R6,#123
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
DJNZ R5,DEL
RET
;****************功能键-返回************************0C3H,0CEH,0C9H,0D4H
MON: ACALL CLEAR
CLR RD_FLAG
CLR WR_FLAG
MOV A,#80H
ACALL WRITE_CMD
MOV A,#0EH
ACALL WRITE_DATA
MOV NUM_COUNTER,#0
MOV A,#90H
ACALL WRITE_CMD
LJMP RE_SCAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -