⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 democs32.asm

📁 51单片机模拟串口
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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 + -