;**********************************************************************
;**********************************************************************
;** 文件名: TFT驱动
;** Copyright(c): 徐军然
;** 创建人: 徐军然
;** 日期: 2012年1月9日
;** 修改人: 徐军然
;** 日期: 2012年1月9日
;** 描述: TFT驱动 芯片为宏晶的STC90C516RD+
;** 版本: 1.0.0
;**
;**
;**********************************************************************
;**********************************************************************
;;;;;;;;;;;;;;;;;;;;;;TFT屏幕;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P0 DATA 80H
P2 DATA 0A0H
P3 DATA 0B0H
COLOR_H DATA 11H
COLOR_L DATA 10H
TCON DATA 88H
TR0 BIT TCON.4
IE DATA 0A8H
EA BIT IE.7
ET0 BIT IE.1
TMOD DATA 89H
TH0 DATA 8CH
TL0 DATA 8BH
X1 EQU R2
X2 EQU R3
Y1 EQU R4
Y2 EQU R5
CS BIT P2.6
RESET BIT P2.7
RS BIT P2.5 ;RS为1时写数据 RS为0时写命令
WR BIT P3.3
RD BIT P3.2
;;;;;;;;;;;;;;;;;;;;;;TFT屏幕;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*;;;;;;;;;;;;;;;;;;;;;;I2C总线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCL BIT P2.1
SDA BIT P2.0
ACK EQU 012H
;;;;;;;;;;;;;;;;;;;;;;I2C总线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
ORG 0000H
LJMP INIT
ORG 00BH
LJMP MAIN
ORG 0030H
INIT:
SETB RESET
LCALL DELAY
LCALL DELAY
CLR RESET
LCALL DELAY
LCALL DELAY
SETB RESET
LCALL DELAY
LCALL DELAY
;R0命令,R1数据
MOV R0,#01H
LCALL WR_CMD ;软件复位
LCALL DELAY
LCALL DELAY
MOV R0,#11H ;退出休眠
LCALL WR_CMD
LCALL DELAY
LCALL DELAY
MOV R0,#3AH ;设置显示像素
LCALL WR_CMD
MOV R1,#05H ;16 bit/pixel
LCALL WR_DATA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定时器初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#20 ;R0用作定时用 T0设置延时为50ms*10=0.5s R0里放10
MOV 20H,#00H ;20H地址处用来暂存A的值
MOV A,20H ;用20H地址的值为A赋初值
MOV P0,#00H ;为P0口赋初值
MOV TMOD,#01H ;T0工作在方式1 赋初值 延时50ms
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA ;开全局中断
SETB ET0 ;开定时器中断
SETB TR0 ;启动定时器0
TIMER0:
AJMP $ ;等待中断
MAIN:
MOV X1,#0H
MOV X2,#127
MOV Y1,#0H
MOV Y2,#159
LCALL SET_POS ;设置显示范围
MOV R0,#36H ;设置扫描方向
LCALL WR_CMD
MOV R1,#0C0H
LCALL WR_DATA
MOV R0,#29H ;开显示
LCALL WR_CMD
MOV R0,#2CH ;写内存
LCALL WR_CMD
MOV COLOR_H,#07H ;设置显示颜色
MOV COLOR_L,#0E0H
LCALL DISPLAY_BACK_COLOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;红色;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,P0
CPL 80H
JNB 80H,GAODIANPING
MOV X1,#10
MOV X2,#60
MOV Y1,#90
MOV Y2,#130
LCALL SET_POS
MOV R0,#36H ;设置扫描方向
LCALL WR_CMD
MOV R1,#0C0H
LCALL WR_DATA
MOV R0,#29H ;开显示
LCALL WR_CMD
MOV R0,#2CH ;写内存
LCALL WR_CMD
MOV COLOR_H,#0F8H
MOV COLOR_L,#00H
LCALL DISPLAY_BACK_COLOR
GAODIANPING:
MOV X1,#60
MOV X2,#110
MOV Y1,#50
MOV Y2,#90
LCALL SET_POS
MOV R0,#36H ;设置扫描方向
LCALL WR_CMD
MOV R1,#0C0H
LCALL WR_DATA
MOV R0,#29H ;开显示
LCALL WR_CMD
MOV R0,#2CH ;写内存
LCALL WR_CMD
MOV COLOR_H,#0F8H
MOV COLOR_L,#00H
LCALL DISPLAY_BACK_COLOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LJMP TIMER0
DISPLAY_BACK_COLOR:
MOV A,Y2 ;设置显示的区域 (X1,X2)->(Y1,Y2)
SUBB A,Y1
INC A
MOV R6,A
MOV A,X2
SUBB A,X1
INC A
LOOP1:
MOV R7,A
MOV R1,COLOR_H
LCALL WR_DATA
MOV R1,COLOR_L
LCALL WR_DATA
LOOP2:
MOV R1,COLOR_H
LCALL WR_DATA
MOV R1,COLOR_L
LCALL WR_DATA
DJNZ R7,LOOP2
DJNZ R6,LOOP1
RET
SET_POS:
MOV R0,#2AH ;设置x坐标
LCALL WR_CMD
MOV R1,#00H
LCALL WR_DATA
MOV A,X1
MOV R1,A
LCALL WR_DATA
MOV R1,#00H
LCALL WR_DATA
MOV A,X2
MOV R1,A
LCALL WR_DATA
MOV R0,#2BH ;设y置坐标
LCALL WR_CMD
MOV R1,#00H
LCALL WR_DATA
MOV A,Y1
MOV R1,A
LCALL WR_DATA
MOV R1,#00H
LCALL WR_DATA
MOV A,Y2
MOV R1,A
LCALL WR_DATA
RET
WR_CMD:
CLR CS
CLR RS ;写命令
MOV P0,R0
MOV R0,#0H
CLR WR
SETB WR
SETB CS
RET ;写入数据
WR_DATA:
CLR CS
SETB RS
MOV P0,R1
MOV R1,#0H
CLR WR
SETB WR
SETB CS
RET
/*;;;;;;;;;;;;;;;;;;;;;;I2C总线;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读写的数据都放在A里
START_I2C: ;启动I2C总线
SETB SDA
NOP
SETB SCL ;起始建立时间要大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SDA ;建立保持时间要大于4.0us
NOP
NOP
NOP
NOP
CLR SCL ;钳住总线 准备
NOP
RET ;子程序结束 返回
STOP_I2C: ;结束总线
CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA ;结束总线
NOP ;保证终止信号和起始信号之间的空闲时间大于4.7秒
NOP
NOP
NOP
NOP
RET
YES_ACK: ;发送应答信号
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
NO_ACK: ;发送非应答信号
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
CHECK_ACK: ;测是否应答
SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
NOP
MOV C,SDA
JC NOTACK
SETB ACK ;应答
NOTACK: ;不应答
NOP
CLR SCL
RET
WRITE_BYTE: ;写一个字节
MOV R0,#08H
LOOP1:
RLC A
JC WRITE_1
LJMP WRITE_0
LOOP2:
DJNZ R0,LOOP1
NOP
RET
WRITE_0:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
lJMP LOOP2
WRITE_1:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
LJMP LOOP2
READ_BYTE: ;读数据到A、R1
MOV R0,#08H
MOV R1,#00H
NEXT1:
SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV A,R1
CLR SCL ;保持需大于4.7us
RLC A
MOV R1,A
NOP
NOP
NOP
DJNZ R0,NEXT1
RET
;;;;;;;;;;;;;;;;;;;;;;I2C总线;;;;;;;;;;;;;;;;;;;;;;
*/
DELAY: ;延时
MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
|