📄 lcd.c
字号:
#include <S3C44B0X.H>
#include <string.h>
#define Lcd_Hpixel (640)
#define Lcd_Vpixel (240)
#define testb(a,b) ((a)&(1<<(b)))
unsigned int LcdBuffer[240][640/4];
extern unsigned char const HZK16[6768][32];
extern unsigned char const ASCII[69][16];
/*LCD初始化*/
void Lcd_Initial(void)
{
pPIO->PCONC = 0x0f01ff54;
pPIO->PCOND = 0xaaaa;
pPIO->PUPC &=~0x00000010;
pLCD->LCDCON1 = (0x0)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12);
pLCD->LCDCON2 = (240-1)|((640*3/8-1)<<10)|(800<<21);
// pLCD->LCDCON3 = 0x00000001;
pLCD->LCDSADDR1 = (0x3<<27)|(((unsigned int)LcdBuffer>>22)<<21)|(((unsigned int)LcdBuffer>>1)&0x1fffff);
pLCD->LCDSADDR2 = ((((unsigned int)LcdBuffer+(640*240))>>1))|(13<<21)&0x1fffff;
pLCD->LCDSADDR3 = (640/2)|(0<<9);
pLCD->REDLUT = 0xfdb96420;
pLCD->GREENLUT = 0xfdb96420;
pLCD->BLUELUT = 0xfb40;
pLCD->DITHMODE = 0x0;
pLCD->DP1_2 = 0xa5a5;
pLCD->DP4_7 = 0xba5da65;
pLCD->DP3_5 = 0xa5a5f;
pLCD->DP2_3 = 0xd6b;
pLCD->DP5_7 = 0xeb7b5ed;
pLCD->DP3_4 = 0x7dbe;
pLCD->DP4_5 = 0x7ebdf;
pLCD->DP6_7 = 0x7fdfdfe;
pPIO->PDATC &=~0x00000100;
pLCD->LCDCON1 = (0x1)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12);
}
/*填充整 屏 */
void Lcd_DrawBackground(unsigned char RGB)
{
unsigned int i;
unsigned int *pBuf = (unsigned int *)LcdBuffer;
for(i=0;i<(640*240/4);i++)
{
*pBuf++=(RGB<<24)+(RGB<<16)+(RGB<<8)+RGB;
}
}
/*画点 */
void Lcd_PutPixel(unsigned int x, unsigned int y,unsigned char RGB)
{
unsigned int mask[4]={0x00ffffff,0xff00ffff,0xffff00ff,0xffffff00};
if(x > (Lcd_Hpixel - 1))
{return;}
if(y > (Lcd_Vpixel - 1))
{return;}
LcdBuffer[y][x/4]=(LcdBuffer[y][x/4]&mask[x%4])|((unsigned int)RGB<<(3-x%4)*8);
}
/*画填充矩形*/
void Lcd_DrawBox(unsigned int H_Offset,unsigned int V_Offset,unsigned int H_Size,unsigned int V_Size,unsigned char RGB)
{
unsigned int i,j;
for(i=0;i<V_Size;i++)
{
for(j=0;j<H_Size;j++)
{
Lcd_PutPixel(H_Offset+j,V_Offset+i,RGB);
}
}
}
/*画水平线 */
void Lcd_DrawHline(unsigned int x0,unsigned int y0,unsigned int x1,unsigned char RGB)
{
unsigned int temp;
if(x0>x1)
{
temp = x0;
x0 = x1;
x1 = temp;
}
do
{
Lcd_PutPixel(x0,y0,RGB);
x0++;
}while(x1>=x0);
}
/*画垂直线 */
void Lcd_DrawVline(unsigned int x0,unsigned int y0,unsigned int y1,unsigned char RGB)
{
unsigned int temp;
if(y0>y1)
{
temp = y0;
y0 = y1;
y1 = temp;
}
do
{
Lcd_PutPixel(x0,y0,RGB);
y0++;
}while(y1>=y0);
}
/*画任意线 */
void Lcd_DrawLine(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,unsigned char RGB)
{
signed int dx;
signed int dy;
signed char dx_sym;
signed char dy_sym;
signed int dx_x2;
signed int dy_x2;
signed int di;
dx = x1 - x0;
dy = y1 - y0;
if(dx>0)
{
dx_sym = 1;
}
else
{
if(dx<0)
{
dx_sym = -1;
}
else
{
Lcd_DrawVline(x0,y0,y1,RGB);
return;
}
}
if(dy>0)
{
dy_sym = 1;
}
else
{
if(dy<0)
{
dy_sym = -1;
}
else
{
Lcd_DrawHline(x0,y0,x1,RGB);
return;
}
}
dx = dx_sym * dx;
dy = dy_sym * dy;
dx_x2 = dx * 2;
dy_x2 = dy * 2;
if(dx >= dy)
{
di = dy_x2 - dx;
while(x0 != x1)
{
Lcd_PutPixel(x0,y0,RGB);
x0 += dx_sym;
if(di < 0)
{
di += dy_x2;
}
else
{
di += dy_x2 - dx_x2;
y0 += dy_sym;
}
}
Lcd_PutPixel(x0,y0,RGB);
}
else
{
di = dx_x2 - dy;
while(y0 != y1)
{
Lcd_PutPixel(x0,y0,RGB);
y0 += dy_sym;
if(di < 0)
{
di += dx_x2;
}
else
{
di += dx_x2 - dy_x2;
x0 += dx_sym;
}
}
Lcd_PutPixel(x0,y0,RGB);
}
}
/*显示汉字 */
void Lcd_PutHz16(unsigned int x,unsigned int y,unsigned char RGB,unsigned char *GB2312)
{
unsigned short temp;
unsigned char i,j;
temp = (GB2312[0] - 0xB0) * 94 + (GB2312[1] - 0xA0) - 1;
for(i = 0; i < 16; i++)
{
for(j = 0; j < 16; j++)
{
if(testb(HZK16[temp][i*2+j/8],j%8))
{
Lcd_PutPixel(x+j,y+i,RGB);
}
}
}
}
/*显示英文 */
void Lcd_PutChar(unsigned int x,unsigned int y,unsigned char RGB,unsigned char *c)
{
unsigned char i,j;
for(i = 0; i < 16; i++)
{
for(j = 0; j < 8; j++)
{
if(testb(ASCII[*c-0x20][i],j))
{
Lcd_PutPixel(x+j,y+i,RGB);
}
}
}
}
/* 显示混合文字 */
void Lcd_Print(unsigned int x,unsigned int y,unsigned char RGB,unsigned char *c)
{
unsigned int i;
for(i = 0; i < strlen((char *)c); i++)
{
if(*(c+i) < 0xA0)
{
Lcd_PutChar(x+i*8,y,RGB,c+i);
}
else
{
Lcd_PutHz16(x+i*8,y,RGB,c+i);
i++;
}
}
}
/*显示图片 */
void Lcd_DrawImage(unsigned char *pic)
{
unsigned int i;
for(i=0;i<38400;i++)
{
LcdBuffer[i/160][i%160]=((*(pic+i*4))<<24)+((*(pic+i*4+1))<<16)+((*(pic+i*4+2))<<8)+(*(pic+i*4+3));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -