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

📄 mbm12864lcd 090430.c

📁 PIC18F44K20开发的液晶屏程序:宏泰128*64液晶;10个按键;每个按键配个微型LED指示灯;仿照西门子做的
💻 C
📖 第 1 页 / 共 4 页
字号:
       {time_x_Flag=1;}
      if(--timekey==0)
       {time_key_Flag=1;
        timekey=TIME_4msVAL;
       }
      if(--time_redisplay==0)   //每五秒自动刷新LCD一次
       {display_renew_Flag=1;
        time_redisplay=TIME_5sVAL;
       }
    }
read_key_prom();
ei();
}
//******************************************************
//主程序
//******************************************************
//#define DEBUG   0x01
void main()
{
//char i;
//char *p;
unsigned char str[6];
static bit mini_win;
unsigned char display_buff(128,8);//开辟一个显示缓存用于显示
char hex_per=10; 
init_pic18f45k20();
init_lcd12864();
LCD_BACKLIGHT=1;
lcd_pro_BACKLIGHT=1;
cls_lcd12864_progrom();
display_log_progrom();
cls_lcd12864_progrom();
display_no=0;
display_renew_Flag=1;
SSPOV=0;
LCD_BACKLIGHT=1;
lcd_pro_BACKLIGHT=1;
SPEAK_DRV=0;
keyval=0;


do
  {
   if(display_renew_Flag==1)
     {
      display_renew_Flag=0;
      out4HZtextxy(40,1,HZ_xianSHI,HZ_XIANshi,HZ_chuang,HZ_kou);
      out2HZtextxy(0,3,HZ_kai,HZ_du);
      draw_bar_xy(24,3,100,hex_per);
      out2HZtextxy(0,5,HZ_wen,HZ_du);
      draw_bar_xy(24,5,100,hex_per+10);
      out2HZtextxy(0,7,HZ_wei,HZ_WEIzhi);
      draw_bar_xy(24,7,100,hex_per+20);
      sprintf(str,"%x",key_val);
      outtextxy(88,1,str);
      if(mini_win==1)
        {
         //cls_lcd12864_progrom();
         lcd_write_MOD=LCD_WR_MODE_REV;
         display_mini_windows(30,1,80,6);
         out4HZtextxy(35,5,HZ_wei,HZ_WEIzhi,HZ_xianSHI,HZ_XIANshi);
         lcd_write_MOD=LCD_WR_MODE_NOR;
        }
     }
   if((key_val==KEY_SET)&&(mini_win==0))
     {
      key_val=0;
      mini_win=1;
      display_renew_Flag=1;
     }
   if((key_val==KEY_SET)&&(mini_win==1))
     {
      key_val=0;
      mini_win=0;
      display_renew_Flag=1;
     }
   if(mini_win==0)
     {
      if((key_val==KEY_UP)||(key_val==KEY_UP_R))
        {
         key_val=0;
         display_renew_Flag=1;
         hex_per++;
        }
      if((key_val==KEY_DOWN)||(key_val==KEY_DOWN_R))
        {
         key_val=0;
         display_renew_Flag=1;
         hex_per--;
        }
     }
   if(key_val==KEY_SET_UP)
     {
      key_val=0;                //LCD属性 对比度
      beep();
      write_lcd_ordor(LCD_SET_REF_MOD);
      write_lcd_ordor(lcd_pro_REFVOLT++);
     }
   if(key_val==KEY_SET_DOWN)
     {
      key_val=0;                //LCD属性 对比度
      beep();
      write_lcd_ordor(LCD_SET_REF_MOD);
      write_lcd_ordor(lcd_pro_REFVOLT--);
     }
   if(key_val==KEY_SET_F1)
     {
      key_val=0;
      beep();
      if(lcd_pro_REVERSE==0)
        {
         lcd_pro_REVERSE=1;
         write_lcd_ordor(LCD_DISPLAY_REV_REV);
        }
      else
        {
         lcd_pro_REVERSE=0;
         write_lcd_ordor(LCD_DISPLAY_REV_NOR);
        }
     }
   if(key_val==KEY_SET_F3)
     {
      key_val=0;
      beep();
      if(lcd_pro_BACKLIGHT==0){lcd_pro_BACKLIGHT=1;LCD_BACKLIGHT=1;}
      else {lcd_pro_BACKLIGHT=0;LCD_BACKLIGHT=0;}
     }
   //ledFlag测试程序
   if(key_val==KEY_F1)
     {
      if((++flagled_ram1&0x0f)>0x7) flagled_ram1=(flagled_ram1&0xf0);
      key_val=0;
      beep();
     }
   if(key_val==KEY_F2)
     {
      flagled_ram1=(flagled_ram1+0x10);
      if((flagled_ram1&0xf0)>0x70) flagled_ram1=(flagled_ram1&0x0F);
      key_val=0;
      beep();
     }
   if(key_val==KEY_F3)
     {
      if((++flagled_ram2&0x0f)>0x7) flagled_ram2=(flagled_ram2&0xf0);
      key_val=0;
      beep();
     }
   if(key_val==KEY_F4)
     {
      flagled_ram2=(flagled_ram2+0x10);
      if((flagled_ram2&0xf0)>0x70) flagled_ram2=(flagled_ram2&0x0F);
      key_val=0;
      beep();
     }
 if(key_val==KEY_F5)
     {
      if((++flagled_ram3&0x0f)>0x7) flagled_ram3=(flagled_ram3&0xf0);
      key_val=0;
      beep();
     }
   if(key_val==KEY_F6)
     {
      flagled_ram3=(flagled_ram3+0x10);
      if((flagled_ram3&0xf0)>0x70) flagled_ram3=(flagled_ram3&0x0F);
      key_val=0;
      beep();
     }
/* if(key_val==KEY_F7)
     {
      if((++flagled_ram4&0x0f)>0x7) flagled_ram4=(flagled_ram4&0xf0);
      key_val=0;
      beep();
     }
   if(key_val==KEY_F8)
     {
      flagled_ram4=(flagled_ram4+0x10);
      if((flagled_ram4&0xf0)>0x70) flagled_ram4=(flagled_ram4&0x0F);
      key_val=0;
      beep();
     }
*/
  }
while(1);
}
//******************************************************
//初始化pic18f45k20
//******************************************************
void init_pic18f45k20(void)
{
 POR=0;                        //清除上电复位标志
 OSCCON=0x00;                  //使用主振荡器
 RCON=0x00;                    //复位控制:中断优先级禁止(使能)
 INTCON=0x00;
//设置A B C D E数字口
//.........................................................
//RA0-4 LK_SL1-5 KEYLED扫描输出;RA5 LCD_RS LCD数据指令选择信号输出; 
//RB6 7 KEY_S1-2键盘输入;RB0-5 LED——S1-6输出
//RC0 SPERK_DRV喇叭驱动输出;RC1、2 EEPROM2_SCL、SDA输出;其他输入
//RD0-7 LCD_DATA_PORT LCD数据接口输出/输入;
//RE0、1、2 LCD_E LCD_RW LCD_CSB LCD读写信号 LCD片选信号输出
//.........................................................
 PORTA=0;LATA=0;
 PORTB=0;LATB=0;
 PORTC=0;LATC=0;
 PORTD=0;LATD=0;
 PORTE=0;LATE=0;
 ADCON0=0b00000000;              //设置A口及AD转换器:设置A口为数字口 关闭AD
 ADCON1=0b00000000;          
 ADCON2=0b00000000;
 ANSELH=0x00;                    //关闭所有模拟端口
 ANSEL=0x00;
 SLRA=0;                         //设置端口修率SLRCON
 SLRB=0;
 SLRC=0;
 SLRD=0;
 SLRE=0;
 TRISA=0b00000000;               //设置A口输出:012345 输入:NO
 TRISB=0b11000000;               //设置B口输出:012345 输入:67
 TRISC=0b11011000;               //设置C口输出:0125 输入:3467
 TRISD=0b00000000;               //设置D口输出:01234567 输入:NO
 TRISE=0b00000000;               //设置E口输出:012 输入:NO (该寄存器高4位控制D口从动)
 WPUB=1;                         //禁止所有PORTB上拉
 //设置I2C参数
 TRISC3=1;TRISC4=1;
 SSPSTAT=0b10000000;           //设置i2c参数:I2C从动方式(标准速率控制)
 SSPCON1=0b00110110;           //SSPEN=1:同步串口使能位;CKP=1:SCK释放控制位 SSPM=0110 I C 从模式,7 位地址
 SSPCON2=0b00000000;           //通用地址禁止
 SSPADD=I2C_ADD;               //I2C从地址
 SSPIF=1;SSPIE=1;              //I2C接收发送中断
 //设置SCI模块
 TRISC6=0;TRISC7=1;
 TXSTA=0b00100100;               //设置SCI模块 8位发送 异步 高速 发送允许
 RCSTA=0b00010000;               //配置SCI模块 (使能)SCI数据长度8 允许连续接受
 SPBRG=((CLOCK_FREQ/16)/BAUD)-1; //设定波特率;                  //4M:D'25' 8M:51 16M:D'103' 20M:D'129' 波特率9600
 RCIE=1;TXIE=0;                  //接收中断 发送不中断
 SPEN=0;                        //关闭 SCI
 //设置TMR0模块
 //T0CON=0b11000000;            //使能TMR08位定时器 内部时钟 上升沿增量 不预分频 分频率1:2
 TMR0ON=1;                     
 T08BIT=1;
 T0CS=0;
 T0SE=0;
 PSA=1;
 T0PS2=0;
 T0PS1=0;
 T0PS0=0;
 TMR0H=0x00;                    //预置值0x00  每514(FCY)指令周期时钟中断一次
 TMR0L=0x00;
 TMR0IF=0;
 TMR0IE=1;
 //设置TMR1模块
 T1CON=0b00110000;          //8位方式操作.定时器内部时钟 预分频8 时间当量2us max=131.072ms
 TMR1IF=0;
 TMR1IE=0;
 TMR1H=0;
 TMR1L=0;
 TMR1ON=0;                  //暂时关闭TMR1
 //设置TMR2模块
 T2CON=0b01111110;          //8位定时器内部时钟 后预分频16 前分频16
 TMR2IF=0;
 TMR2IE=0;
 PR2=156;
 TMR2ON=0;                  //暂时关闭TMR2
 //设置CAN模块
 //initcan();
 //设置INT0 INT1: INT0下降沿中断 INT1上升沿中断
 //TRISB0=1;TRISB1=1;
 //INTEDG0=0;INTEDG1=0;
 //INT0IE=1;INT1IE=1;
 //设置其他中断:TIME0IE;INT0IE;RBIE
 ADIE=0;                       //外围中断 
 C1IE=0;                       //比较器中断
 C2IE=0;
 RCIE=0;                       //SCI 发送中断
 TXIE=0;                       //SCI 接受中断
 SSPIE=0;                      //SSP中断
 CCP1IE=0;                     //CCP中断
 TMR0IE=1;                     //TIME0中断  
 TMR1IE=0;                     //TIME1中断 
 TMR2IE=0;                     //TIME2中断 
 TMR3IE=0;                     //TIME3中断 
 RBIE=0;                       //B口变化中断 
 //清除中断标志
 TMR0IF=0; 
 TMR2IF=0; 
 INT0IF=0;
 INT1IF=0;
 RCIF=0;
 TXIF=0;
 //RXB0IF=0;
 //RXB1IF=0;
 //TXB0IF=0;
 //TXB1IF=0;
 //TXB2IF=0;
 //开放外围中断、总中断
 PEIE=1;                      //允许所有未被屏蔽的外设中断 
 GIE=1;                       //允许所有未被屏蔽的中断
 WDTCON=1;                    //使能看们狗
//初始化参数
 key_count=5;
 time_10ms_Flag=1;
 time10ms=TIME_10msVAL;
 time_20ms_Flag=1;
 time20ms=TIME_20msVAL;
 time_100ms_Flag=1;
 time100ms=TIME_100msVAL;
 time_200ms_Flag=1;
 time200ms=TIME_200msVAL;
 time_300ms_Flag=1;
 time300ms=TIME_300msVAL;
 time_500ms_Flag=1;
 time500ms=TIME_500msVAL;
 time_1s_Flag=1;
 time1s=TIME_1sVAL;
 time_2s_Flag=1;
 time2s=TIME_2sVAL;
 time_4s_Flag=1;
 time4s=TIME_4sVAL;
 time_key_Flag=1;
 timekey=TIME_20msVAL;
}
//******************************************************
//初始化LCD12864
//******************************************************
void init_lcd12864(void)
{
 unsigned int temp;
 LCD_E=0;LCD_RS=1;LCD_CSB=1;LCD_RW=1;LCD_DATA_PORT=0;
 LCD_CSB=0;
 write_lcd_ordor(0xe2);  //RESTET
 temp=50;do{temp--;} while(temp>0);  //delay_20ms
 write_lcd_ordor(0xa0);  //ADC=0
 write_lcd_ordor(0xa6);  //reverse display=normal正像显示
 //write_lcd_ordor(0xa7);  //reverse display=0反像显示
 write_lcd_ordor(0xc8);  //SHL=0 com0--com63
 write_lcd_ordor(0xa2);  //BIAS=1  与占空比有关必须等于1
 write_lcd_ordor(0x2c);  //power control VC=1
 temp=50;do{temp--;} while(temp>0);//delay_20ms
 write_lcd_ordor(0x2e);  //reverse VC=1 VR=1 VF=0
 temp=50;do{temp--;} while(temp>0); //delay_20ms
 write_lcd_ordor(0x2f);  //reverse VC=1 VR=1 VF=1
 temp=50;do{temp--;} while(temp>0);//delay_20ms
 write_lcd_ordor(0x24);  //SET 1+Rb/Rb=4.35 p1<0x25(幅度大不用)
 temp=5;do{temp--;} while(temp>0);//delay_2ms
 write_lcd_ordor(0x81);  //REF VOLTAGE
 temp=5;do{temp--;} while(temp>0);//delay_20ms
 write_lcd_ordor(0x30);  //SV5--SV0=32调整对比度0x24最佳
 temp=5;do{temp--;} while(temp>0);//delay_20ms
 write_lcd_ordor(0xad);  //set static indic mode=0
 write_lcd_ordor(0x01);  //set s1=1 s0=1
 write_lcd_ordor(0x40+0x20);  //set initial display line=32(宏泰液晶需要增加32个页)
 write_lcd_ordor(0xa4);  //set entire=0正常显示
 //write_lcd_ordor(0xa5);  //set entire=1反白显示
 write_lcd_ordor(0xb0);  //set page=0
 write_lcd_ordor(0x1F);  //set column address=00
 write_lcd_ordor(0x0F);
 write_lcd_ordor(0xaf);  //display=ON
 lcd_page=0;
 lcd_column=0;
 lcd_pro_displayON=0;               //LCD属性 是否打开  0
 lcd_pro_REVERSE=0;                 //LCD属性 是否反白显示0
 lcd_pro_BACKLIGHT=0;               //LCD属性 背景灯是否打开0
 lcd_pro_REFVOLT=0x24;              //LCD属性 对比度 0x20 
 lcd_write_MOD=LCD_WR_MODE_NOR;     //LCD写入模式=0
}
//******************************************************
//显示数据刷新程序
//主机指令存放于data中,每次接受新数据后,解释并标志
//该程序负责将数据翻译为显示参数和数据 标志
//前3个字节为指令头 
//'O'R'D'表示控制指令:
//分别为对比度代码(char) 背景灯开闭(char) 正像反向显示(char)
//最后一个字节为校验码 前三个字节的和 共计7个有效字节
//'W'x'显示窗口指令 x(hex char)显示窗口号 后面为窗口数据 长度不定
//******************************************************
void display_renew_prom()
{
 if(display_data_renew_flag==1)
   {
    if((indata_buf[0]=='O')&&(indata_buf[1]=='R')&&(indata_buf[2]=='D'))
      {
       if((indata_buf[3]+indata_buf[4]+indata_buf[5])==indata_buf[6])
         {
          if(lcd_pro_REFVOLT!=indata_buf[3])
            {
             lcd_pro_REFVOLT=indata_buf[3];
             write_lcd_ordor(LCD_SET_REF_MOD);
             write_lcd_ordor(lcd_pro_REFVOLT);
            }
          if(indata_buf[4]==0){lcd_pro_BACKLIGHT=0;LCD_BACKLIGHT=0;}

⌨️ 快捷键说明

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