📄 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 + -