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

📄 csyg.c

📁 ADSL测试仪
💻 C
📖 第 1 页 / 共 3 页
字号:
}
void DisplayInitial(void)   //  显示初始画面
{
      int i,j;
    //  DDRD|=0x40;
      strncpy(Line_str,"VER 5.30",8);
      Line_nums=8;
      Line=0;
      Col=0;
      Disp1608();  //显示程序
      if(Languageflag)   //Languageflag=1为英文
      {
        strncpy_P(Line_str,IniMenuE,16);//"  Initial...... "
        Line_nums=16;
        Line=1;
        Col=0;
        Disp1608();  //显示程序
      }
      else//否则为汉语
      {
        strncpy_P(Line_str,IniMenu,10);//"正在初始化......"
        Line_nums=10;
        Line=1;
        Col=3;
        Disp1608();  //显示程序
      }
  for(i=0;i<1000;i++)      //延时
  {
    for(j=0;j<3000;j++);
  }
   Clr_LCD();    //清列
 //  DDRD|=0x40;
 //  PORTD&=0xbf;  
}

void Disp1608(void)  //显示程序
{
  //signed char  temp;
  char i,k,m,n,Cur_Y,Y_address,X_address,CSY_addr;
  unsigned int HZK_ptr;
  Cur_Y=Col;
  IniLCD();   //屏幕初始化
  for(i=0;i<Line_nums;i++)
  {
     if(Line_str[i]>=0x80)
     {
        HZK_ptr=(Line_str[i]&0x7f)*0x80+(Line_str[i+1]&0x7f);
        HZK_ptr*=32;
        for(m=0;m<2;m++)
        {
          Y_address=Cur_Y*8;          
          X_address=Line*2+m;
          for(n=0;n<2;n++)
          {
             SET_CS1;
             CLR_CS2;
             Y_address+=n*8;
             CSY_addr=Y_address;
             if(Y_address>63)
             {
                CSY_addr-=64;
                SET_CS2;
                CLR_CS1;
              }
              Read_BF();  //判断显示器忙?
              DDRB=0xff;
              CLR_RW;
              CLR_RS;
              PORTB=CSY_addr+0x40;
              SET_E;
              CLR_E;
              Read_BF();  //判断显示器忙?
              DDRB=0xff;
              CLR_RW;
              CLR_RS;
              PORTB=X_address+0xb8;
              SET_E;
              CLR_E;
              for(k=0;k<8;k++)
              {
                Read_BF();  //判断显示器忙?
                CLR_RW;
                SET_RS;
                DDRB=0xff;
                if(M_flag==1)
                   PORTB=0xff-HZK[HZK_ptr];
                else
                   PORTB=HZK[HZK_ptr];
                SET_E;
                CLR_E;
                HZK_ptr++;
               }
              }
            }
           i++;Cur_Y++; 
       }
     
       else
       {
          HZK_ptr=Line_str[i]*16;
          for(m=0;m<2;m++)
         {
           Y_address=Cur_Y*8; 
           X_address=Line*2+m;
            SET_CS1;
            CLR_CS2;
            if(Y_address>63)
            {
                Y_address-=64;
                SET_CS2;
                CLR_CS1;
            }
            Read_BF();  //判断显示器忙?
            CLR_RW;
            CLR_RS;
            DDRB=0xff;
            PORTB=Y_address+0x40;
            SET_E;
            CLR_E;
            Read_BF();  //判断显示器忙?
            CLR_RW;
            CLR_RS;
            DDRB=0xff;
            PORTB=X_address+0xb8;
            SET_E;
            CLR_E;
            for(k=0;k<8;k++)
            {
              Read_BF();  //判断显示器忙?
              CLR_RW;
              SET_RS;
              DDRB=0xff;
              if(M_flag==1)
                PORTB=0xff-asc000[HZK_ptr];//+k+m*8];
              else
                PORTB=asc000[HZK_ptr];//+k+m*8];
              SET_E;
              CLR_E;
              HZK_ptr++;
            }
          }
        }
        Cur_Y++;
     }   
     M_flag=0;
                  
}


void Read_BF(void)  //判断显示器忙?
{
  unsigned char ch,ch1;
  while(1)
  {
     CLR_E;
     SET_RW;CLR_RS;//SET_CS1;CLR_CS2;
     DDRB=0x00;
     PORTB=0x00; 
     SET_E;//下降沿触发
     CLR_E;//
     ch=PINB;
     ch1=ch&0x90;//1001 00000
     if(ch1==0)
        break;
  } 
}

void Clr_Row(char Row)//清行
{
  memcpy_P(Line_str,SPACE,16);
  Col=0;Line=Row;
  Line_nums=16;
  CLR1608();  //清显示屏幕
}   
            
void CLR1608(void)  //清显示屏幕
{
  char i,m,j,X_address;
  for(j=0;j<2;j++)
  {
    if(j==0)
    {
       SET_CS1;//左半面
       CLR_CS2;
    }
    else
    {
       SET_CS2;//右半面
       CLR_CS1;
    }      
          for(m=0;m<2;m++)
         {
            X_address=Line*2+m;
            Read_BF();  //判断显示器忙?
            CLR_RW;
            CLR_RS;
            DDRB=0xff;
            SET_E;//下降沿触发
            CLR_E;//
            Read_BF();  //判断显示器忙?
            CLR_RW;
            CLR_RS;
            DDRB=0xff;
            PORTB=X_address+0xb8;
            SET_E;//下降沿触发
            CLR_E;//
          for(i=0;i<64;i++)//64列
          {
              Read_BF();  //判断显示器忙?
              CLR_RW;
              SET_RS;
              DDRB=0xff;
              PORTB=0;
              SET_E;//下降沿触发
              CLR_E;//
           }   
       } 
   }       
}   
void Clr_LCD(void)    //清列
{
   char i;
   for(i=0;i<4;i++)
     Clr_Row(i);//清行
}
void Clr_4Row(void)   //清4行
{
   char i;
   for(i=1;i<4;i++)
     Clr_Row(i);//清行
}
void IniLCD(void)   //屏幕初始化
{
  // DDRA=0x00;
  // PORTA&=0x07;
  
   SET_CS1;
   CLR_CS2;   
   Read_BF();  //判断显示器忙?
   DDRB=0xff;  //PB口输出口
   PORTB=0x3f; //PB口
   LCDCommand();  //屏幕写命令

   SET_CS2;
   CLR_CS1;
    Read_BF();     //判断显示器忙?
   DDRB=0xff;
   PORTB=0x3f; 
   LCDCommand();  //屏幕写命令

   SET_CS1 ;
   CLR_CS2;    
   DDRB=0xff;
   PORTB=0xc0; 
   LCDCommand();  //屏幕写命令

   SET_CS2;
   CLR_CS1;    
   DDRB=0xff;
   PORTB=0xc0; 
   LCDCommand();  //屏幕写命令
  
}
void LCDCommand(void)  //屏幕写命令
{
   CLR_E;//清液晶片选
   CLR_RW;//写液晶
   CLR_RS;//读液晶
   SET_E;//置液晶片选
   CLR_E;//清液晶片选
}   

void Key(void)      //判断有键按下吗?
{
   unsigned int i;
   char temp;
   BackLight();//背光灯
   Key_pressed=0;//设,没键按下
 //  KeyCode=0xff;
   DDRA=0x0;
   temp=PINA;
   temp|=0xf5;//判断上下键有按吗?
   if(temp!=0xff) //有下降沿
   {                  //有
     for(i=0;i<100;i++);//延时防抖
     temp=PINA; //再一次判断有上下键有按吗?
     temp|=0xf5;
     if(temp!=0xff)//有下降键?
     {             //有
       Key_pressed=1;//有键按下
        _CLI();  //关中断
       TimerOff=0;  //时间计数   有键按下时间计数清0
       _SEI();//开中断
     }
    }      
}
void Get_Keycode(void)//取键值
{
      KeyCode=0xff;
      DDRA=0x00;//A口为输入
      KeyCode=PINA|0xf5;//取键值
}  
void KeyWaite(void)//键等待
{
       while(1)
       {
           BackLight();//背光灯
           Get_Keycode();//取键值
           if(KeyCode==0xff)
              break;
       }    
} 
void SetupLanguage(void) //设置中英
{
   char CurRow1;//临时变量CurRow1为字符型
   CurRow1=CurRow;//标志暂存于CurRow1中
   Clr_LCD();    //清列
   CurRow=Languageflag;//中英标志送CurRow
   while(1)
   {
      SetupLanguageUpdate();    //选择中英文显示面
    //  Key();      //判断有键按下吗?
    //  if(Key_pressed)
    //    break;
      if(!Get_BackLightKey())//假如没有背光键按下
        break;//跳出往下进行
   }
   while(1)
   {
      SetupLanguageUpdate();    //选择中英文显示面
      Key();      //判断有键按下吗?
      if(Key_pressed)//有键按下吗?
      {
        Get_Keycode();//取键值
         if(KeyCode==UP_KEY)//是上升键吗?
         {
            KeyWaite();//键等待(防抖)
            if(CurRow>0)
              CurRow--;//是1变为0
          }
          else if(KeyCode==DOWN_KEY)//否则是下降键
          {
             KeyWaite();//键等待(防抖)
             if(CurRow<1)
               CurRow++;//是0变为1
          }
        //  else if(KeyCode==BG_KEY)
        //  {
        //     KeyWaite();//键等待(防抖)
        //     Languageflag=CurRow;
        //     EE_Languageflag=CurRow;
        //     break;
       //   }
      }
     if(Get_BackLightKey())//假如背光键按下
     {
             Languageflag=CurRow;//送标志位
             EE_Languageflag=CurRow;//送EEPROM中保存
             break;//跳出
     }
   }
   CurRow=CurRow1;//恢复原来标志
}
void SetupLanguageUpdate(void)   //选择“中英文”显示面
{ 
     char i;
     if(!Languageflag)//Languageflag=0?是进入中文吗?
        strncpy_P(Line_str,SetupLanguageMenu,16);//"    语    言    "
     else
        strncpy_P(Line_str,SetupLanguageMenuE,16);//"    LANGUAGE    "
     Line_nums=16;
     Col=0;
     Line=0;
     M_flag=1;
     Disp1608();   //显示程序
     for(i=0;i<2;i++)
     {
       strncpy_P(Line_str,&SetupLanguageMenu1[7*i],7);//"汉   语English"
       Line_nums=7;
       Col=4;
       Line=1+i;
       Disp1608();  //显示程序
       if(CurRow==i)
         strncpy_P(Line_str,&SetupDisplayMenu1[2],2);//"○⊙"
       else
         strncpy_P(Line_str,SetupDisplayMenu1,2);
       Line_nums=2;
       Col=0;
       Line=1+i;
       Disp1608();      //显示程序  
     }
}  

__interrupt void TIMER1VF_Handler(void)  //T1中断
{
  DDRA&=0x7f;  //PA。8口输入(LINK)
  PORTA&=0x7f;  //PA。8口底电瓶
  ICR1=15000;   //ICR1输入     寄存器
  if(!(PINA&0x80))//PA。8口(LINK)底电瓶 有信号?
  {                    //有信号
    if(TimerCount<50)   //计数
        TimerCount++;   //计数
    else
    {
        Synflag=1;   //在(LINK)有信号的情况下,计数超过50,标志Synflag=1
        TimerOff=0;  //清  时间记数  有信号的情况下,时间记数清0
        TimerOffflag=0;   //清   长时间无按键 
    }
  }
  else    //没有信号
  {
    TimerOff++;    //时间计数
    if(TimerOff>5000)    //没有信号,又超过15分钟,让TimerOffflag=1准备关机
       TimerOffflag=1;   //长时间无按键 
    TimerCount=0;   // 清  计数
    Synflag=0;   //清标志Synflag
  }
}
void ADCBattery(void)   //A/D电池检测
{
  ADCSRA|=0x40;
  while(!(ADCSRA&0x10));
  Battery=ADCH;//A/D转换高电瓶  存  Battery
  if(Battery<200)//采集的A/D数字小于200吗?
  {                   //小
     Battery=0;    //清
     LowOffflag=1;    //电池电压底标志=1
  }
  else if(Battery<210)//<6.8V Turn off
  {
    LowOffflag=1;    //电池电压底标志=1
    Battery-=200;    //减去底的电池值
  }
  else if(Battery<216)//<7.0V Alarm
  {
    BeeSpeak(30);   //蜂鸣器(时间长短)
    Battery-=200;   //减去底的电池值
  }
  else
     Battery-=200;   //减去底的电池值
  Battery=Battery*2+2;   //将余下的值*2+2
  if(Battery>112)   //
    Battery=112;   //
}
     


⌨️ 快捷键说明

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