?? 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 + -