初始化阶段:
1.确定8个物理量,设置相应寄存器
2.开辟一段内存 --->合法首地址 + 内存空间的大小
3.将内存锁定到DMA通道
3.将内存锁定到DMA通道
LCD面板基本内容
1.物理特性 ---> 分辨率
2.尺寸
3.扫描方式 --->扫描硬件模块的移动方式,不断定位、偏移 ---> 垂直扫描/水平扫描
1)单扫 技术要求比较低
2)双扫 提高扫描速度 (需要解决同步问题)
3)多扫 1/4 1/8 (需要解决同步问题)
1.物理特性 ---> 分辨率
2.尺寸
3.扫描方式 --->扫描硬件模块的移动方式,不断定位、偏移 ---> 垂直扫描/水平扫描
1)单扫 技术要求比较低
2)双扫 提高扫描速度 (需要解决同步问题)
3)多扫 1/4 1/8 (需要解决同步问题)
4.显示模式
1BPP 每个像素点需要依赖两个位 锁定像素点后会判断参考电压 1个位来保存驱动电压 ---> 只有两种显示模式,要么是全亮的,要么是全黑的
2BPP 四级灰度,用两个位来描述参考电压
4BPP
16BPP
24BPP 2的24次方灰度
1BPP 每个像素点需要依赖两个位 锁定像素点后会判断参考电压 1个位来保存驱动电压 ---> 只有两种显示模式,要么是全亮的,要么是全黑的
2BPP 四级灰度,用两个位来描述参考电压
4BPP
16BPP
24BPP 2的24次方灰度
HSYNC 行同步信号
VSYNC 帧同步信号,用来决定行是否已经结束
VDEN (DE使能信号)
VCLK (DCLK)
VSYNC 帧同步信号,用来决定行是否已经结束
VDEN (DE使能信号)
VCLK (DCLK)
每来一个周期画一个像素
每来一个周期画一行
每来一个周期画一帧
每来一个周期画一行
每来一个周期画一帧
HSYNC --> VSYNC --> VDEN --> VCLK
S5PV210.h头文件
#define rVIC0VECTADDR16 (*(volatile unsigned long*) 0xf2000140)
#define rVIC0VECTADDR25 (*(volatile unsigned long*) 0xf2000164)
#define rVIC2VECTADDR23 (*(volatile unsigned long*) 0xf220015C)
//------GPIO------
#define rGPD0CON (*(volatile unsigned long *)0xE02000A0)
#define rGPD0DAT (*(volatile unsigned long *)0xE02000A4)
#define rGPE0CON (*(volatile unsigned long *)0xE02000E0)
#define rGPE0DAT (*(volatile unsigned long *)0xE02000E4)
#define rGPF0CON (*(volatile unsigned long *)0xE0200120)
#define rGPF1CON (*(volatile unsigned long *)0xE0200140)
#define rGPF2CON (*(volatile unsigned long *)0xE0200160)
#define rGPF3CON (*(volatile unsigned long *)0xE0200180)
#define rGPH2CON (*(volatile unsigned long *) 0xE0200C40)
#define rGPH2DAT (*(volatile unsigned long *) 0xE0200C44)
#define rGPH3CON (*(volatile unsigned long *) 0xE0200C60)
#define rGPJ2CON (*(volatile unsigned long *) 0xE0200280)
#define rGPJ2DAT (*(volatile unsigned long *) 0xE0200284)
#define rGPJ2PUD (*(volatile unsigned long *) 0xE0200288)
#define rGPH3CON (*(volatile unsigned long *) 0xE0200C60)
#define rGPH3DAT (*(volatile unsigned long *) 0xE0200C64)
#define rGPH3PUD (*(volatile unsigned long *) 0xE0200C68)
#define rEXT_INT_0_CON ( *((volatile unsigned long *)0xE0200E00) )
#define rEXT_INT_1_CON ( *((volatile unsigned long *)0xE0200E04) )
#define rEXT_INT_2_CON ( *((volatile unsigned long *)0xE0200E08) )
#define rEXT_INT_3_CON ( *((volatile unsigned long *)0xE0200E0C) )
#define rEXT_INT_0_MASK ( *((volatile unsigned long *)0xE0200F00) )
#define rEXT_INT_1_MASK ( *((volatile unsigned long *)0xE0200F04) )
#define rEXT_INT_2_MASK ( *((volatile unsigned long *)0xE0200F08) )
#define rEXT_INT_3_MASK ( *((volatile unsigned long *)0xE0200F0C) )
#define rEXT_INT_0_PEND ( *((volatile unsigned long *)0xE0200F40) )
#define rEXT_INT_1_PEND ( *((volatile unsigned long *)0xE0200F44) )
#define rEXT_INT_2_PEND ( *((volatile unsigned long *)0xE0200F48) )
#define rEXT_INT_3_PEND ( *((volatile unsigned long *)0xE0200F4C) )
//------- exception ------
#define _Exception_Vector 0xD0037400
#define pExcRESET ( *((volatile unsigned long *)(_Exception_Vector + 0x0)) )
#define pExcUNDEF ( *((volatile unsigned long *)(_Exception_Vector + 0x4)) )
#define pExcSWI ( *((volatile unsigned long *)(_Exception_Vector + 0x8)) )
#define pExcPABORT ( *((volatile unsigned long *)(_Exception_Vector + 0xc)) )
#define pExcDABORT ( *((volatile unsigned long *)(_Exception_Vector + 0x10)) )
#define pExcRESERVED ( *((volatile unsigned long *)(_Exception_Vector + 0x14)) )
#define pExcIRQ ( *((volatile unsigned long *)(_Exception_Vector + 0x18)) )
#define pExcFIQ ( *((volatile unsigned long *)(_Exception_Vector + 0x1c)) )
//---------- interupt init ----------------------------
#define VIC0_BASE (0xF2000000)
#define VIC1_BASE (0xF2100000)
#define VIC2_BASE (0xF2200000)
#define VIC3_BASE (0xF2300000)
// VIC0
#define rVIC0IRQSTATUS ( *((volatile unsigned long *)(VIC0_BASE + 0x00)) )
#define rVIC0FIQSTATUS ( *((volatile unsigned long *)(VIC0_BASE + 0x04)) )
#define rVIC0RAWINTR ( *((volatile unsigned long *)(VIC0_BASE + 0x08)) )
#define rVIC0INTSELECT ( *((volatile unsigned long *)(VIC0_BASE + 0x0c)) )
#define rVIC0INTENABLE ( *((volatile unsigned long *)(VIC0_BASE + 0x10)) )
#define rVIC0INTENCLEAR ( *((volatile unsigned long *)(VIC0_BASE + 0x14)) )
#define rVIC0SOFTINT ( *((volatile unsigned long *)(VIC0_BASE + 0x18)) )
#define rVIC0SOFTINTCLEAR ( *((volatile unsigned long *)(VIC0_BASE + 0x1c)) )
#define rVIC0PROTECTION ( *((volatile unsigned long *)(VIC0_BASE + 0x20)) )
#define rVIC0SWPRIORITYMASK ( *((volatile unsigned long *)(VIC0_BASE + 0x24)) )
#define rVIC0PRIORITYDAISY ( *((volatile unsigned long *)(VIC0_BASE + 0x28)) )
#define rVIC0VECTADDR (VIC0_BASE + 0x100)
#define rVIC0VECPRIORITY ( *((volatile unsigned long *)(VIC0_BASE + 0x200)) )
#define rVIC0ADDRESS ( *((volatile unsigned long *)(VIC0_BASE + 0xf00)) )
#define rVIC0PERID0 ( *((volatile unsigned long *)(VIC0_BASE + 0xfe0)) )
#define rVIC0PERID1 ( *((volatile unsigned long *)(VIC0_BASE + 0xfe4)) )
#define rVIC0PERID2 ( *((volatile unsigned long *)(VIC0_BASE + 0xfe8)) )
#define rVIC0PERID3 ( *((volatile unsigned long *)(VIC0_BASE + 0xfec)) )
#define rVIC0PCELLID0 ( *((volatile unsigned long *)(VIC0_BASE + 0xff0)) )
#define rVIC0PCELLID1 ( *((volatile unsigned long *)(VIC0_BASE + 0xff4)) )
#define rVIC0PCELLID2 ( *((volatile unsigned long *)(VIC0_BASE + 0xff8)) )
#define rVIC0PCELLID3 ( *((volatile unsigned long *)(VIC0_BASE + 0xffc)) )
// VIC1
#define rVIC1IRQSTATUS ( *((volatile unsigned long *)(VIC1_BASE + 0x00)) )
#define rVIC1FIQSTATUS ( *((volatile unsigned long *)(VIC1_BASE + 0x04)) )
#define rVIC1RAWINTR ( *((volatile unsigned long *)(VIC1_BASE + 0x08)) )
#define rVIC1INTSELECT ( *((volatile unsigned long *)(VIC1_BASE + 0x0c)) )
#define rVIC1INTENABLE ( *((volatile unsigned long *)(VIC1_BASE + 0x10)) )
#define rVIC1INTENCLEAR ( *((volatile unsigned long *)(VIC1_BASE + 0x14)) )
#define rVIC1SOFTINT ( *((volatile unsigned long *)(VIC1_BASE + 0x18)) )
#define rVIC1SOFTINTCLEAR ( *((volatile unsigned long *)(VIC1_BASE + 0x1c)) )
#define rVIC1PROTECTION ( *((volatile unsigned long *)(VIC1_BASE + 0x20)) )
#define rVIC1SWPRIORITYMASK ( *((volatile unsigned long *)(VIC1_BASE + 0x24)) )
#define rVIC1PRIORITYDAISY ( *((volatile unsigned long *)(VIC1_BASE + 0x28)) )
#define rVIC1VECTADDR (VIC1_BASE + 0x100)
#define rVIC1VECPRIORITY ( *((volatile unsigned long *)(VIC1_BASE + 0x200)) )
#define rVIC1ADDRESS ( *((volatile unsigned long *)(VIC1_BASE + 0xf00)) )
#define rVIC1PERID0 ( *((volatile unsigned long *)(VIC1_BASE + 0xfe0)) )
#define rVIC1PERID1 ( *((volatile unsigned long *)(VIC1_BASE + 0xfe4)) )
#define rVIC1PERID2 ( *((volatile unsigned long *)(VIC1_BASE + 0xfe8)) )
#define rVIC1PERID3 ( *((volatile unsigned long *)(VIC1_BASE + 0xfec)) )
#define rVIC1PCELLID0 ( *((volatile unsigned long *)(VIC1_BASE + 0xff0)) )
#define rVIC1PCELLID1 ( *((volatile unsigned long *)(VIC1_BASE + 0xff4)) )
#define rVIC1PCELLID2 ( *((volatile unsigned long *)(VIC1_BASE + 0xff8)) )
#define rVIC1PCELLID3 ( *((volatile unsigned long *)(VIC1_BASE + 0xffc)) )
// VIC2
#define rVIC2IRQSTATUS ( *((volatile unsigned long *)(VIC2_BASE + 0x00)) )
#define rVIC2FIQSTATUS ( *((volatile unsigned long *)(VIC2_BASE + 0x04)) )
#define rVIC2RAWINTR ( *((volatile unsigned long *)(VIC2_BASE + 0x08)) )
#define rVIC2INTSELECT ( *((volatile unsigned long *)(VIC2_BASE + 0x0c)) )
#define rVIC2INTENABLE ( *((volatile unsigned long *)(VIC2_BASE + 0x10)) )
#define rVIC2INTENCLEAR ( *((volatile unsigned long *)(VIC2_BASE + 0x14)) )
#define rVIC2SOFTINT ( *((volatile unsigned long *)(VIC2_BASE + 0x18)) )
#define rVIC2SOFTINTCLEAR ( *((volatile unsigned long *)(VIC2_BASE + 0x1c)) )
#define rVIC2PROTECTION ( *((volatile unsigned long *)(VIC2_BASE + 0x20)) )
#define rVIC2SWPRIORITYMASK ( *((volatile unsigned long *)(VIC2_BASE + 0x24)) )
#define rVIC2PRIORITYDAISY ( *((volatile unsigned long *)(VIC2_BASE + 0x28)) )
#define rVIC2VECTADDR (VIC2_BASE + 0x100)
#define rVIC2VECPRIORITY ( *((volatile unsigned long *)(VIC2_BASE + 0x200)) )
#define rVIC2ADDRESS ( *((volatile unsigned long *)(VIC2_BASE + 0xf00)) )
#define rVIC2PERID0 ( *((volatile unsigned long *)(VIC2_BASE + 0xfe0)) )
#define rVIC2PERID1 ( *((volatile unsigned long *)(VIC2_BASE + 0xfe4)) )
#define rVIC2PERID2 ( *((volatile unsigned long *)(VIC2_BASE + 0xfe8)) )
#define rVIC2PERID3 ( *((volatile unsigned long *)(VIC2_BASE + 0xfec)) )
#define rVIC2PCELLID0 ( *((volatile unsigned long *)(VIC2_BASE + 0xff0)) )
#define rVIC2PCELLID1 ( *((volatile unsigned long *)(VIC2_BASE + 0xff4)) )
#define rVIC2PCELLID2 ( *((volatile unsigned long *)(VIC2_BASE + 0xff8)) )
#define rVIC2PCELLID3 ( *((volatile unsigned long *)(VIC2_BASE + 0xffc)) )
// VIC3
#define rVIC3IRQSTATUS ( *((volatile unsigned long *)(VIC3_BASE + 0x00)) )
#define rVIC3FIQSTATUS ( *((volatile unsigned long *)(VIC3_BASE + 0x04)) )
#define rVIC3RAWINTR ( *((volatile unsigned long *)(VIC3_BASE + 0x08)) )
#define rVIC3INTSELECT ( *((volatile unsigned long *)(VIC3_BASE + 0x0c)) )
#define rVIC3INTENABLE ( *((volatile unsigned long *)(VIC3_BASE + 0x10)) )
#define rVIC3INTENCLEAR ( *((volatile unsigned long *)(VIC3_BASE + 0x14)) )
#define rVIC3SOFTINT ( *((volatile unsigned long *)(VIC3_BASE + 0x18)) )
#define rVIC3SOFTINTCLEAR ( *((volatile unsigned long *)(VIC3_BASE + 0x1c)) )
#define rVIC3PROTECTION ( *((volatile unsigned long *)(VIC3_BASE + 0x20)) )
#define rVIC3SWPRIORITYMASK ( *((volatile unsigned long *)(VIC3_BASE + 0x24)) )
#define rVIC3PRIORITYDAISY ( *((volatile unsigned long *)(VIC3_BASE + 0x28)) )
#define rVIC3VECTADDR (VIC3_BASE + 0x100)
#define rVIC3VECPRIORITY ( *((volatile unsigned long *)(VIC3_BASE + 0x200)) )
#define rVIC3ADDRESS ( *((volatile unsigned long *)(VIC3_BASE + 0xf00)) )
#define rVIC3PERID0 ( *((volatile unsigned long *)(VIC3_BASE + 0xfe0)) )
#define rVIC3PERID1 ( *((volatile unsigned long *)(VIC3_BASE + 0xfe4)) )
#define rVIC3PERID2 ( *((volatile unsigned long *)(VIC3_BASE + 0xfe8)) )
#define rVIC3PERID3 ( *((volatile unsigned long *)(VIC3_BASE + 0xfec)) )
#define rVIC3PCELLID0 ( *((volatile unsigned long *)(VIC3_BASE + 0xff0)) )
#define rVIC3PCELLID1 ( *((volatile unsigned long *)(VIC3_BASE + 0xff4)) )
#define rVIC3PCELLID2 ( *((volatile unsigned long *)(VIC3_BASE + 0xff8)) )
#define rVIC3PCELLID3 ( *((volatile unsigned long *)(VIC3_BASE + 0xffc)) )
//------ PLL ----------
#define rAPLL_LOCK (*(volatile unsigned int *)0xe0100000)
#define rMPLL_LOCK (*(volatile unsigned int *)0xe0100004)
#define rAPLL_CON0 (*(volatile unsigned int *)0xe0100100)
#define rAPLL_CON1 (*(volatile unsigned int *)0xe0100104)
#define rMPLL_CON (*(volatile unsigned int *)0xe0100108)
#define rCLK_SRC0 (*(volatile unsigned int *)0xe0100200)
#define rCLK_SRC4 (*(volatile unsigned int *)0xe0100210)
#define rCLK_DIV0 (*(volatile unsigned int *)0xe0100300)
#define rCLK_DIV4 (*(volatile unsigned int *)0xe0100310)
#define rCLK_DIV6 (*(volatile unsigned int *)0xe0100318)
//------ timer---------
#define rTCFG0 (*(volatile unsigned int *)0xe2500000)
#define rTCFG1 (*(volatile unsigned int *)0xe2500004)
#define rTCON (*(volatile unsigned int *)0xe2500008)
#define rTCNTB0 (*(volatile unsigned int *)0xe250000C)
#define rTCMPB0 (*(volatile unsigned int *)0xe2500010)
#define rTCNTB4 (*(volatile unsigned int *)0xe250003C)
#define rTINT_CSTAT (*(volatile unsigned int *)0xe2500044)
//------ watchdog ------
#define rWTCON (*(volatile unsigned int *)0xe2700000)
#define rWTDAT (*(volatile unsigned int *)0xe2700004)
#define rWTCNT (*(volatile unsigned int *)0xe2700008)
#define rWTCLRINT (*(volatile unsigned int *)0xe270000C)
//------ adc ----------
#define rTSADCCON0 (*(volatile unsigned int *)0xe1700000)
#define rTSDATX0 (*(volatile unsigned int *)0xe170000C)
#define rCLRINTADC0 (*(volatile unsigned int *)0xe1700018)
#define rADCMUX (*(volatile unsigned int *)0xe170001C)
//------ lcd ----------
#define rDISPLAY_CONTROL (*(volatile unsigned long *)0xe0107008)
#define rVIDCON0 (*(volatile unsigned long *)0xF8000000)
#define rVIDCON1 (*(volatile unsigned long *)0xF8000004)
#define rVIDTCON2 (*(volatile unsigned long *)0xF8000018)
#define rWINCON0 (*(volatile unsigned long *)0xF8000020)
#define rWINCON2 (*(volatile unsigned long *)0xF8000028)
#define rSHADOWCON (*(volatile unsigned long *)0xF8000034)
#define rVIDOSD0A (*(volatile unsigned long *)0xF8000040)
#define rVIDOSD0B (*(volatile unsigned long *)0xF8000044)
#define rVIDOSD0C (*(volatile unsigned long *)0xF8000048)
#define rVIDW00ADD0B0 (*(volatile unsigned long *)0xF80000A0)
#define rVIDW00ADD1B0 (*(volatile unsigned long *)0xF80000D0)
#define rVIDW00ADD2 (*(volatile unsigned long *)0xF8000100)
#define rVIDTCON0 (*(volatile unsigned long *)0xF8000010)
#define rVIDTCON1 (*(volatile unsigned long *)0xF8000014)
//------ nand --------
#define rNFCONF ( *((volatile unsigned long *)0xB0E00000) )
#define rNFCONT ( *((volatile unsigned long *)0xB0E00004) )
#define rNFCMMD ( *((volatile unsigned long *)0xB0E00008) )
#define rNFADDR ( *((volatile unsigned long *)0xB0E0000C) )
#define rNFDATA ( *((volatile unsigned long *)0xB0E00010) )
#define rNFSTAT ( *((volatile unsigned long *)0xB0E00028) )
#define rMP0_1CON ( *((volatile unsigned long *)0xE02002E0) )
#define rMP0_2CON ( *((volatile unsigned long *)0xE0200300) )
#define rMP0_3CON ( *((volatile unsigned long *)0xE0200320) )
//------- iic -----
#define rGPH1CON ( *((volatile unsigned long *)0xe0200c20) )
#define rGPH1PUD ( *((volatile unsigned long *)0xe0200c28) )
#define rGPD1CON ( *((volatile unsigned long *)0xe02000c0) )
#define rGPD1PUD ( *((volatile unsigned long *)0xe02000c8) )
#define rI2CCON2 ( *((volatile unsigned long *)0xE1A00000) )
#define rI2CSTAT2 ( *((volatile unsigned long *)0xE1A00004) )
#define rI2CADD2 ( *((volatile unsigned long *)0xE1A00008) )
#define rI2CDS2 ( *((volatile unsigned long *)0xE1A0000C) )
LCD裸板C程序
#include "stdio.h"
#include "s5pv210.h"
#include "api.h"
#include "logo.h"
#include "charater_lib.h"
volatile unsigned int *buf = (volatile unsigned int *)0x42000000;
//ARM C程序入口
void Start_Arm(void)
{
printf("enter c...\n");
waiting=1;
IRQ_init();
LCD_IO_Init();
LCD_Init();
LCD_ClearScreen();
LCD_Image(gImage_logo);
printf("Waiting....\n");
while(1);
}
//初始化LCD的IO引脚
void LCD_IO_Init()
{
rGPF0CON = 0x22222222; //initial the IO pins
rGPF1CON = 0x22222222;
rGPF2CON = 0x22222222;
rGPF3CON = 0x22222222;
}
//初始化LCD
void LCD_Init()
{
/*********/
rVIDCON0 &= ~(1<<26); //Determines the output format of Video Controller
rVIDCON0 |= (4<<6); //VCLK = HCLK / (CLKVAL+1), where CLKVAL >= 1 --->read the LCD Datasheet
rVIDCON0 |= (1<<4); //Selects the clock source as direct or divide using CLKVAL_F register.
rVIDCON0 |= (0<<2); //Selects the video clock source.
rVIDCON0 |= (1<<1); //Enables/disables video output and logic immediately.
rVIDCON0 |= (1<<0); //Enables/disables video output and logic at current frame end.
/*********/
rVIDCON1 |= (1<<6); //Specifies the HSYNC pulse polarity. 0 = Normal 1 = Inverted
--->read the LCD Datasheet
rVIDCON1 |= (1<<5); //Specifies the VSYNC pulse polarity. 0 = Normal 1 = Inverted
--->read the LCD Datasheet
/*********/
rVIDTCON0 |= (2<<16); //VBPD --->by calculate
rVIDTCON0 |= (21<<8); //VFPD
rVIDTCON0 |= (19<<0); //VSPW
rVIDTCON1 |= (6<<16); //HBPD --->by calculate
rVIDTCON1 |= (209<<8); //HFPD
rVIDTCON1 |= (39<<0); //HSPW
rVIDTCON2 |= (479<<11); //LINEVAL
rVIDTCON2 |= (799<<0); //HOZVAL
/*********/
rWINCON0 |= (1<<15); //Specifies the Word swap control bit. 1 = Swap Enable
rWINCON0 |= (11<<2); //1011 = Unpacked 24 bpp ( non-palletized R:8-G:8-B:8 )
rWINCON0 |= (1<<0); //1 //= Enables the video output and video control signal.
rSHADOWCON |=(1<<0); //Specifies window shadow control register. Enables Channel 0.
/**** Frame Buffer ****/
rVIDW00ADD0B0 = 0x42000000; // Specifies A [31:0] of the start address for Video frame buffer.
rVIDW00ADD1B0 = 0x42000000 + 800*480*4; //Specifies A[31:0] of the end address for Video frame buffer.
//VBASEL = VBASEU + (PAGEWIDTH+OFFSIZ E) x (LINEVAL+1)
/*********/
rVIDW00ADD2 &= ~(1<<13); //Specifies the Virtual screen offset size (number of byte).
rVIDW00ADD2 |= (800*4<<0); //Specifies the Virtual screen page width (number of byte).
rVIDOSD0A &= ~(1<<11); //Specifies the horizontal screen coordinate for left top pixel of OSD image.
rVIDOSD0A &= ~(1<<0); //Specifies the vertical screen coordinate for left top pixel of OSD image
rVIDOSD0B |= (799<<11); //Specifies the horizontal screen coordinate for right bottom pixel of OSD image. Why?
rVIDOSD0B |= (479<<0); //Specifies the vertical screen coordinate for right bottom pixel of OSD image.
rVIDOSD0C = 800*480; //Specifies the Window Size 0 For example, Height * Width (Number of Word)
rDISPLAY_CONTROL = 0x2; //Display path selection 10: RGB=FIMD I80=FIMD ITU=FIMD
}
//LCD在任意区域画一个点
void LCD_DrawPoint(unsigned int x,unsigned int y,int color)
{
*(buf + (800*y+x)) = color;
}
//LCD画一个正方形
void LCD_DrawSquare(unsigned int x0,unsigned int y0,int color)
{
int x,y;
for(x=x0;x<x0+50;x++)
for(y=y0;y<y0+25;y++)
LCD_DrawPoint(x,y,color);
}
//清除屏幕,实际上是把整个屏幕涂白或者涂黑
void LCD_ClearScreen(void)
{
int x,y;
for(x=0;x<800;x++)
for(y=0;y<480;y++)
*(buf + (800*y+x)) = 0x000000;
printf("LCD_CLEAR completed!\n");
}
//延时函数,根据处理器主频不一样需要调整
void Delay(unsigned int x)
{
volatile int i,j;
for(i=0;i<x;i++)
for(j=0;j<10000;j++);
}
//LCD画一幅图片,实际上是把一个图片的数组装到FrameBuffer中
void LCD_Image(const unsigned char*p)
{
int x,y;
int red,green,blue;
int color;
for(y=0;y<480;y++)
{
for(x=0;x<800;x++)
{
blue = *p++;
green = *p++;
red = *p++;
color=red<<16|green<<8|blue<<0;
LCD_DrawPoint(x,y,color);
}
}
}
//LCD显示一个32*32的字符,需要用到字体库
void LCD_DispASICII32x32(unsigned int x0,unsigned int y0,unsigned int color,const char ch[])
{
unsigned short int i,j,k;
unsigned char mask=0x1;
unsigned char buffer=0;
for(i=0;i<64;i+=2)
{
for(k=i;k<i+2;k++)
{
buffer=ch[k];
for(j=0;j<8;j++)
{
if(buffer&mask)
LCD_DrawPoint(x0+j+(k-i)*8,y0+i,color);
buffer=buffer>>1;
}
}
}
}
//LCD显示一个16*16的中文字符,同样需要用到字体库
void LCD_DispChinese16x16(unsigned int x0,unsigned int y0,unsigned int color,const char ch[])
{
unsigned short int i,j,k;
unsigned char mask=0x1;
unsigned char buffer=0;
for(i=0;i<64;i+=2)
{
for(k=i;k<i+2;k++)
{
buffer=ch[k];
for(j=0;j<8;j++)
{
if(buffer&mask)
LCD_DrawPoint(x0+j+(k-i)*8,y0+i,color);
buffer=buffer>>1;
}
}
}
}
void LCD_DispChinese32x32(unsigned int x0,unsigned int y0,unsigned int color,const char ch[])
{
unsigned short int i,j,k;
unsigned char mask=0x1;
unsigned char buffer=0;
for(i=0;i<128;i+=4)
{
for(k=i;k<i+4;k++)
{
buffer=ch[k];
for(j=0;j<8;j++)
{
if(buffer&mask)
LCD_DrawPoint(x0+j+(k-i)*8,y0+i,color);
buffer=buffer>>1;
}
}
}
}
本文介绍了如何使用C程序在S5PV210平台上进行裸板7寸LCD的配置与操作,通过S5PV210.h头文件实现硬件接口的控制。

被折叠的 条评论
为什么被折叠?



