这是彩屏的程序:
/**********************************************************
file: lcd.c
Author: gguoqing
**********************************************************/
#include "lcd.h"
#include "Font8x16.h"
#include "Chinese.h"
#define FREQ 8 //芯片工作频率
uint colors[]=
{
0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff
};
/**********************************************************
N*ms延时函数
**********************************************************/
void delayms(uint n)
{
uint i=0 ;
for (i=0 ;i
_delay_loop_2(250*FREQ) ;
}
/**********************************************************
y*us延时函数
**********************************************************/
void delayus(uint y)
{
_delay_loop_2(2*y);
}
/**********************************************************
写命令与数据子函数 (16位)
0: command 1: data
**********************************************************/
void LCD_Write(uchar type, uint value)
{
if(type == 0)
LCD_RS_L;
else
LCD_RS_H;
LCD_WR_L;
LCD_DATA = (uchar)((value>>8)&0xff);
LCD_WR_H;
LCD_WR_L;
LCD_DATA = (uchar)(value&0xff);
LCD_WR_H;
}
/**********************************************************
写8位数据子函数
**********************************************************/
void LCD_Write_Data8(uchar value)
{
LCD_CS_L;
LCD_RS_H;
LCD_DATA = value;
LCD_WR_L;
LCD_WR_H;
LCD_CS_H;
}
/**********************************************************
写16位数据子函数
**********************************************************/
void LCD_Wirte_Data16(uint value)
{
LCD_CS_L;
LCD_RS_H;
LCD_WR_L;
LCD_DATA = (uchar)((value>>8)&0xff);
LCD_WR_H;
LCD_WR_L;
LCD_DATA = (uchar)(value&0xff);
LCD_WR_H;
LCD_CS_H;
}
/*********************************************************
写寄存器子函数
**********************************************************/
void Reg_Write(uint reg,uint value)
{
LCD_Write(TYPE_LCD_COMMAND,reg);
LCD_Write(TYPE_LCD_DATA,value);
}
/**********************************************************
设置显示窗口子函数
**********************************************************/
void LCD_SetRamAddr(uint xStart, uint xEnd, uint yStart, uint yEnd)
{
uint VerPos,HorPos,StartAddr;
LCD_CS_L;
HorPos = (uint)((xEnd<<8)|xStart);
VerPos = (uint)((yEnd<<8)|yStart );
StartAddr = (uint)((yStart<<8)|xStart);
Reg_Write(0x16, HorPos);
Reg_Write(0x17, VerPos);
Reg_Write(0x21, StartAddr); // 0x21
LCD_Write(TYPE_LCD_COMMAND,0x22); // 0x22
LCD_CS_H;
}
/**********************************************************
LCD初始化子函数
**********************************************************/
void LCD_init(void)
{
LCD_RST_L;
delayms(20);
LCD_RST_H;
delayms(20);
LCD_CS_H;
LCD_RS_L;
LCD_RD_H;
LCD_WR_H;
LCD_CS_L;
delayms(10);
Reg_Write(0x0007,0x0100); // Display control GON=0,DTE=0,D1=0,D0=0,
Reg_Write(0x000d,0x0000); // Power control 4 PON=0
Reg_Write(0x0000,0x0001); // OSC Start
delayms(20);
Reg_Write(0x000e,0x2000); // Power control 5 VCOMG=1
Reg_Write(0x000c,0x0001); // Power contorl 3 VCI=VDD , VCI1=VCI*1
Reg_Write(0x000d,0x0003); // Power control 4 éè?¨VLCD
Reg_Write(0x0004,0x0000); // Power control 2 CAD=0
Reg_Write(0x000d,0x0903); // Power control 4 ?ùéè?¨ VREG2OUT=-5.5*VCI
Reg_Write(0x0003,0x0414); // Power Control 1
Reg_Write(0x000e,0x1212); // Power control 5 éè?¨Vcom oí Vdv
delayms(50); // VCOMH(3V~VREG1OUT) , VCOML(0.5~1V)
Reg_Write(0x000d,0x031d); // 0x318 // Power control 4 PON=1 VRL3~VRL0=1001 -->VREG2OUT=-5.5*VCI
// VRH3~VRH0=0011 -->VREG1OUT=1.65*REGP=4.62V , REGP=VCI1
Reg_Write(0x0001,0x0113); // Driver output contorl SM,GS,SS NL4~NL0=10011(1/176Duty)
Reg_Write(0x0002,0x0700); // LCD-Driving-waveform control FLD1 FLD0 B/C EOR NW5~NW0=001101
Reg_Write(0x0005,0x1030); // Entry Mode RGB MODE , I/D1 I/D0=11
Reg_Write(0x0006,0x0000);
Reg_Write(0x000b,0x4001);
Reg_Write(0x000f,0x0000); // GATE SCAN POSITION G17 Start scanf G17->G176
Reg_Write(0x0011,0x0000);
Reg_Write(0x0014,0x9F00);
Reg_Write(0x0015,0x0000);
Reg_Write(0x0016,0x7F00); // Horizontal window address 128
Reg_Write(0x0017,0x9F00); // Vertical window Address 160
Reg_Write(0x0021,0x0000);
Reg_Write(0x0030,0x0000);
Reg_Write(0x0031,0x0204);
Reg_Write(0x0032,0x0302);
Reg_Write(0x0033,0x0000);
Reg_Write(0x0034,0x0504);
Reg_Write(0x0035,0x0405);
Reg_Write(0x0036,0x0707);
Reg_Write(0x0037,0x0100);
Reg_Write(0x003a,0x1506);
Reg_Write(0x003b,0x000f);
Reg_Write(0x0007,0x0005);
Reg_Write(0x0007,0x0025);
Reg_Write(0x0007,0x0027);
Reg_Write(0x0007,0x0137);
LCD_Write(TYPE_LCD_COMMAND,0x22); // 0x22
delayms(10);
LCD_CS_H;
}
/**********************************************************
图片显示子函数
**********************************************************/
void pic_play(uint xStart, uint xEnd, uint yStart, uint yEnd, const uchar *P)
{
uint num,m;
uint dx,dy;
uchar temp;
dx = (xEnd+1)-xStart; //计算写入数据的总数
dy = (yEnd+1)-yStart;
num = dx*dy<<1;
LCD_SetRamAddr(xStart,xEnd,yStart,yEnd) ;
for(m=0; m
{
temp = (pgm_read_byte(P+m));
LCD_Write_Data8(temp);
}
}
/**********************************************************
清屏子函数
**********************************************************/
void LCD_clear(uchar n)
{
uint num;
LCD_SetRamAddr(0,127, 0,159);
for(num=20480;num>0;num--) //160*128=20480
{
LCD_Wirte_Data16(colors[n]);
}
}
/**********************************************************
彩屏显示子函数
**********************************************************/
void LCD_color(void)
{
uint num;
uchar n;
for(n=0;n<8;n++)
{
LCD_SetRamAddr(0,127, 0,159);
for(num=20480;num>0;num--) //160*128=20480
{
LCD_Wirte_Data16(colors[n]);
}
delayms(1000);
}
}
/**********************************************************
水平彩条显示子函数
**********************************************************/
void LCD_color_H(void)
{
uint num;
uchar n;
LCD_SetRamAddr(0,127, 0,159);
for(n=0;n<8;n++)
{
for(num=20*128;num>0;num--)
{
LCD_Wirte_Data16(colors[n]);
}
}
}
/**********************************************************
垂直彩条显示子函数
**********************************************************/
void LCD_color_V(void)
{
uint num;
uint n,x1,x2;
x1 = 0;
x2 = 16;
for(n=0;n<8;n++)
{
LCD_SetRamAddr(x1, x2-1, 0,159);
x1 = x2;
x2 = x2+16;
for(num=16*160;num>0;num--)
{
LCD_Wirte_Data16(colors[n]);
}
}
}
/**********************************************************
字符显示子函数
**********************************************************/
void LCD_ShowChar(uchar x,uchar y,uint color,uchar ch)
{
uchar temp;
uchar pos,t;
uchar CHAR_W,CHAR_H;
CHAR_W = 8; //8*16
CHAR_H = 16;
if(x>(LCD_SIZE_X-CHAR_W)||y>(LCD_SIZE_Y-CHAR_H))
return;
LCD_SetRamAddr(x, x+CHAR_W-1, y,y+CHAR_H-1);
ch = ch-32; //得到偏移后的值
for(pos=0;pos
{
temp= pgm_read_byte(&Font8x16[ch][pos]);
for(t=0;t
{
if(temp&0x80)
LCD_Wirte_Data16(color); //textcolor
else
LCD_Wirte_Data16(0xffff); //backcolor
temp<<=1;
}
}
}
/**********************************************************
显示字符串子函数
x,y:起点坐标
*p:字符串起始地址
**********************************************************/
void LCD_ShowString(uchar x,uchar y,uint color,char *p)
{
while(*p!='\0')
{
LCD_ShowChar(x,y,color,*p);
x+=8;
p++;
}
}
/**********************************************************
写汉字子函数
**********************************************************/
void ChineseChar(uint x,uint y,int size,uint color,char c)
{
int e=0,i,j;
int ed;
uint ncols = 0;
uint nrows = 0;
uint nbytes = 0;
uchar *pfont;
uchar *pchar;
uchar *fonttable[]={(uchar *)hz12,(uchar *)hz16,(uchar *)hz24};
pfont=(uchar *)fonttable[size];
if(size==0)
{
ncols =12-1;
nrows =12-1;
nbytes =24;
}
else
if(size==1)
{
ncols =16-1;
nrows =16-1;
nbytes =32;
}
else
if(size==2)
{
ncols =24-1;
nrows =24-1;
nbytes =72;
}
pchar=pfont + (nbytes*(c-1));
LCD_SetRamAddr(x, x+nrows, y,y+ncols);
for(i=0;i
{
ed=*pchar++;
if(size==0)
{
if(i%2==0)
e=8;
else
e=4;
}
else
e=8;
for(j=0;j
if((ed>>j)&0x01)
{
LCD_Wirte_Data16(color); //textcolor
}
else
{
LCD_Wirte_Data16(0xffff); //backcolor
}
}
}
/*********************************************************/