📄 main.c
字号:
#include "LCD.h"
#include "menu.h"
#define TIMER_VALUE 16384 //定时器 TIMER_A的定时值,8000H=32768D,延时0.5秒钟
//flash 保存内容
uint Password_Se1=1000; //se1密码 。。。以后修改,加入flash 保存
uint Password_Se2=2000; //se2密码1
uint Password_Se3=3000 ; //se3密码2
uint Password_Super=6886; //超级密码,@_@
uchar Meter_Type; //仪表类型 0为未设置,1:腰轮,2:涡轮
//腰轮仪表系数
float C0;
uchar C0_n2;
uchar C0_n1;
uchar C0_d1;
//涡轮仪表系数
float C1;
uchar C1_n2;
uchar C1_n1;
uchar C1_d1;
float C2;
uchar C2_n2;
uchar C2_n1;
uchar C2_d1;
float C3;
uchar C3_n2;
uchar C3_n1;
uchar C3_d1;
float C4;
uchar C4_n2;
uchar C4_n1;
uchar C4_d1;
float C5;
uchar C5_n2;
uchar C5_n1;
uchar C5_d1;
float C6;
uchar C6_n2;
uchar C6_n1;
uchar C6_d1;
float C7;
uchar C7_n2;
uchar C7_n1;
uchar C7_d1;
float F1;
uchar F1_n2;
uchar F1_n1;
uchar F1_d1;
float F2;
uchar F2_n2;
uchar F2_n1;
uchar F2_d1;
float F3;
uchar F3_n2;
uchar F3_n1;
uchar F3_d1;
float F4;
uchar F4_n2;
uchar F4_n1;
uchar F4_d1;
float F5;
uchar F5_n2;
uchar F5_n1;
uchar F5_d1;
float F6;
uchar F6_n2;
uchar F6_n1;
uchar F6_d1;
float F7;
uchar F7_n2;
uchar F7_n1;
uchar F7_d1;
uchar Pressure_Scale; //压力传感器量程选择0 1 2
uchar Press_Flag; //线性修正标志位
uchar Press_Linear_N; //压力传感器线性分段
uchar Press_Linear1; //压力传感器线性第1段修正值
uchar Press_Linear2;
uchar Press_Linear3;
uchar Press_Linear4;
uchar Press_Linear5; //压力传感器线性第5段修正值
uchar Press_Linear6;
uchar Press_Linear7;
uchar Press_Linear8;
uchar Press_Linear9; //压力传感器线性第9段修正值
float Flux_Total; //累积流量
uchar Tempe_Press_Type; //温度压力补偿类型 0:均不 1:温度压力补偿 2:温度自动,压力固定 3:压力自动补偿 4:温压固定补偿
float Press_Const; //固定压力输入
float Tempe_Const; //固定温度输入
uchar Pulse_Const_Flag; //固定脉冲产生标志位
uint Pulse_Const; //固定脉冲产生个数
uchar Fz_Flag; //压缩因子启用标志位
float CO2; //CO2的体积百分比
float N2; //N2的体积百分比
float Density_Relat; //相对密度的百分比
uchar History_Flag; //历史记录启用标志位
uchar Year;
uchar Month;
uchar Day;
uchar Hour;
uchar Minute;
uchar Hour_Save; //存储时间间隔
uchar Meter_No; //仪器编号,默认168;
uchar Pulse_Out; //整方脉冲输出
uchar Pulse_Width; //脉宽
uchar Pulse_Current; //供电电流
uchar Pulse_1Cube; //每方脉冲个数
uchar RS485_Flag; //RS485启用标志位
uchar Supply_Flag; //供电方式0 外部,1 内部
uchar Baud_Rate ; //波特率设定
uchar C20ma_Flag; //4-20ma启用标志
uchar Current_20ma; //20ma对应的最大电流
float Flux_Instant; //瞬时流量
//菜单设置参数
uchar Flash_Index=0;//闪烁标志位(第三行),从左向右 1-8
uchar Flashflg;//闪烁标志位, 控制显示,不显示
uchar Number_Input[8];//设置时各位输入的数字0-9
uint CurrentPage;//菜单所在位置索引
void timer_init(void)//定时器设置
{
TACTL=TASSEL0+TACLR;
TACCTL0=CCIE;
CCR0=TIMER_VALUE;
TACTL|=MC0;
}
void key_init(void)//端口初始化
{
P1DIR=0XFF; //P1~~P6 i/o ports set
P1OUT=0X3c; //液晶4引脚输出为高
P1IE=0X01; //P1.0的中断暂时关闭,否则影响程序调试,以后检测脉冲信号时还要打开!!!!!!
P1IES=0x00; //p1.0 interrupt low-to-high to record pulse number
P2DIR=0X0F;
P2OUT=0XF0;
P2IES=0XF0; //p2.4~p2.7 keyboard interrupt high-to-low
P2IE=0XF0;
P3DIR = BIT6;
P3OUT = 0x00;
P3SEL = 0x30; // P3.4,5 = USART0 TXD/RXD
P6DIR=0XBF; //p6.6 is input, others are outputs
P6OUT=0X00;
P6SEL=BIT6; //0: 该引脚为I/O端口; 1: 该引脚为外围模块功能
}
void InitSys()
{
LCD_INIT (); //p1.2~p1.5端口初始化
key_init();//按键端口初始化,p2.4-p2.7
timer_init();//开定时
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
uchar point=0;
if(Flash_Index)
{
if(Flashflg==1) //闪烁位不显示
{
Flashflg=0;
point=judgedp(Flash_Index);
WRITE_LCD(0x00+2*(Flash_Index-1),10,point,2);
}
else
{
Flashflg=1;
point=judgedp(Flash_Index);
WRITE_LCD(0x00+2*(Flash_Index-1),Number_Input[Flash_Index-1],point,2);
}
}
/*
WRITE_LCD(dispflg*2,dispflg,1,1);
delay(4);
WRITE_LCD(dispflg*2,dispflg+6,1,2);
if(dispflg<14)
dispflg++;
else
dispflg=0;
*/
}
// 键盘中断程序 //
unsigned char p2key(void) //判断是否有键按下子程序
{
unsigned char x;
x=(P2IN&0XF0);
return(x);
}
#pragma vector=PORT2_VECTOR
__interrupt void Port2(void)
{
uint i;
if (p2key()!=0XF0) //注意: 函数可以直接用于条件判断, 例如本行的 p2key()
{ //软件延时消抖处理 //
i=6000;
while(i--);
if (p2key()!=0XF0)
{
switch (P2IN&0xF0)
{
case 0x70: key_set(); break;
case 0xB0: key_shift(); break;
case 0xD0: key_inc(); break;
case 0xE0: key_ok(); break;
default:break;
}
while (p2key()!=0XF0) ; //等待按键释放 //
P2IE=0x00;
i=1000;
while(i--);
P2IE=0xf0;
}
}
P2IFG=0X00; //键盘中断标志位清零//
}
void main (void)
{
uint i;
uchar addr;
WDTCTL=WDTPW+WDTHOLD;//关狗
_DINT();
InitSys();//系统初始化
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
///全部显示
wr_lcd(DDATA,3,1);//wr1选择模式
addr=0x00;
addr=addr<<2;
wr_lcd(addr,6,1);//wr1 选地址
for(i=0;i<10;i++)
wr_lcd(0xff,8,1);//wr1 写数据
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
wr_lcd(DDATA,3,2);//wr2选择模式
addr=0x00;
addr=addr<<2;
wr_lcd(addr,6,2);//wr1 选地址
for(i=0;i<14;i++)
wr_lcd(0xff,8,2);//wr2 写数据
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
delay(60);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
//全部清除
wr_lcd(DDATA,3,1);//wr1选择模式
addr=0x00;
addr=addr<<2;
wr_lcd(addr,6,1);//wr1 选地址
for(i=0;i<10;i++)
wr_lcd(0x00,8,1);//wr1 写数据
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
wr_lcd(DDATA,3,2);//wr1选择模式
addr=0x00;
addr=addr<<2;
wr_lcd(addr,6,2);//wr1 选地址
for(i=0;i<14;i++)
wr_lcd(0x00,8,2);//wr1 写数据
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
/*
for(i=0;i<10;i+=2)
{
WRITE_LCD(0x00+i,i,0,1);//wr1 写数据
}
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
for(i=0;i<13;i+=2)
{
WRITE_LCD(0x00+i,i,1,2);//wr1 写数据
}
LCDOUT |= (CS+WR1+WR2+DATA);//置高电平以实现低功耗。
*/
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
_EINT();
LPM2;
while(1)
{
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -