📄 44blcd.c
字号:
#include <string.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"
/*volatile char which_int=0;*/
/*液晶屏初始化*/
void LcdInit(void)
{
Lcd_MonoInit();
clrscreen();
}
/*液晶屏系统配置初始化*/
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 row,U8 col)
{
U8 *pbuffer;
U8 i,a;
U32 k;
pbuffer =(U8*) LcdBuffeer;
k=col+row*20;
if(j==0)j=0; else j++;
for(i=0;i<16;i++)
{
a=ascii8x16[j][i];
pbuffer[k+i*20]=ascii8x16[j][i]; //从字库中调出到显示寄存器
}
}
/*图片显示输出*/
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(U8 rowfirst,U8 colfirst, char *p)
{
U8 q,row,col;
int i,b,c,k;
static int j;
b=colfirst;
i=0;j=0;
row=rowfirst;
while(p[i]!='\0')
{
if(p[i]=='\n') //遇到换行符,则换行
row+=18;
row=rowfirst+(i/20)*18; //确定行值
if(240-row<16){Delay(2000);row=0;} //若行到最大值,延时后从首行开始
col=b+i%20;
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--;
q=p[i];
i++;
Putedot((q-0x20),row,col); //输出单个字符
}
}
/*测试用,图片显示*/
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 lcddrawbox(int V_offset,int H_offset,int V_size,int H_size)
{
U32 i,j,c,col,row;
U8 *pbuffer;
U8 a;
U32 k;
pbuffer =(U8*) LcdBuffeer;
for(i = 0; i< V_size;i++)
for(j = 0;j< H_size ;j++)
{
row=V_offset+i;
col=V_offset+i;
c=V_size%4;
switch(c) //显示的列地址和寄存器的列地址的转换
{
case 1: k=4;break;
case 2: k=3;break;
case 3: k=2;break;
case 0: k=1;break;
}
V_size=(int)((V_size-1)/4)*4+k; //寄存器的列地址
if(V_size==0)col=0; //判断是否为零,为零保持,否则减一
else V_size--;
pbuffer =(U8*) LcdBuffeer;
k=V_size+row*20;
if(j==0)j=0; else j++;
for(i=0;i<16;i++)
{
a=ascii8x16[j][i];
pbuffer[k+i*20]=ascii8x16[j][i]; //从字库中调出到显示寄存器
}
}
}
/*清屏函数*/
void clrscreen(void)
{
int i,j;
for (i=0;i<240;i++)
for (j=0;j<320;j++)
{
LcdBuffeer[j][i]=0x0;//(0x0FFFFFFFF);
}
}
void Main()
{
//char *ch="Hello!";
Port_Init();
*((U32 *)PLLCON) = 0x48032; //set clock to be 40M
Uart_Init(0,115200);
LcdInit();
displaylcd();
displaylcd4();
clrscreen();
printchar(0,0,"\nhello!\nThe LCD is OK!\\n temp_data = (plmmBitmap[i*4] << 24) + (plmmBitmap[i*4+1] << 16)plmmBitmap[i*4+3]");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -