|
发表于 2012-10-12 17:08:15
|
显示全部楼层
参照2楼的c程序,改写成了16位数据模式汇编程序的,端口有点变化,已经驱动成功。
; Target : ATMega16
; Crystal: 4.0000Mhz
; 16位数据模式,全屏循环刷成红色,绿色,蓝色。
;
.include "m16def.inc"
;-------------------I/O定义----------
.equ lcd_dataport_h =portc ;高8位数据口,8位模式下只使用高8位
.equ lcd_datapin_h =pinc
.equ lcd_dataddr_h =ddrc
.equ lcd_dataport_l =porta ;低8位数据口
.equ lcd_datapin_l =pina
.equ lcd_dataddr_l =ddra
.equ lcd_ctrl =portd
.equ lcd_ctrl_ddr =ddrd
.equ lcd_rs =pd3
.equ lcd_wr =pd4
.equ lcd_rd =pd5
.equ lcd_cs =pd6
.equ lcd_rest =pd7
;-------------------工作寄存器定义----------
.def temp0 =r16
.def temp1 =r17
.def temp2 =r18
.def temp3 =r19
.def temp4 =r20
.def temp5 =r21
.def temp6 =r22
.def temp7 =r23
.def temp8 =r24
.def temp9 =r25
.def tempa =r26
.def tempb =r27
.org $0000
jmp reset ;复位
reti ;IRQ0 中断向量
nop
reti ;IRQ1 中断向量
nop
reti ;Time2 比较中断向量
nop
reti ;Time2 溢出中断向量
nop
reti ;Time1 捕捉中断向量
nop
reti ;Time1 比较A中断向量
nop
reti ;Time1 比较B中断向量
nop
reti ;Time1 溢出中断向量
nop
reti ;Time0 溢出中断向量
nop
reti ;SPI 传输结束中断向量
nop
reti ;USART RX结束中断向量
nop
reti ;UDR 空中断向量
nop
reti ;USART TX结束中断向量
nop
reti ;ADC 转换结束中断向量
nop
reti ;EEPROM就绪
nop
reti ;模拟比较器中断向量
nop
reti ;两线串行接口中断向量
nop
reti ;IRQ2 中断向量
nop
reti ;Time0 比较中断向量
nop
reti ;SPM 就绪中断向量
nop
.org $002A
reset:
ldi temp0,low(ramend) ;设置堆栈指针
out spl,temp0
ldi temp0,high(ramend)
out sph,temp0
rcall lcd_port_init ;端口初始化
rcall lcd_init ;lcd初始化
ser tempa ;清屏
ser tempb
rcall pant
scan:
ldi tempa,0xf8 ;红色
ldi tempb,0x00
rcall pant
rcall delay_2000ms
ldi tempa,0x07 ;绿色
ldi tempb,0xe0
rcall pant
rcall delay_2000ms
ldi tempa,0x00 ;蓝色
ldi tempb,0x1f
rcall pant
rcall delay_2000ms
rjmp scan
;*************端口初始化*************
lcd_port_init:
ser temp0
out lcd_dataddr_h,temp0 ;高8位为输出
out lcd_dataddr_l,temp0 ;低8位为输出
ldi temp0,(1<<lcd_rs)|(1<<lcd_wr)|(1<<lcd_rd)|(1<<lcd_cs)|(1<<lcd_rest)
out lcd_ctrl_ddr,temp0 ;5个控制位为输出
ret
;*************16位并行数据写入函数*************
;temp0存高8位数据,temp1存低8位数据
lcd_write_bus:
out lcd_dataport_h,temp0
out lcd_dataport_l,temp1
cbi lcd_ctrl,lcd_wr ;wr=0
sbi lcd_ctrl,lcd_wr ;wr=1
ret
;*************发送命令*************
;temp0存高8位,temp1存低8位
lcd_write_com:
cbi lcd_ctrl,lcd_rs ;cs=0
rcall lcd_write_bus
ret
;*************发送数据*************
;temp0存高8位,temp1存低8位
lcd_write_data:
sbi lcd_ctrl,lcd_rs ;cs=1
rcall lcd_write_bus
ret
;*************设置X,Y坐标*************
;temp2存x1坐标高8位,temp3存x1坐标低8位,temp4存y1坐标高8位,temp5存y1坐标低8位
;temp6存x2坐标高8位,temp7存x2坐标低8位,temp8存y2坐标高8位,temp9存y2坐标低8位
address_set:
ldi temp0,0x00 ;设置X坐标位置
ldi temp1,0x20
rcall lcd_write_com
mov temp0,temp2
mov temp1,temp3
rcall lcd_write_data
ldi temp0,0x00 ;设置Y坐标位置
ldi temp1,0x21
rcall lcd_write_com
mov temp0,temp4
mov temp1,temp5
rcall lcd_write_data
ldi temp0,0x00 ;开始X
ldi temp1,0x50
rcall lcd_write_com
mov temp0,temp2
mov temp1,temp3
rcall lcd_write_data
ldi temp0,0x00 ;开始Y
ldi temp1,0x52
rcall lcd_write_com
mov temp0,temp4
mov temp1,temp5
rcall lcd_write_data
ldi temp0,0x00 ;结束X
ldi temp1,0x51
rcall lcd_write_com
mov temp0,temp6
mov temp1,temp7
rcall lcd_write_data
ldi temp0,0x00 ;结束Y
ldi temp1,0x53
rcall lcd_write_com
mov temp0,temp8
mov temp1,temp9
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x22
rcall lcd_write_com
ret
;*************延时5ms(temp0,temp1,temp2)*************
delay_5ms:
ldi temp0,1
ldi temp1,0
Delay5:
subi temp0,255 ;加1操作
sbci temp1,255
cpi temp0,0x29 ;0x29
ldi temp2,0x0b ;0x0b29 = 2857
cpc temp1,temp2
brlo Delay5 ;未达2857继续
ret
;*************延时50ms(temp0,temp1,temp2)*************
delay_50ms:
ldi temp0,1
ldi temp1,0
Delay50:
subi temp0,255
sbci temp1,255
cpi temp0,0x9b
ldi temp2,0x6f
cpc temp1,temp2
brlo Delay50
ret
;*************延时2000ms(temp0,temp1,temp2,temp3)*************
delay_2000ms:
clr temp3
Delay2000:
rcall delay_50ms
inc temp3
cpi temp3,40
brlo Delay2000
ret
;*************LCD初始化*************
lcd_init:
sbi lcd_ctrl,lcd_rest ;rest=1
rcall delay_5ms
cbi lcd_ctrl,lcd_rest ;rest=0
rcall delay_5ms
sbi lcd_ctrl,lcd_rest ;rest=1
sbi lcd_ctrl,lcd_cs ;cs=1
sbi lcd_ctrl,lcd_rd ;rd=1
sbi lcd_ctrl,lcd_wr ;wr=1
rcall delay_5ms
cbi lcd_ctrl,lcd_cs ;cs=0,打开片选使能
;--------------Start Initial Sequence--------------
ldi temp0,0x00 ;
ldi temp1,0xe5
rcall lcd_write_com
ldi temp0,0x78
ldi temp1,0xf0
rcall lcd_write_data
ldi temp0,0x00 ;set SS and SM bit
ldi temp1,0x01
rcall lcd_write_com
ldi temp0,0x01
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;set 1 line inversion
ldi temp1,0x02
rcall lcd_write_com
ldi temp0,0x07
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;set GRAM write direction and BGR=1
ldi temp1,0x03
rcall lcd_write_com
ldi temp0,0x10
ldi temp1,0x30
rcall lcd_write_data
ldi temp0,0x00 ;Resize register
ldi temp1,0x04
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;set the back porch and front porch
ldi temp1,0x08
rcall lcd_write_com
ldi temp0,0x02
ldi temp1,0x07
rcall lcd_write_data
ldi temp0,0x00 ;set non-display area refresh cycle ISC[3:0]
ldi temp1,0x09
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;FMARK function
ldi temp1,0x0a
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;RGB interface setting
ldi temp1,0x0c
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;Frame marker Position
ldi temp1,0x0d
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;RGB interface polarity
ldi temp1,0x0f
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
;--------------Power On sequence --------------
ldi temp0,0x00 ;SAP, BT[3:0], AP, DSTB, SLP, STB
ldi temp1,0x10
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;DC1[2:0], DC0[2:0], VC[2:0]
ldi temp1,0x11
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x07
rcall lcd_write_data
ldi temp0,0x00 ;VREG1OUT voltage
ldi temp1,0x12
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00 ;VDV[4:0] for VCOM amplitude
ldi temp1,0x13
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x07
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x01
rcall lcd_write_data
rcall delay_50ms ;200ms的延时
rcall delay_50ms
rcall delay_50ms
rcall delay_50ms
ldi temp0,0x00 ;
ldi temp1,0x10
rcall lcd_write_com
ldi temp0,0x10
ldi temp1,0x90
rcall lcd_write_data
ldi temp0,0x00 ;
ldi temp1,0x11
rcall lcd_write_com
ldi temp0,0x02
ldi temp1,0x27
rcall lcd_write_data
rcall delay_50ms
ldi temp0,0x00 ;
ldi temp1,0x12
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x1f
rcall lcd_write_data
rcall delay_50ms
ldi temp0,0x00
ldi temp1,0x13
rcall lcd_write_com
ldi temp0,0x15
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x29
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x27
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x2b
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x0d
rcall lcd_write_data
rcall delay_50ms
ldi temp0,0x00
ldi temp1,0x20
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x21
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
;----------- Adjust the Gamma Curve ----------
ldi temp0,0x00
ldi temp1,0x30
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x31
rcall lcd_write_com
ldi temp0,0x07
ldi temp1,0x07
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x32
rcall lcd_write_com
ldi temp0,0x03
ldi temp1,0x07
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x35
rcall lcd_write_com
ldi temp0,0x02
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x36
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x08
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x37
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x04
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x38
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x39
rcall lcd_write_com
ldi temp0,0x07
ldi temp1,0x07
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x3c
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x02
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x3d
rcall lcd_write_com
ldi temp0,0x1d
ldi temp1,0x04
rcall lcd_write_data
;------------------ Set GRAM area ---------------
ldi temp0,0x00
ldi temp1,0x50
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x51
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0xef
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x52
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x53
rcall lcd_write_com
ldi temp0,0x01
ldi temp1,0x3f
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x60
rcall lcd_write_com
ldi temp0,0xa7
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x61
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x01
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x6a
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
;-------------- Partial Display Control ---------
ldi temp0,0x00
ldi temp1,0x80
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x81
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x82
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x83
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x84
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x85
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x00
rcall lcd_write_data
;-------------- Panel Control -------------------
ldi temp0,0x00
ldi temp1,0x90
rcall lcd_write_com
ldi temp0,0x00
ldi temp1,0x10
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x92
rcall lcd_write_com
ldi temp0,0x06
ldi temp1,0x00
rcall lcd_write_data
ldi temp0,0x00
ldi temp1,0x07
rcall lcd_write_com
ldi temp0,0x01
ldi temp1,0x33
rcall lcd_write_data
sbi lcd_ctrl,lcd_cs ;关闭片选使能
ret
;-------------------扫描LCD----------
;tempa,tempb
pant:
cbi lcd_ctrl,lcd_cs
ldi temp2,0
ldi temp3,0
ldi temp4,0
ldi temp5,0
ldi temp6,0
ldi temp7,240
ldi temp8,1
ldi temp9,64
rcall address_set
clr temp8
clr temp9
Yd:
clr temp2
Xd:
mov temp0,tempa
mov temp1,tempb
rcall lcd_write_data
inc temp2
cpi temp2,240
brlo Xd
adiw temp8,1
cpi temp9,1
brlo Yd
cpi temp8,64
brlo Yd
sbi lcd_ctrl,lcd_cs
ret |
|