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

📄 lcm141-key.c

📁 基于430单片机的涡街流量计设计程序。可以使用
💻 C
📖 第 1 页 / 共 2 页
字号:
//Key variable
unsigned char KeyFlag=0,EditFlag=0,order_count=1,bit_count=0,key_temp=0,value=0;

//LCD variable
unsigned long int view=0;
unsigned long int view_cnt=0;
int buffer,addr_buffer;
int FLOW_RATE=0;
int FLOW_UNIT=1;
int UNSCALED_PULSE=0;
int TEMP_f=0;
int PRESS_f=0;
int DENSITY_UNIT=0;

char asc[8];//整型数数对应的8位ASCII码数组
char dis_up[4];//上排显示寄存器
char dis_down[6];//下排显示寄存器
const char addr_up[4]={0x0B,0x09,0x07,0x05};//上排右->左寄存器地址
const char addr_down[6]={0x1C,0x1A,0x18,0x16,0x14,0x12};//下排右->左寄存器地址
const char addr_rights15=0x0E;//温度,/m,/s,/d,/h,m3-1,t-1
const char addr_rights14=0x0D;//电池
const char addr_rights13=0x0C;//百分号
const char addr_rights31=0x1E;//pa,I-2,m3-2,kg-2,k,M,/,t-2
const char addr_rights17=0x10;//ERROR,WARNING,kg-1,I-1,5,4,3,*10
const char downseg[11]={0xFA,0x06,0xBC,0x9E,0x4E,0xD6,0xF6,0x8A,0xFE,0xDE,0x00};//0->9段码
const char upseg[11]={0xFA,0x06,0xBC,0x9E,0x4E,0xD6,0xF6,0x8A,0xFE,0xDE,0x00};//0->9段码


//LCD subprogram
void Display_Init(void);
void Write_Command(void);
void Write_Data(void);
void Write_act(void);
void FLOAT2ASCII(void);
void Display_up(void);
void Display_down(void);
void Clear_screen(void);
void Clear_up(void);
void Clear_down(void);
void Clear_left(void);
void Clear_right(void);
void Switching_Display(void);
void Switching_Display1(void);
void Flickering_Display(void);

//Key subprogram
void Key_Init(void);
void Key_act(void);


void msdelay(unsigned int delaytime);

/**********************LCD driver***********************************/
void Display_Init(void)
{
    P2SEL&=~BIT5+BIT6+BIT7;
    P2DIR|=BIT5+BIT6+BIT7;
  
    P2OUT|=BIT5;                            // ~CS=1 reset 
    msdelay(100);
    buffer=0x00;
    Write_Command();
    buffer=0x29;                            // 上电初始化命令专用模块
    Write_Command();
    buffer=0x14;                            // 定义内部振荡器工作
    Write_Command();
    buffer=0x01;                            // 开振荡器
    Write_Command();
    buffer=0x03;                            // 开显示器
    Write_Command(); 

    Clear_screen();
    
    //addr_buffer=addr_left;                  // 显示Q标志
    //buffer=0x08;
    //Write_Data();    
    
}

void Write_Command(void)                    // LCD写命令
{  
   P2OUT&=~BIT5;                            // ~CS=0
   P2OUT|=BIT7;                             // DATA=1
   Write_act(); 
   P2OUT&=~BIT7;                            // DATA=0
   Write_act(); 
   P2OUT&=~BIT7;                            // DATA=0
   Write_act();
   for(i=0;i<8;i++)
   {
	if((buffer&0x80)==0x80)
	  P2OUT|=BIT7;
        else P2OUT&=~BIT7;
	Write_act(); 
	buffer<<=1;
   }
   P2OUT&=~BIT7;                            // DATA=0
   Write_act(); 
   P2OUT|=(BIT5+BIT6+BIT7);                 // ~CS=1,~WR=1,DATA=1
}

void Write_act(void)
{
   P2OUT&=~BIT6;
   msdelay(10);
   P2OUT|=BIT6;              
   msdelay(10);
}

