S3C2451_lcd 函数封装

来源:互联网 发布:跳跃网络300tank是什么 编辑:程序博客网 时间:2024/06/11 00:34
S3C2451_lcd.h#ifndef _S3C2451_LCD_H__#define _S3C2451_LCD_H__#include "typedef.h"typedef struct{        U32 VIDCON0;                    U32 VIDCON1;                        U32 VIDTCON0;                   U32 VIDTCON1;           U32 VIDTCON2;           U32 WINCON0;                U32 WINCON1;                U32 UNUSED1;        U32 UNUSED2;        U32 UNUSED3;        U32 VIDOSD0A;               U32 VIDOSD0B;        U32 UNUSED4;        U32 VIDOSD1A;           U32 VIDOSD1B;           U32 VIDOSD1C;           U32 UNUSED5[9];        U32 VIDW00ADD0B0;        U32 VIDW00ADD0B1;           U32 VIDW01ADD0;             U32 UNUSED6;        U32 UNUSED7;        U32 UNUSED8;        U32 VIDW00ADD1B0;           U32 VIDW00ADD1B1;           U32 VIDW01ADD1;         U32 UNUSED9;        U32 UNUSED10;        U32 UNUSED11;        U32 VIDW00ADD2B0;           U32 VIDW00ADD2B1;        U32 VIDW01ADD2;         U32 UNUSED12;        U32 UNUSED13;        U32 UNUSED14;        U32 VIDINTCON;              U32 W1KEYCON0;          U32 W1KEYCON1;        U32 W2KEYCON0;        U32 W2KEYCON1;          U32 W3KEYCON0;        U32 W3KEYCON1;        U32 W4KEYCON0;        U32 W4KEYCON1;              U32 WIN0MAP;            U32 WIN1MAP;    }volatile *LCD_MemMapPtr;#define LCDCTRL_BASE_PTR            ((LCD_MemMapPtr)0x4C800000)#define FRAME_BUFFER        LCD_BUFFER/*TD35*/#if 0#define LCD_X                   240#define LCD_Y                   320#define HSPW                (4)#define HBPD                (101 - 1)#define HFPD                (1 - 1)#define VSPW                (9)#define VBPD                (1 - 1)#define VFPD                (1 - 1)#define LINEVAL             (LCD_Y-1)#define HOZVAL              (LCD_X-1)#else/*P43*/#define LCD_X                   480#define LCD_Y                   272#define HSPW                (30)#define HBPD                (10)#define HFPD                (19)#define VSPW                (8)#define VBPD                (2)#define VFPD                (4)#define LINEVAL             (LCD_Y-1)#define HOZVAL              (LCD_X-1)#endif#define LeftTopX     0#define LeftTopY     0#define RightBotX   (LCD_X-1)#define RightBotY   (LCD_Y-1)//extern const unsigned char zero2nine8x16[11][17];//extern const char char_mode8x15[][15];//const unsigned char feiji_320x240[]£»//extern const unsigned char gImage_picture[];extern void LCD_GPIO_Init(void);  //³õʼ»¯ LCDÏà¹ØGPIOextern void LCD_Init(void);     //³õʼ»¯LCDÅäÖòÎÊýextern void LCD_PutPixel(U32 x,U32 y,U32 c);extern void LCD_Clear( U32 c);extern void LCD_Display_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp);extern void LCD_Display_8x16(U32 x, U32 y, U32 col, const unsigned char ch[]);extern void LCDDisplay_Char(U32 x, U32 y, U32 col, char s);extern void LCDDisplay_String(U32 x, U32 y, U32 col, char *s);#endifS3C2451_lcd.c#include "S3C2451_lcd.h"#include "S3C2451_gpio.h"LCD_MemMapPtr const LCD_BASE_PTR = LCDCTRL_BASE_PTR;volatile unsigned int LCD_BUFFER[LCD_Y][LCD_X];//0x000000//0xff0000void LCD_GPIO_Init(void){    //端口复用设置    GPIO_Init_Typedef gpio_init_struct;    gpio_init_struct.pinx =  0x0000ffff;    gpio_init_struct.mode = GPIO_MODE_ALT;    gpio_init_struct.udp = GPIO_UDP_PULLUP;    GPIO_Init(GPIOC,gpio_init_struct);    gpio_init_struct.pinx =  0x0000ffff;    gpio_init_struct.mode = GPIO_MODE_ALT;    gpio_init_struct.udp = GPIO_UDP_PULLUP;    GPIO_Init(GPIOD,gpio_init_struct);      //背光控制    gpio_init_struct.pinx =  GPIO_PIN_1;    gpio_init_struct.mode = GPIO_MODE_OUT;    gpio_init_struct.udp = GPIO_UDP_PULLUP;    GPIO_Init(GPIOB,gpio_init_struct);    GPIO_WriteBit(GPIOB,GPIO_PIN_1,BIT_SET);    //电源控制    gpio_init_struct.pinx =  GPIO_PIN_2;    gpio_init_struct.mode = GPIO_MODE_OUT;    gpio_init_struct.udp = GPIO_UDP_PULLUP;    GPIO_Init(GPIOG,gpio_init_struct);    GPIO_WriteBit(GPIOG,GPIO_PIN_2,BIT_SET);}void LCD_Init(void){    // 配置VIDCONx,设置接口类型、时钟、极性和使能LCD控制器等/    LCD_BASE_PTR->VIDCON0 = (0<<22)|(0<<13)|(9<<6)|(1<<5)|(1<<4)|(0<<2)|(3<<0);    LCD_BASE_PTR->VIDCON1 |= (1<<6)|(1<<5);     // 配置VIDTCONx,设置时序和长宽等    // 设置时序    LCD_BASE_PTR->VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;    LCD_BASE_PTR->VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;    // 设置长宽    LCD_BASE_PTR->VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);    // 配置WINCON0,设置window0的数据格式    LCD_BASE_PTR->WINCON0 = 0xB<<2; //RGB888    LCD_BASE_PTR->WINCON0 |= (1<<0);//  LCD_BASE_PTR->WINCON0 &= ~(0xf << 2);    // 配置VIDOSD0A/B/C,设置window0的坐标系    LCD_BASE_PTR->VIDOSD0A = (LeftTopX<<11) | (LeftTopY << 0);    LCD_BASE_PTR->VIDOSD0B = (RightBotX<<11) | (RightBotY << 0);    // 置VIDW00ADD0B0和VIDW00ADD1B0,设置framebuffer的地址    LCD_BASE_PTR->VIDW00ADD0B0 = (unsigned long)FRAME_BUFFER;    //显示的BUFFER  LCD_BASE_PTR->VIDW00ADD1B0 =(unsigned long)FRAME_BUFFER + sizeof(FRAME_BUFFER);}/*LCD描点函数*/void LCD_PutPixel(U32 x,U32 y,U32 c){    if(x>=LCD_X||y>=LCD_Y) return;    LCD_BUFFER[y][x] = c;}/*LCD清屏函数*/void LCD_Clear( U32 c){    U16 x,y;    for(y=0;y<LCD_Y;y++)        for(x=0;x<LCD_X;x++)        {                LCD_BUFFER[y][x] = c;                //delay(100000);        }}/*LCD 显示图片*/void LCD_Display_Bmp(int x0,int y0,int w,int h,const unsigned char *bmp){    U16 x,y;    U32 c;    U32 i=0;    for(y=0;y<h;y++)        for(x=0;x<w;x++)        {            c = bmp[i]<<24 | bmp[i+1]<<16 | bmp[i+2]<<8 | bmp[i+3];            LCD_PutPixel(x0+x,y0+y,c);            i+=4;        }}void LCDDisplay_Char(U32 x, U32 y, U32 col, char s){//  int i;//  //  for(i=0;i<11;i++)//  {//          if(zero2nine8x16[i][0] == s)//          {//              break;          //          }//  }//  //  LCD_Display_8x16(x,y,col,&zero2nine8x16[i][1]);}void LCDDisplay_String(U32 x, U32 y, U32 col, char *s){    U16 ypos =y;    do{            LCDDisplay_Char(x, ypos, col, *s);            ypos+=8;        s++;    }while(*s != '\0');}void LCD_Display_8x16(U32 x, U32 y, U32 col, const unsigned char ch[]){    unsigned short i, j;    unsigned char mask, tem ;    for(i=0; i<16; i++)    {                        mask= 0x80 ;        tem    = ch[i] ;    //俩个字节一组16位,取第一个字节        for(j=0; j<8; j++)        {            if(tem & mask)            {                LCD_PutPixel(y+j, x+i+8, col) ;            }            mask = mask >> 1 ;        }    }}void LCD_Display_8x15(U32 x, U32 y, U32 col, const unsigned char ch[]){    unsigned short i, j;    unsigned char mask, tem ;    for(i=0; i<15; i++)    {        mask= 0x80 ;        tem    = ch[i] ;    //俩个字节一组16位,取第一个字节        for(j=0; j<8; j++)        {            if(tem & mask)            {                LCD_PutPixel(x+j, y+i, col) ;            }else                            LCD_PutPixel(x+j, y+i, 0) ;            mask = mask >> 1 ;        }    }}#if 0void LCD_Display_mxn(U32 x, U32 y, U32 col, U16 width, U16 height, const unsigned char ch[]){    unsigned short i, j;    unsigned char mask, tem ;    int byteperline = (width +7)/8 ;      char *ptr;       ptr = ch;    for(i=0; i<height; i++){                        ptr += i * byteperline;                 for(m= 0; m < byteperline; m ++){                 mask= 0x80 ;         tem    = *(ptr + m);    //俩个字节一组16位,取第一个字节                for(j=0; j<8; j++)                {            if(tem & mask)            {                LCD_PutPixel(x+ m*8+j, y+i, col) ;            }else                            LCD_PutPixel(x+ m*8+j, y+i, 0) ;            mask = mask >> 1 ;        }            }    }}void LCD_Display_Char((U32 x, U32 y, U32 col, U16 width, U16 height, char *charBase[], char chard){    LCD_Display_mxn(x, y, col,width,  height,charBase[chard - ' ']);}#endif
0 0
原创粉丝点击