微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > OK6410 LCD操作

OK6410 LCD操作

时间:10-02 整理:3721RD 点击:

1,    LCD操作

在内存在开辟了一块内存,其大小为屏幕像素的个数个字(×4 个字节)

即每个字对应一个像素的颜色值。ARM的显示控制器就是不停的把内存中的颜色值一遍一遍的扫描的LCD的相应的点上。

LCD的屏幕像素显示方向:


2,    描点

void PutPixel(int x,int y,unsigned long plColor){

  volatile unsigned long *p= (volatile unsigned long *)0x54000000;

  int cnt;

  cnt=480*(y-1)+x;

  p[cnt] =plColor;

}

3,    画线

//起点有一些小问题,请高手指正

//画一条线=====================================================

voidpLine(int x0,int y0,int x1,int y1,unsigned long plColor)

{

int long lineHL=0x0,lineVL=0x0;//定义并初始水平与垂直长度,不初始会出错

int long x=0x0,y=0x0;       //定义增长的长度

int xv1=0x0,yv1=0x0;     //定义增长方向+1或-1或0

int long HV=0x0,VH=0x0;     //定义宽高比

int cnt=0x0;             //LCD颜色缓存指针

volatile unsigned long *p = (volatile unsignedlong *)FRAME_BUFFER;

lineHL=x1-x0; //获取水平宽度

lineVL=y1-y0; //获取垂直宽度

//根据首坐标和尾坐标确定x,y的增长方向

if(lineHL==0) {xv1 = 0;}

else if(lineHL>0){xv1 = 1;}

else if(lineHL<0){xv1 =-1;}

if(lineVL==0) {yv1 = 0;}

else if(lineVL>0){yv1 = 1;}

else if(lineVL<0){yv1 =-1;}

//取得水平和垂直宽度的绝对值

lineHL=abs(lineHL);

lineVL=abs(lineVL);

//画线

if(lineHL>=lineVL){//如果水平比垂直宽度长,则让x为增长基准,当x增长使得x:y的比值大于定义的直线x:y时y增长一个单位

    if(lineVL==0){    //垂直方向上没有增长,

        for(x=0;x<lineHL;x++){   //画一条水平线

           x0 += xv1;        //x方向上增长1个单位

           cnt=480*(y0-1)+x0;   //计算点的指针位置

           p[cnt] =plColor;  //描点

        }

    }else if(lineVL != 0){//水平方向上有增长

        HV=(lineHL*10000)/lineVL;   //水平方向与垂直方向的比值,因为不会浮点运算,所以×10000以来获得比值的5位有效数字

        y++;              //使得下面计算时y不能等于0,

        for(x=0;x<lineHL;x++){

           if((abs(x*10000)/abs(y))>HV){//点的位置是否比比值大,

                                    //如果达这说明水平方向的增长已经打与垂直方向的增长了,

                                    //垂直方向要增长

               y0 += yv1;    //y方向增长1个单位

               y++;

           }

           x0 += xv1;        //x方向上增长1个单位

           

           cnt=480*(y0-1)+x0;   //计算点的内存位置

           p[cnt] =plColor;  //描点

        }

        cnt=480*(y1-1)+x1;   //计算点的内存位置

        p[cnt] =plColor;  //描点

    }

}else if(lineHL<lineVL){ //重置比水平宽度长时,算法统上

    if(lineHL==0){

        for(y=0;y<lineVL;y++){

           y0 += yv1;   

           cnt=480*(y0-1)+x0;

           p[cnt] =plColor;  

        }

        cnt=480*(y1-1)+x1;

        p[cnt] =plColor;  

    }else{

        VH=(lineVL*10000)/lineHL;

        x++;

        for(y=0;y<lineVL;y++){

           if((abs(y*10000)/abs(x))>VH){   

               x0 += xv1;   

               x++;

           }

           y0 += yv1;   

           

           cnt=480*(y0-1)+x0;

           p[cnt] =plColor;  

        }

        cnt=480*(y1-1)+x1;

        p[cnt] =plColor;  

    }

}

}

4,    画矩形

voidpBlock(int x0,int y0,int HL,int VL,unsigned long pbColor){

volatile unsigned long *p = (volatile unsignedlong *)FRAME_BUFFER;

int x, y;

int cnt = 0;

cnt=480*(y0-1)+x0;

for (y = 0; y <= VL; y++)

{

    for (x = 0; x <= HL;  x++){

        if(x<480 | y<272){

           p[cnt++] =pbColor;

        }

    }

    cnt=cnt+(480-HL-1);

     }

}

5,    字符输出

int px=0,py=0;//字符的指针位置,全局变量,

voidputc(unsigned char c){

unsigned char strM[8];

int i;

int x,y;

if(c == '\n'){//换行

    px=0;

    py=py+8;

}

else if(c == 0x0D){//到行首

    px=0;

/*      py=py+8;*/

}

else if(c == 0x08){//回格

    px-=8;

}else{//字符

    for(i=0;i<8;i++){//获得字模

        strM=fontdata_8x8[c*8+i];   

    }

           //描点字模

    for (y=0;y<8;y++){//列

        for (x = 0; x<8; x++){//行

           if (strM[y]& (0x80 >> x)){//x位是否为1

               PutPixel(px+x,  py+y, 0xff0000);//描点,红色

           }else{

               PutPixel(px+x,  py+y, 0);//黑色

           }

        }

    }

    if(px+8>=479){//到行尾,换行

        px=0;py+=8;

    }else{

        px+=8;

    }

    if(py+8>=279)//到尾,清屏,从头开始

    {

        clear(0x0);

        py=0;

    }

}

}


thanks

thianks

看看

xiexie

谢谢小编!!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top