void Write_Data(void)                       // LCD写数据程序
{ 	 	
        P2OUT&=~BIT5;                       // CS=0,使能液晶
	P2OUT|=BIT7;                        /*1*/      
        Write_act(); 	
	P2OUT&=~BIT7;                       /*0*/
	Write_act(); 
	P2OUT|=BIT7;                        /*1*/
	Write_act(); 
        P2OUT&=~BIT7;                       /*0*/
	Write_act(); 
	
	addr_buffer<<=3;                    // 左移三位,低五位有效
	for(i=0;i<5;i++)
	{	    
	  if((addr_buffer&0x80)==0x80)
          P2OUT|=BIT7;
	  else P2OUT&=~BIT7;
	  Write_act(); 
	  addr_buffer<<=1;
	}
	for(i=0;i<8;i++)
	{
	  if((buffer&0x01==0x01))
	  P2OUT|=BIT7;
	  else P2OUT&=~BIT7;
          Write_act(); 
          buffer>>=1;
	}
	P2OUT|=(BIT5+BIT6+BIT7);            // ~CS=1,~WR=1,DATA=1
}
 
void FLOAT2ASCII(void)                      //将整型数转化为用于显示的ASCII
{
  unsigned long int view1;
  unsigned long int view2;
  unsigned long int view_temp;

  view2=view;
  view1=view_cnt;

////////////////////////////////////////////
  for(i=0;i<6;i++)                          //上排
  {
     view_temp=view1/10;
     asc[i]=view1-view_temp*10;             //求余数
     view1=view1/10;
  }  
  for(i=0;i<6;i++)
  {
     dis_up[i]=asc[i];
  }  
  i=5;  
  while((dis_up[i]==0)&(i>0))
  {
    dis_up[i]=10;
    i--;
  }
////////////////////////////////////////////  
  for(i=0;i<8;i++)                          //下排
  {
     view_temp=view2/10;
     asc[i]=view2-view_temp*10;             //求余数
     view2=view2/10;
  }
  for(i=0;i<8;i++)
  {
     dis_down[i]=asc[i];
  }
  i=7;  
  while((dis_down[i]==0)&(i>3))
  {
    dis_down[i]=10;
    i--;
  }
}
////////////////////////////////////////////
void Display_up(void)                       //上排液晶显示程序
{
        unsigned int t;
        addr_buffer=addr_up[0];             //显示上排第0位
        t=dis_up[0]; 
	buffer=upseg[t];
	Write_Data();

        addr_buffer=addr_up[1];             //显示上排第1位
        t=dis_up[1]; 
	buffer=upseg[t];
	Write_Data();  
	
	addr_buffer=addr_up[2];             //显示上排第2位
        t=dis_up[2]; 
	buffer=upseg[t];
	Write_Data();

	addr_buffer=addr_up[3];             //显示上排第3位
        t=dis_up[3]; 
	buffer=upseg[t];
	Write_Data();
	

}

void Display_down(void)                     //下排液晶显示程序
{
        unsigned int t;
        addr_buffer=addr_down[0];           //显示下排第0位
        t=dis_down[0]; 
	buffer=downseg[t];
	Write_Data();

	addr_buffer=addr_down[1];           //显示下排第1位
        t=dis_down[1]; 
	buffer=downseg[t];
	Write_Data();
	
	addr_buffer=addr_down[2];           //显示下排第2位
        t=dis_down[2]; 
	buffer=downseg[t];
	Write_Data();

	addr_buffer=addr_down[3];           //显示下排第3位
        t=dis_down[3]; 
	buffer=downseg[t];
        buffer|=0x10;
	Write_Data();

	addr_buffer=addr_down[4];           //显示下排第4位
        t=dis_down[4]; 
	buffer=downseg[t];
	Write_Data();

	addr_buffer=addr_down[5];           //显示下排第5位
        t=dis_down[5]; 
	buffer=downseg[t];
	Write_Data();
 

}
void Clear_up(void)
{
  for(i=0;i<4;i++)                          //上排下排数码清除   
  {
     dis_up[i]=10;
  }  
  Display_up();
}
void Clear_down(void)
{
  for(i=0;i<6;i++)                          //上排下排数码清除   
  {
     dis_down[i]=10;
  }  
  Display_down();
}

void Clear_right(void)
{    
  addr_buffer=addr_rights15;                   
  buffer=0x00;
  Write_Data();
    
  addr_buffer=addr_rights14;                  
  buffer=0x00;
  Write_Data();
  
  addr_buffer=addr_rights13;              
  buffer=0x00;
  Write_Data();
  
  addr_buffer=addr_rights31;              
  buffer=0x00;
  Write_Data();
  
  addr_buffer=addr_rights17;              
  buffer=0x00;
  Write_Data();

}
void Clear_screen(void)
{
  for(i=0;i<6;i++)                          //上排下排数码清除   
  {
     dis_up[i]=10;
  }  
  for(i=0;i<8;i++)
  {
     dis_down[i]=10;
  }  
  Display_up();
  Display_down();
  
  addr_buffer=addr_rights15;                   
  buffer=0x00;
  Write_Data();
    
  addr_buffer=addr_rights14;                  
  buffer=0x00;
  Write_Data();
  
  addr_buffer=addr_rights13;              
  buffer=0x00;
  Write_Data();
  
  addr_buffer=addr_rights31;              
  buffer=0x00;
  Write_Data();
  
  addr_buffer=addr_rights17;              
  buffer=0x00;
  Write_Data();

}

void Switching_Display(void)
{
  Display_Init();
  if(FLOW_RATE==1)
  {
      addr_buffer=addr_rights13;                         //%
      buffer=0x01;
      Write_Data();
     //view=(unsigned long int)(Density*1000);         //仪表系数;
     //view_cnt=3;
  }	
  else if(FLOW_UNIT>0)  
  {
   switch(FLOW_UNIT)
   { 
    case 1:                            //m3/s
      addr_buffer=addr_rights15;         
      buffer=0x30;                 
      Write_Data();
      
      //view=(unsigned long int)(f*1000);//频率;
      //view_cnt=1;
    break; 
    
    case 2:
      addr_buffer=addr_rights15;          //m3/m
      buffer=0x50;
      Write_Data();
      
      //view=(unsigned long int)(Q*1000);//瞬时流量;
      //view_cnt=2;
    break;  
    
    case 3:
      addr_buffer=addr_rights15;          //m3/h
      buffer=0x14;
      Write_Data();
      
      //view=(unsigned long int)(QL*1000);//累计流量;
      //view_cnt=3;
    break;
    
    case 4:
      addr_buffer=addr_rights15;              //m3/d
      buffer=0x18;
      Write_Data();
      
      //view=(unsigned long int)(Diameter*1000);        //仪表口径;
      //view_cnt=1;
    break;
    
    case 5:
      addr_buffer=addr_rights17;                         //l
      buffer=0x10;
      Write_Data();
      addr_buffer=addr_rights15;                         ///s
      buffer=0x20;
      Write_Data();
      
      //view=(unsigned long int)(Meter_coeffient*1000); //仪表系数;
      //view_cnt=2;
    break;
    
    case 6:
      addr_buffer=addr_rights17;                         //l
      buffer=0x10;
      Write_Data();
      addr_buffer=addr_rights15;                         //m
      buffer=0x40;
      Write_Data();
      
      //view=(unsigned long int)(Density*1000);         //仪表系数;
      //view_cnt=3;
    break;      
    
    case 7:
      addr_buffer=addr_rights17;                         //l
      buffer=0x10;
      Write_Data();
      addr_buffer=addr_rights15;                         //h
      buffer=0x04;
      Write_Data();
      
      //view=(unsigned long int)(Density*1000);         //仪表系数;
      //view_cnt=3;
    break;   

    case 8:
      addr_buffer=addr_rights17;                         //l
      buffer=0x10;
      Write_Data();
      addr_buffer=addr_rights15;                         //d
      buffer=0x08;
      Write_Data();
      
      //view=(unsigned long int)(Density*1000);         //仪表系数;
      //view_cnt=3;
    break; 

    case 9:
      addr_buffer=addr_rights17;                         //kg
      buffer=0x20;
      Write_Data();
      addr_buffer=addr_rights15;                         //s
      buffer=0x20;
      Write_Data();
      
      //view=(unsigned long int)(Density*1000);         //仪表系数;
      //view_cnt=3;
    break; 

    case 10:
      addr_buffer=addr_rights17;                         //kg
      buffer=0x20;
      Write_Data();
      addr_buffer=addr_rights15;                         //m
      buffer=0x40;
      Write_Data();
            
      //view=(unsigned long int)(Density*1000);         //仪表系数;
      //view_cnt=3;
    break; 

    case 11:
      addr_buffer=addr_rights17;                         //kg

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -