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

📄 pproject.c

📁 AVRkaifashili.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
}

//定义ISD2560的A0线为PA^0
void Set_A0(uchar level)
{
 if(level)
  PORTA |=0x01;
 else
  PORTA &=0xfe;
}

//****************************语音搜索和播放程序****************************//
//语音搜索程序
void Seek_Segment(uchar s)
{
 Set_PD(1);				//语音芯片复位
 delay(20000);
 Set_PD(0);
 Set_PR(1);				//放音模式
 Set_A0(1);	 			//M0模式
 while(s--)				//快进s段
 {
  Set_CE(0);
  Set_CE(1);
  do
   NOP();
  while(EOM_Flag);		//检测EOM标志位,为0时有效
  EOM_Flag=1;			
 }
 Set_A0(0);	 			//M6模式
}

//语音播放程序
void Play(void)
{
 Set_CE(0);				//CE线的一个低电平,触发芯片的放音操作
 Set_CE(1);
 do
  NOP();
 while(EOM_Flag);		//检测EOM标志位,为0时有效
 EOM_Flag=1;			//重新赋EOM标志位为1
}


//****************************语音报站程序****************************//
//报站
void Inform(uchar m)
{
 uchar i;
 if(Pst_Flag)				//若为上行方向
  Snd_Info[0]=m;			//顺序报站
 else					//若为下行方向
  Snd_Info[0]=17-m;		//逆序报站
 Set_PD(1);				//语音芯片复位
 delay(20000);
 Set_PD(0); 
 for(i=0;i<2;i++)
 {
  Seek_Segment(Snd_Info[i]);		//搜索相应语音信息段
  Play();							//播放
 } 
}

//预报
void Pre_Inform(uchar m) 
{
 uchar i;
 if(Pst_Flag)				//若为上行方向
  Snd_Pre_Info[1]=m;		//顺序预报站
 else					//若为下行方向
  Snd_Pre_Info[1]=17-m;	//逆序预报站
 Set_PD(1);				//语音芯片复位
 delay(20000);
 Set_PD(0); 
 for(i=0;i<3;i++)
 {
  Seek_Segment(Snd_Pre_Info[i]);		//搜索相应语音信息段
  Play();								//播放
 }
}

//播放特殊信息
void Special(uchar m)
{
 Set_PD(1);				//语音芯片复位
 delay(20000);
 Set_PD(0);
 Seek_Segment(Snd_Spec[m]);		//搜索相应语音信息段
 Play();							//播放
}

//欢迎信息
void Welcome()
{
 Set_PD(1);				//语音芯片复位
 delay(20000);
 Set_PD(0); 
 Seek_Segment(Snd_Welc);		//搜索相应语音信息段
 Play();						//播放
}

//****************************中断服务程序****************************//
//按键中断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 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 change()
{
 unsigned char m;
 if(!Pre_Flag)				//报站情形
 {
  switch(State)			//判断站名
  {
   case 1:				//若为第1站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第1站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State1[Word_Number][m];	//依次换字显示“第1站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 2:				//若为第2站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第2站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State2[Word_Number][m];	//依次换字显示“第2站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 3:				//若为第3站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第3站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State1[Word_Number][m];	//依次换字显示“第3站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 4:				//若为第4站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第4站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State2[Word_Number][m];	//依次换字显示“第4站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 5:				//若为第5站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第5站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State1[Word_Number][m];	//依次换字显示“第5站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 6:				//若为第6站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第6站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State2[Word_Number][m];	//依次换字显示“第6站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 7:				//若为第7站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第7站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State1[Word_Number][m];	//依次换字显示“第7站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 8:				//若为第8站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第8站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State2[Word_Number][m];	//依次换字显示“第8站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 9:				//若为第9站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第1站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State1[Word_Number][m];	//依次换字显示“第9站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 10:				//若为第10站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第10站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State2[Word_Number][m];	//依次换字显示“第10站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 11:				//若为第11站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第11站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State1[Word_Number][m];	//依次换字显示“第11站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 12:				//若为第12站
    if(Word_Number<5)	//判断已显示字数
    {
     if(Word_Number<3)	//若未显示完“第12站”,则
     {
      for(m=0;m<32;m++)
       next[m]=State2[Word_Number][m];	//依次换字显示“第12站”
     }
     else				//否则
      for(m=0;m<32;m++)
       next[m]=DL[Word_Number-3][m];		//依次换字显示“到了”
     Word_Number++;		//显示字数+1
    }
    else					//若全部显示完,则
     Word_Number=0;		//显示字数清0
    break;
   case 13:				//若为第13站
    if(Word_Number<5)	//判断已显示字数
    {

⌨️ 快捷键说明

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