📄 lcddriver.c
字号:
#include "Hardware_hook.h"
#include "LCDdriver.h"
#include "PS2.h"
unsigned char const mouse[4*32]={
0xFE,0x00,0xE0,0x00,0xF0,0x00,0xB8,0x00,0x9C,0x00,0x8E,0x00,0x86,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFE,0x00,0xE0,0x00,0xF0,0x00,0xB8,0x00,0x9C,0x00,0x8E,0x00,0x86,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFE,0x00,0xE0,0x00,0xF0,0x00,0xB8,0x00,0x9C,0x00,0x8E,0x00,0x86,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFE,0x00,0xE0,0x00,0xF0,0x00,0xB8,0x00,0x9C,0x00,0x8E,0x00,0x86,0x00,0x00
};
/*-------------------------------------------------------------------------
将量字符串复制到目标变量字符串
--------------------------------------------------------------------------*/
void ReadConst(char const *text,char *buffer,unsigned int lenth)
{
unsigned int i;
for(i=0;i<lenth;i++){
buffer[i]=text[i];
}
return;
}
void System_Init(void)
{
SystemClock_Init();
Init_TimerB();
// SystemTime_Init();
// ADC12_Init();
Uart_Init();
Ioport_Init();
LCD_Init();
// MouseInit();
}
void LCD_Init()
{
LCD_RESET();
LCD_TextInit();
LCD_GraphicInit();
}
void LCD_TextInit(void)//文字
{
unsigned char i,j;
LCD_WriteINS(0x30);
// delay(100);
LCD_WriteINS(0x30);
// delay(37);
LCD_WriteINS(0x34);
LCD_WriteINS(0x34);
LCD_WriteINS(0x02);
LCD_WriteINS(0x30);
LCD_WriteINS(0x40);
for(i=0;i<4*32;i++)
{
j=mouse[i];
LCD_WriteDAT(j);
}
LCD_WriteINS(0x0c);
// delay(100);
LCD_WriteINS(0x01);
// delay(10000);
LCD_WriteINS(0x06);
}
/*===========================================================================================
* 光标函数
* 返回光标位置
============================================================================================*/
unsigned char LCD_LocCursor(void)
{
unsigned char loc;
loc=LCD_ReadINS();
return loc;
}
/*===========================================================================================
* 光标函数
* 设置光标位置、模式
============================================================================================*/
void LCD_SetCursor(unsigned char row,unsigned char line,char mode)//光标
{
unsigned char ins,xloc;
xloc=row%4;
switch(xloc)
{
case 0:
ins=0x80;
break;
case 1:
ins=0x90;
break;
case 2:
ins=0x88;
break;
case 3:
ins=0x98;
break;
default:
return;
}
xloc=line;
if(xloc<8) ins+=xloc;
LCD_WriteINS(0x30);
LCD_WriteINS(ins);
switch(mode)
{
case CLOSE:
ins=0x0c;
break;
case MODE1:
ins=0x0f;
break;
case MODE2:
ins=0x0e;
break;
default:
return;
}
LCD_WriteINS(ins);
}
/*========================================================================================
* 文字显示函数
* row: 0~3;
* line: 0~7;
* *text: 将要输出字符串的地址
========================================================================================*/
void LCD_Text(unsigned char row,unsigned char line,char *text)
{
unsigned char ins,i,xloc;
unsigned char buf[2];
xloc=line;
switch(row)
{
case 0:
ins=0x80;
break;
case 1:
ins=0x90;
break;
case 2:
ins=0x88;
break;
case 3:
ins=0x98;
break;
default:
return;
}
if(xloc<8) ins+=xloc;
LCD_WriteINS(0x30);
LCD_WriteINS(ins);
for(i=0;(text[i]!='\0');i++)//显示结束
{
if(text[i]<0x80)//ASCII char
{
buf[0]=text[i];
if(text[i+1]=='\0')
{
LCD_WriteDAT(text[i]);
return;
}
else if(text[i+1]>0x80)
{
buf[1]=' ';
}
else
{
buf[1]=text[i+1];
}
i++;
}
else//Chinese charactors
{
buf[0]=text[i];
buf[1]=text[i+1];
i++;
}
LCD_WriteDAT(buf[0]);
LCD_WriteDAT(buf[1]);
xloc++;
if(xloc>7)
{
LCD_SetCursor(row+1,0,MODE2);
return;
}
}
return;
}
/*===========================================================================================
* 图像显示部分
============================================================================================*/
/*void LCD_Mode(unsigned char mode)
{
if(mode==GRAPHIC)
{
LCD_WriteINS(0x34);
LCD_WriteINS(0x36);
LCD_WriteINS(0x30);
}
else if(mode==TEXT)
{
}
}
*/
/*
x:0~7
y:0~63
bitmap:32*32
*/
void LCD_GraphicInit(void)//图形模式初始化
{
unsigned char i,j;
LCD_WriteINS(0x34);
for(i=0;i<32;i++){
LCD_WriteINS(0x80+i);
LCD_WriteINS(0x80);
for(j=0;j<16;j++)
LCD_WriteDAT(0x00);
}
for(i=0;i<32;i++){
LCD_WriteINS(0x80+i);
LCD_WriteINS(0x88);
for(j=0;j<16;j++)
LCD_WriteDAT(0x00);
}
LCD_WriteINS(0x30);
}
/*
y: Y location on LCD 0~63;
x: X location on LCD 0~7;
with: with of the picture 0~16;(0~128)
high: highth of the picture 0~63;(0~63)
*/
void LCD_Graphic(unsigned char y,unsigned char x,char *picture,unsigned char with,unsigned char high)//画一个wide*high的位图
{
unsigned char i,j,k,cnt;
if((y>63)||(x>7)) return;
LCD_WriteINS(0x34);
LCD_WriteINS(0x36);
k=((16-x*2)<with)? (16-x*2):with;
for(i=y;i<high+y;i++)
{
cnt=i%32;
j=(i/32)*8;
LCD_WriteINS(0x80+cnt);
LCD_WriteINS(0x80+x+j);
for(j=0;j<k;j++)
{
LCD_WriteDAT(picture[(i-y)*with+j]);
}
if(i>63) return;
}
LCD_WriteINS(0x32);
return;
}
void LCD_ReadGraphic(unsigned char y,unsigned char x,char *picture,unsigned char with,unsigned char high)//读一个wide*high的位图
{
unsigned char i,j,k,cnt;
if((y>63)||(x>7)) return;
k=((16-x*2)<with)? (16-x*2):with;
for(i=y;i<high+y;i++)
{
cnt=i%32;
j=(i/32)*8;
LCD_WriteINS(0x34);
LCD_WriteINS(0x36);
LCD_WriteINS(0x80+cnt);
LCD_WriteINS(0x80+x+j);
LCD_WriteINS(0x32);
for(j=0;j<k;j++)
{
picture[(i-y)*with+j]=LCD_ReadDAT();
}
if(i>63) return;
}
return;
}
void LCD_GraphicSet(char open)//开启图像显示
{
if(open)
{
LCD_WriteINS(0x34);
LCD_WriteINS(0x36);
LCD_WriteINS(0x32);
}
else
{
LCD_WriteINS(0x34);
LCD_WriteINS(0x30);
}
}
/*
显示一张CODE空间里的位图
把图片分成1像素高度的多张小图分别显示
y: Y location on LCD 0~63;
x: X location on LCD 0~127;
with: with of the picture 0~16;(0~128)
high: highth of the picture 0~63;(0~63)
*/
unsigned char picbuffer[16];
void Show_Picture(unsigned char y,unsigned char x,char const *picture,unsigned char with,unsigned char higth,unsigned char FanXian)
{
unsigned char i,j,k;
long int buff;
if(x>127)return;
if(y>63)return;
if(with>16)return;
k=x%16;
for(j=0;j<higth;j++)
{
for(i=0;i<with;i++)
{
if(FanXian) picbuffer[i]=(unsigned char)~picture[j*with+i];
else picbuffer[i]=(unsigned char)picture[j*with+i];
}
if(i<15)picbuffer[i]=0;//先请空后一位然后再进行移位操作。
if(k){//非整数位的时候才进行移位操作
for(i=15;i>2;i-=2){
buff=picbuffer[i-3];
buff<<=8;
buff+=picbuffer[i-2];
buff<<=8;
buff+=picbuffer[i-1];
buff<<=8;
buff+=picbuffer[i];
buff>>=k;
picbuffer[i]=buff;//0-7 bit to [i];
buff>>=8;
picbuffer[i-1]=buff;//8-15bit to [i-1];
}
buff=picbuffer[0];
buff<<=8;
buff+=picbuffer[1];
buff>>=k;
picbuffer[1]=buff;//0-7 bit to [i];
buff>>=8;
picbuffer[0]=buff;//8-15bit to [i-1];
//整行向右移动k位
if(k<9)i=with+1;
else i=with+2;
i=(i>16)? 16:i;
LCD_Graphic(y+j,x/16,(char *)picbuffer,i,1);
}
else LCD_Graphic(y+j,x/16,(char *)picbuffer,with,1);
}
}
/*
单色填充某一个区域,和画图片差不多
y: Y location on LCD 0~63;
x: X location on LCD 0~127;
with: with of the picture 0~16;(0~128)
high: highth of the picture 0~63;(0~63)
color:BLACK or WHITE
*/
void Fill_Area(unsigned char y,unsigned char x,unsigned char with,unsigned char higth,unsigned char color)
{
unsigned char i,j,k;
long int buff;
if(x>127)return;
if(y>63)return;
if(with>16)return;
k=x%16;
for(j=0;j<higth;j++)
{
for(i=0;i<with;i++)
{
if(color) picbuffer[i]=BLACK;
else picbuffer[i]=WHITE;
}
if(i<15)picbuffer[i]=0;//先请空后一位然后再进行移位操作。
if(k){//非整数位的时候才进行移位操作
for(i=15;i>2;i-=2){
buff=picbuffer[i-3];
buff<<=8;
buff+=picbuffer[i-2];
buff<<=8;
buff+=picbuffer[i-1];
buff<<=8;
buff+=picbuffer[i];
buff>>=k;
picbuffer[i]=buff;//0-7 bit to [i];
buff>>=8;
picbuffer[i-1]=buff;//8-15bit to [i-1];
}
buff=picbuffer[0];
buff<<=8;
buff+=picbuffer[1];
buff>>=k;
picbuffer[1]=buff;//0-7 bit to [i];
buff>>=8;
picbuffer[0]=buff;//8-15bit to [i-1];
//整行向右移动k位
if(k<9)i=with+1;
else i=with+2;
i=(i>16)? 16:i;
LCD_Graphic(y+j,x/16,(char *)picbuffer,i,1);
}
else LCD_Graphic(y+j,x/16,(char *)picbuffer,with,1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -