[ARM Cortex-A8]S5PV210裸板7寸LCD C程序

本文介绍了如何使用C程序在S5PV210平台上进行裸板7寸LCD的配置与操作,通过S5PV210.h头文件实现硬件接口的控制。

初始化阶段:
1.确定8个物理量,设置相应寄存器
2.开辟一段内存   --->合法首地址 + 内存空间的大小
3.将内存锁定到DMA通道

LCD面板基本内容
1.物理特性 ---> 分辨率
2.尺寸
3.扫描方式  --->扫描硬件模块的移动方式,不断定位、偏移 ---> 垂直扫描/水平扫描
 1)单扫 技术要求比较低
 2)双扫 提高扫描速度  (需要解决同步问题)
 3)多扫 1/4 1/8    (需要解决同步问题)

4.显示模式
 1BPP   每个像素点需要依赖两个位  锁定像素点后会判断参考电压  1个位来保存驱动电压 ---> 只有两种显示模式,要么是全亮的,要么是全黑的
 2BPP   四级灰度,用两个位来描述参考电压
 4BPP
 16BPP   
 24BPP   2的24次方灰度

HSYNC  行同步信号
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;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值