📄 project.lst
字号:
__start:
__text_start:
0127 E5CF LDI R28,0x5F
0128 E0D2 LDI R29,2
0129 BFCD OUT 0x3D,R28
012A BFDE OUT 0x3E,R29
012B 51C0 SUBI R28,0x10
012C 40D0 SBCI R29,0
012D EA0A LDI R16,0xAA
012E 8308 STD Y+0,R16
012F 2400 CLR R0
0130 E6EB LDI R30,0x6B
0131 E0F0 LDI R31,0
0132 E010 LDI R17,0
0133 3BE4 CPI R30,0xB4
0134 07F1 CPC R31,R17
0135 F011 BEQ 0x0138
0136 9201 ST R0,Z+
0137 CFFB RJMP 0x0133
0138 8300 STD Z+0,R16
0139 E4E2 LDI R30,0x42
013A E0F2 LDI R31,2
013B E6A0 LDI R26,0x60
013C E0B0 LDI R27,0
013D E012 LDI R17,2
013E 34ED CPI R30,0x4D
013F 07F1 CPC R31,R17
0140 F021 BEQ 0x0145
0141 95C8 LPM
0142 9631 ADIW R30,1
0143 920D ST R0,X+
0144 CFF9 RJMP 0x013E
0145 DDE7 RCALL _main
_exit:
0146 CFFF RJMP _exit
FILE: H:\Project\Project\project.c
(0001) //***************************FileName:Project.c**********************//
(0002) //***************************ICCAVR6.30编译**************************//
(0003) #include <io8535v.h> //AT90S8535寄存器定义;
(0004) #include <macros.h> //AT90S8535宏定义;
(0005) #include "zimo.h" //点阵LED字模
(0006) #define uchar unsigned char //数据类型定义
(0007) #define uint unsigned int //数据类型定义
(0008)
(0009) uchar Key_Value; //按键键值;
(0010) uchar State_Flag; //站点标志;
(0011) uchar Ack_Flag; //确认标志;
(0012) uchar Pre_Flag; //预报标志;
(0013) uchar Move_Flag; //滚动标志;
(0014) uchar Spec_Flag; //特殊信息标志;
(0015) uchar EOM_Flag=1; //信息结束标志;
(0016) uchar Pst_Flag; //上、下行标志;
(0017) uchar State=1; //站数;
(0018) uchar Spec; //特殊信息数;
(0019) uchar Speed=20; //文字滚动速度;
(0020) uchar Word_Number; //显示字数;
(0021)
(0022) //语音芯片第1~16段分别保存16站的站名信息
(0023) //第17段保存报站信息“到了,请要下车的乘客依次从后门下车”
(0024) //第18、19段分别保存预报信息“前方到站”、“请要下车的乘客做好下车准备”
(0025) //第20段保存欢迎信息及公交车线路说明
(0026) //第21、22段保存特殊提示信息
(0027) uchar Snd_Info[]={0,17}; //报站声音信息
(0028) uchar Snd_Pre_Info[]={18,0,19}; //预报声音信息
(0029) uchar Snd_Spec[]={21,22}; //特殊声音信息
(0030) uchar Snd_Welc=20; //欢迎声音信息
(0031)
(0032) //本例公交车语音报站系统包含16站
(0033) //所有的站名都以“第n站”代替,其中n为当前站数,n<16
(0034) //报站时显示屏滚动显示“第n站到了”
(0035) //预报站时显示屏显示“前方到站第n站”
(0036) //其中“第n站”字模存放在二维数组State n[3][32]中
(0037) //“到了”字模存放在二维数组DL[2][32]中
(0038) //“前方到站”字模存放在二维数组QFDZ[4][32]中
(0039) uchar text[32]; //当前显示文字
(0040) uchar next[32]; //下一个显示文字
(0041)
(0042) #pragma interrupt_handler Key_Scan:2 //定义按键中断INT0的中断服务程序
(0043) #pragma interrupt_handler Receive_EOM:3//定义语音中断INT1的中断服务程序
(0044)
(0045) //****************************延时程序*******************************//
(0046) void delay(int t)
(0047) {while(t--) ;}
_delay:
t --> R16
0147 2E20 MOV R2,R16
0148 2E31 MOV R3,R17
0149 5001 SUBI R16,1
014A 4010 SBCI R17,0
014B 2022 TST R2
014C F7D1 BNE 0x0147
014D 2033 TST R3
014E F7C1 BNE 0x0147
014F 9508 RET
(0048)
(0049) //****************************语音芯片驱动程序***********************//
(0050) void Set_CE(uchar level) //定义ISD2560使能线为PA^4
(0051) {if(level==1) PORTA |=0x10;
_Set_CE:
level --> R16
0150 3001 CPI R16,1
0151 F411 BNE 0x0154
0152 9ADC SBI 0x1B,4
0153 C003 RJMP 0x0157
(0052) else PORTA &=0xef;
0154 B38B IN R24,0x1B
0155 7E8F ANDI R24,0xEF
0156 BB8B OUT 0x1B,R24
(0053) }
0157 9508 RET
(0054)
(0055) void Set_PD(uchar level) //定义ISD2560的PD线为PA^3
(0056) {if(level) PORTA |=0x08;
_Set_PD:
level --> R16
0158 2300 TST R16
0159 F011 BEQ 0x015C
015A 9ADB SBI 0x1B,3
015B C003 RJMP 0x015F
(0057) else PORTA &=0xf7;
015C B38B IN R24,0x1B
015D 7F87 ANDI R24,0xF7
015E BB8B OUT 0x1B,R24
(0058) }
015F 9508 RET
(0059)
(0060) void Set_PR(uchar level) //定义ISD2560的PR线为PA^2
(0061) {if(level) PORTA |=0x04;
_Set_PR:
level --> R16
0160 2300 TST R16
0161 F011 BEQ 0x0164
0162 9ADA SBI 0x1B,2
0163 C003 RJMP 0x0167
(0062) else PORTA &=0xfb;
0164 B38B IN R24,0x1B
0165 7F8B ANDI R24,0xFB
0166 BB8B OUT 0x1B,R24
(0063) }
0167 9508 RET
(0064)
(0065) void Set_A6(uchar level) //定义ISD2560的A6/8/9线为PA^1
(0066) {if(level) PORTA |=0x02;
_Set_A6:
level --> R16
0168 2300 TST R16
0169 F011 BEQ 0x016C
016A 9AD9 SBI 0x1B,1
016B C003 RJMP 0x016F
(0067) else PORTA &=0xfd;
016C B38B IN R24,0x1B
016D 7F8D ANDI R24,0xFD
016E BB8B OUT 0x1B,R24
(0068) }
016F 9508 RET
(0069)
(0070) void Set_A0(uchar level) //定义ISD2560的A6/8/9线为PA^1
(0071) {if(level) PORTA |=0x01;
_Set_A0:
level --> R16
0170 2300 TST R16
0171 F011 BEQ 0x0174
0172 9AD8 SBI 0x1B,0
0173 C003 RJMP 0x0177
(0072) else PORTA &=0xfe;
0174 B38B IN R24,0x1B
0175 7F8E ANDI R24,0xFE
0176 BB8B OUT 0x1B,R24
(0073) }
0177 9508 RET
_Seek_Segment:
s --> R20
0178 DDD7 RCALL push_gset1
0179 2F40 MOV R20,R16
(0074)
(0075) //****************************语音搜索和播放程序****************************//
(0076) void Seek_Segment(uchar s) //语音搜索程序
(0077) {Set_PD(1); //语音芯片复位
017A E001 LDI R16,1
017B DFDC RCALL _Set_PD
(0078) delay(20000);
017C E200 LDI R16,0x20
017D E41E LDI R17,0x4E
017E DFC8 RCALL _delay
(0079) Set_PD(0);
017F 2700 CLR R16
0180 DFD7 RCALL _Set_PD
(0080) Set_PR(1); //放音模式
0181 E001 LDI R16,1
0182 DFDD RCALL _Set_PR
(0081) Set_A0(1); //M0模式
0183 E001 LDI R16,1
0184 DFEB RCALL _Set_A0
0185 C00C RJMP 0x0192
(0082) while(s--) //快进s段
(0083) {Set_CE(0);
0186 2700 CLR R16
0187 DFC8 RCALL _Set_CE
(0084) Set_CE(1);
0188 E001 LDI R16,1
0189 DFC6 RCALL _Set_CE
(0085) do NOP();
018A 0000 NOP
(0086) while(EOM_Flag); //检测EOM标志位,为0时有效
018B 90200060 LDS R2,0x60
018D 2022 TST R2
018E F7D9 BNE 0x018A
(0087) EOM_Flag=1;}
018F E081 LDI R24,1
0190 93800060 STS 0x60,R24
0192 2E24 MOV R2,R20
0193 2433 CLR R3
0194 5041 SUBI R20,1
0195 2022 TST R2
0196 F779 BNE 0x0186
(0088) Set_A0(0); //M6模式
0197 2700 CLR R16
0198 DFD7 RCALL _Set_A0
(0089) }
0199 DDB9 RCALL pop_gset1
019A 9508 RET
(0090)
(0091) void Play(void) //语音播放程序
(0092) {Set_CE(0); //CE线低电平触发芯片的放音操作
_Play:
019B 2700 CLR R16
019C DFB3 RCALL _Set_CE
(0093) Set_CE(1);
019D E001 LDI R16,1
019E DFB1 RCALL _Set_CE
(0094) do NOP();
019F 0000 NOP
(0095) while(EOM_Flag); //检测EOM标志位,为0时有效
01A0 90200060 LDS R2,0x60
01A2 2022 TST R2
01A3 F7D9 BNE 0x019F
(0096) EOM_Flag=1; //重新赋EOM标志位为1
01A4 E081 LDI R24,1
01A5 93800060 STS 0x60,R24
(0097) }
01A7 9508 RET
_Inform:
i --> R20
m --> R20
01A8 DDA7 RCALL push_gset1
01A9 2F40 MOV R20,R16
(0098)
(0099) //****************************语音报站程序****************************//
(0100) void Inform(uchar m) //报站
(0101) {uchar i;
(0102) if(Pst_Flag) Snd_Info[0]=m; //若为上行方向,顺序报站
01AA 902000AD LDS R2,_Pst_Flag
01AC 2022 TST R2
01AD F019 BEQ 0x01B1
01AE 93400063 STS 0x63,R20
01B0 C004 RJMP 0x01B5
(0103) else Snd_Info[0]=17-m; //若为下行方向,逆序报站
01B1 E181 LDI R24,0x11
01B2 1B84 SUB R24,R20
01B3 93800063 STS 0x63,R24
(0104) Set_PD(1); //语音芯片复位
01B5 E001 LDI R16,1
01B6 DFA1 RCALL _Set_PD
(0105) delay(20000);
01B7 E200 LDI R16,0x20
01B8 E41E LDI R17,0x4E
01B9 DF8D RCALL _delay
(0106) Set_PD(0);
01BA 2700 CLR R16
01BB DF9C RCALL _Set_PD
(0107) for(i=0;i<2;i++)
01BC 2744 CLR R20
01BD C00A RJMP 0x01C8
(0108) {Seek_Segment(Snd_Info[i]); //搜索相应语音信息段
01BE E683 LDI R24,0x63
01BF E090 LDI R25,0
01C0 2FE4 MOV R30,R20
01C1 27FF CLR R31
01C2 0FE8 ADD R30,R24
01C3 1FF9 ADC R31,R25
01C4 8100 LDD R16,Z+0
01C5 DFB2 RCALL _Seek_Segment
(0109) Play();} //播放
01C6 DFD4 RCALL _Play
01C7 9543 INC R20
01C8 3042 CPI R20,2
01C9 F3A0 BCS 0x01BE
(0110) }
01CA DD88 RCALL pop_gset1
01CB 9508 RET
_Pre_Inform:
i --> R20
m --> R20
01CC DD83 RCALL push_gset1
01CD 2F40 MOV R20,R16
(0111)
(0112) void Pre_Inform(uchar m) //报站
(0113) {uchar i;
(0114) if(Pst_Flag) Snd_Pre_Info[1]=m; //若为上行方向,顺序预报站
01CE 902000AD LDS R2,_Pst_Flag
01D0 2022 TST R2
01D1 F019 BEQ 0x01D5
01D2 93400066 STS 0x66,R20
01D4 C004 RJMP 0x01D9
(0115) else Snd_Pre_Info[1]=17-m; //逆序预报站
01D5 E181 LDI R24,0x11
01D6 1B84 SUB R24,R20
01D7 93800066 STS 0x66,R24
(0116) Set_PD(1); //语音芯片复位
01D9 E001 LDI R16,1
01DA DF7D RCALL _Set_PD
(0117) delay(20000);
01DB E200 LDI R16,0x20
01DC E41E LDI R17,0x4E
01DD DF69 RCALL _delay
(0118) Set_PD(0);
01DE 2700 CLR R16
01DF DF78 RCALL _Set_PD
(0119) for(i=0;i<3;i++)
01E0 2744 CLR R20
01E1 C00A RJMP 0x01EC
(0120) {Seek_Segment(Snd_Pre_Info[i]); //搜索相应语音信息段
01E2 E685 LDI R24,0x65
01E3 E090 LDI R25,0
01E4 2FE4 MOV R30,R20
01E5 27FF CLR R31
01E6 0FE8 ADD R30,R24
01E7 1FF9 ADC R31,R25
01E8 8100 LDD R16,Z+0
01E9 DF8E RCALL _Seek_Segment
(0121) Play();} //播放
01EA DFB0 RCALL _Play
01EB 9543 INC R20
01EC 3043 CPI R20,3
01ED F3A0 BCS 0x01E2
(0122) }
01EE DD64 RCALL pop_gset1
01EF 9508 RET
_Special:
m --> R20
01F0 DD5F RCALL push_gset1
01F1 2F40 MOV R20,R16
(0123)
(0124) void Special(uchar m) //播放特殊信息
(0125) {Set_PD(1); //语音芯片复位
01F2 E001 LDI R16,1
01F3 DF64 RCALL _Set_PD
(0126) delay(20000);
01F4 E200 LDI R16,0x20
01F5 E41E LDI R17,0x4E
01F6 DF50 RCALL _delay
(0127) Set_PD(0);
01F7 2700 CLR R16
01F8 DF5F RCALL _Set_PD
(0128) Seek_Segment(Snd_Spec[m]); //搜索相应语音信息段
01F9 E688 LDI R24,0x68
01FA E090 LDI R25,0
01FB 2FE4 MOV R30,R20
01FC 27FF CLR R31
01FD 0FE8 ADD R30,R24
01FE 1FF9 ADC R31,R25
01FF 8100 LDD R16,Z+0
0200 DF77 RCALL _Seek_Segment
(0129) Play(); //播放
0201 DF99 RCALL _Play
(0130) }
0202 DD50 RCALL pop_gset1
0203 9508 RET
(0131)
(0132) void Welcome() //欢迎信息
(0133) {Set_PD(1); //语音芯片复位
_Welcome:
0204 E001 LDI R16,1
0205 DF52 RCALL _Set_PD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -