📄 mbm12864lcd 090430.c
字号:
//最新更新日期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 + -