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

📄 com.asm

📁 智能显示终端串行接口通信演示程序之一
💻 ASM
字号:

;智能显示终端串行接口通信演示程序之一。
;ATS89C51  11.059MHz"。    

Year     EQU  30H    ;年
Mon      EQU  31H    ;月
Day      EQU  32H    ;日
Hour     EQU  33H    ;时
Min      EQU  34H    ;分
Sec      EQU  35H    ;秒
;;==================
CHX_H    EQU  40H
CHX_L    EQU  41H             
CHY_H    EQU  42H
CHY_L    EQU  43H
;;==================
TEMP1    EQU  44H
TEMP2    EQU  45H             
TEMP3    EQU  46H
TEMP4    EQU  47H
;===================
RX_EN    EQU  48H
RX_ADDR  EQU  49H
;=====================
X_AXISH  EQU  4AH     ;显示定位X坐标(高字节)
X_AXISL  EQU  4BH
Y_AXISH  EQU  4CH     ;显示定位Y坐标(高字节)
Y_AXISL  EQU  4DH
F_COLOR  EQU  4EH     ;前景色
B_COLOR  EQU  4FH     ;背景色
;===========用户按键KEY1的坐标定义(由按键在位图中的位置可知)
X_H0     EQU  50H
X_L0     EQU  51H
Y_H0     EQU  52H
Y_L0     EQU  53H
X_H1     EQU  54H
X_L1     EQU  55H
Y_H1     EQU  56H
Y_L1     EQU  57H
;;=========一些绘图子程序用到的参数定义(宽、高、序号)
WIDTH_H  EQU  36H
WIDTH_L  EQU  37H
HEITH_H  EQU  38H
HEITH_L  EQU  39H
NUMBLE   EQU  3AH
;====================
KEY1_EN  BIT  20H.0
;====================

  ORG   0000H
  NOP
  AJMP  START
  ORG   0023H
  AJMP  UART_SER
  ORG   00A0H
START:
;对AT89C51的串口初始化
  MOV   TMOD,#020H       ;定时器1设置为模式2
  CLR   SM0
  SETB  SM1              ;设置串口为方式1,10位异步收发
  ORL   PCON,#080H       ;波特率加倍
  MOV   TL1,#0FDH
  MOV   TH1,#0FDH        ;波特率为19200
  SETB  TR1              ;启动定时器1
  SETB  REN              ;允许串口接受使能
  SETB  EA              ;全局中断使能,(EA=0,关全局中断;EA=1,开全局中断)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示终端在上电就绪时发送F0.用仿真器时不要检测F0.
;当把程序烧写到单片机上时,显示终端和单片机同时上电,所以一定
;要检测是否收到F0。以判断显示终端是否上电就绪
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START1:
  JBC  RI,START2
  AJMP START1
START2:
  MOV  A,SBUF
  CJNE  A,#0F0H,START1       ;是否收到F0
;;=========================
  	SETB  ES              ;串口中断使能置1,允许串口中断
	MOV  F_COLOR,#00H
	MOV  B_COLOR,#0FFH
        CALL  LCD_CLR         ;清屏
	MOV   X_AXISH,#00H	;加载显示位图的参数
	MOV   X_AXISL,#00H
	MOV   Y_AXISH,#00H
	MOV   Y_AXISL,#00H
	MOV   NUMBLE,#00H
	ACALL DIS_BMP		;显示位图
LOOP:   MOV  A,#0B2H
        CJNE A,RX_EN,LOOP	;若串口接收的是触摸屏坐标时,RX_EN=#0B2H(在中断程序中赋值),否则退出
        MOV  CHX_H,TEMP1	;存接收的数据(触摸屏坐标值)
        MOV  CHX_L,TEMP2
        MOV  CHY_H,TEMP3
        MOV  CHY_L,TEMP4
        MOV  RX_EN,#00H		;清RX_EN
	MOV   X_AXISH,#00H	;加载显示变量的参数
	MOV   X_AXISL,#50H
	MOV   Y_AXISH,#00H
	MOV   Y_AXISL,#0FH
	CALL  DIS_VAX		;显示变量(触摸屏的X坐标)
	MOV   X_AXISH,#00H	;加载显示变量的参数
	MOV   X_AXISL,#50H
	MOV   Y_AXISH,#00H
	MOV   Y_AXISL,#32H
	CALL  DIS_VAY		;显示变量(触摸屏的Y坐标)
