?? 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" //點(diǎn)陣LED字模
(0006) #define uchar unsigned char //數(shù)據(jù)類型定義
(0007) #define uint unsigned int //數(shù)據(jù)類型定義
(0008)
(0009) uchar Key_Value; //按鍵鍵值;
(0010) uchar State_Flag; //站點(diǎn)標(biāo)志;
(0011) uchar Ack_Flag; //確認(rèn)標(biāo)志;
(0012) uchar Pre_Flag; //預(yù)報標(biāo)志;
(0013) uchar Move_Flag; //滾動標(biāo)志;
(0014) uchar Spec_Flag; //特殊信息標(biāo)志;
(0015) uchar EOM_Flag=1; //信息結(jié)束標(biāo)志;
(0016) uchar Pst_Flag; //上、下行標(biāo)志;
(0017) uchar State=1; //站數(shù);
(0018) uchar Spec; //特殊信息數(shù);
(0019) uchar Speed=20; //文字滾動速度;
(0020) uchar Word_Number; //顯示字?jǐn)?shù);
(0021)
(0022) //語音芯片第1~16段分別保存16站的站名信息
(0023) //第17段保存報站信息“到了,請要下車的乘客依次從后門下車”
(0024) //第18、19段分別保存預(yù)報信息“前方到站”、“請要下車的乘客做好下車準(zhǔn)備”
(0025) //第20段保存歡迎信息及公交車線路說明
(0026) //第21、22段保存特殊提示信息
(0027) uchar Snd_Info[]={0,17}; //報站聲音信息
(0028) uchar Snd_Pre_Info[]={18,0,19}; //預(yù)報聲音信息
(0029) uchar Snd_Spec[]={21,22}; //特殊聲音信息
(0030) uchar Snd_Welc=20; //歡迎聲音信息
(0031)
(0032) //本例公交車語音報站系統(tǒng)包含16站
(0033) //所有的站名都以“第n站”代替,其中n為當(dāng)前站數(shù),n<16
(0034) //報站時顯示屏滾動顯示“第n站到了”
(0035) //預(yù)報站時顯示屏顯示“前方到站第n站”
(0036) //其中“第n站”字模存放在二維數(shù)組State n[3][32]中
(0037) //“到了”字模存放在二維數(shù)組DL[2][32]中
(0038) //“前方到站”字模存放在二維數(shù)組QFDZ[4][32]中
(0039) uchar text[32]; //當(dāng)前顯示文字
(0040) uchar next[32]; //下一個顯示文字
(0041)
(0042) #pragma interrupt_handler Key_Scan:2 //定義按鍵中斷INT0的中斷服務(wù)程序
(0043) #pragma interrupt_handler Receive_EOM:3//定義語音中斷INT1的中斷服務(wù)程序
(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) //****************************語音芯片驅(qū)動程序***********************//
(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); //語音芯片復(fù)位
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--) //快進(jìn)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標(biāo)志位,為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線低電平觸發(fā)芯片的放音操作
_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標(biāo)志位,為0時有效
01A0 90200060 LDS R2,0x60
01A2 2022 TST R2
01A3 F7D9 BNE 0x019F
(0096) EOM_Flag=1; //重新賦EOM標(biāo)志位為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); //語音芯片復(fù)位
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]); //搜索相應(yīng)語音信息段
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; //若為上行方向,順序預(yù)報站
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; //逆序預(yù)報站
01D5 E181 LDI R24,0x11
01D6 1B84 SUB R24,R20
01D7 93800066 STS 0x66,R24
(0116) Set_PD(1); //語音芯片復(fù)位
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]); //搜索相應(yīng)語音信息段
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); //語音芯片復(fù)位
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]); //搜索相應(yīng)語音信息段
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); //語音芯片復(fù)位
_Welcome:
0204 E001 LDI R16,1
0205 DF52 RCALL _Set_PD
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -