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

📄 mbm12864lcd 090430.c

📁 PIC18F44K20开发的液晶屏程序:宏泰128*64液晶;10个按键;每个按键配个微型LED指示灯;仿照西门子做的
💻 C
📖 第 1 页 / 共 4 页
字号:
    p=fuhao_ku;
    p=p+(2*HZFH_MOD*s[j]); 
    //p=p+(*str++)*HZFH_MOD*2;
    //p=p+2*HZFH_MOD*(*str++); 
    set_lcd_page(lcd_page-1);
    set_lcd_column(lcd_column);
    for(i=0;i<HZFH_MOD;i++)
       {
        zimo_temp=*p++;              //读出字模
        zimo_temp=(read_lcd_data()^zimo_temp);
        write_lcd_data(zimo_temp);
       }
    set_lcd_page(lcd_page);
    set_lcd_column(lcd_column);
    for(i=0;i<HZFH_MOD;i++)
       {
        zimo_temp=*p++;              //读出字模
        zimo_temp=(read_lcd_data()^zimo_temp);
        write_lcd_data(zimo_temp);
       }
    lcd_column=lcd_column+HZFH_MOD;
   }
 write_lcd_ordor(LCD_MODIFL_READ_OFF);
}
//******************************************************
//清12864LCD显示屏
//******************************************************`
void cls_lcd12864_progrom(void)
{
 char i,j;
 for(j=0;j<8;j++)
   {
    set_lcd_column(0);
    set_lcd_page(j);
    for(i=0;i<128;i++) write_lcd_data(0x00);
   }
}
//******************************************************
//清LCD显示屏当前一个128*16水平行
//结束后lcd_column=0
//******************************************************
void cls_lcd_doubpage(void)
{
 char i;
 set_lcd_column(0);
 set_lcd_page(lcd_page-1);
 for(i=0;i<128;i++) write_lcd_data(0x00);
 set_lcd_page(lcd_page);
 for(i=0;i<128;i++) write_lcd_data(0x00);
 lcd_column=0; set_lcd_column(0);
}
//******************************************************
//显示一个12864图片
//******************************************************
void display_bmp_progrom(const char *picture)
{
 char i,j;
 set_lcd_page(0);
 set_lcd_column(0);
 for(j=0;j<8;j++)
   {
    set_lcd_page(j);
    set_lcd_column(0);
    for(i=0;i<128;i++)write_lcd_data(*picture++);
   }
 set_lcd_page(0);
 set_lcd_column(0);
}
//******************************************************
//显示一个任意大小窗口
//X Y LX LY
//结束后lcd_page lcd_column 0
//******************************************************
void display_mini_windows(unsigned char column_address,unsigned char page_address,
                          unsigned char x_val,unsigned char y_val)
{
 char i,j;
 set_lcd_page(column_address);
 set_lcd_column(page_address);

 write_lcd_data(0xff);   //第1行
 write_lcd_data(0xf3);
 for(i=2;i<(x_val-2);i++) write_lcd_data(0xdf);
 write_lcd_data(0xf3);
 write_lcd_data(0xff); 
 for(j=1;j<y_val;j++)  //第2--y_val-1行
   {
    set_lcd_page(page_address+j);
    set_lcd_column(column_address);
    write_lcd_data(0xff); 
    write_lcd_data(0x00);    
    for(i=2;i<(x_val-2);i++) write_lcd_data(0xFF);
    write_lcd_data(0x00);  
    write_lcd_data(0xff); 
   }
 set_lcd_page(page_address+y_val);//第y_val行
 set_lcd_column(column_address);
 write_lcd_data(0xff);
 write_lcd_data(0xc0);
 for(i=2;i<(x_val-2);i++) write_lcd_data(0xbf);
 write_lcd_data(0xc0);
 write_lcd_data(0xff); 

}
//******************************************************
//显示开机LOG
//"设备名称" "石家庄梅波科技开发有限公司""www.hbmeibo.com"
//1正显示2.5s 2反显示2S 3滚动显示100ms*64 4斑条显示2.5s 5单点擦除结束  
//******************************************************
void display_log_progrom(void)
{
 char i,j,str[16];
 display_bmp_progrom(log_data1);
 time_1s_Flag=0;do{}while(time_1s_Flag==0);write_lcd_ordor(LCD_DISPLAY_REV_REV);
 time_1s_Flag=0;do{}while(time_1s_Flag==0);write_lcd_ordor(LCD_DISPLAY_REV_NOR);
 cls_lcd12864_progrom();
 out6HZtextxy((4+2*HZFH_MOD*2),1,HZ_wen,HZ_du,HZ_kong,HZ_zhi,HZ_she,HZ_bei);//温度控制设备
 out5HZtextxy((10+2*HZFH_MOD*2),3,HZ_shi,HZ_nop,HZ_jia,HZ_nop,HZ_zhuang); //石 家 庄
 out10HZtextxy(4+2*HZFH_MOD*0,5,HZ_mei,HZ_bo,HZ_ke,HZ_ji,HZ_kai,HZ_fa,HZ_you,HZ_xian,HZ_gong,HZ_si); //梅波科技开发有限公司
 sprintf(str,"%15s","www.hbmeibo.com");
 outtextxy(7+HZFH_MOD*2,7,str); 
 time_4s_Flag=0;do{}while(time_4s_Flag==0);
/*
 for(i=0;i<64;i++)       //向上推移
   {
    time_10ms_Flag=0;do{}while(time_10ms_Flag==0);
    write_lcd_ordor(0x40|i);
   }
 for(i=64;i>0;i--)       //向下推移
   {
    time_10ms_Flag=0;do{}while(time_10ms_Flag==0);
    write_lcd_ordor(0x40|i);
   }
 write_lcd_ordor(0x40);  
*/
 write_lcd_ordor(LCD_MODIFL_READ_ON);  
 for(j=0;j<8;j++)      //隔行异或
   { 
    set_lcd_page(j);
    set_lcd_column(0);
    for(i=0;i<128;i++)
      {
       time_x_Flag=0;timex=TIME_1msVAL;do{} while(time_x_Flag==0);
       write_lcd_data(read_lcd_data()^0xff);
      }
   }
 for(j=0;j<8;j++)      //隔行异或
   {
    set_lcd_page(j);
    set_lcd_column(0);
    for(i=0;i<128;i++)
      {
       time_x_Flag=0;timex=TIME_1msVAL;do{} while(time_x_Flag==0);
       write_lcd_data(read_lcd_data()^0xff);
      }
   }
 write_lcd_ordor(LCD_MODIFL_READ_OFF); 
 timex=TIME_1sVAL;time_x_Flag=0;do{}while(time_x_Flag==0);
}
//******************************************************
//延时程序 单位i>
//******************************************************
void delay(unsigned char i)
{
 do{i--;}while(i>0);
}
//******************************************************
//蜂鸣器程序 开启5ms后关断
//******************************************************
void beep(void)
{
 unsigned int i=(5000*FCY);
 SPEAK_DRV=1;
 do{}while(--i>0);
 SPEAK_DRV=0;
}
//******************************************************
//每4ms启动读键值及LED指示灯显示一次1次
//每次扫描一对键和一对LED灯
//完全扫描一个周期需要20ms
//1.LK_SLe=1 LK_SLx=0
//2.LED_RAMx-->LED_S1-6
//3.IF KEY_S1=0 KEY_RAM0=x;IF KEY_S2=0 KEY_RAM0=x
//4.IF KEY_COUNT=0 解析KEY值 KEY_COUNT=5 else key_count--;
/*有关变量和参数
#define KEY_S1 RB6           //键盘:输入1
#define KEY_S2 RB7           //键盘:输入2
#define LED_S1 RB0           //LED:输出1
#define LED_S2 RB1           //LED:输出1
#define LED_S3 RB2           //LED:输出1
#define LED_S4 RB3           //LED:输出1
#define LED_S5 RB4           //LED:输出1
#define LED_S6 RB5           //LED:输出1
#define LK_SL1 RA0          //KEYLED扫描:输出1
#define LK_SL2 RA1          //KEYLED扫描:输出2
#define LK_SL3 RA2          //KEYLED扫描:输出3
#define LK_SL4 RA3          //KEYLED扫描:输出4
#define LK_SL5 RA4          //KEYLED扫描:输出5
#define LK_SL6 RA5          //KEYLED扫描:输出6
bank2 unsigned char key_count;                     //键盘计数器0-4
bank2 unsigned char flagled_ram1;                  //LED指示灯显示数据 K1 K1+5对应LED第1个
bank2 unsigned char flagled_ram2;                  //LED指示灯显示数据 K2 K2+5对应LED第1个
bank2 unsigned char flagled_ram3;                  //LED指示灯显示数据 K3 K3+5对应LED第1个
bank2 unsigned char flagled_ram4;                  //LED指示灯显示数据 K4 K4+5对应LED第1个
bank2 unsigned char flagled_ram5;                  //LED指示灯显示数据 K5 K5+5对应LED第1个
bank2 unsigned char key_ram0;                      //健值缓冲区 第0个  K1-K10对应
bank2 unsigned char key_ram1;                      //健值缓冲区 第1个  K1-K5对应
bank2 unsigned char key_ram2;                      //健值缓冲区 第2个  K1-K5对应
bank2 unsigned char key_re_count;                  //重复健计数器
unsigned char volatile key_val;                    //健值
bit volatile key_re_bit;                  //键盘重复标志
bit volatile key_set_bit;                 //键盘复合标志
bit volatile key_sel_bit;                 //键盘复合标志
键值标示方法:
K1=01  K2=02 .....k9=0x20 k10=40
RE_keyx=01+0x80   SET——key=01+0x40 (复合)  SEL+key==01+0x20
led指示灯 分为5组 分别用flagled_ramx标示 (KEY1) B0--LED1 B1--LED2 B2--LED3
                                         (KEY2) B4--LED1 B5--LED2 B6--LED3
*/
//******************************************************
void read_key_prom()
{
if(time_key_Flag==0) return;
time_key_Flag=0;
LK_SL1=1;
LK_SL2=1;
LK_SL3=1;
LK_SL4=1;
LK_SL5=1;
if(key_count==5) 
  {
   display_flagled(flagled_ram1);
   LK_SL1=0;
   if(KEY_S1==0) key_ram0=0x01;
   if(KEY_S2==0) key_ram0=0x02; 
  }
else if(key_count==4)
       {
        display_flagled(flagled_ram2);
        LK_SL2=0;
        if(KEY_S1==0) key_ram0=0x03;
        if(KEY_S2==0) key_ram0=0x04; 
       }
else if(key_count==3)
       {
        LK_SL3=0;
        display_flagled(flagled_ram3);
        if(KEY_S1==0) key_ram0=0x05;
        if(KEY_S2==0) key_ram0=0x06; 
       }
else if(key_count==2)
       {
        display_flagled(flagled_ram4);
        LK_SL4=0;
        if(KEY_S1==0) key_ram0=0x07;
        if(KEY_S2==0) key_ram0=0x08; 
       }
else if(key_count==1)
       {
        LK_SL5=0;
        display_flagled(flagled_ram5);
        if(KEY_S1==0) key_ram0=(key_ram0+0x20);
        if(KEY_S2==0) key_ram0=(key_ram0+0x40); 
       }
if((--key_count)!=0)return;


if(key_re_bit==1)    //重复按键检测确认和退出
  {
   if((key_ram0==key_ram1)&&(key_ram1==key_ram2)&&(key_ram0!=0))
     {
      if(--key_re_count==0)
        {
         key_val=(key_ram1+0x80);
         key_re_count=KEY_RE_COUNT1;
        }
     } 
   else 
     { 
      key_ram1=0;
      key_ram2=0;
      key_re_count=KEY_RE_COUNT0;
      key_re_bit=0;
     }
  }
else
if(key_set_bit==1)     //SET复合按键确认和退出
  {
   if((key_ram0==KEY_SET)&&(key_ram1==key_ram2)&&(key_ram1!=KEY_SET))
     {
      key_val=key_ram1;
      key_re_count=KEY_RE_COUNT0;
      key_re_bit=0;
      key_set_bit=1;
     }
   else
   //if((key_ram0&KEY_SET)==0)
   if(key_ram0!=KEY_SET)
     {
      key_ram1=0;
      key_ram2=0;
      key_re_count=KEY_RE_COUNT0;
      key_re_bit=0;
      key_set_bit=0;
     }
   }
else
if(key_sel_bit==1)     //SEL复合按键确认和退出
  {
   if((key_ram0==KEY_SEL)&&(key_ram1==key_ram2)&&(key_ram1!=KEY_SEL))
     {
      key_val=key_ram1;
      key_re_count=KEY_RE_COUNT0;
      key_re_bit=0;
      key_set_bit=0;
      key_sel_bit=1;
     }
   else
//   if((key_ram0&KEY_SEL)==0)
   if(key_ram0!=KEY_SEL)
     {
      key_ram1=0;
      key_ram2=0;
      key_re_count=KEY_RE_COUNT0;
      key_re_bit=0;
      key_sel_bit=0;
      key_set_bit=0;
     }
   }
else
if((key_ram0==0)&&(key_ram1==key_ram2)&&(key_ram1!=0)) //单独按键检测和运算确认
  {
   key_val=key_ram1;
   key_re_count=KEY_RE_COUNT0;
   key_re_bit=0;
   key_set_bit=0;
   key_sel_bit=0;
  }
else
if((key_ram0==KEY_SET)&&(key_ram1==key_ram2)&&(key_ram1!=KEY_SET)&&(key_ram1!=0))//SET复合按键检测
  {
   key_val=key_ram1;
   key_re_count=KEY_RE_COUNT0;
   key_re_bit=0;
   key_set_bit=1;
   key_sel_bit=0;
  }
else
if((key_ram0==KEY_SEL)&&(key_ram1==key_ram2)&&(key_ram1!=KEY_SEL)&&(key_ram1!=0))//SEL复合按键检测
  {
   key_val=key_ram1;
   key_re_count=KEY_RE_COUNT0;
   key_re_bit=0;
   key_set_bit=0;
   key_sel_bit=1;
  }
else
if((key_ram0==key_ram1)&&(key_ram1==key_ram2)&&(key_ram0!=0)) //重复按键检测
  {
   if(--key_re_count==0)
     {
      key_val=(key_ram1+0x80);
      key_re_count=KEY_RE_COUNT1;
      key_re_bit=1;
      key_set_bit=0;
      key_sel_bit=0;
     }
  }
key_ram2=key_ram1;
key_ram1=key_ram0;
key_ram0=0;
key_count=5;
}
//********************************************************
//play_flagled(flagled_ram)
//根据flagled_ram数值 点亮对应led指示灯
//********************************************************
void display_flagled(unsigned char flagled_ram)
{
 if((flagled_ram&0x01)!=0) LED_S1=1;else LED_S1=0;
 if((flagled_ram&0x02)!=0) LED_S2=1;else LED_S2=0;
 if((flagled_ram&0x04)!=0) LED_S3=1;else LED_S3=0;
 if((flagled_ram&0x10)!=0) LED_S4=1;else LED_S4=0;
 if((flagled_ram&0x20)!=0) LED_S5=1;else LED_S5=0;
 if((flagled_ram&0x40)!=0) LED_S6=1;else LED_S6=0;
}
//********************************************************
//结束
//********************************************************

⌨️ 快捷键说明

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