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

📄 lcd128645.c

📁 lcd12864 驱动程序,此设计是基于PIC单片机的压力采集显示。
💻 C
📖 第 1 页 / 共 3 页
字号:
  send_i(0x1);                   //清除所有显示
  send_i(0x34);                  //扩展指令操作
  send_i(0x30);                  //基本指令操作
}

//------------------------------------------
//查表函数,显示LOGO信息,   
void qushu1(int counts,const unsigned char *ps)
{
  int i;                         //定义循环变量
  for(i=counts;i>0;i--)          //循环counts次
     {  
        send_d(*ps);             //查表取数并调用显示一个字节数据函数送显示
        delay();  delay(); delay(); delay(); delay();                //延长一定时间,确保能看到数据一个个的显示出来
        ps++;                    //取下一个数据
     }
}

//------------------------------------------
//查表函数,显示LOGO信息,   
void qushu11(int counts,const unsigned char *ps)
{
  int i;                         //定义循环变量
  for(i=counts;i>0;i--)          //循环counts次
     {  
        send_d(*ps);             //查表取数并调用显示一个字节数据函数送显示
        //delay();                 //延长一定时间,确保能看到数据一个个的显示出来
        ps++;                    //取下一个数据
     }
}


//-------------------------------------------
//显示一字节数据函数
void send_d(unsigned char x)
{
   chk_busy();                  //检测LCD是否工作繁忙
   rs=1;                        //设置该字节数据是显示数据
   rw=0;                        //设置该次操作为写
   PORTD=x;                     //送数据口PORTD
   e=1;                         //使能
   nop();
   nop();
   nop();                       
   e=0;                         //禁止
}

//--------------------------------------------
//送一字节命令代码函数
void send_i(unsigned char x)
{
   chk_busy();                  //检测LCD是否工作繁忙
   rs=0;                        //设置该字节数据为控制命令
   rw=0;                        //设置此次操作为写
   PORTD=x;                     //送数据口PORTD
   e=1;                         //使能
   nop();
   nop();
   nop();
   e=0;                         //禁止
}

void write_xy_d(unsigned char x,   unsigned char d)
{
  send_i(x);
  send_d(d);
}

//-------------------------------------------
//检测LCD是否工作繁忙
void chk_busy()
{  
   busy=1;                      //先置位繁忙标志位
   TRISD=0XFF;                  //更改通信为输入
   rs=0;                        //设置该字节数据为命令代码
   rw=1;                        //设置此次操作为读
   while(busy)                  
      {
         nop();
         nop();
         nop();
         e=1;                   //使能
         nop();
         nop();
         nop();
         if(!RD7) busy=0;       //检测LCD是否工作繁忙
         nop();
         nop();
         nop();
         e=0;                   //禁止
      }
   e=0;                         //禁止
   TRISD=0X00;                  //恢复通信为输出
 }


/*
void adinitial()
{
   ADCON0=0X49;
   ADCON1=0X80;
   PIE1=0X00;
   PIE2=0X00;
   ADIE=1;
   PEIE=1;
   TRISA1=1;
}

void interrupt adint(void)
{
   ADIF=0;
   adresult.adre[0]=ADRESL;
   adresult.adre[1]=ADRESH;
   uinttouchar(adresult.y1);
   delay();
}
*/
//-------------------------------------------
//延时函数
void delay()
{
    int i;
    for(i=0;i<5535;i++)
       {;}
}

//-------------------------------------------
//延时函数1
void delay1()
{
    int i;
    for(i=0;i<10;i++)
      {
        delay();               //调用延时函数
      }
} 

//------------------------------------------------
//按键扫描程序
void  scan_key()
{
   ADCON1=0X82;              //设置A口为普通I/O口
   TRISB=0X0F;               //设置B口低4位为输入
   TRISD=0X00;               //设置D口全部为输出
   PORTA=0XFF;               
   PORTD=0XFF;               //先关闭所有显示
   //TRISB=0X0F;                //设置B口低4位为输入
   result_key=0x5;            //初始化按键扫描结果,无按键按下时的结果
   if(RB0==0)                 //判断B0是否按下
   {
     delay1();
     if (RB0==0) result_key=0x1;
     if (RB0==0) k1=0x1;
   }

   if(RB1==0)                 //判断B1是否按下
   {
     delay1();     
     if(RB1==0) result_key=0x2;
     if(RB1==0) k2=0x2;
   }

   if(RB2==0)                 //判断B2是否按下
   {
     delay1();  
     if(RB2==0)  result_key=0x3;
     if(RB2==0)  k3=0x3;
   }

   if(RB3==0)                 //判断B3是否按下
   {
     delay1();
     if(RB3==0) result_key=0x4;
     if(RB3==0) k4=0x4;
   } 
}

//-------------------------------------------------
//结果显示程序
void  display_key(int x)
{  
   
   switch(x)                        //根据X值的不同,跳转到相应的部分处理
   {
      case 0x1:
          menu_main();  delay_key();   break;           //B0  主菜单
      case 0x2:
          menu_down();  delay_key();   break;           //B1  确定 按键
      case 0x3:
          menu_up();    delay_key();   break;           //B2  移动 按键
      case 0x4:
          menu_close();delay_key();    break;           //B3  取消 按键
      default:                         break;
    }
}