;===============KEY1(左按键)====================================================
	 MOV   X_H0,#01H	;加载按键的位置坐标(由按键在位图中的位置得知)
	 MOV   X_L0,#32H
	 MOV   Y_H0,#03H
	 MOV   Y_L0,#00H
	 MOV   X_H1,#02H
	 MOV   X_L1,#32H
	 MOV   Y_H1,#03H
	 MOV   Y_L1,#28H
	CALL  KEY_JUST		;调用按键范围判断子程序
	JNB   KEY1_EN,LOOP4	;点击到按键吗?否退出,是往下执行
	CLR   KEY1_EN
	MOV   X_AXISH,#02H	;加载显示字符的参数
	MOV   X_AXISL,#46H
	MOV   Y_AXISH,#01H
	MOV   Y_AXISL,#57H
	MOV   DPTR,#TABLE0
	ACALL DIS_CHAR		;调用显示字符子程序
	MOV   X_AXISH,X_H0	;加载反色矩形的参数
	MOV   X_AXISL,X_L0
	MOV   Y_AXISH,Y_H0
	MOV   Y_AXISL,Y_L0
	MOV   WIDTH_H,#01H
	MOV   WIDTH_L,#00H
	MOV   HEITH_H,#00H
	MOV   HEITH_L,#28H
	ACALL INV_REC		;反色矩形(按键)
LOOP2:	MOV   A,RX_EN  		;注:点击触摸屏时,串口发送完坐标数据后,当按键放开,还会发送一个字节(#0F3H)
	CJNE  A,#0F3H,LOOP2	;若不是#0F3H则继续循环采样
	ACALL INV_REC		;按键放开,按键恢复原来颜色
;;===============KEY2(右按键)========================================
LOOP4:	 MOV   X_H0,#03H	;加载按键的位置坐标(由按键在位图中的位置得知)
	 MOV   X_L0,#5AH
	 MOV   Y_H0,#03H
	 MOV   Y_L0,#00H
	 MOV   X_H1,#04H
	 MOV   X_L1,#5AH
	 MOV   Y_H1,#03H
	 MOV   Y_L1,#28H
	CALL  KEY_JUST		;调用按键范围判断子程序
	JNB   KEY1_EN,LOOP1	;点击到按键吗?否退出,是往下执行
	CLR   KEY1_EN
	MOV   X_AXISH,#02H	;加载显示字符的参数
	MOV   X_AXISL,#46H
	MOV   Y_AXISH,#01H
	MOV   Y_AXISL,#57H
	MOV   DPTR,#TABLE1
	ACALL DIS_CHAR		;调用显示字符子程序
	MOV   X_AXISH,X_H0	;加载反色矩形的参数
	MOV   X_AXISL,X_L0
	MOV   Y_AXISH,Y_H0
	MOV   Y_AXISL,Y_L0
	MOV   WIDTH_H,#01H
	MOV   WIDTH_L,#00H
	MOV   HEITH_H,#00H
	MOV   HEITH_L,#28H
	ACALL INV_REC		;反色矩形(按键)
LOOP3:	MOV   A,RX_EN  		;注:点击触摸屏时,串口发送完坐标数据后,当按键放开,还会发送一个字节(#0F3H)
	CJNE  A,#0F3H,LOOP3	;若不是#0F3H则继续循环采样
	ACALL INV_REC		;按键放开,按键恢复原来颜色
LOOP1: 	AJMP  LOOP

;=============================================================
;清屏子程序
LCD_CLR:
 	CLR  T1
  	MOV  SBUF,#081H        ;发送指令开始码
  	CALL  check_uart
  	MOV  SBUF,#043H        ;发送清屏指令高字节
  	CALL  check_uart
  	MOV  SBUF,#04CH        ;发送清屏指令低字节
  	CALL  check_uart
  	MOV  SBUF,F_COLOR      ;发送前景颜色E0H指令
  	CALL  check_uart
  	MOV  SBUF,B_COLOR      ;发送背景颜色FFH指令
  	CALL  check_uart
  	MOV  SBUF,#084H        ;发送指令结束码
  	CALL  check_uart
  	RET
;;========================================================
;显示位图子程序
DIS_BMP:  CLR   TI
	  MOV   SBUF,#81H
	  ACALL  check_uart
	  MOV   SBUF,#44H
	  ACALL  check_uart
	  MOV   SBUF,#53H
	  ACALL  check_uart
	  MOV   SBUF,F_COLOR
	  ACALL  check_uart
	  MOV   SBUF,B_COLOR
	  ACALL  check_uart
	  MOV 	SBUF,X_AXISH
	  ACALL  check_uart
	  MOV   SBUF,X_AXISL
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISH
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISL
	  ACALL  check_uart
	  MOV   SBUF,NUMBLE
	  ACALL  check_uart
	  MOV   SBUF,#84H
	  ACALL  check_uart
	  RET;
;=========================================================
;按键范围判断子程序
KEY_JUST:CLR   C	;清借位位
	 CLR   KEY1_EN	;清点击正确标志(点击在按键的范围内)
	 MOV   A,CHX_H	;触摸屏x坐标高字节
	 MOV   B,A
	 SUBB  A,X_H0	;触摸屏x坐标高字节-按键左上角x坐标高字节
	 JC   K_OUT	;触摸屏x坐标高字节<按键左上角x坐标高字节,则退出
	 MOV   A,B
	 CJNE  A,X_H0,K1;触摸屏x坐标高字节不等于按键左上角x坐标高字节,则无须比较低字节,直接跳到下一个比较
	 MOV   A,CHX_L	;比较两个x坐标的低字节
	 SUBB  A,X_L0
	 JC   K_OUT
K1:	 MOV   A,CHY_H	;触摸屏y坐标与按键左上角y坐标比较
	 MOV   B,A
	 SUBB  A,Y_H0
	 JC   K_OUT
	 MOV   A,B
	 CJNE  A,Y_H0,K2
	 MOV   A,CHY_L
	 SUBB  A,Y_L0
	 JC   K_OUT
K2:	 MOV   A,X_H1	;触摸屏x坐标与按键右下角x坐标比较
	 MOV   B,A
	 SUBB  A,CHX_H
	 JC    K_OUT
	 MOV   A,B
	 CJNE  A,CHX_H,K3;
	 MOV   A,X_L1
	 SUBB  A,CHX_L
	 JC    K_OUT
K3:	 MOV   A,Y_H1	;触摸屏y坐标与按键右下角y坐标比较
	 MOV   B,A
	 SUBB  A,CHY_H
	 JC    K_OUT
	 MOV   A,B
	 CJNE  A,CHY_H,K4
	 MOV   A,Y_L1
	 SUBB  A,CHY_L
	 JC    K_OUT
K4:      SETB  KEY1_EN	   ;若点击处在按键的范围之内则置位,否则保持为零
K_OUT:   RET;


;==============================================================
;反色矩形子程序
INV_REC:  CLR   TI
	  MOV   SBUF,#81H
	  ACALL  check_uart
	  MOV   SBUF,#43H
	  ACALL  check_uart
	  MOV   SBUF,#4EH
	  ACALL  check_uart
	  MOV   SBUF,F_COLOR
	  ACALL  check_uart
	  MOV   SBUF,B_COLOR
	  ACALL  check_uart
	  MOV 	SBUF,X_AXISH
	  ACALL  check_uart
	  MOV   SBUF,X_AXISL
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISH
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISL
	  ACALL  check_uart
	  MOV   SBUF,WIDTH_H
	  ACALL  check_uart
	  MOV   SBUF,WIDTH_L
	  ACALL  check_uart
	  MOV   SBUF,HEITH_H
	  ACALL  check_uart
	  MOV   SBUF,HEITH_L
	  ACALL  check_uart
	  MOV   SBUF,#84H
	  ACALL  check_uart
	  RET;

;;=========================================显示变量子程序(X轴)
DIS_VAX:  CLR   TI
	  MOV   SBUF,#81H
	  ACALL  check_uart
	  MOV   SBUF,#44H
	  ACALL  check_uart
	  MOV   SBUF,#56H
	  ACALL  check_uart
	  MOV   SBUF,F_COLOR
	  ACALL  check_uart
	  MOV   SBUF,B_COLOR
	  ACALL  check_uart
	  MOV 	SBUF,X_AXISH
	  ACALL  check_uart
	  MOV   SBUF,X_AXISL
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISH
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISL
	  ACALL  check_uart
	  MOV   SBUF,CHX_H
	  ACALL  check_uart
	  MOV   SBUF,CHX_L
	  ACALL  check_uart
	  MOV   SBUF,#03H
	  ACALL  check_uart
	  MOV   SBUF,#84H
	  ACALL  check_uart
	  RET;
;;=========================================显示变量子程序(Y轴)
DIS_VAY:  CLR   TI
	  MOV   SBUF,#81H
	  ACALL  check_uart
	  MOV   SBUF,#44H
	  ACALL  check_uart
	  MOV   SBUF,#56H
	  ACALL  check_uart
	  MOV   SBUF,F_COLOR
	  ACALL  check_uart
	  MOV   SBUF,B_COLOR
	  ACALL  check_uart
	  MOV 	SBUF,X_AXISH
	  ACALL  check_uart
	  MOV   SBUF,X_AXISL
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISH
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISL
	  ACALL  check_uart
	  MOV   SBUF,CHY_H
	  ACALL  check_uart
	  MOV   SBUF,CHY_L
	  ACALL  check_uart
	  MOV   SBUF,#03H
	  ACALL  check_uart
	  MOV   SBUF,#84H
	  ACALL  check_uart
	  RET;
;=========================================显示字符子程序
DIS_CHAR: CLR   TI
	  MOV   SBUF,#81H
	  ACALL  check_uart
	  MOV   SBUF,#44H
	  ACALL  check_uart
	  MOV   SBUF,#57H
	  ACALL  check_uart
	  MOV   SBUF,F_COLOR
	  ACALL  check_uart
	  MOV   SBUF,B_COLOR
	  ACALL  check_uart
	  MOV 	SBUF,X_AXISH
	  ACALL  check_uart
	  MOV   SBUF,X_AXISL
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISH
	  ACALL  check_uart
	  MOV   SBUF,Y_AXISL
	  ACALL  check_uart
CH1:	  CLR   A
	  MOVC  A,@A+DPTR
	  CJNE  A,#00H,CH2
	  AJMP  CH_OUT
CH2:	  MOV   SBUF,A
	  ACALL  check_uart
	  INC   DPTR
	  AJMP  CH1
CH_OUT:   MOV   SBUF,#84H
	  ACALL  check_uart
	  RET
;===============================================================                      
;查看一个字符是否传送完毕,当一个字符传送完毕后TI位会被硬件置1;
check_uart:
  	JBC  TI,check1
  	AJMP  check_uart
check1:
  	RET
;;===============================================================
;串口中断服务程序
UART_SER:
  	PUSH  ACC
  	PUSH  B
  	PUSH  DPH
  	PUSH  DPL
  	PUSH  PSW
  	PUSH  0   ;PUSH  R0
  	CLR   RI
  	CLR   C
  	MOV   A,SBUF
  	MOV   B,A
  	SUBB  A,#0F0H  ;小于F0的数据为参数,大于F0的数据为前导字节。
  	JNC  SER9
  	MOV  A,RX_EN
  	CJNE A,#0F2H,SER1   ;充许接收触摸屏数据
  	MOV  R0,RX_ADDR
  	MOV  @R0,B
  	INC  RX_ADDR
  	MOV  A,RX_ADDR
  	CJNE A,#048H,OUT_SER
  	MOV  RX_EN,#0B2H
  	AJMP OUT_SER
SER1:
  	CJNE A,#0F8H,SER2   ;充许接收年月日数据
  	MOV  R0,RX_ADDR
  	MOV  @R0,B
  	INC  RX_ADDR
  	MOV  A,RX_ADDR
  	CJNE A,#048H,OUT_SER
  	MOV  RX_EN,#0B8H
  	AJMP OUT_SER
SER2:
  	CJNE A,#0F9H,OUT_SER   ;充许接收时分秒数据
  	MOV  R0,RX_ADDR
  	MOV  @R0,B
  	INC  RX_ADDR
  	MOV  A,RX_ADDR
  	CJNE A,#047H,OUT_SER
  	MOV  RX_EN,#0B9H
  	AJMP OUT_SER
SER9:
  	MOV   RX_EN,B  
  	MOV   RX_ADDR,#044H
OUT_SER:
  	POP   0  ;POP  R0
  	POP   PSW
  	POP   DPL
  	POP   DPH
  	POP   B
  	POP   ACC
  	RETI
;;===================================================================
TABLE0: DB "左按键",00H
TABLE1: DB "右按键",00H
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -