📄 com.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 + -