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

📄 mbm12864lcd 090430.c

📁 PIC18F44K20开发的液晶屏程序:宏泰128*64液晶;10个按键;每个按键配个微型LED指示灯;仿照西门子做的
💻 C
📖 第 1 页 / 共 4 页
字号:
//最新更新日期20090430
//.................................................................
//*****************************************************************
//MBK智能控制器控制器LCD12864显示及键盘驱动 文件名MBM12864LCD.c(第0版)
//本程序有主程序MBM12864LCD.c 汉字符号库HZFH_KU0612 HZFH_KU0714 HZFH_KU0816.h 
//                            图片库<BMP_KU.h>
//*****************************************************************
//功能设计:
//1.显示主机信息
//2.键盘输入
//*********************************************************************
#include <pic18.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <htc.h>
#define HZFH_KU0612
//#define HZFH_KU0714
//#define HZFH_KU0816
#ifdef HZFH_KU0612 
#define HZFH_MOD 6
#include <HZFH_KU0612.h>
#endif
#ifdef HZFH_KU0714
#include <HZFH_KU0714.h>
#define HZFH_MOD 7
#endif
#ifdef HZFH_KU0816
#include <HZFH_KU0816.h>
#define HZFH_MOD 8
#endif
#include <BMP_KU.h>
//配置内置晶振开关;时钟开关;晶振
//上电定时器;电压溢出检测;电压级别;看门狗定时器;看门狗时钟分频;
//MCL引脚使能;快速启动;TIME1低功耗模式;PB口复位数字模式;CCP2引脚RC1/RB3
//#define _18F44K20;
//__CONFIG(1,HS&IESOEN&FCMEN);
//__CONFIG(2,PWRTEN&BOREN&BORV18&WDTEN&WDTPS32K);    
//__CONFIG(3,MCLREN&HFSTABLE&LPT1EN&PBDIGITAL&CCP2RC1);
//__CONFIG(4,HS&WDTEN&PWRTEN&BORDIS&LVPDIS&WRTEN&DEBUGDIS&PROTECT);
//__IDLOC(0x0000);
//存储默认设置值:1.工作模式char 2 本机ID号码CHAR 3.move_drive_mode
//              5.位置[0-12]对应位置号位置坐标 6校验码 char(7byte)
__EEPROM_DATA(0x00,0x01,0xf4,0x64,0x59,0x00,0x00,0x00);
//常数定义16M晶振 每个指令周期250ns
//定时器常量.....................................................
#define CLOCK_FREQ 16000000                 //定义晶振频率16M
#define FCY (CLOCK_FREQ/4)                  //指令周期
#define Tcy256 (1024000000/CLOCK_FREQ)      //定时器0中段周期
#define TIME_1msVAL 1000/Tcy256             //定时器0初值(1ms)
#define TIME_4msVAL 4000/Tcy256             //定时器0初值(4ms)
#define TIME_5msVAL 5000/Tcy256             //定时器0初值(5ms)
#define TIME_10msVAL 10000/Tcy256           //定时器0初值(10ms)
#define TIME_20msVAL 20000/Tcy256           //定时器0初值(20ms)
#define TIME_50msVAL 50000/Tcy256           //定时器0初值(50ms)
#define TIME_100msVAL 100000/Tcy256         //定时器0初值(100ms)
#define TIME_200msVAL 200000/Tcy256         //定时器0初值(200ms)
#define TIME_300msVAL 300000/Tcy256         //定时器0初值(300ms)
#define TIME_400msVAL 400000/Tcy256         //定时器0初值(400ms)
#define TIME_500msVAL 500000/Tcy256         //定时器0初值(500ms)
#define TIME_1sVAL 1000000/Tcy256           //定时器0初值(1s)
#define TIME_2sVAL 2000000/Tcy256           //定时器0初值(2s)
#define TIME_3sVAL 3000000/Tcy256           //定时器0初值(3s)
#define TIME_4sVAL 4000000/Tcy256           //定时器0初值(4s)
#define TIME_5sVAL 5000000/Tcy256           //定时器0初值(5s)
#define TIME_dogVAL 1563                    //看门狗定时器100ms
#define BAUD 9600                           //串行通讯速率
#define I2C_ADD        1                    //从器件(显示)I2C地址
#define TRUE 1
#define FALSE 0
#define FAULT 0
#define ENBLE 1
#define DISENBLE 0
#define LED_LIGHT 0
#define LED_DARK 1//健值表.......................................................
#define KEY_F1         0x01
#define KEY_F2         0x02
#define KEY_F3         0x03
#define KEY_F4         0x04
#define KEY_F5         0x05
#define KEY_F6         0x06
#define KEY_F7         0x07
#define KEY_F8         0x08
#define KEY_UP         0x07
#define KEY_DOWN       0x08
#define KEY_SEL        0x20
#define KEY_SET        0x40
#define KEY_SEL_F1     (KEY_F1+0x20)
#define KEY_SEL_F2     (KEY_F2+0x20)
#define KEY_SEL_F3     (KEY_F3+0x20)
#define KEY_SEL_F4     (KEY_F4+0x20)
#define KEY_SEL_F5     (KEY_F5+0x20)
#define KEY_SEL_F6     (KEY_F6+0x20)
#define KEY_SEL_F7     (KEY_F7+0x20)
#define KEY_SEL_F8     (KEY_F8+0x20)
#define KEY_SEL_UP     (KEY_UP+0x20)
#define KEY_SEL_DOWN   (KEY_DOWN+0x20)
#define KEY_SEL_SET    (KEY_SEL+0x20)
#define KEY_SET_F1     (KEY_F1+0x40)
#define KEY_SET_F2     (KEY_F2+0x40)
#define KEY_SET_F3     (KEY_F3+0x40)
#define KEY_SET_F4     (KEY_F4+0x40)
#define KEY_SET_F5     (KEY_F5+0x40)
#define KEY_SET_F6     (KEY_F6+0x40)
#define KEY_SET_F7     (KEY_F7+0x40)
#define KEY_SET_F8     (KEY_F8+0x40)
#define KEY_SET_UP     (KEY_UP+0x40)
#define KEY_SET_DOWN   (KEY_DOWN+0x40)
#define KEY_SET_SEL    (KEY_SEL+0x40)
#define KEY_F1_R       (KEY_F1+0x80)
#define KEY_F2_R       (KEY_F2+0x80)
#define KEY_F3_R       (KEY_F3+0x80)
#define KEY_F4_R       (KEY_F4+0x80)
#define KEY_F5_R       (KEY_F5+0x80)
#define KEY_F6_R       (KEY_F6+0x80)
#define KEY_F7_R       (KEY_F7+0x80)
#define KEY_F8_R       (KEY_F8+0x80)
#define KEY_UP_R       (KEY_UP+0x80)
#define KEY_DOWN_R     (KEY_DOWN+0x80)
#define KEY_SEL_R      (KEY_SEL+0x80)
#define KEY_SET_R      (KEY_SET+0x80)
#define KEY_RE_COUNT0  100   //重复健值认定初值(2.0s=100*20ms)
#define KEY_RE_COUNT1  12    //重复健值认定值(0.24s=12*20ms)
//引脚定义
#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 LCD_DATA_PORT PORTD    //LCD数据接口
#define LCD_CSB RE2            //LCD片选信号
#define LCD_RW RE1             //LCD读写信号 
#define LCD_E RE0              //LCD读写信号 
#define LCD_RS RA5             //LCD数据指令选择信号 
#define LCD_BACKLIGHT RC5      //背景灯 
#define SPEAK_DRV RC0          //喇叭驱动
#define EEPROM2_SCL RC1        //片外EEPROM模拟IIC SCL输出
#define EEPROM2_SDA RC2        //片外EEPROM模拟IIC SDA 输入、输出
//LCD命令定义............................................//
#define LCD_DISPLAY_ON 0xaf         //显示器打开指令 
#define LCD_DISPLAY_OFF 0xae        //显示器关闭指令 
#define LCD_MODIFL_READ_ON 0xe0     //显示器读编辑状态打开
#define LCD_MODIFL_READ_OFF 0xee    //显示器读编辑状态关闭
#define LCD_DISPLAY_REV_NOR 0xa6    //显示器正像显示指令 
#define LCD_DISPLAY_REV_REV 0xa7    //显示器反像显示指令 
#define LCD_SET_REF_MOD 0x81        //显示器设置参考电压模式指令
#define LCD_WR_MODE_NOR 0           //LCD数据写入模式0标准
#define LCD_WR_MODE_REV 1           //LCD数据写入模式1取反写入
#define DISPLAY10_SEL_MAX  3        //显示10对应最大bar条号
#define DISPLAY20_SEL_MAX  9        //显示20对应最大bar条号
#define DISPLAY30_SEL_MAX  11       //显示30对应最大bar条号
#define DISPLAY50_SEL_MAX  24       //显示50对应最大bar条号
#define WIN_NO_MAX 10               //最大窗口号

//全局变量定义---------------------------------------------------------------
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-K5对应
bank2 unsigned char key_ram1;                      //健值缓冲区 第0个  K6-K10对应
bank2 unsigned char key_ram2;                      //健值缓冲区 第1个  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;                 //键盘复合标志
char volatile *spi_inbuf_point; 
bit volatile spi_rev;                    //I2C正在接收数据标志
bit volatile spi_send;                   //I2C正在发送接收数据标志
bank1 char indata_buf[64];               //显示或指令参数(输入缓冲区)
bit volatile display_data_renew_flag;    //显示数据需要刷新标志
bit volatile display_renew_Flag;         //显示需要刷新标志
bank2 char display_no;                   //显示号0 1 2 3 
bank2 char display_bar_sel;              //显示选择条号

bank2 char lcd_page;
bank2 char lcd_column;
bank2 bit lcd_pro_displayON;               //LCD属性 是否打开  0
bank2 bit lcd_pro_REVERSE;                 //LCD属性 是否反相显示0
bank2 bit lcd_pro_BACKLIGHT;               //LCD属性 背景灯是否打开0
bank2 char lcd_pro_REFVOLT;                //LCD属性 对比度 0x24 
bank2 bit lcd_write_MOD;                   //LCD数据写入模式 0标准1取反
bank2 char windows_show_no;                //显示窗口号

/*window_canshu      //窗口结构
(win_no;.....//基本参数
 bar0_canshu:
 bar1_canshu:
 bar2_canshu:
 bar3_canshu; 
 bar4_canshu;
 bar5_canshu:
 bar6_canshu:
 bar7_canshu:
 bar8_canshu; 
 bar9_canshu;
)*/

bank2 char m,temp_mm,temp_i,temp_j;
bank2 int temp_hex;

volatile unsigned char time10ms;             //定时器0
volatile unsigned int time20ms;              //定时器1
volatile unsigned int time50ms;              //定时器1
volatile unsigned int time200ms;             //定时器1
volatile unsigned int time100ms;             //定时器1
volatile unsigned int time200ms;             //定时器2
volatile unsigned int time300ms;             //定时器3
volatile unsigned int time400ms;             //定时器3
volatile unsigned int time500ms;             //定时器3
volatile unsigned int time1s;                //定时器4
volatile unsigned int time2s;                //定时器4
volatile unsigned int time4s;                //定时器4
volatile unsigned int timess;                //定时器5
volatile unsigned int timekey;               //定时器6
volatile unsigned int timex;                 //定时器x
volatile unsigned int time_redisplay;         //显示刷新定时器
bit volatile time_10ms_Flag;
bit volatile time_20ms_Flag;
bit volatile time_50ms_Flag;
bit volatile time_100ms_Flag;
bit volatile time_200ms_Flag;
bit volatile time_300ms_Flag;
bit volatile time_400ms_Flag;
bit volatile time_500ms_Flag;
bit volatile time_1s_Flag;
bit volatile time_2s_Flag;
bit volatile time_4s_Flag;
bit volatile time_key_Flag;
bit volatile time_x_Flag;
//函数定义---------------------------------------------------------------
void init_pic18f45k20(void);                          //初始化程序
void init_lcd12864(void);                             //初始化LCD12864
void read_key_prom(void);                             //读键值
void display_flagled(unsigned char flagled_ram);      //显示FLAGLED
void delay(unsigned char i);                          //延时程序 单位i>
void beep(void);                                      //蜂鸣器程序
void lcdtest(void);                                   //LCD测试程序
void display_renew_prom(void);                        //显示刷新程序        
void display_prom(void);                              //显示缓冲区刷新程序
void write_lcd_ordor(unsigned char data);             //写LCD显示指令
void write_lcd_data(unsigned char data);              //写LCD显示数据
unsigned char read_lcd_data(void);                    //LCD显示数据读出
void set_lcd_column(unsigned char column_address);    //设置LCD当前列地址
void set_lcd_page(unsigned char page_address);        //设置LCD当前页地址
void putchar(unsigned char s);                        //在当前位置写入单个字符(数字或符号)
void putHALFchar(unsigned char s);                    //在当前位置写入半个符号
void outtextxy(unsigned char column_address,unsigned char page_address,
     unsigned char *s);                               //在X Y位置写入一个字符串(数字符号)字符串以\0空符号结束
void putHZtextxy(unsigned char s);                    //在当前位置写入一个汉字
void out2HZtextxy(unsigned char column_address,unsigned char page_address,
     unsigned char s1,unsigned char s2);              //在x y位置写入一个X字汉字串
void out4HZtextxy(unsigned char column_address,unsigned char page_address,
     unsigned char s1,unsigned char s2,unsigned char s3,unsigned char s4);
void out6HZtextxy(unsigned char column_address,unsigned char page_address,unsigned char s1,
     unsigned char s2,unsigned char s3,unsigned char s4,unsigned char s5,unsigned char s6);
void out8HZtextxy(unsigned char column_address,unsigned char page_address,unsigned char s1,unsigned char s2,
     unsigned char s3,unsigned char s4,unsigned char s5,unsigned char s6,unsigned char s7,unsigned char s8);
void draw_bar_xy(unsigned char column_address,unsigned char page_address,
     unsigned char bar_length,unsigned char percent); //在x y位置写入百分数指示条
void display_mini_windows(unsigned char column_address,unsigned char page_address,
                          unsigned char x_val,unsigned char y_val);//显示一个任意大小窗口
void cls_lcd_doubpage(void);                  //清LCD显示屏当前一个128*16水平行
void cls_lcd12864_progrom(void);              //清12864LCD显示屏
void display_bmp_progrom(const char *picture);//显示一个12864图片
void display_log_progrom(void);               //开机LOG
//*******************************************************
//中断服务程序
//*******************************************************
//#pragma regsused WREG FSR STATUS PCLATH
void interrupt tc_int(void)
{
di();
asm("clrwdt");
//-------------------------- 
//I2C中断读取显示数据,发送健值
//-------------------------- 
if((spi_rev==1)&&(STOP==1))        //发现停止位而且刚才正在接收数据,数据接受结束,I2C总线空闲
  {
   display_data_renew_flag=1;
   spi_rev=0;
   spi_send=0;
  }
if(SSPIF==1)
  {
   if(DA==0)   //地址匹配而且读操作--开始发送健值
     {
     if(RW==1)
       {
        asm("movf _SSPBUF,w");            //SSPSTAT BF=0
        SSPBUF=key_val;
        CKP=1;
        SSPIF=0;
        spi_rev=0;
        spi_send=1;
        key_val=0;
       }
     else          //地址匹配而且写操作--开始接收数据   
       {
        asm("movf _SSPBUF,w");            //SSPSTAT BF=0
        spi_inbuf_point=&indata_buf[0];
        SSPIF=0;
        spi_rev=1;
        spi_send=0;
       }
     }
   else
     {
     if(spi_send==0)           //接受操作完成而且接受的是数据--接受一个字节
       {                    
        *spi_inbuf_point=SSPBUF;
        spi_inbuf_point++;
        SSPIF=0;
        if(STOP==1)
          {
           display_data_renew_flag=1;
           spi_rev=0;
           spi_send=0;
          }
       }
     else
       {                                    //键盘值发送结束
        SSPIF=0;
        spi_rev=0;
        spi_send=0;
       }
    }
   //SSPIF=0;
   WCOL=0;
   SSPOV=0;
   INT0IF=0;
  }
//*********定时器0中断(128us)*********
 if(TMR0IF==1)
    {
     TMR0IF=0;
     if(--time10ms==0)
       {
        time_10ms_Flag=1;
        time10ms=TIME_10msVAL;
       }
     if(--time20ms==0)
       {time_20ms_Flag=1;
        time20ms=TIME_20msVAL;
       }
     if(--time50ms==0)
       {time_50ms_Flag=1;
        time50ms=TIME_50msVAL;
       }  
     if(--time100ms==0)
       {time_100ms_Flag=1;
        time100ms=TIME_100msVAL;
       }  
     if(--time200ms==0)
       {time_200ms_Flag=1;
        time200ms=TIME_200msVAL;
       }
     if(--time300ms==0)
       {time_300ms_Flag=1;
        time300ms=TIME_300msVAL;
       }
     if(--time500ms==0)
       {time_500ms_Flag=1;
        time500ms=TIME_500msVAL;
       }
     if(--time1s==0)
       {time_1s_Flag=1;
        time1s=TIME_1sVAL;
       }
     if(--time2s==0)
       {time_2s_Flag=1;
        time2s=TIME_2sVAL;
       }
     if(--time4s==0)
       {time_4s_Flag=1;
        time4s=TIME_4sVAL;
       }    
      if(--timex==0)

⌨️ 快捷键说明

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