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

📄 51-pic.c

📁 PIC单片机12864显示程序 PIC单片机12864显示程序
💻 C
字号:
#include		<pic.h>
//该程序用于HS12864-1液晶显示功能的演示
//运行程序后,液晶上显示"欢迎光临!"和"谈益强"字样
//芯片采用PIC16F877A
#define  RS   RC5    //DI
#define  RW   RC4 
#define  E    RC3 
#define  CS1  RE0 
#define  CS2  RE1 
#define  RST  RE2
unsigned   char	 PAGEADD;  //存放页地址寄存器
unsigned   char	 PAGENUM;  //存放总页数寄存器
unsigned   char	 CLMSUM;   //存放总列数寄存器
unsigned   char	 CLMADD;   //存放列地址寄存器
unsigned   char	 WRITE;    //存放显示数据寄存器
unsigned   char	 row;	   //存放显示起始行寄存器
unsigned   char	 i,k;      //通用寄存器
const  char  table[]=
{
 0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,
 0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
 0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,
 0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,//0"欢"

 0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,
 0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
 0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,
 0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,//1"迎"

 0x00,0x40,0x42,0x44,0x5C,0xC8,0x40,0x7F,
 0x40,0xC0,0x50,0x4E,0x44,0x60,0x40,0x00,
 0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
 0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,//2"光"

 0x00,0xF8,0x00,0x00,0xFE,0x40,0x30,0x8F,
 0x0A,0x08,0x18,0x68,0x08,0x88,0x08,0x00,
 0x00,0x1F,0x00,0x00,0x7F,0x00,0x00,0x7F,
 0x21,0x21,0x3F,0x21,0x21,0x7F,0x01,0x00,//3"临"

 0x40,0x41,0xCE,0x04,0x00,0x90,0x4C,0x20,
 0x10,0x8F,0x10,0x28,0x46,0x44,0x00,0x00,
 0x00,0x00,0x7F,0x20,0x10,0x80,0x44,0x23,
 0x18,0x07,0x08,0x14,0x63,0xC0,0x40,0x00,//4"谈"

 0x00,0x10,0x90,0x92,0x54,0x38,0x10,0x10,
 0x18,0x14,0x33,0x52,0x90,0x90,0x00,0x00,
 0x41,0x41,0x40,0x7E,0x42,0x42,0x7E,0x42,
 0x42,0x7E,0x42,0x42,0x7E,0x41,0x40,0x00,//5"益"

 0x00,0xF2,0x12,0x12,0x1E,0x00,0xC0,0x5E,
 0x52,0xF2,0x52,0x52,0x5E,0xC0,0x00,0x00,
 0x00,0x01,0x41,0x81,0x7F,0x00,0x87,0x84,
 0x84,0xFF,0x44,0x44,0x54,0xE7,0x40,0x00,//6"强"

 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//7"!"
};
//****************************************************************
//延时程序(x*0.5ms)(1ms*93)
void    delay(unsigned int x)
{
    unsigned int j;
    for(j=x*50;--j;)
        continue;
}
//****************************************************************
//系统各口的输入输出状态初始化子程序
void		INITIAL()
{
    ADCON1=0X87;			//设置PORTA口和PORTE口为数字I/O口
    TRISC=0X00; 
    TRISD=0X00;
    TRISE=0X00;    
    PORTD=0X00; 
    PORTC=0X00; 			//设置液晶的4个控制脚为输出
    RST=0;        //Reset. 
    NOP(); 
    delay(2); 
    RST=1; 
    NOP(); 
    delay(2); 
    RC7=1;
    RC6=1;
}

//*******************************************************************
//*******************E1边的处理部分**********************************
//*******************************************************************
//*****************写命令程序******************************* 
void send_com1(unsigned char command ) 
{ 
  delay(1);// check_busy1(); 
  CS1=1;       //左边
  CS2=0;       
  RS=0; 
  RW=0; 
  PORTD=command; 
  E =1; 
  NOP(); 
  NOP(); 
  E =0; 
} 	
//***********对液晶显示器写数据子程序************************
void send_data1(unsigned char data ) 
{ 
    delay(1); // check_busy1();	 //查询液晶是否为空闲
    CS1=1;              //左边
    CS2=0; 	
    RS=1; 
    RW=0; 				
    PORTD=data;		//需要写入的数据放入D口
    E =1;		//E1=0,写入数据
    NOP(); 
    E =0;
}
//************E1边清屏子程序***************************
void	CLEAR1()
{
     PAGEADD=0xB8;    //设置页地址代码0页
     for(PAGENUM=0X08;PAGENUM>0;PAGENUM--) //8页
     {
       send_com1(PAGEADD); 
	   CLMADD=0x00;			   //设置起始列
   	   for(CLMSUM=0X40;CLMSUM>0;CLMSUM--) //64列
        {
	     send_data1(0x00);	    //写入00H以清屏
        }
        PAGEADD++;		//页号增1
    }
}	

