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

📄 lcd12864io.c

📁 智能浇灌系统源代码
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint  unsigned int
sbit    LCD_RST= P3^7;	//液晶屏复位脚定义	
sbit    DI=P3^4;	//DI引脚定义
sbit    RW=P3^5;	//RW引脚定义
sbit    CS=P3^3;	//片选信号定义
sbit    EN=P3^6;	//使能信号定义
sbit    RDY=P0^7;	//对应状态信息中的BF位
sfr     LCD=0x80;  	//P0口作为数据口
#define	LCD_DISPON	    0x3f	// 打开LCD显示 
#define LCD_STARTROW	0xc0	
// 设置起始行,可用LCD_STARTROW+x设置起始行(x<64) 
#define	LCD_ADDRSTRY	0xb8	
// 页起始地址,   可用LCD_ADDRSTRX+x设置当前页(x<8)
#define	LCD_ADDRSTRX	0x40	
// 列起始地址,可用LCD_ADDRSTRY+x设置当前列(x<64) 

#define CS1  0     //左半屏选择
#define CS2  1     //右半屏选择

//命令字cmd送左半屏(port=0)/右半屏(port=1)命令口
void	LCD_WrCmd(bit port,uchar  cmd)	
{  EN=0; 
CS=port;
   DI=0;			//选择命令寄存器
   RW=0;
   EN=1;
   LCD=cmd; 		//命令码送总线
   EN=0;
}
//数据wrdata送左半屏(port=0)/右半屏(port=1)数据口
void  LCD_WrDat(bit port ,uchar wrdata) 	
{  EN=0;
CS=port;
   DI=1;			//选择命令寄存器
   RW=0;
   EN=1;
   LCD=wrdata; 		//数据送总线
   EN=0;
}	
uchar code  ASCII_TAB[480] = //0x20~0x7F之间 ASCII码对应的点阵数据表 
              { 0x00, 0x00, 0x00, 0x00, 0x00,
			 	0x00, 0x00, 0x9e, 0x00, 0x00,
                0x00, 0x0e, 0x00, 0x0e, 0x00,
                0x28, 0xfe, 0x28, 0xfe, 0x28,
                0x48, 0x54, 0xfe, 0x54, 0x24,
                0x46, 0x26, 0x10, 0xc8, 0xc4,
                0x6c, 0x92, 0xaa, 0x44, 0xa0,
                0x00, 0x0a, 0x06, 0x00, 0x00,
			 	0x00, 0x38, 0x44, 0x82, 0x00,
			 	0x00, 0x82, 0x44, 0x38, 0x00,
			 	0x28, 0x10, 0x7c, 0x10, 0x28,
			 	0x10, 0x10, 0x7c, 0x10, 0x10,
			 	0x00, 0xa0, 0x60, 0x00, 0x00,
			 	0x10, 0x10, 0x10, 0x10, 0x10,
			 	0x00, 0xc0, 0xc0, 0x00, 0x00,
			 	0x40, 0x20, 0x10, 0x08, 0x04,
                
                0x7C, 0xA2, 0x92, 0x8A, 0x7C,			
				0x00, 0x84, 0xFE, 0x80, 0x00,
				0x84, 0xC2, 0xA2, 0x92, 0x8C,			
				0x42, 0x82, 0x8A, 0x96, 0x62,			
				0x30, 0x28, 0x24, 0xFE, 0x20,		
				0x4E, 0x8A, 0x8A, 0x8A, 0x72,			
				0x78, 0x94, 0x92, 0x92, 0x60,			
				0x02, 0xE2, 0x12, 0x0A, 0x06,			
				0x6C, 0x92, 0x92, 0x92, 0x6C,			
 				0x0C, 0x92, 0x92, 0x52, 0x3C,			
				0x00, 0x6C, 0x6C, 0x00, 0x00,			
				0x00, 0xAC, 0x6C, 0x00, 0x00,			
				0x10, 0x28, 0x44, 0x82, 0x00,			
				0x28, 0x28, 0x28, 0x28, 0x28,			
				0x00, 0x82, 0x44, 0x28, 0x10,			
				0x04, 0x02, 0xA2, 0x12, 0x0C,

                0x64, 0x92, 0xF2, 0x82, 0x7C,			
				0xFC, 0x22, 0x22, 0x22, 0xFC,			
		 		0xFE, 0x92, 0x92, 0x92, 0x6C,			
				0x7C, 0x82, 0x82, 0x82, 0x44,			
				0xFE, 0x82, 0x82, 0x44, 0x38,		
				0xFE, 0x92, 0x92, 0x92, 0x82,		
				0xFE, 0x12, 0x12, 0x12, 0x02,			
				0x7C, 0x82, 0x92, 0x92, 0xF4,			
				0xFE, 0x10, 0x10, 0x10, 0xFE,		
				0x00, 0x82, 0xFE, 0x82, 0x00,		
				0x40, 0x80, 0x82, 0x7E, 0x02,			
				0xFE, 0x10, 0x28, 0x44, 0x82,			
				0xFE, 0x80, 0x80, 0x80, 0x80,		
				0xFE, 0x04, 0x18, 0x04, 0xFE,			
				0xFE, 0x08, 0x10, 0x20, 0xFE,			
				0x7C, 0x82, 0x82, 0x82, 0x7C,
 
                0xFE, 0x12, 0x12, 0x12, 0x0C,
				0x7C, 0x82, 0xA2, 0x42, 0xBC,
				0xFE, 0x12, 0x32, 0x52, 0x8C,			
				0x8C, 0x92, 0x92, 0x92, 0x62,			
				0x02, 0x02, 0xFE, 0x02, 0x02,	
				0x7E, 0x80, 0x80, 0x80, 0x7E,
				0x3E, 0x40, 0x80, 0x40, 0x3E,
				0x7E, 0x80, 0x70, 0x80, 0x7E,
				0xC6, 0x28, 0x10, 0x28, 0xC6,
				0x0E, 0x10, 0xE0, 0x10, 0x0E,
				0xC2, 0xA2, 0x92, 0x8A, 0x86,
				0x00, 0xFE, 0x82, 0x82, 0x00,
				0x04, 0x08, 0x10, 0x20, 0x40,
				0x00, 0x82, 0x82, 0xFE, 0x00,
				0x08, 0x04, 0x02, 0x04, 0x08,
				0x80, 0x80, 0x80, 0x80, 0x80,

                0x00, 0x02, 0x04, 0x08, 0x00,
				0x40, 0xA8, 0xA8, 0xA8, 0xF0,
				0xFE, 0x90, 0x88, 0x88, 0x70,
				0x70, 0x88, 0x88, 0x88, 0x40,
				0x70, 0x88, 0x88, 0x90, 0xFE,
				0x70, 0xA8, 0xA8, 0xA8, 0x30,
				0x10, 0xFC, 0x12, 0x02, 0x04,
				0x18, 0xA4, 0xA4, 0xA4, 0x7C,
				0xFE, 0x10, 0x08, 0x08, 0xF0,
				0x00, 0x88, 0xFA, 0x80, 0x00,
				0x40, 0x80, 0x88, 0x7A, 0x00,
				0xFE, 0x20, 0x50, 0x88, 0x00,
				0x00, 0x82, 0xFE, 0x80, 0x00,
				0xF8, 0x08, 0x30, 0x08, 0xF8,
				0xF8, 0x10, 0x08, 0x08, 0xF0,
				0x70, 0x88, 0x88, 0x88, 0x70,

                0xF8, 0x28, 0x28, 0x28, 0x10,
				0x10, 0x28, 0x28, 0x30, 0xF8,
				0xF8, 0x10, 0x08, 0x08, 0x10,
				0x90, 0xA8, 0xA8, 0xA8, 0x40,
				0x08, 0x7E, 0x88, 0x80, 0x40,
				0x78, 0x80, 0x80, 0x40, 0xF8,
				0x38, 0x40, 0x80, 0x40, 0x38,
				0x78, 0x80, 0x60, 0x80, 0x78,
				0x88, 0x50, 0x20, 0x50, 0x88,
				0x18, 0xA0, 0xA0, 0xA0, 0x78,
				0x88, 0xC8, 0xA8, 0x98, 0x88,
				0x00, 0x10, 0x6C, 0x82, 0x00,
				0x00, 0x00, 0xFE, 0x00, 0x00,
				0x00, 0x82, 0x6C, 0x10, 0x00,
				0x10, 0x10, 0x54, 0x38, 0x10,
				0x10, 0x38, 0x54, 0x10, 0x10};

uchar   code HZTAB[]=


{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,

0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,/*"温",0*/



0x20,0x18,0x08,0x09,0xEE,0xAA,0xA8,0xAF,0xA8,0xA8,0xEC,0x0B,0x2A,0x18,0x08,0x00,//常1

0x00,0x00,0x3E,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,0x00,



0x40,0x20,0xF0,0x0C,0x07,0x02,0xFC,0x44,0x44,0x42,0xFE,0x43,0x43,0x42,0x40,0x00,//低2

0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x20,0x10,0x28,0x43,0x0C,0x10,0x20,0x78,0x00,



0x04,0x04,0x04,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x04,0x04,0x04,0x00,

0x00,0xFF,0x01,0x01,0x3D,0x25,0x25,0x25,0x25,0x25,0x3D,0x41,0x81,0x7F,0x00,0x00,//高3



0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,

0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,/*"电",4*/



0x82,0xE2,0x5E,0x42,0xC2,0x0A,0x08,0xC9,0x3E,0x0A,0x08,0x8C,0x7A,0x09,0x08,0x00,

0x00,0x7F,0x10,0x10,0x1F,0x32,0x2B,0x26,0x2A,0x71,0x32,0x2B,0x26,0x2A,0x71,0x00,/*"磁",5*/



0x00,0x00,0xF8,0x81,0x46,0xE0,0x58,0x42,0xFA,0x2A,0x32,0xA2,0x02,0xFE,0x00,0x00,

0x00,0x00,0xFF,0x00,0x00,0x3F,0x04,0x04,0x03,0x0E,0x11,0x3C,0x80,0xFF,0x00,0x00,/*"阀",6*/



0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,

0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,/*"开",7*/



0x00,0x10,0x10,0x10,0x11,0x1E,0x14,0xF0,0x10,0x18,0x17,0x12,0x18,0x10,0x00,0x00,

0x01,0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x05,0x09,0x31,0x61,0xC1,0x41,0x01,0x00,/*"关",8*/



0x10,0x60,0x01,0xC6,0x00,0x80,0x84,0x44,0x5F,0x24,0x64,0x94,0x84,0xE4,0x00,0x00,

0x04,0xFC,0x03,0x00,0x42,0x42,0x32,0x0E,0x02,0x02,0x3E,0x42,0x42,0x42,0x78,0x00,/*"浇",9*/



0x08,0x31,0x82,0x78,0x02,0x3A,0xEA,0xAF,0xBA,0xC2,0xBA,0xAF,0xAA,0xBA,0x02,0x00,

0x04,0x04,0x7F,0x00,0x02,0x01,0x7F,0x2A,0x2A,0x2A,0x3F,0x2A,0x2A,0x2A,0x20,0x00,/*"灌",10*/



0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,

0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,/*"时",11*/


0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,

0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00,/*"间",12*/


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",13*/

0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,/*"分",14*/

0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,/*"秒",15*/


0x00,0xF0,0xF8,0x0C,0x04,0x04,0x04,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x00,0x01,0x03,
0x02,0x02,0x02,0x02,0x03,0x01,0x00,0x00,/*"0",16*/











};











//以filldata充填液晶屏
void  LCD_DispFill(uchar filldata) 
{  uchar  x, y;
   LCD_WrCmd(CS1,LCD_STARTROW);	//设置左半屏显示起始行为0
   LCD_WrCmd(CS2,LCD_STARTROW);	//设置右半屏显示起始行为0
   for(y=0; y<8; y++)           //循环充填8页
   {  LCD_WrCmd(CS1,LCD_ADDRSTRY+y);	// 设置左半屏页地址
      LCD_WrCmd(CS1,LCD_ADDRSTRX);	    // 设置左半屏列地址
      LCD_WrCmd(CS2,LCD_ADDRSTRY+y);	// 设置右半屏页地址
      LCD_WrCmd(CS2,LCD_ADDRSTRX);		// 设置右半屏列地址
      for(x=0; x<64; x++)          	//充填每页的64个单元(列)
       { LCD_WrDat(CS1,filldata);
         LCD_WrDat(CS2,filldata);
}
   }
}

//液晶模块初始化
void  LCD_DispIni(void)			
{  uint  i;
   LCD_RST = 0;				   	// 复位驱动芯片
   for(i=0; i<500; i++);
   LCD_RST = 1;    
   LCD_WrCmd(CS1,LCD_DISPON);	 	// 打开显示
   LCD_WrCmd(CS1,LCD_STARTROW);   	// 设置显示起始行为0
   LCD_WrCmd(CS2,LCD_DISPON);	
   LCD_WrCmd(CS2,LCD_STARTROW);		
   LCD_DispFill(00);			// 清屏
   LCD_WrCmd(CS1,LCD_ADDRSTRY+0);	// 设置页(字符行)地址
   LCD_WrCmd(CS1,LCD_ADDRSTRX+0);	// 设置列地址
   LCD_WrCmd(CS2,LCD_ADDRSTRY+0);
   LCD_WrCmd(CS2,LCD_ADDRSTRX+0);
}


      
//在液晶屏的cy(0-3)行、cx(0-7)列显示汉字字符dispdata   
void LCD_DispHZ(uchar cy, uchar cx, uchar dispdata) 
{  uchar  code  *pdat;
   uchar  i,s,page;
   bit  port;
   cy = cy&0x03;		// 参数过滤
   cx = cx&0x07;
   pdat = &HZTAB[dispdata*32];
   if( (cx&0x04) == 0 ) // 如果在左半屏显示
     { port=0;
       s = cx<<4;         // 求出该汉字在屏幕上的起始列
     }
   else	//在右半屏上显示
     { port=1;
       s = (cx<<4)-64;   // 求出该汉字在屏幕上的起始列
     }
   for(page=0;page<2;page++) 		//每个汉字2页
      {  LCD_WrCmd(port,LCD_ADDRSTRX+s);	// 设置当前列地址
         LCD_WrCmd(port,LCD_ADDRSTRY+(cy<<1)+page);	// 设置当前页地址
         for(i=0; i<5; i++);
         for(i=0; i<16; i++)     	//每个汉字16列
      	{  LCD_WrDat(port,*pdat);	// 发送数据	
	  pdat++;
      	}
         for(i=0; i<5; i++);
}
}

//在液晶屏的cy(0-3)行、cx(0-7)列显示汉字字符串disp_str 
void  LCD_DispHZStr(uchar cy, uchar cx, uchar *disp_str)
{  while( *disp_str!=0x55)
   {  cy = cy&0x03;		// 参数过滤
      cx = cx&0x07;	
      LCD_DispHZ(cy, cx, *disp_str); 	// 显示汉字
      disp_str++;		// 指向下一汉字
      cx++;				//列号加1
      if(cx>7) 			
	{ cy++;           // 指向下一显示行
cx=0; 
          }
}
}
void LCD_DispChar(char cy, char cx, char dispdata) 
{  uchar  code  *pch;
   uchar  i;
   bit port;
   cy = cy&0x07;		// 参数过滤
   cx = cx&0x0f;
   pch = &ASCII_TAB[(dispdata-0X20)*5];     //指向字符起始列的点阵码
   if( (cx&0x08) == 0 )		// 列号cx<8,在左半屏显示
       {  port=CS1;
          i=cx<<3;
       }
   else 
       {  port=CS2;
          i = (cx&0x07)<<3;
       }
   LCD_WrCmd(port,LCD_ADDRSTRX+i);	// 设置当前列地址
   LCD_WrCmd(port,LCD_ADDRSTRY+cy);	// 设置当前页地址
   for(i=0; i<5; i++);           //延时
  
       LCD_WrDat(port,0x00);	// 显示一列空格
   
   for(i=0; i<5; i++)            //送出字符的5列点阵码
      { 
            LCD_WrDat(port,*pch);
     	
        pch++;
      }
   
       LCD_WrDat(port,0x00);	// 显示一列空格
   
      for(i=0; i<5; i++);
   
       LCD_WrDat(port,0x00);	// 显示一列空格
   
}
//字符串输出函数相应地改为:
void  LCD_DispStr(char cy, char cx, char *disp_str) 
{  while( *disp_str != '\0')
   {  cy = cy&0x07;		        // 参数过滤
      cx = cx&0x0f;	
      LCD_DispChar(cy, cx, *disp_str); 	// 显示字符
      disp_str++;				// 指向下一字符数据
      cx++;
      if(cx>15) cy++;		    // 指向下一显示行
   }
}


⌨️ 快捷键说明

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