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

📄 main.c

📁 北京青云创新公司段式液晶的MSP430例程
💻 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 + -