📄 knife.asm
字号:
;2006-01-11
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SINT
RXDATA EQU 20H ;接收单元首地址
TXDATA EQU 30H ;发送单元地址
POWER EQU 40H
PERFUSION EQU 41H
SUCTION EQU 42H
TIMESEC EQU 43H
TIMEMIN EQU 44H
TIMESECH EQU 45H
TIMESECL EQU 46H
TIMEMINH EQU 47H
TIMEMINL EQU 48H
SELECT EQU 49H ;判断结果1:poweradd 2:powersub
; 3:perfusionadd 4:perfusionsub
; 5:perfusionOnoff
; 6:suctionadd 7:suctionsub
; 8:suctionOnoff
; 9:reset 10:setfreq
; 11:help
ORG 0080H
MAIN:
MOV TMOD,#20H ;定时器1,定时器0
MOV TH1,#0FDH ;设置波特率为9600
MOV TL1,#0FDH
MOV SCON,#50H
MOV PCON,#00H
MOV IE,#90H
SETB TR1 ;启动定时器作为波特率发生器
; MOV TH0,#3C ;定时50毫秒
;MOV TL0,#B0
;初始化显示屏
MOV POWER,#02H
MOV PERFUSION,#02H
MOV SUCTION,#02H
MOV TIMESEC,#30H
MOV TIMEMIN,#59H
MOV R7,POWER
MOV R5,#0
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,#0
MOV R5,#1
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,PERFUSION
MOV R5,#2
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,#0
MOV R5,#3
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,SUCTION
MOV R5,#4
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,#0
MOV R5,#5
LCALL GETDATA
LCALL DELAY
LCALL DISP_TIMESEC
LCALL DISP_TIMEMIN
LOOP: SJMP LOOP
DISP_TIMESEC: ;显示时间秒
MOV A,TIMESEC
ANL A,#0F0H
SWAP A
MOV TIMESECH,A
MOV A,TIMESEC
ANL A,#0FH
MOV TIMESECL,A
MOV R7,TIMESECH
MOV R5,#8
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,TIMESECL
MOV R5,#9
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
RET
DISP_TIMEMIN: ;显示时间分钟
MOV A,TIMEMIN
ANL A,#0F0H
SWAP A
MOV TIMEMINH,A
MOV A,TIMEMIN
ANL A,#0FH
MOV TIMEMINL,A
MOV R7,TIMEMINH
MOV R5,#6
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
MOV R7,TIMEMINL
MOV R5,#7
LCALL GETDATA
LCALL TXDATA
LCALL DELAY
RET
;串口发送程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TXBEGIN: CLR EA ;禁止中断
CLR REN ;禁止接收
MOV R0,#TXDATA ;发送字符串地址
MOV R1,#0FH ;发送字符串长度
TXLOOP0: MOV A,@R0
MOV SBUF,A
TXLOOP1: JBC TI,TXLOOP2
SJMP TXLOOP1
TXLOOP2: INC R0
DJNZ R1,TXLOOP0
SETB REN
SETB EA
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SINT: ;串口接收程序,触摸屏判断程序
CLR EA
RXBEGIN: MOV R0,#RXDATA ;接收数据存储地址
MOV R1,#06H
RXLOOP1: JBC RI,RXLOOP2
SJMP RXLOOP1
RXLOOP2: MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R1,RXLOOP1
;接收满6个字节的数据,开始判断
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETDATA: ;将字库数据和位置信息组装成显示命令
; R7和R5中分别放传递的两个参数
;R7放字库R5放位置
MOV DPTR,#lib1 ;指令表地址,计算响应指令开始地址
MOV A,R7
MOV B,#0BH
MUL AB
MOV R0,DPL
ADD A,R0
MOV DPL,A
CLR A
MOV R0,DPH
ADDC A,R0
MOV DPH,A
MOV R6,#0
MOV R1,#TXDATA
GETDATALOOP1:
CLR A
MOVC A,@A+DPTR ;读取数据存放到R4中
MOV @R1,A ;将数据放到ARRAY中的相应单元中
INC R1
INC R6
INC DPTR
CJNE R6,#0BH,GETDATALOOP1 ;如果一个数值的命令没有全部转移到ARRAY中,则转到继续
;添加后一段位置信息
MOV DPTR,#DataPosition
MOV A,R5
MOV B,#04H ;位置信息长度
MUL AB
MOV R0,DPL
ADD A,R0
MOV DPL,A
CLR A
MOV R0,DPH
ADDC A,R0
MOV DPH,A
MOV R6,#0
GETDATALOOP2:
CLR A
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC DPTR
INC R6
CJNE R6,#04H,GETDATALOOP2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JUDGE: ;比较两个16bit无符号数的大小,R0内数值表示判断是否是第n个按钮
;r6中放每个按钮坐标的长度8
MOV R0,#1
MOV DPTR,#BUTTON-01H
MOV SELECT,#0 ;清零
COMP_UPLEFT: ;比较收到的坐标是否在对应按钮的右下
COMP_X0: CLR A
INC DPTR
MOVC A,@A+DPTR
CJNE A,RXDATA+02H,X0NEQ_H ;X坐标的高8位比较,相等则比较低8位,不等则判断是大还是小
JMP X0EQ_H
X0NEQ_H:
JNC NEXT_X0H ;若大于,则比较坐标Y,否则表示没有按钮按下
INC DPTR ;在进行纵坐标比较以前地址加1,因为只判断了高位
JMP COMP_Y0
NEXT_X0H: ;进行下一个按钮判断前设置正确的DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
LJMP NO_BUTTON
X0EQ_H: ;X坐标高8位相等,继续比较低8位
INC DPTR
CLR A
MOVC A,@A+DPTR
CJNE A,RXDATA+03H,X0NEQ_L ;低8位大于等于则开始比较Y坐标的大小,否则认为无按钮按下
JMP COMP_Y0
X0NEQ_L:
JNC NEXT_X0L
LJMP COMP_Y0
NEXT_X0L: INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
LJMP NO_BUTTON
COMP_Y0: CLR A
INC DPTR
MOVC A,@A+DPTR
CJNE A,RXDATA+04H,Y0NEQ_H
LJMP Y0EQ_H
Y0NEQ_H: JNC NEXT_Y0H
INC DPTR
LJMP COMP_DOWNRIGHT
NEXT_Y0H:
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -