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

📄 project._c

📁 AVRkaifashili.rar
💻 _C
📖 第 1 页 / 共 3 页
字号:
              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;	   //8535应为GIMSK
}

//****************************中断服务程序****************************//
//按键中断INT0服务程序
void Key_Scan(void)
{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();
}

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

//****************************系统初始化程序****************************//
//MAX6959初始化
void MAX6959_Initialize(void)
{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进行按键扫描并发出下降沿中断请求
}

//AT90S8535初始化
void AVR_Initialize()
{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();
 MAX6959_Initialize(); 
 Welcome(); 
 while(1) ;
}

⌨️ 快捷键说明

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