//************E1边初始化**********************************
void	lcd1()
{
	 send_com1(0XC0);	//起始行0
	 send_com1(0X3F);	//开显示
	 CLEAR1();		//清屏
}	
//*******************************************************************
//*******************E2边的处理部分**********************************
//*******************************************************************
//*****************写命令程序******************************* 
void send_com2(unsigned char command ) 
{ 
  delay(1);  //check_busy2(); 
  CS1=0;       //右边 
  CS2=1;       
  RS=0; 
  RW=0; 
  PORTD=command; 
  E =1; 
  NOP(); 
  NOP(); 
  E =0; 
} 	
//***********对液晶显示器写数据子程序************************
void send_data2(unsigned char data ) 
{ 
    delay(1); //check_busy2();	
    CS1=0;         //右边 
    CS2=1; 	
    RS=1; 
    RW=0; 				
    PORTD=data;		//需要写入的数据放入D口
    E =1;		//E1=0,写入数据
    NOP(); 
    E =0;
}
//************E2边清屏子程序************************
void	CLEAR2()
{
    PAGEADD=0xB8;    //设置页地址代码0页
    for(PAGENUM=0X08;PAGENUM>0;PAGENUM--) //8页
     {
       send_com2(PAGEADD); 	   
       CLMADD=0x40;                      //设置起始列0
       for(CLMSUM=0X40;CLMSUM>0;CLMSUM--) //64列
         {
	      send_data2(0x00);         //写入00H以清屏
         }
       PAGEADD++;		    //页号增1
     }
}	
//************E2边初始化**********************************
void	lcd2()
{
	 send_com2(0XC0);	//起始行0
	 send_com2(0X3F);	//开显示
	 CLEAR2();		//清屏		
}
//******************************************************************
//******************************************************************
//LCD的E1边显示函数,调用一次该函数,则在相应的位置显示相应的字
void	dis1()
{
    send_com1(CLMADD);      //设置起始列
    send_com1(PAGEADD);
    i=i*32;					//i变成数组指示指针
    for(k=0;k<=15;k++)	 
      {
	    WRITE=table[i+k];	//查得需要显示的字节
	    send_data1(WRITE);	//在WRITE1子程序里面,列地址加1
        CLMADD++;
      }
    CLMADD=CLMADD-16;//恢复列地址
    send_com1(CLMADD);      //设置起始列
    PAGEADD=PAGEADD+1;//页地址加1
    send_com1(PAGEADD);
    for(;k<32;k++)
      {
	    WRITE=table[i+k];	//查得需要显示的字节
	    send_data1(WRITE);	//列地址加1
      }	 
}
//*******************************************************************
//LCD的E2边显示函数,调用一次该函数,则在相应的位置显示相应的字
void	dis2()
{
     send_com2(CLMADD);      //设置起始列
     send_com2(PAGEADD);
	 i=i*32;			     //i变成数组指示指针
	 for(k=0;k<16;k++)	
      {
	    WRITE=table[i+k];	 //查得需要显示的字节
	    send_data2(WRITE);	 //列地址加1
        CLMADD++;
	  }
	 CLMADD=CLMADD-16;      //恢复列地址
     send_com2(CLMADD);     //设置起始列
	 PAGEADD=PAGEADD+1;     //页地址加1
     send_com2(PAGEADD);
	 for(;k<32;k++)	 
       {
	     WRITE=table[i+k];	  //查得需要显示的字节
	     send_data2(WRITE);	  //在WRITE1子程序里面,列地址已经加1
	   }	 
}
//*************************************************************************
//*****************************主程序**************************************
//*************************************************************************
main()
{
	INITIAL();				//系统初始化
	lcd1();					//E1边初始化
	lcd2();					//E2边初始化
//******以下显示不同的字符*************************************************
    RC6=0;
	PAGEADD=0XB8;		//显示起始页为第0页
	CLMADD=0X40;		//起始列为第0列
	i=0;				//欢
	dis1();				//调用显示函数

	PAGEADD=0XB8;		//显示起始页为第0页
	CLMADD=0X60;		//起始列为第32列
	i=1;				//迎	
	dis1();				//调用显示函数

	PAGEADD=0XB8;		//显示起始页为第0页
	CLMADD=0X40;		//起始列为第0列
	i=2;				//光	
	dis2();				//调用显示函数2

	PAGEADD=0XB8;		//显示起始页为第0页
	CLMADD=0X60;		//起始列为第32列
	i=3;				//临	
	dis2();				//调用显示函数2
	
	PAGEADD=0XB8;		//显示起始页为第0页
	CLMADD=0X70;		//起始列为第48列
	i=7;				//!
	dis2();		//调用E2边显示函数

	PAGEADD=0XBC;		//显示起始页为第4页
	CLMADD=0X50;		//起始列为第16列
	i=4;				//显示数组中对应的第一个字	
	dis1();				//调用显示函数

	PAGEADD=0XBC;		//显示起始页为第4页
	CLMADD=0X70;		//起始列为第48列
	i=5;				//显示数组中对应的第六个字	
	dis1();				//调用显示函数

	PAGEADD=0XBC;		//显示起始页为第4页
	CLMADD=0X50;		//起始列为第16列
	i=6;				//显示数组中对应的第三个字	
	dis2();				//调用显示函数
	
        while(1)
         {
           delay(1000);
           RC1=!RC1;
          }
}


















⌨️ 快捷键说明

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