OK6410 LCD操作
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
谢谢小编!!