📄 democs32.asm
字号:
;==== DEMOCS32.ASM ==========================================================
;触摸屏_硬件或模拟串口_汇编语言_KY-C55A(H)P_彩色终端配触摸屏例程
;本程序以KY-C55A(H)P为例校准,用于其它终端时,需重新校准"按键数据存放区C03ANZ3"中的数据.
;============================================================================
;============================================================================
;本程序可在任何51系列单片机中运行
;如8031,8032,AT89C2051,AT89C4051,AT89C51,AT89C52,AT89C55,W78E51
; W78E52,W78E58,W78E516......
;通过K_MNCK可以选择使用硬件串口或模拟串口.
;当使用模拟串口时,CMP_DATA和ZD_DATA可任意选择单片机的引脚
; 当使用硬件串口时,CMP_DATA必须为P3.0 ZD_DATA必须为P3.1
; 其它功能引脚可任意安排.
;本例中使用AT89C51,18.432MHz.
;硬件支持为本公司的51单片机实验板(TEST51B.PCB)
;可完成如下功能:
; 1)使用模拟串口,CMP_DATA和ZD_DATA可任意选择单片机的引脚
; 2)触摸屏演示.
; 3)本程序可用于KY系列中320*240,640*480分辨率之单色或彩色终端配套触摸屏的演示
; 4)本例中为9个按键,用户可以根据需要,选择任意个按键并放在任何位置。
; 其中的子程序用户可以直接使用,也可根据需要适当改动。
; 5)建议晶振频率为18.432MHz,通信波特率为9600Hz
; 6)程序运行后,画出9个按键(9个矩形),按键后画面发生相应变化。
;============================================================================
;********用户开发触摸屏系统工作过程(仅供参考)********************************
;1)将需要使用到的所有按键用矩形画出.
;2)将触摸屏控制器的输出信号经RS232C转换板接微机的RS232C接口,运行配套软件,选
; 择"触摸屏测试",即可在微机屏幕上显示触摸屏的输出数据即手压位置的XY坐标.
;3)用铅笔分别点触各个矩形的对角两个点,即左上角和右下角.
; 记下各点(每个按键2个点)的XY坐标,并将这些数据分别填入标号为按键数据区.
;4)运行后将完成各键对应的功能.
;============================================================================
;============================================================================
TIMEzq EQU 22 ;通过修改TIMEzq使本程序适用于各种晶振及各种波特率.
;============================================================================
K_MNCK EQU 1 ;当K_MNCK=1时,使用模拟串口输出/接收数据.(本例中波特率为9600Hz)
;当K_MNCK=0时,使用硬件串口输出/接收数据.(本例中波特率为9600Hz)
CMP_DATA EQU P3.0 ;接收触摸屏控制器发来的串行数据
;当K_MNCK=1时,使用模拟串口接收数据,故可以连接于任意一位输入引脚上.
;当K_MNCK=0时,使用硬件串口接收数据,故必须连接于P3.0
ZD_DATA EQU P3.1 ;向液晶终端输出串行数据
;当K_MNCK=1时,使用模拟串口输出数据,故可以连接于任意一位输出引脚上.
;当K_MNCK=0时,使用硬件串口输出数据,故必须连接于P3.1
ZD_BUSY EQU P1.2 ;接收液晶终端发来的"忙"(BUSY)信号,可以连接于任意一位输入引脚上.
;=========================
;====使用硬件串口时,波特率的设置及计算方法: =================================
;BTL*(256-TH)=(18.432MHz*1000)/(12*16) BTL*(256-TH)=96 TH=256-(96/BTL)
;例:当BTL=9600Hz=9.6KHz时,TH=256-(96/9.6)=246
BTL96000 EQU 255 ;=FFH;18.432MHz:96000Hz(SMOD=1)
BTL19200 EQU 251 ;=FBH;18.432MHz:19200Hz(SMOD=1)
BTL9600 EQU 246 ;=F6H;18.432MHz: 9600Hz(SMOD=1)
BTL2400 EQU 216 ;=D8H;18.432MHz: 2400Hz(SMOD=1)
;=============================================================================
ESC EQU 1BH
XHDM EQU 37H ;型号代码0-7
MXH EQU 2BH
MXL EQU 2AH
MYH EQU 29H
MYL EQU 28H
;============================================================================
;===== 主程序 ==============================================================
ORG 0
JB K_MNCK,M00;使用模拟串口时不进行串口初始化
LCALL CSH ;串口初始化
M00: NOP
;============================================================================
;=======CMP03===C55A(H)P=====================================================
CMP03: NOP ;
MOV DPTR,#C03QPM ;清屏
LCALL SC1PSJ ;
MOV DPTR,#C03A1WZ ;AN1位置
LCALL SC1PSJ ;
MOV DPTR,#C03WX ;AN外形
LCALL SC1PSJ ;
MOV DPTR,#C03A2WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A3WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A4WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A5WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A6WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A7WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A8WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03A9WZ
LCALL SC1PSJ ;
MOV DPTR,#C03WX
LCALL SC1PSJ ;
MOV DPTR,#C03WZH0 ;位置回0
LCALL SC1PSJ ;
C0320: MOV DPTR,#C03ANZ3 ;DPTR为按键数据区首地址
MOV R7,#9 ;R7为最大按键值(如9个按键,则R7=9)
LCALL CMPAJ ;触摸屏按键处理,如果无压力或没有按指定的按
;键,则始终在本程序中运行.
C0330: MOV DPTR,#C0340
DEC A
MOV B,#3
MUL AB
JMP @A+DPTR
C0340: LJMP C03AN1CL ;AN1处理,完毕后转C0320
LJMP C03AN2CL
LJMP C03AN3CL
LJMP C03AN4CL
LJMP C03AN5CL
LJMP C03AN6CL
LJMP C03AN7CL
LJMP C03AN8CL
LJMP C03AN9CL
;============================================================================
C03AN1CL:MOV DPTR,#C03AN1ML ;演示画面按键1
LCALL SC
LJMP C0320
C03AN2CL:MOV DPTR,#C03AN2ML
LCALL SC
LJMP C0320
C03AN3CL:MOV DPTR,#C03AN3ML
LCALL SC
LJMP C0320
C03AN4CL:MOV DPTR,#C03AN4ML
LCALL SC
LJMP C0320
C03AN5CL:MOV DPTR,#C03AN5ML
LCALL SC
LJMP C0320
C03AN6CL:MOV DPTR,#C03AN6ML
LCALL SC
LJMP C0320
C03AN7CL:MOV DPTR,#C03AN7ML
LCALL SC
LJMP C0320
C03AN8CL:MOV DPTR,#C03AN8ML
LCALL SC
LJMP C0320
C03AN9CL:MOV DPTR,#C03AN9ML
LCALL SC
LJMP C0320
;============================================================================
;============================================================================
;============================================================================
;按键数据存放区
;当触摸屏位置与开发时发生较大偏移时,可将以下4个常数改为非零的正数或负数以抵
;消触摸位置的偏差,一般情况下,X1PY=X2PY,Y1PY=Y2PY。
C03X1PY EQU 0 ;X1偏移量
C03Y1PY EQU 0 ;Y1偏移量
C03X2PY EQU 0 ;X2偏移量
C03Y2PY EQU 0 ;Y2偏移量
;KY-C55A(H)P OK
;存放顺序依次为:按键左上角坐标X1,Y1 按键右下角X2,Y2
; X1 Y1 X2 Y2
C03ANZ3:DW 00589+C03X1PY, 00100+C03Y1PY, 00483+C03X2PY, 00193+C03Y2PY ;第1键
DW 00589+C03X1PY, 00351+C03Y1PY, 00483+C03X2PY, 00457+C03Y2PY ;第2键
DW 00589+C03X1PY, 00612+C03Y1PY, 00483+C03X2PY, 00716+C03Y2PY ;第3键
DW 00408+C03X1PY, 00100+C03Y1PY, 00300+C03X2PY, 00193+C03Y2PY ;第4键
DW 00408+C03X1PY, 00351+C03Y1PY, 00300+C03X2PY, 00457+C03Y2PY ;第5键
DW 00408+C03X1PY, 00612+C03Y1PY, 00300+C03X2PY, 00716+C03Y2PY ;第6键
DW 00225+C03X1PY, 00100+C03Y1PY, 00118+C03X2PY, 00193+C03Y2PY ;第7键
DW 00225+C03X1PY, 00351+C03Y1PY, 00118+C03X2PY, 00457+C03Y2PY ;第8键
DW 00225+C03X1PY, 00612+C03Y1PY, 00118+C03X2PY, 00716+C03Y2PY ;第9键
;================================================
C03QPM: DW 3 ;清屏幕
DB 1BH,51H,1
C03A1WZ:DW 204
DB 1BH,'m',0,010H,0,010H ;第1键,用"设置新坐标原点"命令决定以下6个矩形的左上角位置.
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz1_32.bmp" ;数字1的BMP图象(32*32单色)190个字节
C03A2WZ:DW 204
DB 1BH,'m',0,088H,0,010H;第2键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz2_32.bmp"
C03A3WZ:DW 204
DB 1BH,'m',1,000H,0,010H;第3键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz3_32.bmp"
C03A4WZ:DW 204
DB 1BH,'m',0,010H,0,060H;第4键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz4_32.bmp"
C03A5WZ:DW 204
DB 1BH,'m',0,088H,0,060H;第5键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz5_32.bmp"
C03A6WZ:DW 204
DB 1BH,'m',1,000H,0,060H;第6键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz6_32.bmp"
C03A7WZ:DW 204
DB 1BH,'m',0,010H,0,0B0H;第7键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz7_32.bmp"
C03A8WZ:DW 204
DB 1BH,'m',0,088H,0,0B0H;第8键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz8_32.bmp"
C03A9WZ:DW 204
DB 1BH,'m',1,000H,0,0B0H;第9键
DB ESC,'z',0,8,0,8
DB 1DH,42H
USES "sz9_32.bmp"
C03WX: DW 60
DB 1BH, 6AH,0E0H, 0,030H, 0, 0,30H, 0,30H ;最外层,左边和上边黄色,每个按键画6个矩形
DB 1BH, 6AH,080H, 0,0C0H, 0, 0,30H, 0,30H ;最外层,右边和下边黑色
DB 1BH, 6AH,0F0H, 1,030H, 1, 0,2FH, 0,2FH ;中间层,左边和上边白色
DB 1BH, 6AH,080H, 1,0C0H, 1, 0,2FH, 0,2FH ;中间层,右边和下边黑色
DB 1BH, 6AH,0E0H, 2,030H, 2, 0,2EH, 0,2EH ;最里层,左边和上边黄色
DB 1BH, 6AH,080H, 2,0C0H, 2, 0,2EH, 0,2EH ;最里层,右边和下边黑色
C03WZH0:DW 6
DB 1BH,'m',0,0,0,0;
;================================================
;AN1-AN90按键被按压后的处理程序
C03AN1ML:DB 0
DB 1BH,'m',0,010H,0,010H;第1键
DB ESC,'j',0,0,4,0,0,30H,0,30H;'q'
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN2ML:DB 0
DB 1BH,'m',0,088H,0,010H;第2键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN3ML:DB 0
DB 1BH,'m',1,000H,0,010H;第3键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN4ML:DB 0
DB 1BH,'m',0,010H,0,060H;第4键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN5ML:DB 0
DB 1BH,'m',0,088H,0,060H;第5键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN6ML:DB 0
DB 1BH,'m',1,000H,0,060H;第6键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN7ML:DB 0
DB 1BH,'m',0,010H,0,0B0H;第7键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN8ML:DB 0
DB 1BH,'m',0,088H,0,0B0H;第8键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
C03AN9ML:DB 0
DB 1BH,'m',1,000H,0,0B0H;第9键
DB ESC,'j',0,0,4,0,0,30H,0,30H
DB 0,0,0,0,0,0,0,0,0,0,0,0
;============================================================================
;============================================================================
;============================================================================
;============================================================================
;功能:触摸屏按键处理,如果无压力或没有按指定的按键,则始终在本程序中运行.
;入口:DPTR为按键数据区首地址,每键4字=8字节.
; R7为最大按键值(如9个按键,则R7=9)
;出口:A中为对应的键值.如A=1,2,3,4,5....为对应的键。
;影响:A,B,C,R6,R5,R4,R3
CMPAJ: MOV R5,DPH
MOV R4,DPL
CMPAJ1: MOV R3,#0FFH
CMPAJ2: LCALL CMP31 ;接收一组(5个字节)数据。
LCALL CMP38 ;转换求出XY坐标。X坐标于MXH,MXL中.Y坐标于MYH,MYL中.
MOV DPH,R5
MOV DPL,R4
LCALL QJ00 ;求按键值,A=0,没有按键被选中。A=1,2,3,4,5....为对应的键。
JZ CMPAJ1 ;=0:无按键,继续检测
MOV B,A
CLR C
SUBB A,R3
JZ CMPAJ3
MOV R3,B ;有按键,存键值在R3中
SJMP CMPAJ2
CMPAJ3: LCALL CMP31 ;第2次检测还是本键,开始第3次检测.(接收一组(5个字节)数据)
LCALL CMP38 ;转换求出XY坐标。X坐标于MXH,MXL中.Y坐标于MYH,MYL中.
MOV DPH,R5
MOV DPL,R4
LCALL QJ00 ;求按键值,A=0,没有按键被选中。A=1,2,3,4,5....为对应的键。
JZ CMPAJ1
MOV B,A
CLR C
SUBB A,R3
JNZ CMPAJ1 ;
MOV A,B
RET ;A=1,2,3,4,5....为对应的键。
;================================================
;================================================
;功能:求按键值,
;入口:当前压力点的X坐标于MXH,MXL中.Y坐标于MYH,MYL中.
; DPTR为按键数据区首地址,每键4字=8字节.
; R7为最大按键值(如9个按键,则R7=9)
;出口:A=0时没有按键被选中。A非0时,A中为对应的键值.如A=1,2,3,4,5....为对应的键。
;影响:A,B,C,R6
QJ00: MOV R6,#1
QJ23: CALL BJ00 ;A非0:是本键(键值在R6中)
JZ QJ21
MOV A,R6
RET
QJ21: MOV A,R6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -