⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcddriver.c

📁 LCD显示和驱动以ps鼠标
💻 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 + -