C语言驱动之配置LCD(基于S3C2440开发板)
发布日期:2021-05-26 20:05:02 浏览次数:9 分类:技术文章

本文共 10989 字,大约阅读时间需要 36 分钟。

源码地址:

lcd.c文件如下

#include 
#include
#include "lcd.h"#include "type.h"//1.LCDCON1的控制寄存器参数#define CLKVAL    (4 << 8)    //设置公式:VCLK=HCLK / [(CLKVAL + 1) × 2]    (CLKVAL≥0)#define MMODE        (0 << 7)    //VM触发频率,TFT不用,设置为0#define    PNRMODE    (3 << 5)    //显示模式 TFT 11#define    BEEMODE (12 << 1)    //像素点位数,TFT  16位模式:1100#define    ENVID     (0 << 0)    //控制视频输出,也就是EN位,先默认关闭#define LCDCON_VAL1    (CLKVAL | MMODE | PNRMODE | BEEMODE | ENVID)//2.LCDCON2#define    VBPD        (2 << 24)    //垂直同步信号周期后无效的行数#define    LINEVAL    ((LCD_HIGH-1) << 14)    //LCD的垂直尺寸(高度)#define    VFPD        (2 << 6)        //垂直同步周期信号#define    VSPW        (10 << 0)#define LCDCON_VAL2    (VBPD | LINEVAL | VFPD | VSPW)//LCDCON3#define        HBPD        (2 << 19)#define        HOZVAL    ((LCD_WIDTH-1) << 8)#define        HFPD        (2 << 0)#define        LCDCON_VAL3    (HBPD | HOZVAL | HFPD)//LCDCON4#define        HSPW        (40 << 0)        //TYP=41标准再减1#define        LCDCON_VAL4    HSPW//LCDCON5#define        BPP24BL        (0 << 12)#define        FRM565        (1 << 11)//时序图引脚翻转配置#define        INVVCLK        (0x0 << 10)#define        INVLINE        (0x1 << 9)#define        INVFRAME    (0x1 << 8)#define        INVVD            (0x0 << 7)#define        INVVDEN        (0x1 << 6)#define        INVPWREN    (0x0 << 5)#define        INVLEND        (0x0 << 4)#define     PWREN            (0 << 3)#define        ENLEND        (0 << 2)#define     BSWP        (0x0 << 1)#define        HWSWP        (0x1 << 0)#define     LCDCON_VAL5    (BPP24BL | FRM565 | INVVCLK | INVLINE | \                                                INVFRAME | INVVD | INVVDEN | INVPWREN | \                                                INVLEND | PWREN | ENLEND | BSWP | HWSWP)static volatile    rgb_t G_lcdBuffer[LCD_HIGH][LCD_WIDTH];//LCD缓冲区,用来给数据#define LCDBASE    ((unsigned long)G_lcdBuffer)//配置缓冲区地址#define        LCDBANK        (((LCDBASE >>22) & 0x1FF) << 21)#define        LCDBASEU    ((LCDBASE >>1) & 0x1FFFFF << 0)#define        vLCDADDR1    (LCDBANK | LCDBASEU)#define        LCDBASEL        (((LCDBASE + LCD_WIDTH * LCD_HIGH * 2) >> 1) & 0x1FFFFF)#define        vLCDADDR2        LCDBASEL#define        OFFSIZE        0x0#define        PAGEWIDTH (LCD_WIDTH)#define        vLCDADDR3        (OFFSIZE | PAGEWIDTH)//帧缓冲区 一帧的数据,所有的像素点,16位typedef unsigned short RGB_COLOR;volatile RGB_COLOR frameBuffer[LCD_HIGH][LCD_WIDTH];//列是宽,480void ptr(char picture[]){    memcpy((char *)G_lcdBuffer,picture,480*272*2);}/***************************************** 函数名:void lcd_init(void);* 函数功能:* 函数参数:* 函数返回值;* 修改时间:*****************************************/void lcd_init(){    //1.配置引脚    GPCCON = 0xAAAAFEAB;    GPDCON = 0xAAAAAAAA;    GPGCON |= (0x3 << 8);         //2.配置寄存器,控制寄存器    LCDCON1 =LCDCON_VAL1;    LCDCON2 =LCDCON_VAL2;    LCDCON3 =LCDCON_VAL3;    LCDCON4 =LCDCON_VAL4;    LCDCON5 =LCDCON_VAL5;        //3.配置缓冲区地址    LCDSADDR1 = vLCDADDR1;    LCDSADDR2 = vLCDADDR2;    LCDSADDR3 = vLCDADDR3;        //4.打开LCD的电源    BIT_SET(LCDCON5,3);    BIT_SET(LCDCON1,0);        memset((void*)G_lcdBuffer,110,sizeof(G_lcdBuffer));    lcd_clean(0,0,LCD_WIDTH,LCD_HIGH,BLUE);} /***************************************** 函数名:void lcd_deinit(void);* 函数功能:* 函数参数:* 函数返回值;* 修改时间:*****************************************/void lcd_deinit(){}/********************************* *函数名称:void LCD_setpixel(int x, int y, rgb_t color) *函数功能:打点 *函数参数: *函数返回值:无*********************************/void lcd_setpixel(int x, int y, rgb_t color){    if(x < 0 || x >=LCD_WIDTH || y < 0 || y >= LCD_HIGH)        return ;        G_lcdBuffer[y][x] = color;}    /***************************************************************函数名:void lcd_clean(int x,int y,int w,int h,rgb_t color);函数功能:把屏幕的任意大小的一块区域清成“color”颜色函数参数:@int x :起始横坐标@int y :起始纵坐标@int w :宽    @int h :高@rgb_t color:填充颜色*******************************************************************/void lcd_clean(int x,int y,int w,int h,rgb_t color){    int i;        if(x < 0 || x >=LCD_WIDTH || y < 0 || y >= LCD_HIGH)        return ;        for(i = x; i < x+w; i++)    {        G_lcdBuffer[y][i] = color;    }        for(i = 1; i < h; i++)    {        memcpy((void*)&G_lcdBuffer[y+i][x], (void*)&G_lcdBuffer[y][x], w*sizeof(rgb_t));    }}/***************************************************************函数名:void lcd_showpic(int x,int y,int w,int h,char *pic)函数功能:显示一张烧在内存里面的图函数参数:@int x :起始横坐标@int y :起始纵坐标@int w :宽    @int h :高@char *pic:图片地址*******************************************************************/void lcd_showpic(int x,int y,int w,int h,char *pic){    int i,j;    rgb_t color;    for(i=0;i
< 16;i++)    {        word = (pWord.data[i * 2]<<8)|pWord.data[i*2+1];        for(j=0;j < 16;j++)        {            if(word&(1<<(15-j)))            {                    lcd_setpixel(x+j,y+i,fgcolor);            }            else                lcd_setpixel(x+j,y+i,bgcolor);        }    }    }/***************************************************************函数名:void lcd_showCn(int x,int y,char cn[2],rgb_t fgcolor,rgb_t bgcolor)函数功能:根据输入显示一个烧在内存中文字符函数参数:@int x :起始横坐标@int y :起始纵坐标@char en[128]:要打印的中英文字符串@rgb_t fgcolor:前景色即字符的颜色@rgb_t bgcolor:背景色即字符背后的颜色*******************************************************************/void lcd_Swords(int x,int y,char *cn,rgb_t fgcolor,rgb_t bgcolor){    char word[2];    int i;    for(i=0;i<=128;i++)    {        word[0]=cn[i];        if(word[0]==0)        {            break;        }            if((int)word[0] > 0xA0)        {            i++;            word[1]=cn[i];            lcd_showCn(x+(i-1)*10,y,word,fgcolor,bgcolor);            word[1]=0;        }        else            lcd_showEn(x+i*10,y,word[0],fgcolor,bgcolor);    }}void lcd_myshowCn(int x,int y,char cn[2],rgb_t fgcolor){    int row = cn[0] - 0xA1;    int col = cn[1] - 0xA1;    cn_word_t pWord = CNBASE[row*94+col];//当前汉字的点阵数据    int i,j;    short word = (pWord.data[0]<<8)|pWord.data[1];        for(i=0;i < 16;i++)    {        word = (pWord.data[i * 2]<<8)|pWord.data[i*2+1];        for(j=0;j < 16;j++)        {            if(word&(1<<(15-j)))            {                    lcd_setpixel(x+j,y+i,fgcolor);            }        }    }    }void lcd_myshowEn(int x,int y,char en,rgb_t fgcolor){    int index = en -0x20;    int i,j;    for(i=0;i<16;i++)    {        for(j=0;j<8;j++)        {            if(ENBASE[index].data[i]&(1<<(7-j)))                lcd_setpixel(x+j,y+i,fgcolor);        }    }}void lcd_print(int x,int y,char *str,rgb_t fgcolor,rgb_t bgcolor){    int pos = 0;    while(*str != '\0')    {        if(*str & 0x80)        {            lcd_showCn(x+pos*18,y,str,fgcolor,bgcolor);            str += 2;        }        else        {                        lcd_showEn(x+pos*9,y,*str,fgcolor,bgcolor);            str++;        }        pos++;    }}/** * 函数名:LCD_SetBackGround * 作用:打印背景颜色 * 参数: *         @color: 打印的颜色 */   void LCD_SetBackGround(rgb_t color){    int i, j;    for(j = 0; j < LCD_WIDTH; j++)    {        G_lcdBuffer[0][j] = color;    }    for(i = 1; i < LCD_HIGH; i++)    {        memcpy((void *)(G_lcdBuffer+i), (void *)G_lcdBuffer, sizeof(G_lcdBuffer)/LCD_HIGH);    }}void lcd_newprint( unsigned x, unsigned y,char *string,rgb_t fgcolor,rgb_t bgcolor){    unsigned i, len = strlen(string);    for(i = 0; i < len;)    {        if((unsigned)string[i] < 0x80)        {            lcd_showEn(x + i*8, y,string[i], fgcolor,  bgcolor);            i++;        }        else        {            lcd_showCn( x + i*8, y,string+i, fgcolor,  bgcolor);            i += 2;        }    }}

----------------------------------------------------华丽的分割线----------------------------------------------------------------

lcd.h如下

#ifndef    __LCD_H__#define    __LCD_H__#include "type.h"#define    LCD_HIGH     (272)#define    LCD_WIDTH    (480)#define     PICADD ((char *)0x140000)#define     PIC1     ((char *)0x80000)#define     PIC2     ((char *)0xC0000) #define     PIC3     ((char *)0x100000)#define        ENBASE        ((en_word_t*)0x1C0000)#define        CNBASE        ((cn_word_t*)0x180000)#define  PICBASE1   ((char *)0x31000000) //图片1的位置//RGB565颜色设置方式#define RGB565(r,g,b)        (((r & 0x1f) << 11) | ((g & 0x3f) << 5) | ((b & 0x1f) << 0))#define   BLACK     RGB565(0,0,0)      //黑色    #define   NAVY      RGB565(0,0,50)    //深蓝色#define   PINK      RGB565(255, 128, 255)  //粉色#define   BGCOLOR   RGB565(238, 120, 23)#define   DGREEN    RGB565(0,50,0)    //深绿色  #define   DCYAN     RGB565(0,127,127)  //深青色       #define   MAROON    RGB565(50,0,0)    //深红色   #define   GREEN     RGB565(0,255,0)    //绿色    #define   RED       RGB565(255,0,0)    //红色     #define   PURPLE    RGB565(127,0,127)  //紫色    #define   OLIVE     RGB565(127,127,0)  //橄榄绿#define   CGRAY     RGB565(240,240,240)///灰白色#define   LGRAY     RGB565(88,88,88)///灰白色   #define   DGRAY     RGB565(30,30,30)///浅紫色      #define   BLUE      RGB565(0,0,255)    ///蓝色        #define   CYAN      RGB565(0,255,255)  ///青色     #define   MAGENTA   RGB565(255,0,255)  ///品红        #define   YELLOW    RGB565(255,255,0)  ///黄色   #define   WHITE     RGB565(255,255,255)///白色 void ptr(char picture[]);    /***************************************** 函数名:void lcd_init(void);* 函数功能:* 函数参数:* 函数返回值;* 修改时间:*****************************************/void lcd_init(void); /***************************************** 函数名:void lcd_deinit(void);* 函数功能:* 函数参数:* 函数返回值;* 修改时间:*****************************************/void lcd_deinit(void);/***************************************************************函数名:void lcd_clean(int x,int y,int w,int h,rgb_t color);函数功能:把屏幕的任意大小的一块区域清成“color”颜色函数参数:@int x :起始横坐标@int y :起始纵坐标@int w :宽    @int h :高@rgb_t color:填充颜色*******************************************************************/void lcd_clean(int x,int y,int w,int h,rgb_t color);/********************************* *函数名称:void LCD_setpixel(int x, int y, rgb_t color) *函数功能:打点 *函数参数: *函数返回值:无*********************************/void lcd_setpixel(int x, int y, rgb_t color);void lcd_showpic(int x,int y,int w,int h,char *pic);void lcd_showpic2s(int x,int y,int w,int h,char *pic);void lcd_showEn(int x,int y,char en,rgb_t fgcolor,rgb_t bgcolor);void lcd_showCn(int x,int y,char cn[2],rgb_t fgcolor,rgb_t bgcolor);void lcd_print(int x,int y,char *str,rgb_t fgcolor,rgb_t bgcolor);void lcd_Swords(int x,int y,char *cn,rgb_t fgcolor,rgb_t bgcolor);void LCD_SetBackGround(rgb_t color);void lcd_newprint( unsigned x, unsigned y,char *string,rgb_t fgcolor,rgb_t bgcolor);void lcd_myshowCn(int x,int y,char cn[2],rgb_t fgcolor);void lcd_myshowEn(int x,int y,char en,rgb_t fgcolor);void lcd_myprint(int x,int y,char *str,rgb_t fgcolo);void lcd_print1(char *string, unsigned starX, unsigned starY, rgb_t bg_color, rgb_t font_color);void LCD_SetPic(unsigned starX, unsigned starY, unsigned w, unsigned h, char *pic);void LCD_SetPixel(unsigned x, unsigned y, rgb_t color);void lcd_showEN(char en,int x,int y,rgb_t bgcolor,rgb_t fgcolor);void lcd_showCN(char cn[2], int x, int y,rgb_t bgcolor, rgb_t fgcolor);#endif

 

转载地址:https://blog.csdn.net/Gaodes/article/details/81775882 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C语言驱动之配置串口(基于S3C2440开发板)
下一篇:C语言驱动之配置定时器(基于S3C2440开发板)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月09日 09时44分08秒