发表于:2008-04-07 14:26:34
楼主
软件模拟串口,使用普通I/O 口和T0
;标准51 单片机,22.1184MHz 晶体
;19200bps N81 收发
;北京迪文科技有限公司 www.dwin.com.cn 86-10-62102630 62105007
;接收触摸屏信息 AA 73 XH XL YH YL
UTXD BIT P1.7 ;OUT USER RS232 INTERFACE
RXD BIT P1.5 ;IN
COMFLG EQU 20H ;.7 RECEIVED A VALID RF FRAME DATA
TCHOK BIT COMFLG.7
SYNCOK BIT COMFLG.6
RXAA EQU 30H ;触摸屏接收缓冲区
RX73 EQU 31H
RXXH EQU 32H
RXXL EQU 33H
RXYH EQU 34H
RXYL EQU 35H
RXLEN EQU 40H
RXBUF EQU 41H ;软件串口接收缓冲寄存器
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP UART1PRO ;软件串口接收
ORG 0100H
MAIN: CLR EA
MOV SP,#80H
LCALL INITUART
SETB EA
START: NOP
JNB TCHOK,START
CLR TCHOK ;每点击一次触摸屏就把DMT48270 屏幕一个区域反色一次
MOV DPTR,#TESTLCD
LCALL ROMSND1
MOV R7,#30 ;发送LCD 显示帧间延时 3mS
LCALL DELAY
LJMP START
;*******软件串口驱动********
;软件串口初始化,T0 工作在Autoload 模式
INITUART:MOV TMOD,#22H
MOV TH0,#238 ;10uS 定时器中断,软件串口波特率为19200
MOV TL0,#238
CLR TF0
CLR SYNCOK
SETB TR0
SETB ET0
CLR TCHOK
RET
;T0 中断,软件模拟串口接收
UART1PRO:PUSH ACC
PUSH PSW
CLR TF0
JB SYNCOK,URXDPR1
JB URXD,URXDPRE
SETB SYNCOK
MOV TH0,#160
MOV TL0,#112
MOV RXLEN,#8
SJMP URXDPRE
URXDPR1:MOV C,URXD
MOV A,RXBUF
RRC A
MOV RXBUF,A
DJNZ RXLEN,URXDPRE
MOV TH0,#238 ;接收完成一个完整的字节
MOV TL0,#160
CLR SYNCOK
JB TCHOK,URXDPRE ;还有触摸屏数据没有处理就不接收新的数据
MOV RXAA,RX73
MOV RX73,RXXH
MOV RXXH,RXXL
MOV RXXL,RXYH
MOV RXYH,RXYL
MOV RXYL,RXBUF
MOV A,RXAA
CJNE A,#0AAH,URXDPRE
MOV A,RX73
CJNE A,#73H,URXDPRE
SETB TCHOK ;接收到触摸屏数据
URXDPRE:POP PSW
POP ACC
RETI
;软件模拟串口发送1 个字节数据,发送数据在ACC,采用延时方式
TXBCOM1:PUSH PSW
PUSH B
MOV B,R2
PUSH B
CLR UTXD ;起始位
MOV R2,#46
DJNZ R2,$
MOV B,#8 ;8 个数据位,LSB
TXBCOM11:RRC A
MOV UTXD,C
MOV R2,#46
DJNZ R2,$
DJNZ B,TXBCOM11
SETB UTXD ;停止位
MOV R2,#64
DJNZ R2,$
POP B
MOV R2,B
POP B
POP PSW
RET
;发送固定的字符串到软件串口,0xFF 为结束标记
ROMSND1: CLR A
MOVC A,@A+DPTR
INC DPTR
CJNE A,#0FFH,ROMSND1E
RET
ROMSND1E:LCALL TXBCOM1
LJMP ROMSND1
RET
DEALY: PUSH ACC
PUSH PSW
DELAY1: MOV A,#90
DJNZ ACC,$
DJNZ R7,DELAY1
POP PSW
POP ACC
RET
TESTLCD:DB 0AAH,5CH,00H,40H,00H,40H,00H,80H,00H,80H,0FFH ;反色区域(40,40) (80,80)
END