找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7440|回复: 1
打印 上一主题 下一主题
收起左侧

msp430单片机adc+12864液晶显示菜单程序

[复制链接]
跳转到指定楼层
楼主
ID:60266 发表于 2014-8-18 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "msp430g2553.h"

typedef unsigned char u8;                              //数据类型定义
typedef unsigned int  u16;
typedef unsigned long u32;

float   T_diff1 = 0 ;                                  //定义积分环节参数
float   T_diff2[10] ;                                  //定义微分环节参数
float   T_diff3 = 0;

#define SID_1 P1OUT  |=BIT0                            //串行数据传输P1.0
#define SID_0 P1OUT  &=~BIT0

#define SID_IN_1 P1IN
#define CLK_1 P1OUT  |=BIT3                            //串行时钟P1.2
#define CLK_0 P1OUT  &=~BIT3

#define KM_S         (P2IN&BIT4)                       //主菜单键   P2.4
#define KM_SSDOWN    (P2IN&BIT5)                       //功能下选键 P2.5
#define KM_SSUP      (P2IN&BIT3)                       //功能上选键 P2.3
#define KM_SURE      (P2IN&BIT2)                       //确认键     P2.2
#define KM_RETURN    (P2IN&BIT0)                       //返回键     P2.0

#define SCLK_UP    P2OUT |= BIT0
#define SCLK_DOWN  P2OUT &= ~BIT0

#define SYNC_UP    P1OUT |= BIT4
#define SYNC_DOWN  P1OUT &= ~BIT4

#define SDIN_UP    P1OUT |= BIT5
#define SDIN_DOWN  P1OUT &= ~BIT5

u8   M_S   ;                                           //全局变量M_S功能选择函数入口
u8   MM_S   ;                                          //功能选定结果
u16  ADC_Result;                                       //AD转换的结果
u8   Number[10] ={"0123456789"};
u32  time1 = 0,time2 = 0;                              //计时变量


float  T_real = 0;                                     //当前值  
float  T_target = 0;                                   //目标值
float  T_diff = 0;                                     //误差

float f;
float T ;
float c;
float last = 0;

u8 DA_ON[4]={0,0,0,1};

u8 time11 = 0;
u8 flag =0;
u8 CHANGE = 0;                          //子菜单功能切换变量

u8   M_S1;                              //全局变量子菜单入口
u8   MM_S1;                             //子菜单功能选择结果
u8   MM_S2;                              //子菜单2功能选择结果
u16  ADC_RESULT1;                       //ADC转换结果
u8   GO = 0;
u8   GO1 = 0;
u8   FANHUI;                            //记录上级菜单最后选定结果
u8   FANHUI1;                           //记录二级菜单中最后选定结果
u8   FANHUI2;                           //温度二级菜单中的最后选定结果
float  TEMPE ;                          //温度变量
u16 _ADC;
signed int  TARGET;                     //目标温度
float TEMPE1;                           //温度转换变量

u8 HOW_A;                               //程控增益基础篇增益选择变量
u8 HOW_A1;                              //程控增益提高篇增益选择变量


void delay(u16 t);                      //延时函数
void Send_Byte(u8 data);                //串行发送8位数据
void Write_CMD(u8 CMD);                 //写命令函数
void Write_DATA(u8 DATA);               //写数据函数
void LCD12864_Init(void);               //LCD初始化函数
void print_string(u8 *s);               //显示字符串函数
void Init_port(void) ;                  //msp430管脚初始化函数
void LCD_write_char(u8 X,u8 Y,u8 data); //在屏幕任意位置写字符函数
void Menu_LCDshow(u8 HOW);              //LCD12864显示菜单函数
void Menu_Init(void);                   //菜单初始化函数
void ADC_Init(void);                    //ADC初始化函数
void ADC_Run(void);                     //ADC运行函数
void LCD_set_xy( u8 x, u8 y );          //设置LCD12864上显示的位置
void Time_Init(void);                   //LCD12864上显示时钟函数
void RES_show(void);
void Time_change(void);
void Miaobiao(void);
void Daojishi(void);
void Time_choose(u8 HOW);
u16  ADC_LVBO(void);
void game_play(void);
void delay_(u32 time);                  
u16  PID_Run(float Target);              //PID运算函数

void Temper_run(void);                  //温度操控
void Tempe_show(u8 HOW);                //显示温度
void Tempe_relook(void);                //查看当前温度
void Tempe_change(void);                //温度调整函数
void Tempe_PID(void);                   //温度PID
void write_da7811(u16 data);              //模拟SPI串行发送数据  

/*************************************************************
*函数名称:void write_da7811(u16 da)
*函数功能:实现普通I/O模拟SPI通信
*输入参数:void
*返回值:u16 data
**************************************************************/
void write_da7811(u16 data)
{
      char i;
      SYNC_DOWN;
      for(i=0;i<4;i++)
      {
            SCLK_UP;
            if(DA_ON[i])
             {
               SDIN_UP;
             }              
            else
            {
               SDIN_DOWN;
               }
             SCLK_DOWN;
             }
      for (i=0;i<12;i++)
      {
        SCLK_UP;
        if(data&0x800)
        {
           SDIN_UP;
           }
        else
        {
           SDIN_DOWN;
           }
        SCLK_DOWN;
         data<<=1;
      }
      SDIN_UP;
      SYNC_UP;
      SCLK_DOWN;
}

/****************************************************************
*函数名称:void Zeng_yi(void)
*函数功能:输出相应的增益
*输入参数:void
*返回值:  void
*****************************************************************/
void Zeng_yi(void)
{
          signed long i,j,i_1,j_1,b = 0,c=0;      
          u16 Control_Val[3] = {0} ;                            //存储数据的地址
          u16  a = 0;

          u16 SHUZI=0 ,SHUZI_1=0 ;

          ADC10CTL1|= CONSEQ_3 + INCH_2 + INCH_0 + INCH_1;     //序列通道多次转换+最大通道为A2
          ADC10CTL0|= ADC10SHT_2 + MSC + ADC10ON + SREF_0 ;
          ADC10DTC1|= 0x08;                                    //一共采样8次
          ADC10AE0 |= BIT1 + BIT2;                             //打开A1和A2的模拟输入通道

          Write_CMD(0x01);                                     //清屏
          P1DIR |= BIT4 + BIT5;                                //让P1.4和P1.5工作在输出状态

          Write_CMD(0x80);                                     //第一行显示
          print_string("当前增益:");                          //选择倒计时功能

          i = HOW_A/10;
          LCD_write_char(5,0,Number[i]);
          LCD_write_char(6,0,'.');
          i = HOW_A%10;
          LCD_write_char(7,0,Number[i]);

          Write_CMD(0x90);                //第一行显示
          print_string("Vin:");       //选择倒计时功能
          Write_CMD(0x88);                //第一行显示
          print_string("Vout:");       //选择倒计时功能

          Write_CMD(0x98);                //第一行显示
          print_string("返回");           //选择倒计时功能
          Write_CMD(0x9c);                //第一行显示
          print_string("单位:V");         //选择倒计时功能

    while(M_S ==12)
      {  
         do{  
                SHUZI=0 ;
                SHUZI_1=0 ;  

                ADC10CTL0 &= ~ENC;                      //关闭采样使能
                while(ADC10CTL1 & BUSY);   
                ADC10CTL0 |= ENC + ADC10SC;             //Enable conversion,Start conversion        
                ADC10SA = (unsigned int)Control_Val;

                SHUZI   =  Control_Val[2] ;
                SHUZI_1 =  Control_Val[1] ;

                b = b + SHUZI;
                c = c + SHUZI_1;

              if(a==400)
              {
                  b = b/400;   
                  i = (b*35)/10*2-50 ;
                  j = i/1000;
                  LCD_write_char(3,1,Number[j]);
                  LCD_write_char(4,1,'.');
                  j = i/100%10;
                  LCD_write_char(5,1,Number[j]);  
                  j = i/10%10;
                  LCD_write_char(6,1,Number[j]);  


                    if(i*50<=21000)         
                     {                                 
                       HOW_A = 50;      
                     }
                    else if(i*20<=21000)
                    {
                       HOW_A = 20;
                       }
                   else if(i*5<=21000)
                    {
                      HOW_A = 5;
                     }
                   else if(i*2<=21000)
                      {
                        HOW_A = 2;
                      }

                 c = c/400;
                 if((HOW_A==50)||(HOW_A==20))
                 {
                    i_1 = (c*35)/10 ;
                  }
                 else if(HOW_A==5)
                 {
                    i_1 = ((c*35)/10)*100/88 -280;
                  }
                 else if(HOW_A==2)
                 {
                    i_1 = ((c*35)/10)*100/85-210;
                  }
                 if(i_1>2000)
                 {
                    i_1=2000;
                  }
                 j_1 = i_1/1000;
                 LCD_write_char(3,2,Number[j_1]);
                 LCD_write_char(4,2,'.');
                 j_1 = i_1/100%10;
                 LCD_write_char(5,2,Number[j_1]);
                 j_1 = i_1/10%10;
                 LCD_write_char(6,2,Number[j_1]);  

                  a=0;
                  b=0;  
              }
              else
              {
                  a++;
                  }

                 i = HOW_A/10;
                 LCD_write_char(5,0,Number[i]);
                 LCD_write_char(6,0,'.');
                 i = HOW_A%10;
                 LCD_write_char(7,0,Number[i]);  
               switch(HOW_A)
                {
                   case 2:
                           P1OUT &= ~BIT4 ;
                           P1OUT &= ~BIT5;                  
                           break;
                   case 5:
                           P1OUT &= ~BIT4 ;
                           P1OUT |=  BIT5;
                           break;
                   case 20:
                           P1OUT |=  BIT4 ;
                           P1OUT &= ~BIT5;
                           break;
                   case 50:
                           P1OUT |=  BIT4 ;
                           P1OUT |=  BIT5;
                           break;
                  }  
            }while(KM_RETURN&&KM_S);
            if(!KM_RETURN)
                {
                     while(!KM_RETURN);
                     P1DIR &= ~BIT5  ;          //让P1.4和P1.5工作在输出状态
                     P1DIR &= ~BIT4  ;          //让P1.4和P1.5工作在输出状态
                     M_S = 5;
                     }
                else if(!KM_S)
                 {      
                     while(!KM_S);
                     P1DIR &= ~BIT4 ;          //让P1.4和P1.5工作在输出状态
                     P1DIR &= ~BIT5  ;          //让P1.4和P1.5工作在输出状态
                     M_S = 0;
                     }
         }
}

/****************************************************************
*函数名称:void PID_PWM(void)
*函数功能:进行PID运行
*输入参数:void
*返回值:void
****************************************************************/
void Tempe_PID(void)
{
  u8 a = 1,b,c,d   ;
  u16 e;
  Write_CMD(0x01);                     //第一行显示

  while(M_S == 11)
  {

    do{
           if(a==1)
           {
                P2SEL  |=  BIT1 ;
                TA1CCTL1 = OUTMOD_7;
                TA1CCR0 =10000;

                 Write_CMD(0x80);
                 b = (u8)(TARGET*10/100);
                 c = (u8)(TARGET*10/10%10);
                 d = (u8)(TARGET*10%10);

                 print_string("当前温度:");        //当前温度显示
                 Write_CMD(0x88);
                 print_string("目标温度:");        //目标温度显示

                 LCD_write_char(2,3,Number[b]);
                 LCD_write_char(3,3,Number[c]);
                 LCD_write_char(4,3,'.');
                 LCD_write_char(5,3,Number[d]);

                 Write_CMD(0x9e);
                 print_string("°C");               //目标温度设置

                 Write_CMD(0x96);                  //第二行
                 print_string("°C");               //目标温度设置  
                 a = 2;
           }


         TA1CCR1 = PID_Run(TARGET);
         TEMPE = TEMPE*10;
         e = (u16)TEMPE;
         b = (u8)(e/100);
         c = (u8)(e/10%10);
         d = (u8)(e%10);

         LCD_write_char(2,1,Number[b]);
         LCD_write_char(3,1,Number[c]);
         LCD_write_char(4,1,'.');
         LCD_write_char(5,1,Number[d]);
         delay_(3);
         }while(KM_S&&KM_RETURN );
      if(!KM_S)
      {
        M_S = 0;
        TA1CCTL1 = OUTMOD_0;

        T_real = 0;                           //当前值  
        T_target = 0;                         //目标值
        T_diff = 0;                           //误差
       }
      else if(!KM_RETURN)
      {
          M_S = 10;
          TA1CCTL1 = OUTMOD_0;
          T_real = 0;                           //当前值  
          T_target = 0;                         //目标值
          T_diff = 0;                           //误差
          T_diff3 = 0;
          T_diff1 = 0 ;
       }
   }
}

/***************************************************************
*函数名称:void Tempe_show(u8 HOW)
*函数功能:显示温度
*输入参数:void
*输出参数:void
****************************************************************/
void Tempe_show(u8 HOW)
{
  switch(HOW)
  {  
     case 0:
            Write_CMD(0x80);                   //第一行显示
            print_string("1.当前温度");        //显示当前温度值
            Write_CMD(0x90);                   //第二行显示
            print_string("2.目标温度");        //目标温度设置
            break;
     case 1:
            Write_CMD(0x96);                   //第二行显示
            Write_DATA(0x20);                  //清除其他功能

            Write_CMD(0x86);                   //第一行显示
            Write_DATA(0x03);                  //选定电压测量  
            break;  
     case 2:  
            Write_CMD(0x86);                   //第二行显示
            Write_DATA(0x20);                  //选定电压测量

            Write_CMD(0x96);                   //第二行显示
            Write_DATA(0x03);                  //清除其他功能
            break;
   }     
}

/**************************************************************
*函数名称:void Tempe_change(void)
*函数功能:选择目标温度
*输入参数:void
*返回值:void
****************************************************************/
void Tempe_change(void)
{
    u8 a = 1,b,c;
    signed int Target = 30;              
    Write_CMD(0x01);                           //清屏
    while(M_S == 10 )
    {
       while(!KM_SURE)
       {}
       do{  
              b = Target/10%10;
              c = Target%10;
             if(a)
             {
                 Write_CMD(0x80);                  //第一行
                 print_string("目标温度:");        //目标温度设置

                 Write_CMD(0x95);                  //第四行
                 print_string("°C");        //目标温度设置
                 Write_CMD(0x98);                  //第四行
                 print_string("返回");        //目标温度设置
                 Write_CMD(0x9e);
                 print_string("确定");        //目标温度设置
                 a = 0;
               }

               LCD_write_char(3,1,Number[b]);
               LCD_write_char(4,1,Number[c]);

              if(!KM_SSUP)
               {
                 while(!KM_SSUP);
                   Target++;
                    if(Target>80)
                    {
                      Target=80;
                     }
                }
              else if(!KM_SSDOWN)
               {
                  while(!KM_SSDOWN);
                   Target--;
                   if(Target<30)
                   {
                     Target=30;
                    }
                }

               }while(KM_S&&KM_RETURN&&KM_SURE);
         if(!KM_S)
         {
            M_S = 0;
           FANHUI=1;
          }
         else if(!KM_RETURN)
           {
             M_S = 3;
            }
         else if(!KM_SURE)
          {
            M_S = 11;
            TARGET = Target;                       //将目标温度值传递给pid1结构体
           }
      }
}

/***************************************************************
*函数名称:void Tempe_relook(void)
*函数功能:查看当前温度值
*输入参数:void
*返回值:void
****************************************************************/
void Tempe_relook(void)
{
    u8 i;
    Write_CMD(0x01);                           //清屏
    while(M_S == 9 )
    {   

         do{
              _ADC = ADC_LVBO();                          //经过滤波算法后取值  
              TEMPE = ((float)(_ADC-24)/30)  ;            //计算当前温度值
              i=((u8)TEMPE)/100;
              Write_CMD(0x80);
              print_string("当前温度值:");
              if(i!=0)
              {  
                LCD_write_char(2,1,Number[i]);
               }
             else
              {
                  LCD_write_char(2,1,0x20);
                }
              i=((u8)TEMPE)/10%10;
              LCD_write_char(3,1,Number[i]);
              i=((u8)TEMPE)%10;
              LCD_write_char(4,1,Number[i]);   
              Write_CMD(0x95);
              print_string("°C");
            }while(KM_S&&KM_RETURN);
         if(!KM_S)
         {
           M_S = 0;
           FANHUI=1;
          }
         else if(!KM_RETURN)
          {
           M_S = 3;
           }
      }
}

/***************************************************************
*函数名称:void Temper_run(void)
*函数功能:温度操作
*输入参数:void
*输出参数:void
****************************************************************/
void Temper_run(void)
{   
   Write_CMD(0x01);                               //清屏
   MM_S2 = 0;
   Tempe_show(MM_S2);                       //调用温度显示函数   
   while(M_S==3)
   {
      while((!KM_SURE)||(!KM_RETURN))
      {
            Tempe_show(MM_S2);                       //调用温度显示函数   
      }
       MM_S2 =FANHUI2;
       do{  
             _ADC = ADC_LVBO();
             TEMPE = (((float)(_ADC-24))/30)  ;           //计算当前温度值
             Tempe_show(MM_S2);                       //调用温度显示函数  
             if(!KM_SSDOWN)                           //下选键按下         
                 {                                
                     while(!KM_SSDOWN )               //按键消抖操作
                       {
                          Tempe_show(MM_S2);          //显示当前MM_S(即所选功能)
                          }
                       MM_S2++;
                       if(MM_S2 == 3)                    
                         {
                             MM_S2 = 1;                     //当MM_S加到3就恢复到1
                           }
                     }
                   else  if(!KM_SSUP)
                         {
                           while(!KM_SSUP )               //按键消抖操作
                               {
                                  Menu_LCDshow(MM_S2);      //显示当前MM_S(即所选功能)
                                  }
                              MM_S2--;                        //选择下一功能  
                              if(MM_S2 == 0)                    
                               {
                                 MM_S2 = 2;                 //当MM_S减到0就恢复到2
                                   }
                            }

            }while(KM_S&&KM_RETURN&&KM_SURE);

            if(!KM_S)
            {
              M_S = 0;
              FANHUI=1;
             }
             else if(!KM_RETURN)
             {
              while(!KM_RETURN);
              M_S = 0;
             }
           else if(!KM_SURE)
            {
              M_S = MM_S2 + 8;
           }
      }
}

/****************************************************************
*函数名称:u16 PID_Run(signed Target)
*函数功能:进行PID计算
*输入参数:PID_INT *pid
*输出参数:void
******************************************************************/
u16 PID_Run(float Target)
{  
          signed long  PWM = 0 ;

          float  Kp;                               //比例系数
          float  Ki;                               //积分系数                                       
          float  Kd;                               //微分系数

          float  P_OUT;                             //比例
          float  D_OUT;                             //微分
          float  I_OUT;                             //积分   

          Kp = 250;                         //PID参数
          Ki = 1.0;        
          Kd =  0;   

          TEMPE  =   (((float)(ADC_LVBO()-24))/30) ;            //读取当前温度

          T_real =   (((float)(ADC_LVBO()-24))/30) ;            //读取当前温度

          T_target = Target;                                   //设置目标温度         

          T_diff = (float)((T_target - T_real)*10);               //计算误差         

          if(T_diff<=30&&T_diff>0)
           {
              P_OUT = Kp* T_diff ;                              //计算比例环节
              I_OUT = Ki* T_diff1 ;                             //计算积分环节
              D_OUT = Kd* T_real;

              PWM = (signed int)(P_OUT  + I_OUT + D_OUT ) ;
            }
        else
           {
             return 10000;
            }

          if(PWM<0)
          {
             return 0;
           }
         else if(PWM >=10000)
           {

            return 10000;
           }
            return (u16) PWM;   
}

