📄 lcd.c
字号:
#include "lcd.h"
#include <string.h>
extern unsigned char const ASCII[95][16];
extern unsigned char const HZK16[6768][32];
extern unsigned char const Image1[512];
extern unsigned char const Image2[512];
unsigned short color[8]={0x0000,0x001f,0x07e0,0x07ff,0xf800,0xf81f,0xffe0,0xffff};
void delay_Nms(unsigned short t)
{
unsigned short i;
while(t--)
{
i=4000;
while(i--);}
}
void delay_Nus(unsigned short t)
{
unsigned short i;
while(t--)
{
i=30;
while(i--);}
}
void LCD_WriteData(unsigned short val)
{
IO0CLR = LCD_DATA;
IO0SET = val&0xFF00;
LCD_WR_L;
LCD_WR_H;
IO0CLR = LCD_DATA;
IO0SET = (val&0xFF)<<8;
LCD_WR_L;
LCD_WR_H;
}
void LCD_WriteReg(unsigned char index,unsigned short val)
{
LCD_CS_L;
LCD_RS_L;
IO0CLR = LCD_DATA;
LCD_WR_L;
LCD_WR_H;
IO0SET = index<<8;
LCD_WR_L;
LCD_WR_H;
LCD_RS_H;
IO0CLR = LCD_DATA;
IO0SET = val&0xFF00;
LCD_WR_L;
LCD_WR_H;
IO0CLR = LCD_DATA;
IO0SET = (val&0xFF)<<8;
LCD_WR_L;
LCD_WR_H;
LCD_CS_H;
}
void Lcd_Init()
{
PINSEL2 &= ~(1<<3);
LCD_CS_SEL;
LCD_RST_SEL;
LCD_LED_SEL;
LCD_DATA_SEL;
LCD_WR_OUT;
LCD_RD_OUT;
LCD_RS_OUT;
LCD_RST_OUT;
LCD_CS_OUT;
LCD_LED_OUT;
LCD_DATA_OUT;
LCD_RD_H;
LCD_LED_L;
LCD_RST_L;
delay_Nms(30);
LCD_RST_H;
delay_Nms(30);
delay_Nms(5); // delay 50 ms
/* Start Initial Sequence ----------------------------------------------------*/
LCD_WriteReg(229, 0x8000); /* Set the internal vcore voltage */
LCD_WriteReg(0, 0x0001); /* Start internal OSC. */
LCD_WriteReg(1, 0x0100); /* set SS and SM bit */
LCD_WriteReg(2, 0x0700); /* set 1 line inversion */
LCD_WriteReg(3, 0x1030); /* set GRAM write direction and BGR=1. */
LCD_WriteReg(4, 0x0000); /* Resize register */
LCD_WriteReg(8, 0x0202); /* set the back porch and front porch */
LCD_WriteReg(9, 0x0000); /* set non-display area refresh cycle ISC[3:0] */
LCD_WriteReg(10, 0x0000); /* FMARK function */
LCD_WriteReg(12, 0x0000); /* RGB interface setting */
LCD_WriteReg(13, 0x0000); /* Frame marker Position */
LCD_WriteReg(15, 0x0000); /* RGB interface polarity */
LCD_WriteReg(0x2b,0x0010);
/* Power On sequence ---------------------------------------------------------*/
LCD_WriteReg(16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
LCD_WriteReg(18, 0x0000); /* VREG1OUT voltage */
LCD_WriteReg(19, 0x0000); /* VDV[4:0] for VCOM amplitude */
delay_Nms(20); /* Dis-charge capacitor power voltage (200ms) */
LCD_WriteReg(16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */
delay_Nms(5); /* Delay 50 ms */
LCD_WriteReg(18, 0x0139); /* VREG1OUT voltage */
delay_Nms(5); /* Delay 50 ms */
LCD_WriteReg(19, 0x1d00); /* VDV[4:0] for VCOM amplitude */
LCD_WriteReg(41, 0x0013); /* VCM[4:0] for VCOMH */
delay_Nms(5); /* Delay 50 ms */
LCD_WriteReg(32, 0x0000); /* GRAM horizontal Address */
LCD_WriteReg(33, 0x0000); /* GRAM Vertical Address */
/* Adjust the Gamma Curve ----------------------------------------------------*/
LCD_WriteReg(48, 0x0006);
LCD_WriteReg(49, 0x0101);
LCD_WriteReg(50, 0x0003);
LCD_WriteReg(53, 0x0106);
LCD_WriteReg(54, 0x0b02);
LCD_WriteReg(55, 0x0302);
LCD_WriteReg(56, 0x0707);
LCD_WriteReg(57, 0x0007);
LCD_WriteReg(60, 0x0600);
LCD_WriteReg(61, 0x020b);
/* Set GRAM area -------------------------------------------------------------*/
LCD_WriteReg(80, 0x0000); /* Horizontal GRAM Start Address */
LCD_WriteReg(81, 0x00EF); /* Horizontal GRAM End Address */
LCD_WriteReg(82, 0x0000); /* Vertical GRAM Start Address */
LCD_WriteReg(83, 0x013F); /* Vertical GRAM End Address */
LCD_WriteReg(96, 0x2700); /* Gate Scan Line */
LCD_WriteReg(97, 0x0001); /* NDL,VLE, REV */
LCD_WriteReg(106, 0x0000); /* set scrolling line */
/* Partial Display Control ---------------------------------------------------*/
LCD_WriteReg(128, 0x0000);
LCD_WriteReg(129, 0x0000);
LCD_WriteReg(130, 0x0000);
LCD_WriteReg(131, 0x0000);
LCD_WriteReg(132, 0x0000);
LCD_WriteReg(133, 0x0000);
/* Panel Control -------------------------------------------------------------*/
LCD_WriteReg(144, 0x0010);
LCD_WriteReg(146, 0x0000);
LCD_WriteReg(147, 0x0003);
LCD_WriteReg(149, 0x0110);
LCD_WriteReg(151, 0x0000);
LCD_WriteReg(152, 0x0000);
/* Set GRAM write direction and BGR = 1 */
/* I/D=01 (Horizontal : increment, Vertical : decrement) */
/* AM=1 (address is updated in vertical writing direction) */
//LCD_WriteReg(3, 0x1018);
LCD_WriteReg(7, 0x0173); /* 262K color and display ON */
}
void Lcd_Write_Start()
{
LCD_CS_L;
LCD_RS_L;
IO0CLR = LCD_DATA;
LCD_WR_L;
LCD_WR_H;
IO0SET = 0x22<<8;
LCD_WR_L;
LCD_WR_H;
LCD_RS_H;
}
void Lcd_Write_End()
{
LCD_CS_H;
}
void Lcd_putchar(unsigned short x,unsigned short y,unsigned short color,char *ch)
{
unsigned char i,j,temp;
LCD_WriteReg(0x20, x);
for(i=0;i<16;i++)
{
LCD_WriteReg(0x21, y+i);
Lcd_Write_Start();
temp = ASCII[*ch-0x20][i];
for(j=0;j<8;j++)
{
if(temp & 0x01) LCD_WriteData(color);
else LCD_WriteData(0);
temp>>=1;
}
}
Lcd_Write_End();
}
void Lcd_putstr(unsigned short x,unsigned short y,unsigned short color,char *str)
{
unsigned char i=0;
while(*str)
{
Lcd_putchar(x+i*8,y,color,str);
i++;
str++;
}
}
void Lcd_FillBlack(unsigned short color)
{
unsigned short i,j;
LCD_WriteReg(0x20, 0);
LCD_WriteReg(0x21, 0);
LCD_WriteReg(0x50,0);
LCD_WriteReg(0x51,0x00ef);
LCD_WriteReg(0x52,0);
LCD_WriteReg(0x53,0x013f);
Lcd_Write_Start();
for(i=0;i<320;i++)
for(j=0;j<240;j++)
{
LCD_WriteData(color);
}
Lcd_Write_End();
}
void Lcd_image(unsigned short x,unsigned short y,unsigned char p)
{
unsigned char i,j;
LCD_WriteReg(0x20, x);
for(i=0;i<16;i++)
{
LCD_WriteReg(0x21, y+i);
Lcd_Write_Start();
if(p==1)
{
for(j=0;j<16;j++)
{
IO0CLR = LCD_DATA;
IO0SET = Image1[i*32+j*2+1]<<8;
LCD_WR_L;
LCD_WR_H;
IO0CLR = LCD_DATA;
IO0SET =Image1[i*32+j*2];
LCD_WR_L;
LCD_WR_H;
}
}
else
{
for(j=0;j<16;j++)
{
IO0CLR = LCD_DATA;
IO0SET = Image2[i*32+j*2+1]<<8;
LCD_WR_L;
LCD_WR_H;
IO0CLR = LCD_DATA;
IO0SET =Image2[i*32+j*2];
LCD_WR_L;
LCD_WR_H;
}
}
}
Lcd_Write_End();
}
void Lcd_PutHz16(unsigned short x,unsigned short y,unsigned short color,char *GB2312)
{
unsigned short temp;
unsigned char i,j,tmp;
LCD_WriteReg(0x20, x);
temp = (GB2312[0] - 0xB0) * 94 + (GB2312[1] - 0xA0) - 1;
for(i = 0; i < 16; i++)
{
LCD_WriteReg(0x21, y+i);
Lcd_Write_Start();
tmp = HZK16[temp][i*2];
for(j = 0; j < 8; j++)
{
if(tmp&0x01) LCD_WriteData(color);
else LCD_WriteData(0);
tmp>>=1;
}
tmp = HZK16[temp][i*2+1];
for(j = 0; j < 8; j++)
{
if(tmp&0x01) LCD_WriteData(color);
else LCD_WriteData(0);
tmp>>=1;
}
Lcd_Write_End();
}
}
unsigned short Lcd_Print(unsigned short x,unsigned short y,unsigned short color,char *c,unsigned char size)
{
unsigned int i;
unsigned char temp;
if(size)temp=size;
else temp=strlen((char *)c);
for(i = 0; i < temp; i++)
{
if(*(c+i) < 0xA0 && !(*(c+i)==' '))
{
Lcd_putchar(x,y,color,c+i);
x+=8;
}
else if(*(c+i) >= 0xA0)
{
Lcd_PutHz16(x,y,color,c+i);
i++;
x+=16;
}
}
return x;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -