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

📄 project.c

📁 AVRkaifashili.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
       case 5:					//若为“第5站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State1[Word_Number-4][m];		//依次换字显示“第1站”
              Word_Number++;}			//显示字数+1
    
         else						//若全部显示完
           Word_Number=0;			//显示字数清0
         break;
       case 6:					//若为“第6站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
               next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State2[Word_Number-4][m];		//依次换字显示“第2站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0;
         break;
       case 7:					//若为“第7站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State1[Word_Number-4][m];		//依次换字显示“第1站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0
         break;
       case 8:					//若为“第8站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
               next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State2[Word_Number-4][m];		//依次换字显示“第2站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0;
         break;
       case 9:					//若为“第9站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
            next[m]=State1[Word_Number-4][m];		//依次换字显示“第1站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0
         break;
       case 10:					//若为“第10站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State2[Word_Number-4][m];		//依次换字显示“第2站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0;
         break;
       case 11:					//若为“第11站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State1[Word_Number-4][m];		//依次换字显示“第1站”
            Word_Number++;}			//显示字数+1
           
         else						//若全部显示完
           Word_Number=0;			//显示字数清0
         break;
       case 12:					//若为“第12站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State2[Word_Number-4][m];		//依次换字显示“第2站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0;
         break;
       case 13:					//若为“第13站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State1[Word_Number-4][m];		//依次换字显示“第1站”
                  Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0
         break;
       case 14:					//若为“第14站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State2[Word_Number-4][m];		//依次换字显示“第2站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0;
           break;
       case 15:					//若为“第15站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State1[Word_Number-4][m];		//依次换字显示“第1站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0
         break;
       case 16:					//若为“第16站”
         if(Word_Number<7)		//判断已显示字数
           {if(Word_Number<4)		//若未显示完“前方到站”
              {for(m=0;m<32;m++)
                   next[m]=QFDZ[Word_Number][m];}		//依次换字显示“前方到站”
            else					//若显示完“前方到站”
              for(m=0;m<32;m++)
                  next[m]=State2[Word_Number-4][m];		//依次换字显示“第2站”
            Word_Number++;}			//显示字数+1
         else						//若全部显示完
           Word_Number=0;			//显示字数清0;
         break;
}}}  


//***************************滚动显示********************************//
void move(void)
{uchar b;
 if(Move_Flag==16)		     //若当前汉字已向左移动16列
   {Move_Flag=0;			 //滚动标志清0
    change();}				 //更换下一个字
 for(b=0;b<15;b++)		     //上半屏字型向左移一列
     text[b]=text[b+1];
 text[15]=next[0];			 //上半屏最后一列为下一个字上半部分的第1列
 for(b=0;b<15;b++)		     //下一个字的上半部分也左移一列
     next[b]=next[b+1];
 for(b=16;b<31;b++)		     //下半屏字型向左移一列
     text[b]=text[b+1];
 text[31]=next[16];			 //下半屏最后一列为下一个字下半部分的第1列
 for(b=16;b<31;b++)		     //下一个字的下半部分也左移一列
     next[b]=next[b+1];
 Move_Flag++;			     //滚动标志+1
}

//****************************汉字显示程序****************************//
void display()
{uchar a;
 PORTC=0x60;			     //先显示上半屏
 for(a=0;a<32;a++)
    {if(PORTC==0x6f)		 //若上半屏显示完毕,则
     PORTC=0x50;			 //显示下半屏
     if(PORTC==0x5f)		 //若下半屏显示完毕,则
     PORTC=0x60;			 //显示上半屏
     PORTC++;			     //选通显示列
     PORTB=text[a];			 //送显示字型
     delay(20000);			 //延时等待,以保证显示的稳定性
     PORTB=0;}				 //清空显示屏
}

void Lattice_Display(void)   //显示屏显示
{uchar k;
 while(1)
  {if(k==Speed) {move();k=0;}
   display();
   k++;}
}

//***************************键盘处理程序****************************//
void Key_Act(void)
{GIMSK &=0x7f;			     //关闭中断 
 switch(Key_Value)		     //判断键值
  {case 1:		  			 //若键值为1,则报站 
     Inform(State);			 //报第State站
     Lattice_Display();		 //显示到站信息
     Key_Value=0;			 //重新赋键值为0
     break;
   case 2:		  			 //若键值为2,则前进一站
     if(State<16)  State++;	 //若站数<16,则站数+1
     else		   State=0;	 //否则重新赋站数为0
     Led_Display(State);	 //显示当前站数
     Key_Value=0; 			 //重新赋键值为0
     break;
   case 4:					 //若键值为4,则播放特殊信息
     Spec++;				 //特殊键按下一次,特殊段+1
     Special(Spec);			 //报第Spec段特殊段		  	   
     Key_Value=0; 			 //重新赋键值为0
     break;
   case 8:					 //若键值为8,则进行上、下行切换
     Pst_Flag=!Pst_Flag;	 //上、下行切换
     Key_Value=0; 			 //重新赋键值为0
     break;
   case 16:				     //若键值为16,则后退一站
     if(State)		State--; //若站数不为0,则站数-1
     else		State=16;	 //否则重新赋站数为16
     Led_Display(State);	 //显示当前站数
     Key_Value=0; 			 //重新赋键值为0
     break;
   case 32:				     //若键值为32,则进行预报站
     Pre_Inform(State+1);	 //预报第State+1站
     Lattice_Display();		 //显示预报站信息
     Key_Value=0; 			 //重新赋键值为0
     break;
   default:break;}
 GIMSK |=0x80;	   
}

//***************************中断服务程序****************************//
void Key_Scan(void)                    //按键中断INT0服务程序
{uchar Press,Debounce;
 GIMSK &=0xbf;		  	               //关闭中断INT0
 Press=Read_1byte(0x70,0x0c);          //读取按下键的键值
 if(Press)
   {Debounce=Read_1byte(0x70,0x08);	   //读取释放键的键值
    if(Debounce==Press)				   //若二者相同,则认为该键被按下
   	Key_Value=Press;}
 GIMSK |=0x40;	 			           //重新打开中断INT0
 Key_Act();
}

void Receive_EOM(void)                 //语音中断INT1服务程序
{GIMSK &=0x7f;		  	               //关闭中断INT1
 Set_PD(1);				               //语音芯片复位
 delay(20000);
 Set_PD(0);
 EOM_Flag=0;			               //设置EOM标志位,为0时有效
 GIMSK |=0x80;		  	               //重新打开中断INT1
}

//***************************系统初始化程序**************************//
void MAX6959_Initialize(void)          //MAX6959初始化
{Write_1byte(0x70,0x01,0x0f); //设置MAX6959为译码模式
 Write_1byte(0x70,0x02,0x3f); //设置MAX6959的显示亮度为最高,即63/64
 Write_1byte(0x70,0x03,0x03); //设置MAX6959扫描所有显示位和按键
 Write_1byte(0x70,0x04,0x21); //设置MAX6959使其进入正常工作模式,并清除显示
 Write_1byte(0x70,0x06,0x58); //设置MAX6959进行按键扫描并发出下降沿中断请求
}

void AVR_Initialize()         //AT90S8535初始化
{DDRA=0xff;		   //定义PA口为输出,用于与ISD2560和MAX6959进行数据通信
 PORTA=0x16;
 DDRB=0xff;		   //定义PB口为输出,作为点阵显示器的数据总线
 PORTB=0xff;
 DDRC=0xff;		   //定义PC口为输出,作为点阵显示器的地址和控制总线
 PORTC=0x30;
 SREG=0x80;		   //开全局中断
 GIMSK=0xc0;	   //通用中断控制寄存器设置,打开中断INT0和INT1
 MCUCR=0x0a;	   //设置外部中断的中断触发方式为下降沿触发
}

//****************************主程序****************************//
void main()
{AVR_Initialize();           //I/O口及中断初始化
 MAX6959_Initialize();       //MAX6959初始化
 Welcome();                  //显示欢迎信息
 while(1) ;                  //等待按键中断
}

⌨️ 快捷键说明

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