/************************************************************
*函数名称:void delay_(u32)
*函数功能:可被打断延时
*输入参数:u32
*返回值:void
************************************************************/
void delay_(u32 time)
{
   u32 b = 0,a;
  do{
      for(a=0;a<990;a++)
      {
         _NOP();
      }
      b++;
     }while((b<time)&&KM_S&&KM_RETURN);

}

/*****************************************
*函数名称:void LCD_write_char(u8 X,u8 Y,u8 data)
*函数功能:在屏幕上随意显示字符     
*输入参数:u8 x,u8 y,u8 data
*返回值:void
*****************************************/
void LCD_write_char(u8 X,u8 Y,u8 data)
{
   LCD_set_xy( X, Y ); //写地址
   Write_DATA( data);
}

/*****************************************
*函数名称:void LCD_set_xy( u8 x, u8 y )
*函数功能:设置LCD12864上要显示的位置(字母或是符号)           
*输入参数:u8 x,u8 y
*返回值:void
****************************************/
void LCD_set_xy( u8 x, u8 y )
{
  u8 address;
  switch(y)
   {
       case 0:
              address=x+0x80;
              break;
       case 1:
              address=x+0x90;
              break;
       case 2:
              address=x+0x88;
              break;
       case 3:
              address=x+0x98;
              break;

     }
     Write_CMD( address);
}

/******************************************************************
*函数名称:void int_port(void)
*函数功能:初始化LCD的管脚
*输入参数:void
*输出参数:void
*******************************************************************/
void Init_port(void)                    //管脚初始化                       
{     

    P1DIR |=  BIT3;                          
    P1OUT &= ~BIT3;  

  //P1DIR |=  BIT0;                           
  //P1OUT &= ~BIT0;

    P2DIR &= ~BIT4 ;                //P2.4(KM_S菜单)设置为输入
    P2DIR &= ~BIT5 ;                //P2.5(KM_SS功能向下选择)设置为输入
    P2DIR &= ~BIT3;                 //P2.3(KM_SS功能向上选择)设置为输入
    P2DIR &= ~BIT2;                 //P2.2(KM_SURE确定键)设置为输入
    P2DIR &= ~BIT0;                 //P2.1(KM_RETURN返回键)设置为输入
}

/*****************************************************
*函数名称:void delay(u8 t)   
*函数功能:实现简单的软件延时
*输入参数:u8 t
*输出参数:void
********************************************************/
void delay(u16 t)            
{                                      
     u16 i,j;

       for(i=0; i<t;  i++)
       for(j=0; j<10; j++);

}

/********************************************************
*函数名称:void Send_Byte(u8 data)
*函数功能:串行发送8位数据
*输入参数:u8 data
*输出参数:void
**********************************************************/
void Send_Byte(u8 data)
{  
   P1DIR |=  BIT0;                           
   P1OUT &= ~BIT0;
   u8 a;            
   for(a=0;a<8;a++)
   {
      if(data&(0x80>>a))
      {
        SID_1;      
       }   
      else
      {
        SID_0;
        }   
          CLK_0;
          delay(2);
          CLK_1;
       }
}

/********************************************************************
*函数名称:void Send_CMD(u8)
*函数功能:向LCD发送指令
*输入参数:u8  CMD
*返回值:void
*********************************************************************/
void Write_CMD(u8 CMD)
{
   Send_Byte(0xf8);            //5个1,RS(0),RW(0),0
   Send_Byte(0xf0&CMD);         //高四位
   Send_Byte(0xf0&(CMD<<4));    //低四位
   delay(2);
}

/********************************************************************
*函数名称:void Send_DATA(u8 DATA)
*函数功能:向LCD发送数据
*输入参数:u8  CMD
*返回值:void
*********************************************************************/
void Write_DATA(u8 DATA)
{

   Send_Byte(0xfa);            //5个1,RS(0),RW(0),0
   Send_Byte(0xf0&DATA);         //高四位
   Send_Byte(0xf0&(DATA<<4));    //低四位
   delay(2);
}

/********************************************************************
*函数名称:void LCD12864_Init(void)
*函数功能:LCD初始化函数
*输入参数:void
*返回值:void
*********************************************************************/
void LCD12864_Init(void)
{
   delay(200);                  //复位等待(内部自带上电复位电路),时间较长
   Write_CMD(0x30);
   delay(50);                     //延时等待
   Write_CMD(0x0c);               //整体显示,关游标  
   delay(50);

}

/******************************************************************
*函数名称:void print_string(u8  *s)
*函数功能:显示一个字符串
*输入参数:u8 *s
*返回值:void
********************************************************************/
void print_string(u8 *s)           
{  
    while(*s>0)                  //C语言里字符串末尾自动加“\0”(ASCII码值为0)
     {
       Write_DATA(*s);        //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址
       s++;      
       delay(50);
    }
}

/********************************************************************
*函数名称:void Menu_LCDshow(U8 HOW)
*函数功能:显示菜单
*输入参数:void
*返回值:void
*********************************************************************/
void Menu_LCDshow(u8 HOW)
{
    switch(HOW)
     {
         case 0 :
                 Write_CMD(0x80);                //第一行显示
                 print_string("1.测量电压");    //选择电压显示功能
                 Write_CMD(0x90);                //第二行显示
                 print_string("2.功能合集");        //选择时钟功能
                 Write_CMD(0x88);                //第三行显示
                 print_string("3.温度PID");        //选择游戏功能
                 Write_CMD(0x98);                //第三行显示
                 print_string("4.串口调试");        //选择游戏功能
                 break;
         case 1:  
                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x03);               //选定电压测量
                 break;  
         case 2:
                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x03);               //选定电压测量      
                 break;
        case 3:
                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x03);               //选定电压测量      
                 break;
         case 4:
                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x03);               //选定电压测量      
                 break;      
      }
}

/*********************************************************************
*函数名称:void menu(void)
*函数功能:进入菜单
*输入参数:void
*返回值:  void
*********************************************************************/
void Menu_Init(void)
{
    Write_CMD(0x01);                                  //清屏
    MM_S = 0;
    Menu_LCDshow(MM_S);
    while(M_S==0)
     {
         MM_S = FANHUI;
              do{

                  Menu_LCDshow(MM_S);                  //MM_S为菜单中功能选择变量  
                  if(!KM_SSDOWN)                       //下选键按下         
                     {                           
                       while(!KM_SSDOWN )               //按键消抖操作
                        {
                           Menu_LCDshow(MM_S);      //显示当前MM_S(即所选功能)
                           }
                       MM_S++;                        //选择下一功能  
                       if(MM_S == 5)                    
                         {
                             MM_S = 1;                 //当MM_S加到3就恢复到1
                           }
                     }
                   else  if(!KM_SSUP)
                         {
                           while(!KM_SSUP )               //按键消抖操作
                               {
                                  Menu_LCDshow(MM_S);      //显示当前MM_S(即所选功能)
                                  }
                              MM_S--;                        //选择下一功能  
                              if(MM_S == 0)                    
                               {
                                 MM_S = 4;                 //当MM_S减到0就恢复到2
                                   }
                            }
                  }while(KM_SURE&&KM_S);                    //当菜单键再次按下的时候即可退出循环
         if(!KM_SURE)
                  {
                     if(MM_S==4)
                     {
                        MM_S = 13;
                      }
                     M_S = MM_S;
                     FANHUI = M_S;                       //把M_S的值赋给FANHUI
                  }
                  else if(!KM_S)
                  {
                    M_S = 0;
                    FANHUI =1;
                   }
         }
}


/********************************************************************
*函数名称:void ADC_Run(void)
*函数功能:运行ADC检测电压(管脚P1.1)
*输入参数:void
*输出参数:void
*********************************************************************/
void ADC_Run(void)
{
      ADC10CTL1 |= INCH_1;                         // input A1模拟信号输入选择通道A1即p1.1
      ADC10AE0 |= 0x02;                           // PA.1 ADC option select使p1.1允许AD模拟输入信号
      u8 i;
      Write_CMD(0x01);

      while(M_S)
      {
         while(!KM_S )
         {
            Menu_LCDshow(MM_S);                         //MM_S为菜单中功能选择变量  
          }
          do
          {
              ADC_RESULT1 = ADC_LVBO() ;

              Write_CMD(0x86);                          //第一行显示
              Write_DATA(0x20);                         //选定电压测量
              Write_CMD(0x90);

              print_string("U");  
              LCD_write_char(1,1,':');
              i = ADC_RESULT1/1000;
              LCD_write_char(2,1,Number[i]);
              LCD_write_char(3,1,'.');
              i = (ADC_RESULT1/100)%10;
              LCD_write_char(4,1,Number[i]);
              i = (ADC_RESULT1/10)%10;
              LCD_write_char(5,1,Number[i]);
              i = ADC_RESULT1%10;
              LCD_write_char(6,1,Number[i]);
              LCD_write_char(7,1,'V');
             }while(KM_S&&KM_RETURN);
         if(!KM_S)
         {
            while(!KM_S);
            M_S = 0;
         }
        else if(!KM_RETURN)
         {
            while(!KM_RETURN);
            M_S = 0;
            ADC10CTL0 &= ~ADC10ON  ; // ADC10ON, interrupt enabled
          }   
      }
}

/********************************************************************
*函数名称:u16 ADC_LVBO(void)
*函数功能:滤波算法(中位值)
*输入参数:void
*返回值:u32
*********************************************************************/
u16 ADC_LVBO(void)
{
   u8 a,b,c ;
   u16 SHUZI[9] ,SHUZHI,d;

for(a=0;a<9;a++)
  {
      ADC10CTL0 |= ENC + ADC10SC;               //开始转换
      while(ADC10CTL1&ADC10BUSY);
      ADC_Result = ADC10MEM;                    //采集转换结果
      SHUZHI  = ADC_Result*35/10;               //转换结果运算
      SHUZI[a] =  SHUZHI;                       //取转换结果接下来进行滤波计算
  }

  for(c=0;c<9;c++)
  {
     for(b=c;b<9;b++)
     {
       if(b+1<9)
       {
         if(SHUZI[c]<SHUZI[b+1])
         {
            d = SHUZI[c];
            SHUZI[c] = SHUZI[b+1];
            SHUZI[b+1] = d;
          }
       }
     }
  }
  return   SHUZI[4];
}

/*********************************************************************
*函数名称:void ADC_Init(void)
*函数功能:初始化ADC
*输入参数:void
*返回值:void
**********************************************************************/
void ADC_Init(void)
{
    ADC10CTL0 |= ADC10SHT_2 + ADC10ON  ;         // ADC10ON, interrupt enabled
}      

/*********************************************************************
*函数名称:void Time_choose(u8 HOW)
*函数功能:时钟第二功能设置
*输入参数:u8 HOW
*返回值:void
**********************************************************************/
void Time_choose(u8 HOW)
{

  switch(HOW)
  {
       case 0:
                 Write_CMD(0x80);                //第一行显示
                 print_string("1.测电阻(H)");     //选择电压显示功能
                 Write_CMD(0x90);                //第二行显示
                 print_string("2.程控放大");        //选择时钟功能
                 Write_CMD(0x88);                //第三行显示
                 print_string("3.测电容");         //选择秒表功能
                 Write_CMD(0x98);                //第四行显示
                 print_string("4.程控提高");       //选择倒计时功能
                 break;
       case 1:  

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x03);               //选定电压测量
                 break;  
       case 2:
                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x03);               //选定电压测量      
                 break;
        case 3:
                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x03);               //选定电压测量      
                 break;
         case 4:


                 Write_CMD(0x8E);                //第三行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x96);                //第二行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x20);               //清除其他功能

                 Write_CMD(0x9E);                //第四行显示
                 Write_DATA(0x03);               //选定电压测量      
                 break;  
         case 5:
                 if(GO==0)
                 {
                    Write_CMD(0x01);             //清屏
                    GO = 1;
                  }  
                 Write_CMD(0x80);                //第一行显示  
                 print_string("5.呼吸灯");       //选择PWM呼吸灯功能
                 Write_CMD(0x86);                //第一行显示
                 Write_DATA(0x03);               //选定呼吸灯
                 break;   
  }
}

/*********************************************************************
*函数名称:void Time_Init(void)
*函数功能:进入时钟选择
*输入参数:void
*返回值:void
**********************************************************************/
void Time_Init(void)
{
  Write_CMD(0x01);                       //清屏
  if(FANHUI1!=5)
  {
    MM_S1 = 0;
    Time_choose(MM_S1);
  }
   MM_S1 = FANHUI1;
   Time_choose(MM_S1);                  //MM_S为菜单中功能选择变量
  if(MM_S1==5)
   {
     GO=0;  
    }
  while(M_S==2)
   {  
       while(!KM_SURE)
       {
          Time_choose(MM_S1);
        }
      do{

                  Time_choose(MM_S1);                  //MM_S为菜单中功能选择变量

                  if(!KM_SSDOWN)                       //下选键按下         
                     {                                
                       while(!KM_SSDOWN )               //按键消抖操作
                        {
                           Time_choose(MM_S1);      //显示当前MM_S(即所选功能)
                           }
                       if(MM_S1==5)
                          {
                             Write_CMD(0x01);//清屏
                             Write_CMD(0x80);                //第一行显示
                             print_string("1.测电阻(H)");     //选择电压显示功能
                             Write_CMD(0x90);                //第二行显示
                             print_string("2.程控放大");        //选择时钟功能
                             Write_CMD(0x88);                //第三行显示
                             print_string("3.侧电容");         //选择秒表功能
                             Write_CMD(0x98);                //第四行显示
                             print_string("4.程控提高");       //选择倒计时功能
                                         }
                       MM_S1++;                        //选择下一功能  
                       if(MM_S1==5)
                            {
                              GO=0;
                             }
                       if(MM_S1 == 6)                    
                       {
                            MM_S1 = 1;                 //当MM_S加到5就恢复到1

                           }
                        }
           else  if(!KM_SSUP)
                 {
                   while(!KM_SSUP )               //按键消抖操作
                       {
                           Time_choose(MM_S1);      //显示当前MM_S(即所选功能)
                           }
                   if(MM_S1==5)
                     {
                         Write_CMD(0x01);//清屏
                         Write_CMD(0x80);                //第一行显示
                         print_string("1.测电阻(H)");     //选择电压显示功能
                         Write_CMD(0x90);                //第二行显示
                         print_string("2.程控放大");        //选择时钟功能
                         Write_CMD(0x88);                //第三行显示
                         print_string("3.测电容");         //选择秒表功能
                         Write_CMD(0x98);                //第四行显示
                         print_string("4.程控提高");       //选择倒计时功能
                        }
                      MM_S1--;                        //选择下一功能
                    if(MM_S1==5)
                        {
                            GO=0;
                           }  
                      if(MM_S1 == 0)                    
                       {
                         MM_S1 = 5;                 //当MM_S减到0就恢复到5
                         GO=0;
                        }
                   }
         }while(KM_SURE&&KM_S&&KM_RETURN);
         if(!KM_SURE)
         {
            M_S = MM_S1 + 3;                             //把选定结果赋给M_S
            FANHUI1 = MM_S1;                              //将选定结果赋给FANHUI
          }
         else if(!KM_S)
         {
            M_S = 0;
            FANHUI = 1;
          }
         else if(!KM_RETURN)
         {   
            M_S = 0;
            FANHUI1 = 1;
          }
       }
}

/************************************************************
*函数名称:void Time_Look(void)
*函数功能:测量电阻
*输入参数:void
*返回值:void
*************************************************************/
void RES_show(void)
{
   Write_CMD(0x01);                //第一行显示
   CHANGE = 1;                                   //功能切换变量为1(选择测电阻)

   TACTL = TASSEL_2 + MC_2 + ID_3 ;                    //SMCLK,up?mode
   TACCTL1 |= CM_1 + CCIS_0 + CAP + CCIE;       //cap设置
   P1SEL |= BIT2  ;                             //select P1.1,P1.2 function
   P1DIR &= ~BIT2;
   P1DIR |= BIT4;
   P1OUT |=BIT2;
   TAR = 0;
   _BIS_SR( GIE);
   P2SEL  &=  ~BIT1 ;

   while(M_S==4)
    {
       do{

           }while(KM_S&&KM_RETURN);
       if(!KM_S)
       {
         M_S = 0;
                   _DINT();
                   TACCTL1 &= (~CM_1) + (~CCIS_0) + (~CAP) + (~CCIE);       //cap设置
                   TACTL  &= (~TASSEL_1) + (~MC_2) ;   
                   TAR = 0;
                   time11 = 0;
                   CHANGE = 0;
       }
       else if(!KM_RETURN)
       {
           while(!KM_RETURN);
           M_S = 2;
                   _DINT();
                   TACCTL1 &= (~CM_1) + (~CCIS_0) + (~CAP) + (~CCIE);       //cap设置
                   TACTL  &= (~TASSEL_1) + (~MC_2) ;
                   P1OUT &= ~BIT4;
                   TAR = 0;
                   time11=0;
                   CHANGE = 0;
        }
    }
}

/***********************************************************************
*函数名称:void Time_change(void)
*函数功能:程控增益基础篇一级菜单
*输入参数:void
*返回值:void
************************************************************************/
void Time_change(void)
{
  signed char a = 0,b = 0  ;
  u8 i[4]={ 2,5,20,50};
  Write_CMD(0x01);                //第一行显示

   while(M_S==5)
    {
       while(!KM_RETURN);
       while(!KM_SURE)
       {

            b = i[a]/10;
            Write_CMD(0x80);
            print_string("选择增益:");     //选择电压显示功能
            LCD_write_char(3,1,Number[b]);
            b = i[a]%10;
            LCD_write_char(4,1,'.');
            LCD_write_char(5,1,Number[b]);
        }
       do{

              b = i[a]/10;
              Write_CMD(0x80);
              print_string("选择增益:");     //选择电压显示功能
              LCD_write_char(3,1,Number[b]);
              b = i[a]%10;
              LCD_write_char(4,1,'.');
              LCD_write_char(5,1,Number[b]);

              Write_CMD(0x98);
              print_string("返回");     //选择电压显示功能

              Write_CMD(0x9e);
              print_string("确定");     //选择电压显示功能

            if(!KM_SSDOWN)
            {
              while(!KM_SSDOWN);
              a--;
              if(a<0)
              {
                a = 3;
               }
             }
            else if(!KM_SSUP)
            {
               while(!KM_SSUP);
               a++;
               if(a>3)
               {
                 a = 0;
                }
              }

           }while(KM_S&&KM_RETURN&&KM_SURE);

        if(!KM_S)
         {
            while(!KM_S);       //延时
            M_S = 0;            
          }
          else if(!KM_RETURN)
           {
             while(!KM_RETURN); //延时
             M_S = 2;     
           }
        else if(!KM_SURE)
        {
           while(!KM_SURE);     //延时
           HOW_A = i[a];
           M_S = 12;
         }
      }
}

/*************************************************************
*函数名称:void Miaobiao(void)
*函数功能:测量电容
*输入参数:void
*返回值:void
**************************************************************/
void Miaobiao(void)
{
   Write_CMD(0x01);
   CHANGE = 2;                                   //功能切换变量为1(选择测电容)

   TACTL = TASSEL_2 + MC_2 + ID_3 ;                    //SMCLK,up?mode
   TACCTL1 |= CM_1 + CCIS_0 + CAP + CCIE;       //cap设置
   P1SEL |= BIT2  ;                             //select P1.1,P1.2 function
   P1DIR &= ~BIT2;
   P1DIR |= BIT4;
   P1OUT |=BIT2;
   TAR = 0;
   _BIS_SR( GIE);                        

   while(M_S==6)
   {
         do{   

             }while(KM_S&&KM_RETURN);
             if(!KM_S)
              {
                   M_S = 0;
                           _DINT();
                           TACCTL1 &= (~CM_1) + (~CCIS_0) + (~CAP) + (~CCIE);       //cap设置
                           TACTL  &= (~TASSEL_1) + (~MC_2) ;   
                           TAR = 0;
                           time11 = 0;
                           CHANGE = 0;
                  }

    else if(!KM_RETURN)
     {
          while(!KM_RETURN);   
          M_S = 2;
                    _DINT();
                    TACCTL1 &= (~CM_1) + (~CCIS_0) + (~CAP) + (~CCIE);       //cap设置
                    TACTL  &= (~TASSEL_1) + (~MC_2) ;
                    P1OUT &= ~BIT4;
                    TAR = 0;
                    time11=0;
                    CHANGE = 0;
      }
  }
}

/**********************************************************************************
*函数名称:void Daojishi(void)
*函数功能:实现程控增益提高篇
*输入参数:void
*返回值:void
***********************************************************************************/
void Daojishi(void)
{  
          signed long i,j,i_1,j_1,b = 0,c=0;   
          u16 Control_Val[3] = {0} ;                            //存储数据的地址
          u16  a = 0;

          u16 SHUZI=0 ,SHUZI_1=0 ;

          P1DIR |= BIT1;                                       //设置为输入状态
          P1DIR |= BIT2;

          ADC10CTL1|= CONSEQ_3 + INCH_2 + INCH_0 + INCH_1;     //序列通道多次转换+最大通道为A2
          ADC10CTL0|= ADC10SHT_2 + MSC + ADC10ON + SREF_0 ;
          ADC10DTC1|= 0x08;                                    //一共采样8次
          ADC10AE0 |= BIT1 + BIT2;                             //打开A1和A2的模拟输入通道

          Write_CMD(0x01);                                     //清屏

          Write_CMD(0x80);                                     //第一行显示
          print_string("当前增益:");                           //选择倒计时功能

          i = HOW_A/10;
          LCD_write_char(5,0,Number[i]);
          LCD_write_char(6,0,'.');
          i = HOW_A%10;
          LCD_write_char(7,0,Number[i]);

          Write_CMD(0x90);                //第一行显示
          print_string("Vin:");       //选择倒计时功能
          Write_CMD(0x88);                //第一行显示
          print_string("Vout:");       //选择倒计时功能

    while(M_S==7)
     {
       do{  
                SHUZI=0 ;
                SHUZI_1=0 ;  

                ADC10CTL0 &= ~ENC;                      //关闭采样使能
                while(ADC10CTL1 & BUSY);   
                ADC10CTL0 |= ENC + ADC10SC;             //Enable conversion,Start conversion        
                ADC10SA = (unsigned int)Control_Val;

                SHUZI   =  Control_Val[2] ;
                SHUZI_1 =  Control_Val[1] ;

                b = b + SHUZI;
                c = c + SHUZI_1;

               }while(KM_S&&KM_RETURN);
               if(!KM_S)
                {
                  M_S = 0;
                  }
                else if(!KM_RETURN)
                {
                while(!KM_RETURN);
                 M_S = 2;
                  }
    }
}


void Pwm_run(void)
{
  u16 a = 20000;
  u16 b;
  P2SEL  |=  BIT1 ;
  Write_CMD(0x01);                //第一行显示
  TA1CCTL1 = OUTMOD_7;
  TA1CCR0 =20000;
  TA1CCR1 = a;

  while(M_S == 8)
   {
       do{
             Write_CMD(0x80);                //第一行显示
             print_string("呼吸灯");       //选择倒计时功能  
             if(a==20000)
             {

               do{
                  delay(1);
                  b++;
                 }while((b<10000)&&KM_S&&KM_RETURN);
                 b=0;
               do{
                  a--;
                  TA1CCR1 = a;
                  delay(3);      
                }while((a>0)&&KM_S&&KM_RETURN);

               if(a==0)
                {
                  do{
                    delay(1);
                     b++;
                   }while((b<10000)&&KM_S&&KM_RETURN);
                  b=0;
                 do{
                 a++;
                 TA1CCR1 = a;
                 delay(3);
                 }while((a<20000)&&KM_S&&KM_RETURN);
                }
           }
         }while(KM_S&&KM_RETURN );
      if(!KM_S)
       {
           M_S = 0;
           TA1CCTL1 = OUTMOD_0;
        }
       else if(!KM_RETURN)
       {
            while(!KM_RETURN);
            M_S = 2;
            TA1CCTL1 = OUTMOD_0;
        }
    }
}

void main(void)
{
      WDTCTL = WDTPW + WDTHOLD;                     //关闭看门狗
      P2DIR  |=  BIT1 ;
      P2OUT &= ~BIT1;

      BCSCTL1 = CALBC1_8MHZ;  //MCLK=8MHz
      DCOCTL  = CALDCO_8MHZ;
      TA1CTL = MC_1 + TASSEL_2;

      Init_port();                                  //管脚初始化
      LCD12864_Init();                              //LCD12864初始化
      ADC_Init();                                   //AD转换初始化
    //  Write_CMD(0x01);
      M_S = 0;                                      //直接进入主菜单
      MM_S = 0;                                    
      FANHUI = 1;                                   //将上级菜单最后结果设置为1
      FANHUI1 = 1;                                  //将二级菜单中最后结果设置为1
      FANHUI2 = 1;                                  //将温度二级菜单中最后结果设置为1
      MM_S1 = 1;
      MM_S2 = 0;


  while(1)
    {  
        switch(M_S)
{
     case 0:  
      Menu_Init();                 //菜单显示
      break;
              case 1:
                       ADC_Run();                   //ADC运行
                       break;
              case 2:  
                       Time_Init();              
                       break;
              case 3:
                       Temper_run();                //温度
                       break;         
              case 4:               
                       RES_show ();                 //检测电阻            
                       break;
              case 5:
                       Time_change();               //选择放大器增益  
                       break;
              case 6:
                       Miaobiao();
                       break;
              case 7:
                       Daojishi();
                       break;
              case 8:
                       Pwm_run();
                       break;  
              case 9:  
                       Tempe_relook();
                       break;
              case 10:   
                       Tempe_change();      
                       break;
              case 11:
                       Tempe_PID();
                       break;
              case 12:
                       Zeng_yi();
                       break;
          }
      }
}

#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
  long a = 0 ;

      if(TACCTL1&CCIFG)
       {   
          TACCTL1 &= ~CCIFG;
            time11++;
            if(time11==1)
            {
               TA0CTL |= TACLR;
             }

            if(time11==2)
             {
                 T  = TACCR1;
                 f  = 1000000/T;

              switch (CHANGE)
              {   
                  case 2:
                           f = 1000000000000/(709632*f);
                           Write_CMD(0x80);                //第一行显示
                           print_string("电容值");     //选择电压显示功能

                           Write_CMD(0x98);                //第一行显示
                           print_string("单位,pF");     //选择电压显示功能


                           a = (u16)(((long)f)/1000%10);
                           LCD_write_char(3,1,Number[a]);
                           a = (u16)(((long)f)/100%10);
                           LCD_write_char(4,1,Number[a]);
                           a = (u16)(((long)f)/10%10);
                           LCD_write_char(5,1,Number[a]);
                           a = (u16)(((long)f)%10);
                           LCD_write_char(6,1,Number[a]);

                           P1OUT ^= BIT4;
                           break;
                    case 1:   
                                LCD_write_char(0,1,0x20);
                                 LCD_write_char(1,1,0x20);
                                  LCD_write_char(2,1,0x20);
                                   LCD_write_char(3,1,0x20);
                                    LCD_write_char(4,1,0x20);
                                     LCD_write_char(5,1,0x20);
                                      LCD_write_char(6,1,0x20);
                                       LCD_write_char(7,1,0x20);

                           f = (3333333/f-165);
                           Write_CMD(0x80);                //第一行显示
                           print_string("电阻值");     //选择电压显示功能

                           Write_CMD(0x98);                //第一行显示
                           print_string("单位,R");     //选择电压显示功能

                        if((f>=1)&&(f<10))
                        {
                                LCD_write_char(0,1,0x20);
                                 LCD_write_char(1,1,0x20);
                                  LCD_write_char(2,1,0x20);
                                   LCD_write_char(3,1,0x20);
                                    LCD_write_char(4,1,0x20);
                                     LCD_write_char(5,1,0x20);
                                      LCD_write_char(6,1,0x20);
                           f = f-f*0.04;
                           a = (u16)f;
                           LCD_write_char(7,1,Number[a]);
                           last  = f;                 
                         }
                        else if((f>=10)&&(f<100))
                         {
                              LCD_write_char(0,1,0x20);
                                 LCD_write_char(1,1,0x20);
                                  LCD_write_char(2,1,0x20);
                                   LCD_write_char(3,1,0x20);
                                    LCD_write_char(4,1,0x20);
                                     LCD_write_char(5,1,0x20);
                              f = f-f*0.04;
                             a = ((u16)f)/10;
                             LCD_write_char(6,1,Number[a]);
                             a = ((u16)f)%10;
                             LCD_write_char(7,1,Number[a]);

                            }
                        else if((f>=100)&&(f<1000))
                         {
                              LCD_write_char(0,1,0x20);
                                 LCD_write_char(1,1,0x20);
                                  LCD_write_char(2,1,0x20);
                                   LCD_write_char(3,1,0x20);
                                    LCD_write_char(4,1,0x20);
                             f = f-f*0.04;
                             a = ((u16)f)/100;
                             LCD_write_char(5,1,Number[a]);
                             a = ((u16)f)/10%10;
                             LCD_write_char(6,1,Number[a]);
                             a = ((u16)f)%10;
                             LCD_write_char(7,1,Number[a]);

                          }
                        else if((f>=1000)&&(f<10000))
                         {
                              LCD_write_char(0,1,0x20);
                                 LCD_write_char(1,1,0x20);
                                  LCD_write_char(2,1,0x20);
                                   LCD_write_char(3,1,0x20);
                             f = f-f*0.04;
                             a = ((u16)f)/1000;
                             LCD_write_char(4,1,Number[a]);
                             a = ((u16)f)/100%10;
                             LCD_write_char(5,1,Number[a]);
                             a = ((u16)f)/10%10;
                             LCD_write_char(6,1,Number[a]);
                             a = ((u16)f)%10;
                             LCD_write_char(7,1,Number[a]);

                           }
                      else if((f>=10000)&&(f<100000))
                         {
                              LCD_write_char(0,1,0x20);
                                 LCD_write_char(1,1,0x20);
                                  LCD_write_char(2,1,0x20);
                             f = f-f*0.04;
                             a = ((u16)f)/10000;
                             LCD_write_char(3,1,Number[a]);
                             a = ((u16)f)/1000%10;
                             LCD_write_char(4,1,Number[a]);
                             a = ((u16)f)/100%10;
                             LCD_write_char(5,1,Number[a]);
                             a = ((u16)f)/10%10;
                             LCD_write_char(6,1,Number[a]);
                              a = ((u16)f)%10;
                             LCD_write_char(7,1,Number[a]);
                           }
                       else if((f>=100000)&&(f<1000000))
                         {
                             LCD_write_char(1,1,0x20);
                             f = f-f*0.04;
                             a = ((long)f)/100000;
                             LCD_write_char(2,1,Number[a]);
                             a = ((long)f)/10000%10;
                             LCD_write_char(3,1,Number[a]);
                             a = ((long)f)/1000%10;
                             LCD_write_char(4,1,Number[a]);
                             a = ((long)f)/100%10;
                             LCD_write_char(5,1,Number[a]);
                              a = ((long)f)/10%10;
                             LCD_write_char(6,1,Number[a]);
                             a = ((long)f)%10;
                             LCD_write_char(7,1,Number[a]);
                           }
                         P1OUT ^= BIT4;
                         break;              
              }           
           }
         }
}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65585 发表于 2014-9-5 15:42 | 只看该作者
很强大,楼主把效果图贴一下就好了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表