📄 pproject.c
字号:
}
//定义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 + -