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

📄 lcd_fun.c

📁 该C程序是基于MSP430的液晶显示程序
💻 C
字号:
#include "Global.h"
#include "LCD_LTM024.h"
#include "LCD_ASCII.h"

uint16 SearchHZ(uint16 hzaddr)//找出汉字地址
{
  uint16 i;
  for(i=0;  i<0xff; i++)
  {
    if((HzToGB[i*2] == (hzaddr>>8)) && (HzToGB[i*2+1] == (uint8)hzaddr))
      break;
  }
  return i*32;
}
int PrintCHZ(uint8 xs, uint16 ys, uint16 chzaddr, uint8 fb)//写一个字符或汉字
{
  int i;
  int j,k;
  uint8  x;
  uint16 y;
  uint16 Temp[129];
  unsigned char data;
  x = xs;
  y = ys;
  if(chzaddr>0xA0)
  {
    if(x+16 > glcd_XMAX)
      return -1;
    chzaddr = SearchHZ(chzaddr);
    for(i=0; i<2; i++)
    {
      y = ys;
      LCD_SetRec(x+i*8, y, 7, 15);//设置窗口大小
      LCD_WrReg(0x0F);//Read 
      for(j=0; j<129; j++)
      {
        Temp[j] = LCD_RdData16();//Read 16-bit Data
      }
      for(j=0; j<128; j++)
      {
        Temp[j] &= 0xff00;
        Temp[j] |= Temp[j+1]&0x00ff;
      }
      LCD_SetRec(x+i*8, y, 7, 15);//设置窗口大小
      LCD_WrReg(0x0E);//Write 
      for(j=0; j<16; j++)
      {
        if(fb)
        {
          data = GB[chzaddr+i+j*2];
        }
        else
        {
          data=~GB[chzaddr+i+j*2];
        }
        for(k=0; k<8; k++,data <<= 1)
        {
          if(data&0x80)
          {
            LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
          }
          else
          {
            LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
          }
        }
        y++;
        if(y>glcd_YMAX)
        {
          return -1;
        }
      }
    }
  }
  else
  {
    if(x+8 > glcd_XMAX)
      return -1;
    chzaddr = (chzaddr-' ')*16;
//    LCD_RdData16();
//    LCD_RdData8();
    LCD_SetRec(x, y, 7, 15);//设置窗口大小
    LCD_WrReg(0x0F);//Read 
    for(i=0; i<128; i++)
    {
      Temp[i] = LCD_RdData16();//Read 16-bit Data
    }
    for(j=0; j<128; j++)
    {
      Temp[j] &= 0xff00;
      Temp[j] |= Temp[j+1]&0x00ff;
    }
    LCD_SetRec(x, y, 7, 15);//设置窗口大小
    LCD_WrReg(0x0E);//Write 
    for(j=0; j<16; j++)
    {
      if(fb)
      {
        data = nAsciiDot[chzaddr+j];
      }
      else
      {
        data = ~nAsciiDot[chzaddr+j];
      }
      for(k=0; k<8; k++,data <<= 1)
      {
        if(data&0x80)
        {
          LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
        }
        else
        {
          LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
        }
      }
      y++;
      if(y>glcd_YMAX)
      {
        return -1;
      }
    }
  }
  return 0;
}

int PrintCHZ2(uint8 xs, uint16 ys, uint16 chzaddr, uint8 fb)//写一个字符或汉字
{
  uint16 i,l,m;
  uint16 j,k;
  uint8  x;
  uint16 y;
  uint16 Temp[8*CHARACTER+1];
  unsigned char data;
  x = xs*CHARACTER/2;
  y = ys;
  if(chzaddr>0xA0)
  {
    if(x+CHARACTER > glcd_XMAX)
      return -1;
    chzaddr = SearchHZ(chzaddr);
    for(i=0; i<2; i++)
    {
      y = ys;
      LCD_SetRec(x+i*CHARACTER/2, y, CHARACTER/2-1, CHARACTER-1);//设置窗口大小
      LCD_WrReg(0x0F);//Read 
      for(j=0; j<8*CHARACTER+1; j++)
      {
        Temp[j] = LCD_RdData16();//Read 16-bit Data
      }
      for(j=0; j<8*CHARACTER; j++)
      {
        Temp[j] &= 0xff00;
        Temp[j] |= Temp[j+1]&0x00ff;
      }
      LCD_SetRec(x+i*CHARACTER/2, y, CHARACTER/2-1, CHARACTER-1);//设置窗口大小
      LCD_WrReg(0x0E);//Write 
      for(j=0; j<16; j++)
      {
        for(m=0; m<CHARACTER/16; m++)//y^^
        {
          if(fb)
          {
            data = GB[chzaddr+i+j*2];
          }
          else
          {
            data=~GB[chzaddr+i+j*2];
          }
          for(k=0; k<8; k++,data <<= 1)
          {
            for(l=0;l<CHARACTER/16;l++)//x^^
            {
              if(data&0x80)
              {
                LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
              }
              else
              {
                LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
              }
            }
          }
          y++;
          if(y>glcd_YMAX)
          {
            return -1;
          }
        }
      }
    }
  }
  else
  {
    if(x+CHARACTER/2 > glcd_XMAX)
      return -1;
    chzaddr = (chzaddr-' ')*16;
    LCD_SetRec(x, y, CHARACTER/2-1, CHARACTER-1);//设置窗口大小
    LCD_WrReg(0x0F);//Read 
    for(j=0; j<8*CHARACTER+1; j++)
    {
      Temp[j] = LCD_RdData16();//Read 16-bit Data
    }
    for(j=0; j<8*CHARACTER; j++)
    {
      Temp[j] &= 0xff00;
      Temp[j] |= Temp[j+1]&0x00ff;
    }
    LCD_SetRec(x, y, CHARACTER/2-1, CHARACTER-1);//设置窗口大小
    LCD_WrReg(0x0E);//Write 
    for(j=0; j<16; j++)
    {
      for(m=0; m<CHARACTER/16; m++)//y^^
      {
        if(fb)
        {
          data = nAsciiDot[chzaddr+j];
        }
        else
        {
          data=~nAsciiDot[chzaddr+j];
        }
        for(k=0; k<8; k++,data <<= 1)
        {
          for(l=0;l<CHARACTER/16;l++)//x^^
          {
            if(data&0x80)
            {
              LCD_WrData16(~Temp[k+j*8]);//Write 16-bit data
            }
            else
            {
              LCD_WrData16(Temp[k+j*8]);//Write 16-bit data
            }
          }
        }
        y++;
        if(y>glcd_YMAX)
        {
          return -1;
        }
      }
    }
  }
  return 0;
}
/*
void DrawIcon(uint8 xs, uint8 ys, uint8 fb, unsigned char const *icon)//画图标
{
  uint8 i;
  uint8 j;
  uint16 addr;
    for(j=0; j<16; j++)
    {
      addr =  glcd_G_BASE + ys*30 + xs;
      glcd_set_address(addr);
      glcd_cput(0xB0);   //自动写模式
      for(i=0; i<2; i++)
      {
        if(fb)
        {
          glcd_dput(*icon++);
        }
        else
        {
          glcd_dput(~(*icon++));
        }
      }
      glcd_cput(0xB2);
      ys++;
      if(ys>glcd_YMAX)
      {
        return;
      }
    }
}
*/
uint16 StrLen(uint8 * str)//找字符串长度
{
  uint16 i;
  for(i=0; (*str)!='\0'; i++)
  {
    str++;
    if(i>1000)
      return 0;
  }
  return i;
}

int LCD_Printf(uint8 xs, uint16 ys, int fb, uint8 Total, uint8 *str)//显示字符,汉字串
{
  uint16 i;
  uint8  x;
  uint16 y;
  uint8  hzl;
  uint8  hzh;
  uint16 hz;
  x = xs;
  y = ys;
  for(i=0; i<Total; i++)
  {
    if(*str >= 0xA0)
    {
      hzh = *(str++);
      if(*str >= 0xA0)//是汉字
      {
        if((x+2) > (xs+Total))
        {
          PrintCHZ(x, y, ' ', fb);//显示空白
          break;
        }
        if((x+2) > glcd_XMAX/8)//此处高修改过原本是(>=),可能使最右边显示半个字或者影响右对齐
        {
          y += 16;
          if(y > glcd_YMAX) //写出界
            break;
          x = glcd_XMIN;
        }
        hzl = *(str++);
        hz   = hzh;
        hz <<= 8;
        hz  |= hzl;
        PrintCHZ(x, y, hz, fb);
        x += 2;
        i ++;
      }
      else
      {
        i ++;
      }
    }
    else//是字符
    {
      if(x > (glcd_XMAX/8)-1)//满一行
      {
        y += 16;
        x = glcd_XMIN;
        if(y > glcd_YMAX) //写出界
          break;
      }
      PrintCHZ(x, y, *(str++), fb);//显示字符
      x += 1;
    }
  }
  return i;
}

int Printfc(uint8 xs, uint16 ys, int fb, uint8 LBytes, uint8 Mode, uint8 *str)//格式输出
{
  uint16 Total;//总字符数
  uint16 Bytes;
  uint16 LLine;//最后一行字符数
  uint16 i;
  uint16 k;
  uint16 x;
  uint16 y;
  if(xs > glcd_XMAX/8)//超出范围
    return -1;
  Total = StrLen(str);
  Bytes = 0;
  x = xs;
  y = ys;
  if((xs+LBytes) > glcd_XMAX/8)
  {
    LBytes = glcd_XMAX/8 - xs;
  }
  for(; (Total-Bytes) >= LBytes;)
  {
    Bytes += LCD_Printf(x, y, fb, LBytes, &str[Bytes]);
    y += 16;
    if(y > (glcd_YMAX-16))
    {
      x += LBytes+1;    //Next Page
      y = ys;
      if(x > glcd_XMAX/8) //出界
        return -1;
    }
  }
  LLine = Total - Bytes;//最后一行个数
  switch(Mode)
  {
  case CCENTER:
    {
      i = (LBytes-LLine)/2;//中间
      for(k=0; k<i && LLine!=0; k++)
      {
        PrintCHZ(x+k, y, ' ', fb);//显示空白
      }
      for(k=0; k<(LBytes-LLine-i) && LLine!=0; k++)
      {
        PrintCHZ(x+LLine+i+k, y, ' ', fb);//显示空白
      }
    }
    break;
  case CLEFT:
    {
      i = 0;//左对齐
      for(k=0; k<(LBytes-LLine) && LLine!=0; k++)
      {
        PrintCHZ(x+LLine+k, y, ' ', fb);//显示空白
      }
    }
    break;
  case CRIGHT:
    {
      i = (LBytes-LLine);//右对齐
      for(k=0; k<i && LLine!=0; k++)
      {
        PrintCHZ(x+k, y, ' ', fb);//显示空白
      }
    }
    break;
  default :
    {
      i = 0;//左对齐
      for(k=0; k<(LBytes-LLine); k++)
      {
        PrintCHZ(x+LLine+k, y, ' ', fb);//显示空白
      }
    }
    break;
  }
  LCD_Printf(x + i, y, fb, LLine, &str[Bytes]);
//   PrintDen(16,5,Bytes);///////////////
  return 0;
}

int PrintDen(int xs, int ys, uint32 den)//显示十进制数,返回数据位数
{
  uint16 i;
  uint16 Begin = 0;
  uint32 j = 100000000;
  char Den[10] = {0,0,0,0,0,0,0,0,0,0};
  if(den == 0)
    Begin = 9;
  for(i=0; i<9; i++)
  {
    Den[i] = den / j;
    den -= Den[i]*j;
    j /= 10;
    if(Den[i] != 0 && Begin == 0)
    {
      Begin = i+1;
    }
    Den[i] += '0';
  }
  LCD_Printf(xs, ys, FB_OFF, 10-Begin, (uint8 *)&Den[Begin-1]);//显示字符,汉字串  
  return 10-Begin;
}


uint8 B4ToChar(uint8 B4)//四位二进制数转字十六进制字符
{
  uint8 Char;
  if(B4>9)
  {
    Char = 'A'+(B4-10);
  }
  else
  {
    Char = '0'+B4;
  }
  return Char;
}


int PrintHex(uint8 xs, uint16 ys, uint32 hex)//显示十六进制数,返回数据位数
{
  uint16 i;
  uint16 Begin = 0;
  uint32 j = 0xF0000000;
  char Hex[9] = {0,0,0,0,0,0,0,0,0};
  if(hex == 0)
    Begin = 8;
  for(i=0; i<8; i++)
  {
    Hex[i] = (hex & j)>>(4*(7-i));
    j >>= 4;
    if(Hex[i] != 0 && Begin == 0)
    {
      Begin = i+1;
    }
    Hex[i] = B4ToChar(Hex[i]);
  }
  LCD_Printf(xs, ys, FB_OFF, 9-Begin, (uint8 *)&Hex[Begin-1]);//显示字符,汉字串  
  return 9-Begin;
}

int PrintFlo(int xs, int ys, uint32 den, uint32 mut, uint16 wei)// 写入浮点数据
{
  const uint32 QUAN[]={
  1,10,100,1000,10000,100000,1000000,10000000};//权
  uint16 Total = 0;
  uint32 dot   = 0;
  uint8 i,j=0;
  dot  = (den%mut)*(QUAN[wei]/mut);
  den /= mut;
  Total += PrintDen(xs, ys, den);
  PrintCHZ(xs + Total, ys, '.', FB_OFF);//写一个字符或汉字
  for(j=wei; QUAN[j-1]>dot && j>1; j--)
  {
  }
  for(i=0; i<(wei-j); i++)
    PrintCHZ(xs + Total +1+i, ys, '0', FB_OFF);//写一个字符或汉字
  PrintDen(xs + Total +1+i, ys, dot);
  return Total+wei+1;
}

//画、清点函数
//column为水平点数,row为垂直点数
//show=1画点,show=0清点
void glcd_pixel(uint8 x, uint16 y, char show)//画、清点函数
{
  uint16 dot;
  LCD_SetRec(x, y, 0, 0);//设置窗口大小
  LCD_WrReg(0x0F);//Read
  dot = LCD_RdData16();//Read 16-bit Data
  LCD_SetRec(x, y, 0, 0);//设置窗口大小
  LCD_WrReg(0x0E);//Write
  if(show)
    LCD_WrData16(~dot);
  else
    LCD_WrData16(dot);
}
void glcd_line(int x1, int y1, int x2, int y2, unsigned char show)//画一条x1,y1到x2,y2的直线
{
 int dy ;
 int dx ;
 int stepx, stepy, fraction;
 dy = y2 - y1;
 dx = x2 - x1;
 if (dy < 0)
 {
  dy = -dy;
  stepy = -1;
 }
 else
 {
  stepy = 1;
 }
 if (dx < 0)
 {
  dx = -dx;
  stepx = -1;
 }
 else
 {
  stepx = 1;
 }
 dy <<= 1;
 dx <<= 1;
 glcd_pixel(x1,y1,show);
 if (dx > dy)
 {
  fraction = dy - (dx >> 1);
  while (x1 != x2)
  {
   if (fraction >= 0)
   {
    y1 += stepy;
    fraction -= dx;
   }
   x1 += stepx;
   fraction += dy; 
   glcd_pixel(x1,y1,show);
  }
 }
 else
 {
  fraction = dx - (dy >> 1);
  while (y1 != y2)
  {
   if (fraction >= 0)
   {
    x1 += stepx;
    fraction -= dy;
   }
   y1 += stepy;
   fraction += dx;
   glcd_pixel(x1,y1,show);
  }
 }
}

void LCD_PrintFlash(uint8 xs, uint16 ys, uint8 x_dot, uint16 y_dot, const uint8 *pStr)//画图
{
  uint8  i;
  uint16 j;
  LCD_SetRec(xs, ys, x_dot, y_dot); //设置窗口大小
  LCD_WrReg(0x0E);                  //Write 
  for(j=0; j<y_dot; j++)
    for(i=0; i<x_dot; i++)
    {
      LCD_WrData8(*(pStr++));
      LCD_WrData8(*(pStr++));
    }
}

void axison(uchar xorien,uchar yorien )
{
  uchar x=0;
  uint y=0;
  glcd_line(0,yorien,239-7,yorien,1);
  glcd_line(xorien,0,xorien,319-7,1);
  for(x=0,y=0;x<7&&y<7;x++,y++)
  {
    glcd_line(239-x,yorien-y,239-x,yorien+y,1);  //plot arrow
  }
  
  for(x=0,y=0;x<7&&y<7;x++,y++)
  {
    glcd_line(xorien-x,319-y,xorien+x,319-y,1);  //plot arrow
  }  
  for(x=xorien+10;x<240-10;x+=10)  //画刻度
  {
    glcd_pixel(x,yorien-1,1);
    glcd_pixel(x,yorien+1,1);
  }
  for(x=10;x<xorien;x+=10)
  {
    glcd_pixel(xorien-x,yorien-1,1);
    glcd_pixel(xorien-x,yorien+1,1);
  }
    for(y=yorien+10;y<320-10;y+=10)
  {
    glcd_pixel(xorien-1,y,1);
    glcd_pixel(xorien+1,y,1);
  }
    for(y=10;y<yorien;y+=10)
  {
    glcd_pixel(xorien-1,yorien-y,1);
    glcd_pixel(xorien+1,yorien-y,1);
  }
 for(x=1;x<(239-xorien)/10;x+=2)
  {
    PrintCHZ(xorien-6+x*10,yorien-16,'0'+x/10,FB_OFF);
    PrintCHZ(xorien-6+x*10+8,yorien-16,'0'+x%10,FB_OFF);
  }
 // for(x=2;x<10;x+=2)
  //{
  //  PrintCHZ(xorien-10-x*10,yorien-16,'-',FB_OFF);
    //PrintCHZ(xorien-6+x*10+8,yorien-16,'0'+x/10,FB_OFF);
  //  PrintCHZ(xorien-10-x*10+8,yorien-16,'0'+x,FB_OFF);
 // }
  for(y=1;y<(319-yorien)/10;y+=2)
  {
    PrintCHZ(xorien-16,yorien-6+y*10,'0'+y/10,FB_OFF);
    PrintCHZ(xorien-8,yorien-6+y*10,'0'+y%10,FB_OFF);
  }
  for(y=2;y<10;y+=2)
  {
    PrintCHZ(xorien-16,yorien-10-y*10,'-',FB_OFF);
    PrintCHZ(xorien-16+8,yorien-10-y*10,'0'+y,FB_OFF);
  }
  //LCD_WrReg(0x0E);
  
  //LCD_SetRec(xorien,yorien, 239-xorien,319-yorien);
  //LCD_WrCmd8(0x01,0x0F);//写入清屏
  //DelayMs(10000);
  //LCD_WrReg(0x0E);
  //for(y=0;y<13200;y++)
  //      LCD_WrData16(RED);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -