📄 democs32.asm
字号:
CLR C
SUBB A,R7
JNZ QJ22
; CJNE A,R7,QJ22
MOV A,#0
RET
QJ22: INC R6
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
JMP QJ23
;================================================
;================================================
;功能:比较当前XY坐标,是否落在某按键的矩形区域内.
;入口:当前压力点的X坐标于MXH,MXL中.Y坐标于MYH,MYL中.
; DPTR为所比较按键数据区(4字=8字节)首地址,
;出口:A=0不是本键,A=1是本键。
;影响:A,B,C
BJ00: LCALL BJX1 ;比较X1
MOV B,A
LCALL BJX2 ;比较X2
CJNE A,B,BJ01 ;返回值不相同,即X<X1 X>X2 OR X>X1 X<X2时,可能是本键,继续比较Y
JMP BJFHJ0 ;返回值相同,即X<X1<X2 OR X>X1>X2时,不是本键.
BJ01: LCALL BJY1 ;比较Y1
MOV B,A
LCALL BJY2 ;比较Y2
CJNE A,B,BJFHJ1 ;返回值不相同,即Y<Y1 Y>Y2 OR Y>Y1 Y<Y2时,是本键
JMP BJFHJ0 ;返回值相同,即Y<Y1<Y2 OR Y>Y1>Y2时,不是本键.
BJFHJ1: MOV A,#1;是本键
RET
BJFHJ0: MOV A,#0;不是本键
RET
;------
BJX1: MOV A,#1 ;X1-(MXH,MXL)
MOVC A,@A+DPTR
CLR C
SUBB A,MXL
MOV A,#0
MOVC A,@A+DPTR
SUBB A,MXH
JNC BJFH0
JMP BJFH1
BJX2: MOV A,#5 ;X2-(MXH,MXL)
MOVC A,@A+DPTR
CLR C
SUBB A,MXL
MOV A,#4
MOVC A,@A+DPTR
SUBB A,MXH
JNC BJFH0
JMP BJFH1
BJY1: MOV A,#3 ;Y1-(MYH,MYL)
MOVC A,@A+DPTR
CLR C
SUBB A,MYL
MOV A,#2
MOVC A,@A+DPTR
SUBB A,MYH
JNC BJFH0
JMP BJFH1
BJY2: MOV A,#7 ;Y2-(MYH,MYL)
MOVC A,@A+DPTR
CLR C
SUBB A,MYL
MOV A,#6
MOVC A,@A+DPTR
SUBB A,MYH
JNC BJFH0
JMP BJFH1
BJFH1: MOV A,#1 ;< A=1
RET
BJFH0: MOV A,#0 ;>= A=0
RET
;============================================================================
;============================================================================
;===================================================================================
CMP31: JB K_MNCK,MNJS
CLR RI
CMP31B: JNB RI,CMP31B ;等待接收第1个字节,按下后第1字节发0A0H
CMP32: CLR RI
MOV A,SBUF
CJNE A,#0A0H,CMP31B ;
CMP33: JNB RI,CMP33 ;等待接收第2个字节,低4位时X坐标的D9-D6位,高4位为0.
CLR RI
MOV MXH,SBUF
CMP34: JNB RI,CMP34 ;等待接收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
CLR RI
MOV MXL,SBUF
CMP35: JNB RI,CMP35 ;等待接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
CLR RI
MOV MYH,SBUF
CMP36: JNB RI,CMP36 ;等待接收第5个字节,低4位时Y坐标的D5-D0位,高2位为0.
CLR RI
MOV MYL,SBUF
RET
;======================================================================
MNJS: LCALL MNJS1ZJ ;等待接收第1个字节,按下后第1字节发0A0H
CJNE A,#0A0H,MNJS
LCALL MNJS1ZJ ;等待接收第2个字节,低4位时X坐标的D9-D6位,高4位为0.
MOV MXH,A
ANL A,#0F0H
JNZ MNJS
LCALL MNJS1ZJ ;等待接收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
MOV MXL,A
ANL A,#0C0H
JNZ MNJS
LCALL MNJS1ZJ ;等待接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
MOV MYH,A
ANL A,#0F0H
JNZ MNJS
LCALL MNJS1ZJ ;等待接收第5个字节,低4位时Y坐标的D5-D0位,高2位为0.
MOV MYL,A
ANL A,#0C0H
JNZ MNJS
RET
;=======当K_MNCK=1时,模拟串口接收1字节,波特率由TIME1B和TIME决定,本例中为9600Hz.
MNJS1ZJ:JNB CMP_DATA,MNJS1ZJ ;CMP_DATA=0,则等待.
MNJS3: JB CMP_DATA,MNJS3 ;CMP_DATA=1,则等待.
LCALL TIME1B
LCALL TIME
MOV C,CMP_DATA ;数据位0
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位1
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位2
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位3
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位4
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位5
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位6
RRC A
LCALL TIME
MOV C,CMP_DATA ;数据位7
RRC A
LCALL TIME
LCALL TIME
RET
;============================================================================
CMP38: CLR C ;合并第2,3字节,产生X坐标于MXH,MXL中.
MOV A,MXH
RRC A
MOV MXL.6,C
CLR C
RRC A
MOV MXH,A
MOV MXL.7,C
CLR C ;合并第4,5字节,产生Y坐标于MYH,MYL中.
MOV A,MYH
RRC A
MOV MYL.6,C
CLR C
RRC A
MOV MYH,A
MOV MYL.7,C
RET
;============================================================================
;输出一批数据子程序(用于数据区中不能出现连续0的情况)
;入口:DATR为数据区首地址,当数据区有连续10个00H时,退出本子程序.
;出口:将该数据区的全部数据通过FSA子程序发出.
;影响:A,C,PSW,R7,DATR
SC: MOV R7,#0
SC1: MOV A,#0
MOVC A,@A+DPTR
JNZ SC3
INC R7 ;数据区有连续10个00H时,完毕
CJNE R7,#10,SC2
RET
SC3: MOV R7,#0
SC2: LCALL FSA
INC DPTR
JMP SC1
;============================
;输出一批数据子程序(用于所有情况)
;入口:DATR为数据区首地址,数据区头2个字节为本数据区以下数据的数量.
;出口:将该数据区的全部数据通过FSA子程序发出.
;影响:A,C,PSW,R4,R5,DATR
SC1PSJ: MOV A,#0
MOVC A,@A+DPTR
MOV R5,A
INC DPTR
MOV A,#0
MOVC A,@A+DPTR
MOV R4,A
INC DPTR ;R5R4为将要发出的数据个数,DATP指向第3个字节.
SC9: MOV A,#0
MOVC A,@A+DPTR
LCALL FSA ;发送A
INC DPTR ;地址+1
CLR C ;计数器-1
MOV A,R4
SUBB A,#1
MOV R4,A
MOV A,R5
SUBB A,#0
MOV R5,A
JNZ SC9
MOV A,R4
JNZ SC9 ;R5R4=0退出
RET
;===== 串口初始化 ===========================================================
CSH: MOV TH1,#BTL9600 ;9.6KHz
CKSZ2: MOV PCON,#80H ;SMOD=1
MOV TMOD,#20H ;定时器1为方式2:可自动再装入的8位计数器
MOV TCON,#40H ;定时器1开始运行(TR1=1)
MOV SCON,#0D0H ;串口通道工作方式3,发送11位
RET
;=============================================================================
;=============================================================================
FSA: JB ZD_BUSY,FSA ;如果终端"忙",则等待(输出A中的数据)
JB K_MNCK,FS3 ;使用模拟串口转FS3
MOV SBUF,A ;发送一字节
FS2: JNB TI,FS2 ;等待本字节发送完毕
CLR TI
RET
;---- 模拟串口
FS3: CLR ZD_DATA ;起始位0
LCALL TIME
RRC A
MOV ZD_DATA,C ;D0位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D1位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D2位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D3位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D4位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D5位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D6位
LCALL TIME
RRC A
MOV ZD_DATA,C ;D7位
LCALL TIME
CLR ZD_DATA ;奇偶位=0,终端不检测奇偶位.
LCALL TIME
SETB ZD_DATA ;停止位=1
LCALL TIME
RET
;============================================================================
;==== 精确延时子程序(TIME延时时间的1/2)
TIME1B: MOV B,#TIMEzq/2
TIME2: NOP
NOP
NOP
NOP
NOP
DJNZ B,TIME2
RET
;============================================================================
;==== 精确延时子程序
TIME: MOV B,#TIMEzq
TIME1: NOP
NOP
NOP
NOP
NOP
DJNZ B,TIME1
RET
;/===========================================================================
;/例1:当通讯波特率F=9.6KHz,单片机晶振Z=18.432MHz时,TIMEzq=22
;/计算方法:
;/当波特率为9.6KHz时,每个二进制位的宽度为104uS.
;/振荡周期数zq=(1000/9.6)*18.432MHz=1920个振荡周期
;/调用本函数的其它指令执行时间为(12+24+24+12+24)=96个振荡周期.
;/执行每个循环需要(12*5+24=84)个振荡周期,则TIMEzq=(zq-96)/84=(1920-96)/84=22
;/即:TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*18.432)-96]/84=22
;/-------------
;/例2:当通讯波特率F=4.8KHz,单片机晶振Z=18.432MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/4.8)*18.432)-96]/84=44
;/-------------
;/例3:当通讯波特率F=19.2KHz,单片机晶振Z=18.432MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/19.2)*18.432)-96]/84=10
;/-------------
;/例4:当通讯波特率F=9.6KHz,单片机晶振Z=12.000MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*12.000)-96]/84=14
;/-------------
;/例5:当通讯波特率F=4.8KHz,单片机晶振Z=12.000MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/4.8)*12.000)-96]/84=28
;/-------------
;/例6:当通讯波特率F=19.2KHz,单片机晶振Z=12.000MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/19.2)*12.000)-96]/84=6
;/-------------
;/例7:当通讯波特率F=9.6KHz,单片机晶振Z= 6.000MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*6.000)-96]/84=6
;/-------------
;/例8:当通讯波特率F=9.6KHz,单片机晶振Z=11.0592MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*11.0592)-96]/84=13
;/-------------
;/例9:当通讯波特率F=9.6KHz,单片机晶振Z=22.1184MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*22.1184)-96]/84=26
;/-------------
;/例10:当通讯波特率F=9.6KHz,单片机晶振Z=24.0000MHz时:
;/ TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*24.000)-96]/84=29
;/------------
;============================================================================
;============================================================================
;============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -