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

📄 lcd.c

📁 Proteus6.9 sp4 上
💻 C
字号:
#include "lcd.h"
#include "delay.h"

#ifdef  Debug
#include <stdio.h>  
#endif

unsigned char CurOffset,CurRow,CurPage,CurCol;

void LCD_BUSY(unsigned char lr) //判断忙标志
{
   unsigned char status;

   if(lr==RIGHT)
   {
      CLEAR_LCD_CS2; //cs2=0
      SET_LCD_CS1;   //cs1=1
   }
   else
   {
      SET_LCD_CS2;   //cs2=1
      CLEAR_LCD_CS1; //cs1=0
   }
   SET_LCD_CMD;

   SET_LCD_READ;
   SET_LCD_E;
   delay_us();
   while(LCD_OP_PORT&LCD_STATUS_BUSY)
   {
      CLEAR_LCD_E;
	  delay_us();
      SET_LCD_E;
	  delay_us();
   }
   CLEAR_LCD_E;
   SET_LCD_WRITE;

}

void write_LCD(unsigned char lr,unsigned char cd,unsigned char dat) /*写入指令或数据*/
{	

   LCD_BUSY(lr);
   if(cd==CMD)
      SET_LCD_CMD;
   else
      SET_LCD_DATA;

   SET_LCD_WRITE;
   SET_LCD_E;
   LCD_OP_PORT = dat;

   #ifdef Debug
     printf("%x  \n",dat);
   #endif

   delay_nus(4);
   CLEAR_LCD_E;
}

unsigned char read_LCD(unsigned char lr)	  /*  读显示数据 */
{
   unsigned char dat;
   
   LCD_BUSY(lr);
   SET_LCD_DATA;

   SET_LCD_READ;
   SET_LCD_E;

   delay_us();

   dat=LCD_OP_PORT;

   CLEAR_LCD_E;
   SET_LCD_WRITE;
   
   LCD_BUSY(lr);
   SET_LCD_DATA;

   SET_LCD_READ;
   SET_LCD_E;

   delay_us();

   dat=LCD_OP_PORT;
   CLEAR_LCD_E;
   SET_LCD_WRITE;

   return dat;
}

void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
{
   write_LCD(LEFT,CMD,0xc0|line);
}

void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
{
   write_LCD(RIGHT,CMD,0xc0|line);
}

void set_page_L(unsigned char page)	/*设置X地址 设置页*/  //0-7
{
   write_LCD(LEFT,CMD,0xb8|page);
}

void set_page_R(unsigned char page)	/*设置X地址 设置页*/ //0-7
{
   write_LCD(RIGHT,CMD,0xb8|page);
}

void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
{
   write_LCD(LEFT,CMD,0x40|col);
}

void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
{
   write_LCD(RIGHT,CMD,0x40|col);
}

void LCD_Init(void) /*初始化函数*/
{
   set_start_line_L(0);             /*显示起始行为0*/
   set_start_line_R(0);             /*显示起始行为0*/

   write_LCD(LEFT,CMD,DISPLAY_ON);  /*  开显示  */

   #ifdef Debug
     //printf("OK \n");
   #endif

  // write_LCD(RIGHT,CMD,DISPLAY_ON); /*  开显示  */

   for(;;)
   {
   // write_LCD(RIGHT,CMD,DISPLAY_ON); /*  开显示  */
   // write_LCD(RIGHT,CMD,DISPLAY_OFF); /*  开显示  */
	LCD_clr();
	disp_char('1');
	
 //   disp_char('1');	
   }
}

void LCD_clr(void)                  /*清屏函数*/
{
   unsigned char pages,i;
   for(pages=6;pages<8;pages++)
   {
      set_page_L(pages);            /* X 页地址 */
      set_page_R(pages);            /* X 页地址 */
      for(i=0;i<20;i++)
      {
         set_col_addr_L(i);//Y
         set_col_addr_R(i);//Y
         write_LCD(LEFT,DATA,0x0);
         write_LCD(RIGHT,DATA,0x0);
      }
   }
}

//ASCII 字模宽度及高度
#define ASC_CHR_WIDTH	8
#define ASC_CHR_HEIGHT	12

typedef struct typFNT_ASC16	/* 汉字字模显示数据结构 */
{
   char Index[1];
   char Msk[16];
};

struct  typFNT_ASC16  ASC_16[] = {	/* 显示为8*16  Curier 10 常规*/
   "1",0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x07,0x04,0x04,0x00,
};

#define ASC_HZ_WIDTH	12
//#define ASC_HZ_HEIGHT	12

typedef struct typFNT_GB16	/*12*16 汉字字模显示数据结构 */
{
   char Index[2];
   char Msk[24];
};

unsigned char GetPage(void) /*得到当前页*/
{
   return CurPage;
}

unsigned char GetCol(void) /*得到当前列*/
{
   return CurCol;
}

void SetPageCol(unsigned char upage, unsigned char ucol) /* 设置液晶的页和列 */
{
   CurPage = upage;
   CurCol = ucol;
   if(ucol<64)
   {
      set_page_L(upage);
      set_col_addr_L(ucol);
   }
   else
   {
      set_page_R(upage);
      set_col_addr_R(ucol-64);
   }
}

/* 设置当前显示的页和列 */
void SetRowCol(unsigned char urow, unsigned char ucol) 
{
   unsigned char page;
   CurRow = urow;
   CurCol = ucol;
	
   switch(urow)
   {
      case 1:
             page=0;
             CurOffset=1;
             break;
      case 2:
             page=1;
             CurOffset=2;
             break;
      case 3:
             page=3;
             CurOffset=1;
             break;
      case 4:
             page=4;
             CurOffset=2;
             break;
      case 5:
             page=6;
             CurOffset=1;
             break;
   }
   SetPageCol(page,ucol);
}

void disp_char(unsigned char c)
{
   unsigned char k,j,uPage,uCol,ch_r,ch_w;
   unsigned char width;
   unsigned char len;
   uPage = GetPage();
   uCol = GetCol();
   len=sizeof(ASC_16)/sizeof(ASC_16[0]);
   for(k=0;k<len;k++)
   {
      if(c == ASC_16[k].Index[0] )
         break;
   }
   if(k<len)
   {
      if(c=='-'||c==':')
         width=ASC_CHR_WIDTH-2;
      else if(c=='|')
         width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
      else
         width=ASC_CHR_WIDTH;
		
      if(CurOffset==1) //下半部是写半个字节
      {
         for(j=0;j<width;j++)
         {
            SetPageCol(uPage,uCol+j);
            ch_w=ASC_16[k].Msk[j];
            if(uCol+j<64)
               write_LCD(LEFT,DATA,ch_w);
            else
               write_LCD(RIGHT,DATA,ch_w);
         }
         SetPageCol(uPage+1,uCol);
			
         for(j=0;j<width;j++)
         {
            SetPageCol(uPage+1,uCol+j);
            if(uCol+j<64)
               ch_r=read_LCD(LEFT);
            else
               ch_r=read_LCD(RIGHT);
            ch_r&=0xf0;
            ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f;
            ch_w|=ch_r;
            SetPageCol(uPage+1,uCol+j);
            if(uCol+j<64)
               write_LCD(LEFT,DATA,ch_w);
            else
               write_LCD(RIGHT,DATA,ch_w);
         }
      }
      else //上半部是写半个字节
      {
         for(j=0;j<width;j++)
         {
            SetPageCol(uPage,uCol+j);
            if(uCol+j<64)
               ch_r=read_LCD(LEFT);
            else
               ch_r=read_LCD(RIGHT);
            ch_r&=0x0f;
            ch_w=ASC_16[k].Msk[j];
            ch_w=ch_w<<4;
            ch_w|=ch_r;
            SetPageCol(uPage,uCol+j);
            if(uCol+j<64)
               write_LCD(LEFT,DATA,ch_w);
            else
               write_LCD(RIGHT,DATA,ch_w);
         }
         SetPageCol(uPage+1,uCol);
         for(j=0;j<width;j++)
         {
            SetPageCol(uPage+1,uCol+j);
				
            ch_r=ASC_16[k].Msk[j];
            ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j];
            ch_r=ch_r>>4;
            ch_w=ch_w<<4;
            ch_w|=ch_r;
            SetPageCol(uPage+1,uCol+j);
            if(uCol+j<64)
               write_LCD(LEFT,DATA,ch_w);
            else
               write_LCD(RIGHT,DATA,ch_w);
         }
      }
   }
   SetPageCol(uPage,uCol+width);
}

/*
void disp_hz(unsigned char *hz)
{
   unsigned char k,j,uPage,uCol,ch_r,ch_w;
   uPage = GetPage();
   uCol = GetCol();
   for(k=0;k<sizeof(GB_16)/sizeof(GB_16[0]);k++)
   {
      if(hz[0] == GB_16[k].Index[0] && hz[1] == GB_16[k].Index[1])
         break;
   }

   if(CurOffset==1)
   {
      for(j=0;j<ASC_HZ_WIDTH;j++)
      {
         SetPageCol(uPage,uCol+j);
         ch_w=GB_16[k].Msk[j];
         if(uCol+j<64)	write_LCD(LEFT,DATA,ch_w);
         else write_LCD(RIGHT,DATA,ch_w);
      }
      SetPageCol(uPage+1,uCol);

      for(j=0;j<ASC_HZ_WIDTH;j++)
      {
         SetPageCol(uPage+1,uCol+j);
         if(uCol+j<64)
            ch_r=read_LCD(LEFT);
         else
            ch_r=read_LCD(RIGHT);
         ch_r&=0xf0;
         ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j]&0x0f;
         ch_w|=ch_r;
         SetPageCol(uPage+1,uCol+j);
         if(uCol+j<64)
            write_LCD(LEFT,DATA,ch_w);
         else
            write_LCD(RIGHT,DATA,ch_w);
      }
      SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
   }

   else //汉字上半部是写半个字节
   {
      for(j=0;j<ASC_HZ_WIDTH;j++)
      {
         SetPageCol(uPage,uCol+j);
         if(uCol+j<64)
            ch_r=read_LCD(LEFT);
         else ch_r=read_LCD(RIGHT);
         ch_r&=0x0f;
         ch_w=GB_16[k].Msk[j];
         ch_w=ch_w<<4;
         ch_w|=ch_r;
         SetPageCol(uPage,uCol+j);
         if(uCol+j<64)
            write_LCD(LEFT,DATA,ch_w);
         else
            write_LCD(RIGHT,DATA,ch_w);
      }
      SetPageCol(uPage+1,uCol);
      for(j=0;j<ASC_HZ_WIDTH;j++)
      {
         SetPageCol(uPage+1,uCol+j);

         ch_r=GB_16[k].Msk[j];
         ch_w=GB_16[k].Msk[ASC_HZ_WIDTH+j];
         ch_r=ch_r>>4;
         ch_w=ch_w<<4;
         ch_w|=ch_r;
         SetPageCol(uPage+1,uCol+j);
         if(uCol+j<64)
            write_LCD(LEFT,DATA,ch_w);
         else
            write_LCD(RIGHT,DATA,ch_w);
      }
      SetPageCol(uPage,uCol+ASC_HZ_WIDTH);
   }
}
*/
void disp_str(unsigned char *p)
{
   unsigned char i=0;
   while(p[i]>0)
   {
      if(p[i] < 128)
      {	/* ASCII */
         disp_char(p[i]);
      }
      else
      {	/* 中文 */
         disp_hz(&p[i]);
         i++;
      }
      i++;
   }
}

⌨️ 快捷键说明

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