📄 lcdlib.c
字号:
/*********************************************************************************************
* File name : lcdlib.c
* Author : Brian Zheng
* Descript : lcd库函数文件
* History
* Brian Zheng, Programming modify, May 26, 2008
*********************************************************************************************/
#include "lcdlib.h"
//UINT32T *frameBuffer8Bits; //声明显示缓冲区
UINT32T (*frameBuffer8Bits)[SCR_XSIZE_CSTN/4];
/*********************************************************************************************
* name: lcd_port_init
* func: 初始化lcd相关的GPIO端口
* para: 无
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void lcd_port_init(void)
{
rGPCUP = 0xFFFFFFFF; //上拉寄存器失效
rGPCCON = 0xAAAAA9AA; //初始化相应的VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND;特别的此处
//VM位初始化为01即output,而非10(VM)
rGPDUP = 0xFFFFFFFF;
rGPDCON = 0xAAAAAAAA;
uart_printf("lcd port initialing....\n");
}
void lcd_power_en(void)
{
//GPG4 is setted as LCD_PWREN
rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
rGPGCON=rGPGCON&(~(3<<8))|(3<<8); // GPG4=LCD_PWREN
//Enable LCD POWER ENABLE Function
rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3); // PWREN
rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5); // INVPWREN
}
/*********************************************************************************************
* name: lcd_reg_init
* func: 初始化lcd相关的控制寄存器和地址寄存器
* para: 无
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void lcd_reg_init(void)
{
//MY own
frameBuffer8Bits = (UINT32T (*) [SCR_XSIZE_CSTN/4]) LCDFRAMEBUFFER;
//frameBuffer8Bits = (UINT32T *)LCDFRAMEBUFFER; //My frameBuffer8Bits
rLCDCON1 = (CLKVAL_CSTN << 8) | (0 << 7) | (2 << 5) | (3 << 1) | 0;
//rLCDCON1 = (CLKVAL_CSTN << 8) | (1 << 7) | (2 << 5) | (3 << 1) | 1; //My LCDCON1
//|CLKVAL|MVAL used|8-bit single scan display mode (STN) |8 bpp for STN, color mode|Enable video output & LCD control signal|
rLCDCON2 = (0 << 24) | (LINEVAL_CSTN << 14) | (0 << 6) | 0;
rLCDCON3 = (WDLY_CSTN << 19) | (HOZVAL_CSTN << 8) | (LINEBLANK_CSTN);
//---------|---WDLY:32 HCLK--|-----HOZVAL---------|-LINEBLANK:16 HCLK--|
rLCDCON4 = (MVAL_CSTN << 8) | (WLH_CSTN);
//---------|---MVAL:0x04 ------|--64 HCLK--|
rLCDCON5 = 0;
//LCD_PWREN: enable
/*
rLCDSADDR1 = (((UINT32T)frameBuffer8Bits >> 22) << 21) | (LCDBASEU >> 1);
//----------|----LCDBANK----------------------|-----LCDBASEU: NOT USE---|
rLCDSADDR2 = LCDBASEL;
rLCDSADDR3 = (OFFSET << 11) | PAGEWIDTH;*/
rLCDSADDR1=(((UINT32T)frameBuffer8Bits>>22)<<21 )|M5D((UINT32T)frameBuffer8Bits>>1);
rLCDSADDR2=M5D( ((UINT32T)frameBuffer8Bits+(SCR_XSIZE_CSTN*LCD_YSIZE_CSTN/1))>>1 );
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN/2);
/*课件上的值如下,但是实际情况并非如此
rREDLUT = 0;
rGREENLUT = 0;
rBLUELUT = 0;*/
rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
rDITHMODE = 0;
}
/*********************************************************************************************
* name: pixel_display
* func: 将像素显示到指定的坐标点(8位彩色模式下)
* para: UINT32T x -- 列坐标
* UINT32T y -- 行坐标
* UINT32T c -- 颜色值
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void pixel_display(INT32T x, INT32T y, INT32T c)
{
/*My Own
INT32T dPixelAddr;
dPixelAddr = (*(UINT32T *)(frameBuffer8Bits + y*(SCR_XSIZE_CSTN/4) + ((x)/4)));
if ((x < SCR_XSIZE_CSTN) && (y < SCR_YSIZE_CSTN))
{
dPixelAddr = ((dPixelAddr & (~(0xFF000000 >> ((x%4)*8)))) | ((c&0x000000FF) << ((4-(x%4)-1)*8)));
}*/
if(x<SCR_XSIZE_CSTN&& y<SCR_YSIZE_CSTN)
frameBuffer8Bits[(y)][(x)/4]=( frameBuffer8Bits[(y)][x/4]
& ~(0xff000000>>((x)%4)*8) ) | ( (c&0x000000ff)<<((4-1-((x)%4))*8) );
}
/*********************************************************************************************
* name: clear_screen
* func: 用指定的颜色值清屏
* para: UINT32T c -- 颜色值
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void clear_screen(UINT32T c)
{
INT32T i,j;
for(j=0; j<SCR_YSIZE_CSTN; j++)
for(i=0; i<SCR_XSIZE_CSTN; i++)
{
pixel_display(i,j,c);
}
}
/*********************************************************************************************
* name: lcd_init
* func: 初始化lcd
* para: 无
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void lcd_init(void)
{
lcd_port_init();
lcd_reg_init();
clear_screen(GREEN - 20);
lcd_power_en();
LCD_ENVID_ON;
}
/*********************************************************************************************
* name: draw_lint
* func: 在屏幕指定的坐标点之间画线
* para: int x1 -- 起点横坐标
* int y1 -- 起点纵坐标
* int x2 -- 终点横坐标
* int y2 -- 终点纵坐标
* int color -- 颜色值
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void draw_line(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
pixel_display(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
pixel_display(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
pixel_display(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
pixel_display(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
pixel_display(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
pixel_display(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
pixel_display(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
pixel_display(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
/*********************************************************************************************
* name: draw_rectangle
* func: 过屏幕指定的对角点绘制矩形
* para: int x1 -- 起始对角点横坐标
* int y1 -- 起始对角点纵坐标
* int x2 -- 结束对角点横坐标
* int y2 -- 结束对角点纵坐标
* int color -- 颜色值
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void draw_rectangle(int x1,int y1,int x2,int y2,int color)
{
draw_line(x1,y1,x2,y1,color);
draw_line(x2,y1,x2,y2,color);
draw_line(x1,y2,x2,y2,color);
draw_line(x1,y1,x1,y2,color);
}
/*********************************************************************************************
* name: draw_hline
* func: 绘制屏幕指定起始点间铅垂线
* para: int x1 -- 起始点横坐标
* int y1 -- 起始点纵坐标
* int x2 -- 结束点横坐标
* int y2 -- 结束点纵坐标
* int color -- 颜色值
* int width -- 指定宽度
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void draw_hline(int x1, int x2, int y, int color, int width)
{
int i;
for (i=0; i<width; i++)
{
draw_line(x1, y, x2, y, color);
y++;
}
}
/*********************************************************************************************
* name: draw_vline
* func: 绘制屏幕指定起始点间水平线
* para: int x1 -- 起始点横坐标
* int y1 -- 起始点纵坐标
* int x2 -- 结束点横坐标
* int y2 -- 结束点纵坐标
* int color -- 颜色值
* int width -- 指定宽度
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void draw_vline(int x, int y1, int y2, int color, int width)
{
int i;
for (i=0; i<width; i++)
{
draw_line(x, y1, x, y2, color);
x++;
}
}
/*********************************************************************************************
* name: draw_rectangle_width
* func: 过屏幕指定的对角点绘制指定宽度的矩形
* para: int x1 -- 起始对角点横坐标
* int y1 -- 起始对角点纵坐标
* int x2 -- 结束对角点横坐标
* int y2 -- 结束对角点纵坐标
* int color -- 颜色值
* int width -- 指定宽度
* ret: 无
* modify:
* comment:
*********************************************************************************************/
void draw_rectangle_width(int x1, int y1, int x2, int y2, int color, int width)
{
draw_hline(x1, x2, y1, color, width);
draw_hline(x1, x2, y2-width+1, color, width);
draw_vline(x1, y1, y2, color, width);
draw_vline(x2-width+1, y1, y2, color, width);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -