📄 project.c
字号:
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 + -