;**********************************************************************
;**********************************************************************
;** 文件名: TFT驅(qū)動
;** Copyright(c): 徐軍然
;** 創(chuàng)建人: 徐軍然
;** 日期: 2012年1月9日
;** 修改人: 徐軍然
;** 日期: 2012年1月9日
;** 描述: TFT驅(qū)動 芯片為宏晶的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時寫數(shù)據(jù) 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數(shù)據(jù)
MOV R0,#01H
LCALL WR_CMD ;軟件復(fù)位
LCALL DELAY
LCALL DELAY
MOV R0,#11H ;退出休眠
LCALL WR_CMD
LCALL DELAY
LCALL DELAY
MOV R0,#3AH ;設(shè)置顯示像素
LCALL WR_CMD
MOV R1,#05H ;16 bit/pixel
LCALL WR_DATA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#20 ;R0用作定時用 T0設(shè)置延時為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 ;設(shè)置顯示范圍
MOV R0,#36H ;設(shè)置掃描方向
LCALL WR_CMD
MOV R1,#0C0H
LCALL WR_DATA
MOV R0,#29H ;開顯示
LCALL WR_CMD
MOV R0,#2CH ;寫內(nèi)存
LCALL WR_CMD
MOV COLOR_H,#07H ;設(shè)置顯示顏色
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 ;設(shè)置掃描方向
LCALL WR_CMD
MOV R1,#0C0H
LCALL WR_DATA
MOV R0,#29H ;開顯示
LCALL WR_CMD
MOV R0,#2CH ;寫內(nèi)存
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 ;設(shè)置掃描方向
LCALL WR_CMD
MOV R1,#0C0H
LCALL WR_DATA
MOV R0,#29H ;開顯示
LCALL WR_CMD
MOV R0,#2CH ;寫內(nèi)存
LCALL WR_CMD
MOV COLOR_H,#0F8H
MOV COLOR_L,#00H
LCALL DISPLAY_BACK_COLOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LJMP TIMER0
DISPLAY_BACK_COLOR:
MOV A,Y2 ;設(shè)置顯示的區(qū)域 (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 ;設(shè)置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 ;設(shè)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 ;寫入數(shù)據(jù)
WR_DATA:
CLR CS
SETB RS
MOV P0,R1
MOV R1,#0H
CLR WR
SETB WR
SETB CS
RET
/*;;;;;;;;;;;;;;;;;;;;;;I2C總線;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;讀寫的數(shù)據(jù)都放在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 ;子程序結(jié)束 返回
STOP_I2C: ;結(jié)束總線
CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA ;結(jié)束總線
NOP ;保證終止信號和起始信號之間的空閑時間大于4.7秒
NOP
NOP
NOP
NOP
RET
YES_ACK: ;發(fā)送應(yīng)答信號
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
NO_ACK: ;發(fā)送非應(yīng)答信號
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
CHECK_ACK: ;測是否應(yīng)答
SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
NOP
MOV C,SDA
JC NOTACK
SETB ACK ;應(yīng)答
NOTACK: ;不應(yīng)答
NOP
CLR SCL
RET
WRITE_BYTE: ;寫一個字節(jié)
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: ;讀數(shù)據(jù)到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
|