//------------------------------------------------------------------
//延时程序  键盘扫描
void  delay_key()                   //延时程序
{
  int i;                            //定义整形变量
  for(i=0x100;i--;);                //延时
}

//-------------------------------------------------------------------
void  menu_main()                  //菜单 按键
{
  show3(); 
  write_xy_d(0x90,0x10);           //第二行,> 
}

//-------------------------------------------------------------------
void  menu_down()                  //确定 按键
{
  if (k1==0x1)                     //进入 菜单
  if (k2==0x2)                     //确定 按键
  {
    if (cnt==0x0) TF_CHECK();      //指向>     通风压力设置 
    if (cnt==0x1) CN_CHECK();      //指向>     舱内压力设置       
  }
}

//-------------------------------------------------------------------
void  menu_up()                    //移动 按键
{
  if (k1==0x1)                     //进入菜单
  if (k3==0x3)                     //移动键
  {
    if (cnt==0x1)                  //MENU:  下
    {                    
       write_xy_d(0x90,0x20);      //清除第二行的 >
       write_xy_d(0x88,0x10);      //设置显示位置:第三行//>     舱内压力设置  
     }
     if (cnt==0x0)                 //MENU:  下
    {
       write_xy_d(0x90,0x10);      //设置显示位置:第二行//>     通风压力设置               
       write_xy_d(0x88,0x20);      //清除第三行的 >
     }
     cnt++;
     if (cnt>1) cnt=0;
   }
}

//-------------------------------------------------------------------
void  menu_close()                 //退出按键
{
  result_key=0x0; 
  k1=0;
  k2=0;
  k3=0;
  k4=0;
  cnt=0;
  //break;
}

//-------------------------------------------------------------------
void  TF_CHECK()                 //通风压力检测
{
  init_e();
  ee_data_write[0]=n1;
  ee_data_write[1]=j2;
  write();
  delay_e();
  menu_close();

  init();                      //调用I/O口设置函数
  lcd_init();                  //调用LCD初始化函数   
  clear_p();                   //调用清屏函数
}

//-------------------------------------------------------------------
void  CN_CHECK()                 //舱内通风压力检测
{
  init_e();
  ee_data_write[0]=j1;
  ee_data_write[1]=n2;
  write();
  delay_e();
  menu_close();
  
  init();                      //调用I/O口设置函数
  lcd_init();                  //调用LCD初始化函数   
  clear_p();                   //调用清屏函数
}

void init_e()
  {
   STATUS=0X0;

   PORTD=0XFF;
   ADCON1=0X02;

   TRISC=0XFF;

   //TRISA=0X00;

   //TRISB=0X03;

   //TRISD=0X00;

   SSPADD=0X9;
   SSPSTAT=0X80;
   SSPCON=0X38;
  }
  
void write()
  {
    int i;
    i2c_idle();
    SEN=1;
    while(!SSPIF);
    SSPIF=0;
    SSPBUF=0XA0;
    wrtacktest();
    while(STAT_BF);
    SSPBUF=address1;
    wrtacktest();
    while(STAT_BF);
 
    for(i=0;i<2;i++)
      {
         SSPBUF=ee_data_write[i];
         wrtacktest();
      }
    PEN=1;
    nop();
    SSPIF=0;
    delay();
    delay();
    //PORTD=0XA4;
    //PORTA=0X3E;
 }

void read()
 {
    static volatile unsigned int i;
    i2c_idle();
    SSPIF=0;
    SEN=1;
    while(!SSPIF);
    SSPIF=0;
    SSPBUF=0XA0;
    wrtacktest();
    SSPBUF=address1;
    wrtacktest();
    
    i2c_idle();
    SSPIF=0;
    RSEN=1;
    while(!SSPIF);
    SSPIF=0;
    SSPBUF=0XA1;
    wrtacktest();
   
    for(i=0;i<2;i++)
       {
          RCEN=1;
          while(!SSPIF);
          ee_date[i]=SSPBUF;
          while(!SSPIF);
          SSPIF=0;
          if(i>=1) 
              {
                ACKDT=1;
              }
          else     
              {
                ACKDT=0;
              }
          ACKEN=1;
          while(!SSPIF);
          SSPIF=0;
       }
   
    PEN=1;
    while(!SSPIF);
    SSPIF=0;
 }
     
void wrtacktest()
 {
   while(!SSPIF);
   SSPIF=0;
 }

void i2c_idle()
 {
   while(STAT_RW);
   ZERO=0;
   while(ZERO)
     {
       SSPCON2&0x1f;
     }
 }
    
void display_e()
   { 
     int i;
     i=ee_date[0]&0x0f;
     PORTD=TABNUM[0];
     delay();

     i=ee_date[1]&0x0f;
     PORTD=TABNUM[1];
     delay();
   }

void delay_e()
 {
    int i;
    for(i=0;i<100;i++)
       {;}
 }






⌨️ 快捷键说明

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