📄 mbm12864lcd 090430.c
字号:
{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 + -