?? 44blcd.c
字號:
#include <string.h>
#include <math.h>
#include "inc\option.h"
#include "inc\def.h"
#include "inc\44b.h"
#include "inc\44blib.h"
#include "inc\44blcd.h"
#include "inc\PLMM.h"
#include "inc\test.h"
#include "inc\ascii.h"
#include "inc\hanzi.h"
/*volatile char which_int=0;*/
/*液晶屏初始化*/
U16 row,col;
void LcdInit(void)
{
Lcd_MonoInit();
clrscreen();
}
/*打點函數*/
void Lcd_Point()
{
U8 *pbuffer,c;
U16 k,t;
U16 a,b;
a=row;b=col;
if(240-row<16){Delay(2000);row=0;} //若行到最大值,延時后從首行開始
c=(col/8+1)%4;
switch(c) //顯示的列地址和寄存器的列地址的轉換
{
case 1: k=4;break;
case 2: k=3;break;
case 3: k=2;break;
case 0: k=1;break;
}
t=(int)(col/32)*4+k; //寄存器的列地址
pbuffer =(U8*) LcdBuffeer;
pbuffer[t-1+row*20]|=0x80>>(col%8); //打點,不破壞原有數據
}
/*定位函數*/
void Lcd_Locate(void)
{
U16 c;
U8 k;
if(240-row<16){Delay(2000);row=0;} //若行到最大值,延時后從首行開始
col++;
c=col%4;
switch(c) //顯示的列地址和寄存器的列地址的轉換
{
case 1: k=4;break;
case 2: k=3;break;
case 3: k=2;break;
case 0: k=1;break;
}
col=(int)((col-1)/4)*4+k; //寄存器的列地址
if(col==0)col=0; //判斷是否為零,為零保持,否則減一
else col--;
}
/*液晶屏系統配置初始化*/
void Lcd_MonoInit(void)
{
//160x240 1bit/1pixel LCD
#define MVAL_USED 0
rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);
//LINEBLANK=10 (without any calculation)
rLCDSADDR1= (0x0<<27) | ( ((U32)LcdBuffeer>>22)<<21 ) | M5D((U32)LcdBuffeer>>1);
// monochrome, LCDBANK, LCDBASEU
rLCDSADDR2= M5D( (((U32)LcdBuffeer+(SCR_XSIZE*LCD_YSIZE/8))>>1) ) | (MVAL<<21);
rLCDSADDR3= (LCD_XSIZE/16) | ( ((SCR_XSIZE-LCD_XSIZE)/16)<<9 );
rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
// enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
}
/*液晶屏單個字符輸出*/
void Putedot(U8 j ,U8 f)
{
U8 *pbuffer;
U16 i,a;
U32 k;
pbuffer =(U8*) LcdBuffeer;
k=col+row*20;
for(i=0;i<16;i++)
{
if(f==1)a=~ascii8x16[j][i];
else a=ascii8x16[j][i];
pbuffer[k+i*20]=a; //從字庫中調出到顯示寄存器
}
}
/*液晶屏單個漢字輸出*/
void Putedet(U32 j ,U8 f)
{
U16 *pbuffer,p;
U16 i,a,k;
pbuffer =(U16*) LcdBuffeer;
k=col+row*10;
for(i=0;i<16;i++)
{
if(f==1)a=~((hanzi[j][i*2+1]<<8)+hanzi[j][i*2]);
else a=(hanzi[j][i*2]<<8)+hanzi[j][i*2+1];
pbuffer[k+i*10]=a; //從字庫中調出到顯示寄存器
}
}
/*圖片顯示輸出*/
void displaylcd()
{
U32 *pbuffer,temp_data;
int i;
clrscreen();
pbuffer =(U32*) LcdBuffeer;
for(i = 0; i< (4800/4) ;i++)
{
temp_data = (plmmBitmap[i*4] << 24) + (plmmBitmap[i*4+1] << 16) + (plmmBitmap[i*4+2] << 8) +(plmmBitmap[i*4+3]);
pbuffer[i] = temp_data;
}
}
/*字符串顯示輸出*/
void printchar( U16 rowfirst,U16 colfirst, char *p,U8 f)
{
U16 qq;
U16 q;
int i,b,c=0;
static int j;
b=colfirst;
i=0;j=0;
row=rowfirst;
while(p[i]!='\0')
{
q=p[i];
row=rowfirst+(i/20)*18; //確定行值
if(240-row<16){Delay(2000);row=0;} //若行到最大值,延時后從首行開始
col=b+i%20;
if(q&0x80)
{
col=b+(i/2)%10;
i++;
qq=p[i];
q=(q-0xB0)*94+(qq-0xA1); //取出漢字內碼
if(col%2==0)col++;
else col--;
Putedet(q,f);
}
else
{
col=b+i%20;
Lcd_Locate();
Putedot((q-0x20),f); //輸出單個字符
}
i++;
}
}
/*測試用,圖片顯示*/
void displaylcd4()
{
U32 *pbuffer,temp_data;
int i;
clrscreen();
pbuffer =(U32*) LcdBuffeer;
for(i = 0; i< (1100/4) ;i++)
{
temp_data = (test3[i*4] << 24) + (test3[i*4+1] << 16) + (test3[i*4+2] << 8) +(test3[i*4+3]);
pbuffer[i] = temp_data;
}
}
/*畫線函數*/
void Lcd_Line(int V_begin,int H_begin,int V_end,int H_end)
{
int delta_x,delta_y;//xerr,yerr存儲偏移量
int incx,incy; //存儲斜率方向判斷數據
col=V_begin;
row=H_begin;
do{
delta_x=distance(V_begin,V_end);
delta_y=distance(H_begin,H_end);
incx=compare(delta_x,delta_y);
incy=compare(delta_y,delta_x);
if(incx){col++;Lcd_Point();V_begin++;}
if(incy){row++;Lcd_Point();H_begin++;}
}while(delta_x>0||delta_y>0);
}
/*畫矩形函數*/
void lcddrawbox(int V_offset,int H_offset,int V_size,int H_size)
{
U16 i,j;
for(i = 0; i< H_size;i++)
{
for(j = 0;j< V_size ;j++)
{
row=H_offset+i;
col=V_offset+j;
Lcd_Point();
}
}
}
/*清屏函數*/
void clrscreen(void)
{
int i,j;
for (i=0;i<240;i++)
for (j=0;j<320;j++)
{
LcdBuffeer[j][i]=0x0;//(0x0FFFFFFFF);
}
}
/*畫正弦波*/
/*ox,oy為坐標原點,t為周期,h為幅值*/
void Lcd_sin(int ox,int oy,float t,int h)
{
U8 s;
int a,b;
U16 i;
a=b=0;
col=ox;
row=oy;
Lcd_Point();
for(i=0;i<160;i++)
{
b=a;
a=(float)h*sin((float)i/t*2.0*pi);
col=ox+i;
while(a!=b)
{
s=compare(a,b);
row=oy-b;
if(s==1)b++;
else b--;
Lcd_Point();
}
}
}
/*畫正弦波*/
/*ox,oy為坐標原點,t為周期,h為幅值*/
void Lcd_sin1(int ox,int oy,float t,int h)
{
U8 s;
int a,b;
U16 i;
a=b=0;
col=ox;
row=oy;
Lcd_Point();
for(i=0;i<240;i++)
{
b=a;
a=(float)h*sin((float)i/t*2.0*pi);
row=ox+i;
while(a!=b)
{
s=compare(a,b);
col=oy-b;
if(s==1)b++;
else b--;
Lcd_Point();
}
}
}
/*畫圓*/
/*ox,oy為坐標原點,r為半徑,h為線寬*/
void Lcd_cicle(int ox,int oy,int r,int h)
{
U8 s;
U16 i,j;
int a,b,a1,b1;
a=b=0;
a1=b1=0;
col=ox+r;
row=oy;
Lcd_Point();
for(i=0;i<h;i++)
{
r=r-i;
for(j=ox-r;j<=ox+r;j++)
{
b=a;
a=sqrt(r*r-(j-ox)*(j-ox));
col=j;
while(a!=b)
{
s=compare(a,b);
row=oy-b;
if(s==1)b++;
else b--;
Lcd_Point();
}
a1=-sqrt(r*r-(j-ox)*(j-ox));
while(a1!=b1)
{
s=compare(a1,b1);
row=oy-b1;
if(s==1)b1++;
else b1--;
Lcd_Point();
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -