MEGA16L单片机驱动2.4寸tft,控制芯片为ILI9325
MEGA16L单片机驱动2.4寸tft,控制芯片为ILI9325,谁给一个程序吧。做了几天了都没做出来,特急,那位朋友和我一样是做单片机控制tft显示图形的,或者已做过了,探讨一下 我现在还只能让它显示红、绿、蓝.....只能知道大概的原理....给你看我最近写的程序...好像如果要显示一张图片的话。。。m16的flash太小了。。。得装SD卡才行哦。。。
#include <avr/io.h>
#define F_CPU 11000000
#include <util/delay.h>
#define Bus_16 //16位数据模式,如果使用8位模式,请注释词句,如果使用16位模式,请打开词句
#define LCD_DataPORT_H PORTC //高8位数据口,8位模式下只使用高8位
#define LCD_DataPIN_H PINC
#define LCD_DataDDR_H DDRC
#define LCD_DataPORT_L PORTA //低8位数据口,8位模式下低8位可以不接线,请确认PA口已经上拉10K电阻,不宜太小,最小4.7K,推荐10K
#define LCD_DataPIN_L PINA
#define LCD_DataDDR_L DDRA
#define LCD_CTRL PORTD
#define LCD_CTRL_DDR DDRD
#define LCD_RS PD2 //
#define LCD_WR PD3
#define LCD_RD PD4
#define LCD_CS PD0
#define LCD_REST PD1
#define RS_0 (LCD_CTRL &= ~(1 << LCD_RS))
#define RS_1 (LCD_CTRL |= (1 << LCD_RS))
#define WR_0 (LCD_CTRL &= ~(1 << LCD_WR))
#define WR_1 (LCD_CTRL |= (1 << LCD_WR))
#define RD_0 (LCD_CTRL &= ~(1 << LCD_RD))
#define RD_1 (LCD_CTRL |= (1 << LCD_RD))
#define CS_0 (LCD_CTRL &= ~(1 << LCD_CS))
#define CS_1 (LCD_CTRL |= (1 << LCD_CS))
#define REST_0 (LCD_CTRL &= ~(1 << LCD_REST))
#define REST_1 (LCD_CTRL |= (1 << LCD_REST))
#define busy_time 5 //延时时间
#ifdef Bus_16 //条件编译-16位数据模式
void LCD_Port_Init(void) //LCD端口初始化
{
LCD_DataDDR_H = 0xff; //方向为输出
LCD_DataDDR_L = 0xff; //方向为输出
LCD_CTRL_DDR |= (1 << LCD_RS) | (1 << LCD_WR) | (1 << LCD_RD) | (1 << LCD_CS) | (1 << LCD_REST); //方向输出
}
void LCD_Writ_Bus(char VH, char VL) //并行数据写入函数
{
LCD_DataPORT_H = VH;
LCD_DataPORT_L = VL;
WR_0;
WR_1;
}
#else //条件编译-8位数据模式
void LCD_Writ_Bus(char VH, char VL) //并行数据写入函数
{
LCD_DataPORT_H = VH;
WR_0;
WR_1;
LCD_DataPORT_H = VL;
WR_0;
WR_1;
}
#endif
void LCD_Write_Com(char VH,char VL) //发送命令
{
RS_0;
LCD_Writ_Bus(VH, VL);
}
void LCD_Write_Data(char VH, char VL) //发送数据
{
RS_1;
LCD_Writ_Bus(VH, VL);
}
void Address_set(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
{
LCD_Write_Com(0x00, 0x20); LCD_Write_Data(x1 >> 8, x1); //设置X坐标位置
LCD_Write_Com(0x00, 0x21); LCD_Write_Data(y1 >> 8, y1); //设置Y坐标位置
LCD_Write_Com(0x00, 0x50); LCD_Write_Data(x1 >> 8, x1); //开始X
LCD_Write_Com(0x00, 0x52); LCD_Write_Data(y1 >> 8, y1); //开始Y
LCD_Write_Com(0x00, 0x51); LCD_Write_Data(x2 >> 8, x2); //结束X
LCD_Write_Com(0x00, 0x53); LCD_Write_Data(y2 >> 8, y2); //结束Y
LCD_Write_Com(0x00, 0x22);
}
void LCD_Init(void)
{
REST_1;
_delay_ms(busy_time);
REST_0;
_delay_ms(busy_time);
REST_1;
CS_1;
RD_1;
WR_1;
_delay_ms(busy_time);
CS_0; //打开片选使能
//************* Start Initial Sequence **********//
LCD_Write_Com(0x00,0xE5); LCD_Write_Data(0x78,0xF0); // set SRAM internal timing
LCD_Write_Com(0x00,0x01); LCD_Write_Data(0x01,0x00); // set SS and SM bit
LCD_Write_Com(0x00,0x02); LCD_Write_Data(0x07,0x00); // set 1 line inversion
LCD_Write_Com(0x00,0x03); LCD_Write_Data(0x10,0x30); // set GRAM write direction and BGR=1.
LCD_Write_Com(0x00,0x04); LCD_Write_Data(0x00,0x00); // Resize register
LCD_Write_Com(0x00,0x08); LCD_Write_Data(0x02,0x07); // set the back porch and front porch
LCD_Write_Com(0x00,0x09); LCD_Write_Data(0x00,0x00); // set non-display area refresh cycle ISC
LCD_Write_Com(0x00,0x0A); LCD_Write_Data(0x00,0x00); // FMARK function
LCD_Write_Com(0x00,0x0C); LCD_Write_Data(0x00,0x00); // RGB interface setting
LCD_Write_Com(0x00,0x0D); LCD_Write_Data(0x00,0x00); // Frame marker Position
LCD_Write_Com(0x00,0x0F); LCD_Write_Data(0x00,0x00); // RGB interface polarity
//*************Power On sequence ****************//
LCD_Write_Com(0x00,0x10); LCD_Write_Data(0x00,0x00); // SAP, BT, AP, DSTB, SLP, STB
LCD_Write_Com(0x00,0x11); LCD_Write_Data(0x00,0x07); // DC1, DC0, VC
LCD_Write_Com(0x00,0x12); LCD_Write_Data(0x00,0x00); // VREG1OUT voltage
LCD_Write_Com(0x00,0x13); LCD_Write_Data(0x00,0x00); // VDV for VCOM amplitude
LCD_Write_Com(0x00,0x07); LCD_Write_Data(0x00,0x01);
_delay_ms(50); // Dis-charge capacitor power voltage
LCD_Write_Com(0x00,0x10); LCD_Write_Data(0x10,0x90); // 1490//SAP, BT, AP, DSTB, SLP, STB
LCD_Write_Com(0x00,0x11); LCD_Write_Data(0x02,0x27); // DC1, DC0, VC
_delay_ms(50); // Delay 50ms
LCD_Write_Com(0x00,0x12); LCD_Write_Data(0x00,0x1F); //001C// Internal reference voltage= Vci;
_delay_ms(50); // Delay 50ms
LCD_Write_Com(0x00,0x13); LCD_Write_Data(0x15,0x00); //0x1000//1400 Set VDV for VCOM amplitude1A00
LCD_Write_Com(0x00,0x29); LCD_Write_Data(0x00,0x27); //0x0012 //001aSet VCM for VCOMH//0x00250034
LCD_Write_Com(0x00,0x2B); LCD_Write_Data(0x00,0x0D); // Set Frame Rate 000C
_delay_ms(50); // Delay 50ms
LCD_Write_Com(0x00,0x20); LCD_Write_Data(0x00,0x00); // GRAM horizontal Address
LCD_Write_Com(0x00,0x21); LCD_Write_Data(0x00,0x00); // GRAM Vertical Address
// ----------- Adjust the Gamma Curve ----------//
LCD_Write_Com(0x00,0x30); LCD_Write_Data(0x00,0x00);
LCD_Write_Com(0x00,0x31); LCD_Write_Data(0x07,0x07);
LCD_Write_Com(0x00,0x32); LCD_Write_Data(0x03,0x07);
LCD_Write_Com(0x00,0x35); LCD_Write_Data(0x02,0x00);
LCD_Write_Com(0x00,0x36); LCD_Write_Data(0x00,0x08);//0207
LCD_Write_Com(0x00,0x37); LCD_Write_Data(0x00,0x04);//0306
LCD_Write_Com(0x00,0x38); LCD_Write_Data(0x00,0x00);//0102
LCD_Write_Com(0x00,0x39); LCD_Write_Data(0x07,0x07);//0707
LCD_Write_Com(0x00,0x3C); LCD_Write_Data(0x00,0x02);//0702
LCD_Write_Com(0x00,0x3D); LCD_Write_Data(0x1D,0x04);//1604
//------------------ Set GRAM area ---------------//
LCD_Write_Com(0x00,0x50); LCD_Write_Data(0x00,0x00); // Horizontal GRAM Start Address
LCD_Write_Com(0x00,0x51); LCD_Write_Data(0x00,0xEF); // Horizontal GRAM End Address
LCD_Write_Com(0x00,0x52); LCD_Write_Data(0x00,0x00); // Vertical GRAM Start Address
LCD_Write_Com(0x00,0x53); LCD_Write_Data(0x01,0x3F); // Vertical GRAM Start Address
LCD_Write_Com(0x00,0x60); LCD_Write_Data(0xA7,0x00); // Gate Scan Line
LCD_Write_Com(0x00,0x61); LCD_Write_Data(0x00,0x01); // NDL,VLE, REV
LCD_Write_Com(0x00,0x6A); LCD_Write_Data(0x00,0x00); // set scrolling line
//-------------- Partial Display Control ---------//
LCD_Write_Com(0x00,0x80); LCD_Write_Data(0x00,0x00);
LCD_Write_Com(0x00,0x81); LCD_Write_Data(0x00,0x00);
LCD_Write_Com(0x00,0x82); LCD_Write_Data(0x00,0x00);
LCD_Write_Com(0x00,0x83); LCD_Write_Data(0x00,0x00);
LCD_Write_Com(0x00,0x84); LCD_Write_Data(0x00,0x00);
LCD_Write_Com(0x00,0x85); LCD_Write_Data(0x00,0x00);
//-------------- Panel Control -------------------//
LCD_Write_Com(0x00,0x90); LCD_Write_Data(0x00,0x10);
LCD_Write_Com(0x00,0x92); LCD_Write_Data(0x06,0x00);
LCD_Write_Com(0x00,0x07); LCD_Write_Data(0x01,0x33); // 262K color and display ON
CS_1; //关闭片选使能
}
void Pant(char VH, char VL)
{
int i, j;
CS_0; //打开片选使能
Address_set(0,0,240,320);
for(i = 0; i < 320; i++)
{
for (j = 0; j < 240; j++)
{
LCD_Write_Data(VH, VL);
}
}
CS_1; //关闭片选使能
}
int main(void)
{
LCD_Port_Init(); //TFT端口初始化
LCD_Init(); //TFT初始化
Pant(0xff, 0xff); //TFT清屏
while(1)
{
Pant(0xF8, 0x00); //红色
_delay_ms(2000);
Pant(0x07, 0xE0); //红色
_delay_ms(2000);
Pant(0x00, 0x1F); //红色
_delay_ms(2000);
}
} 如果用PORTC了别忘了禁用JTAG,好多人卡在这里了。
坛子里的程序大把大把,能搜到。改一下端口基本都好使 这是我以前做过的。初始化成功后就是定义区域然后写像素了。基本就是这些。
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587232U0YT8U.jpg
(原文件名:ourdev_575061.jpg) 有没有ILI9325的中文资料,网上搜到的全都是英文的,看不懂,我主要是想看懂初始化tft的细节,深入研究一下 回复【1楼】zywh
-----------------------------------------------------------------------
做出来了,太感谢你了./emotion/em020.gif ./emotion/em020.gif 这些资料没多少是英文的。你找一些关键的就行了,比如扫描方向等,看图就明白了 找到了一部分中文翻译,剩下的麻烦大家再找下
点击此处下载 ourdev_587362FP3A29.rar(文件大小:2.33M) (原文件名:ILI9325.rar) mark 回复【3楼】turf456
-----------------------------------------------------------------------
好像你的屏幕跟我的是一样的哦。。。是不是都是淘宝买的58块钱的啊???
请问显示一张图片。。。单片机的内存太小。。。是不是得通过sd卡读取啊???? LZ做的不错,但是显示那样的图片就是大错特错了!至少是苍老师的才行啊! 回复【9楼】zywh
-----------------------------------------------------------------------
我买的是35元的屏,2.4寸,只是一个单屏,没带触摸屏控制芯片和tf卡插口,我用的是mega16芯片控制,ram为1k字节,一幅240X320大小的图片大小为240*320*2=150k字节(一个像素为两个字节),远远不够显示一幅图片,所以必需要用tf卡,我这几天正在研究用tf卡显示图片,研究了几天了,还挺麻烦,不过在屏幕上显示各种颜色还是挺简单的,你可以先试试 我用的M128做的读SD卡里的二进制文件显示,好像坛子里有做直接读bmp文件的 文件系统,可以参阅 回复【9楼】zywh
回复【3楼】turf456
-----------------------------------------------------------------------
好像你的屏幕跟我的是一样的哦。。。是不是都是淘宝买的58块钱的啊???
请问显示一张图片。。。单片机的内存太小。。。是不是得通过sd卡读取啊????
-----------------------------------------------------------------------
必须用sd卡,一张16位的320*240的bmp图片时160K。 回复【11楼】e1909
回复【9楼】zywh
-----------------------------------------------------------------------
我买的是35元的屏,2.4寸,只是一个单屏,没带触摸屏控制芯片和tf卡插口,我用的是mega16芯片控制,ram为1k字节,一幅240x320大小的图片大小为240*320*2=150k字节(一个像素为两个字节),远远不够显示一幅图片,所以必需要用tf卡,我这几天正在研究用tf卡显示图片,研究了几天了,还挺麻烦,不过在屏幕上显示各种颜色还是挺简单的,你可以先试试
-----------------------------------------------------------------------
加油吧,我研究SD卡都快哭了才成功的。
还有fat32文件系统,看懂容易写起来超级费脑细胞 回复【14楼】turf456
-----------------------------------------------------------------------
正在看振南的sd卡的视频教程。。。呵呵。。。。我也要加油学习咯。。。哈哈。。。 mark mark 天了,太难了,我也想学这个,但现在还一头乌水。。。。只看明白了你作品中的图片!! MARK
看到3楼,我有些想吐了 记录下 谢谢,学习了,原来是我的CS信号有问题! mark 回复【21楼】laohuang868
-----------------------------------------------------------------------
你怎么看出来哪个信号有问题的? mark ILI9325+M16+IAR用起来很爽的 参照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
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, 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, DC0, VC
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 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 发现了一个问题,开窗口的时候结束X不是240,而应该是239,结束Y不是320,而应该是319,当然窗口开成整屏的时候不会出错,因为屏幕本来就没有那么大。我用点阵显示8X16字符的时候,开窗口的时候开始X为0,开始Y为0,结束X为8,结束Y为16,结果显示不对,卡了我好久,最后才发觉应该是(0,0,7,15)。 请问8位控制怎么控制,
页:
[1]