📄 lcddrv.c
字号:
/***************************************************************
* 文件名:lcd.c
* 功能:640*480液晶驱动(QPYD-04驱动模块),用GPIO实现
* 硬件连接:D0~D7 <--> P2.16~P2.23
// /RD <--> P0.22
// /WR <--> P0.21
// /CS <--> P0.19
// RS <--> P0.17
***************************************************************/
#include "config.h"
static uint8 DisBuf[LCD_Y][LCD_X];
void InitLCD(void) {
uint8 i;
uint16 j;
IO0DIR = (LCD_RD | LCD_WR | LCD_CS | LCD_RS);
IO0SET = LCD_RS;
IO0SET = LCD_WR;
IO0SET = LCD_CS;
IO0SET = LCD_RD;
IO2DIR = LCD_DATA;
for(j = 0; j < LCD_Y; j++) {
for(i = 0; i < LCD_X; i++) {
DisBuf[j][i] = 0xFF;
}
}
Invalidate();
}
void Invalidate() {
uint8 i;
uint16 j;
/* 写低64K区地址 */
LCD_I(0x08);
LCD_D(0x00);
LCD_I(0x09);
LCD_D(0x00);
/* 写低64K数据 */
LCD_I(0x0A);
for(j = 0; j < LCD_Y; j++) {
for(i = 0; i < LCD_X; i++) {
LCD_D(DisBuf[j][i]);
}
}
}
void LCD_I(uint8 I) {
/* 将数据移到数据口 */
IO2PIN = I << 16;
/* 选择指令寄存器 */
IO0CLR = LCD_RS;
IO0CLR = LCD_CS;
IO0CLR = LCD_WR;
IO0SET = LCD_WR;
IO0SET = LCD_CS;
}
void LCD_D(uint8 D) {
/* 将数据移到数据口 */
IO2PIN = D << 16;
/* 选择数据寄存器 */
IO0SET = LCD_RS;
IO0CLR = LCD_CS;
IO0CLR = LCD_WR;
IO0SET = LCD_WR;
IO0SET = LCD_CS;
}
uint8 LCD_R(void) {
uint8 temp;
IO0CLR = LCD_RS;
IO0CLR = LCD_RD;
IO0CLR = LCD_CS;
temp = (uint8)((IO2PIN & LCD_DATA) >> 16);
IO0SET = LCD_CS;
IO0SET = LCD_WR;
return temp;
}
void InvalidateRect(uint16 l,uint16 t,uint16 r,uint16 b)
{
uint8 i,k,n;
uint16 j;
uint32 temp=0;
if(l>r){i=l;l=r;r=i;}
if(t>b){j=t;t=b;b=j;}
if(r>=MAX_X || b>=MAX_Y) return;
/* l*3/8为(l,t)所在字节,k为小于它的3的倍数,
这样保证在边缘提取完整像素点,同理n为大于r*3/8的三的倍数 */
i=l*3/8;i-=i%3;
k=i;
n=r*3/8;n+=3-n%3;
for(j=t;j<=b;j++)
{
temp=j*(LCD_X)+i;
if(temp<0x10000)
//写低64K区
{
LCD_I(0x08);
LCD_D((uint8)temp);
LCD_I(0x09);
LCD_D((uint8)(temp>>8));
LCD_I(0x0A);
}
else
//写高
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -