📄 project.s
字号:
.dbsym r m 20 c
.dbend
.dbfunc e Pre_Inform _Pre_Inform fV
; i -> R20
; m -> R20
.even
_Pre_Inform::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 113
;
; void Pre_Inform(uchar m) //报站
; {uchar i;
.dbline 114
; if(Pst_Flag) Snd_Pre_Info[1]=m; //若为上行方向,顺序预报站
lds R2,_Pst_Flag
tst R2
breq L39
.dbline 114
sts _Snd_Pre_Info+1,R20
rjmp L40
L39:
.dbline 115
; else Snd_Pre_Info[1]=17-m; //逆序预报站
ldi R24,17
sub R24,R20
sts _Snd_Pre_Info+1,R24
L40:
.dbline 116
; Set_PD(1); //语音芯片复位
ldi R16,1
rcall _Set_PD
.dbline 117
; delay(20000);
ldi R16,20000
ldi R17,78
rcall _delay
.dbline 118
; Set_PD(0);
clr R16
rcall _Set_PD
.dbline 119
; for(i=0;i<3;i++)
clr R20
rjmp L46
L43:
.dbline 120
.dbline 120
ldi R24,<_Snd_Pre_Info
ldi R25,>_Snd_Pre_Info
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _Seek_Segment
.dbline 121
rcall _Play
.dbline 121
L44:
.dbline 119
inc R20
L46:
.dbline 119
cpi R20,3
brlo L43
.dbline -2
.dbline 122
; {Seek_Segment(Snd_Pre_Info[i]); //搜索相应语音信息段
; Play();} //播放
; }
L38:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r m 20 c
.dbend
.dbfunc e Special _Special fV
; m -> R20
.even
_Special::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 125
;
; void Special(uchar m) //播放特殊信息
; {Set_PD(1); //语音芯片复位
.dbline 125
ldi R16,1
rcall _Set_PD
.dbline 126
; delay(20000);
ldi R16,20000
ldi R17,78
rcall _delay
.dbline 127
; Set_PD(0);
clr R16
rcall _Set_PD
.dbline 128
; Seek_Segment(Snd_Spec[m]); //搜索相应语音信息段
ldi R24,<_Snd_Spec
ldi R25,>_Snd_Spec
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _Seek_Segment
.dbline 129
; Play(); //播放
rcall _Play
.dbline -2
.dbline 130
; }
L47:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r m 20 c
.dbend
.dbfunc e Welcome _Welcome fV
.even
_Welcome::
.dbline -1
.dbline 133
;
; void Welcome() //欢迎信息
; {Set_PD(1); //语音芯片复位
.dbline 133
ldi R16,1
rcall _Set_PD
.dbline 134
; delay(20000);
ldi R16,20000
ldi R17,78
rcall _delay
.dbline 135
; Set_PD(0);
clr R16
rcall _Set_PD
.dbline 136
; Seek_Segment(Snd_Welc); //搜索相应语音信息段
lds R16,_Snd_Welc
rcall _Seek_Segment
.dbline 137
; Play(); //播放
.dbline -2
.dbline 138
; }
L48:
.dbline 0 ; func end
rjmp _Play
.dbend
.dbfunc e Set_SCL _Set_SCL fV
; i -> R16
.even
_Set_SCL::
.dbline -1
.dbline 142
;
; //****************************I2C驱动程序****************************//
; void Set_SCL(uchar i) //定义MAX6959时钟线为PA^7
; {if(i) PORTA |=0x80;
.dbline 142
tst R16
breq L50
.dbline 142
sbi 0x1b,7
rjmp L51
L50:
.dbline 143
in R24,0x1b
andi R24,127
out 0x1b,R24
L51:
.dbline -2
.dbline 144
; else PORTA &=0x7f;
; }
L49:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Set_SDA _Set_SDA fV
; i -> R16
.even
_Set_SDA::
.dbline -1
.dbline 147
;
; void Set_SDA(uchar i) //定义MAX6959数据线为PA^6
; {if(i) PORTA |=0x40;
.dbline 147
tst R16
breq L53
.dbline 147
sbi 0x1b,6
rjmp L54
L53:
.dbline 148
in R24,0x1b
andi R24,191
out 0x1b,R24
L54:
.dbline -2
.dbline 149
; else PORTA &=0xbf;
; }
L52:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Start _Start fV
.even
_Start::
.dbline -1
.dbline 152
;
; void Start() //I2C总线的开始条件
; {Set_SDA(1); //SDA=1;
.dbline 152
ldi R16,1
rcall _Set_SDA
.dbline 153
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 154
; delay(100); //等待时钟信号变高
ldi R16,100
ldi R17,0
rcall _delay
.dbline 155
; Set_SDA(0); //SDA=0;
clr R16
rcall _Set_SDA
.dbline 156
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 157
; Set_SCL(0); // SCL=0;
clr R16
.dbline -2
.dbline 158
; }
L55:
.dbline 0 ; func end
rjmp _Set_SCL
.dbend
.dbfunc e Stop _Stop fV
.even
_Stop::
.dbline -1
.dbline 161
;
; void Stop() //I2C总线结束条件
; {Set_SDA(0); //SDA=0;
.dbline 161
clr R16
rcall _Set_SDA
.dbline 162
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 163
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 164
; delay(100); //等待时钟信号变低
ldi R16,100
ldi R17,0
rcall _delay
.dbline 165
; Set_SDA(1); //SDA=1;
ldi R16,1
rcall _Set_SDA
.dbline 166
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 167
; Set_SCL(0); //SCL=0;
clr R16
.dbline -2
.dbline 168
; }
L56:
.dbline 0 ; func end
rjmp _Set_SCL
.dbend
.dbfunc e Ack _Ack fV
.even
_Ack::
.dbline -1
.dbline 171
;
; void Ack() //I2C总线应答
; {Set_SDA(0); //SDA=0;
.dbline 171
clr R16
rcall _Set_SDA
.dbline 172
; delay(50);
ldi R16,50
ldi R17,0
rcall _delay
.dbline 173
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 174
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 175
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 176
; delay(50);
ldi R16,50
ldi R17,0
rcall _delay
.dbline 177
; Set_SDA(1); //SDA=1;
ldi R16,1
.dbline -2
.dbline 178
; }
L57:
.dbline 0 ; func end
rjmp _Set_SDA
.dbend
.dbfunc e Nack _Nack fV
.even
_Nack::
.dbline -1
.dbline 181
;
; void Nack() //I2C总线应答非
; {Set_SDA(1); //SDA=1;
.dbline 181
ldi R16,1
rcall _Set_SDA
.dbline 182
; delay(50);
ldi R16,50
ldi R17,0
rcall _delay
.dbline 183
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 184
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 185
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 186
; delay(50);
ldi R16,50
ldi R17,0
rcall _delay
.dbline 187
; Set_SDA(0); //SDA=0;
clr R16
.dbline -2
.dbline 188
; }
L58:
.dbline 0 ; func end
rjmp _Set_SDA
.dbend
.dbfunc e Check_Ack _Check_Ack fV
.even
_Check_Ack::
.dbline -1
.dbline 191
;
; void Check_Ack() //I2C总线应答检查
; {Set_SDA(1); //SDA=1;
.dbline 191
ldi R16,1
rcall _Set_SDA
.dbline 192
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 193
; Ack_Flag=0; //清除应答标志;
clr R2
sts _Ack_Flag,R2
.dbline 194
; DDRA&=0xbf; //设置SDA为输入
in R24,0x1a
andi R24,191
out 0x1a,R24
.dbline 195
; if(!((PINA & 0x40)>>6))
in R24,0x19
andi R24,64
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
tst R24
brne L60
.dbline 196
; {delay(50);
.dbline 196
ldi R16,50
ldi R17,0
rcall _delay
.dbline 197
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 198
; delay(100);}
ldi R16,100
ldi R17,0
rcall _delay
.dbline 198
rjmp L61
L60:
.dbline 200
; else
; {Ack_Flag=1; //收到应答;
.dbline 200
ldi R24,1
sts _Ack_Flag,R24
.dbline 201
; delay(50);
ldi R16,50
ldi R17,0
rcall _delay
.dbline 202
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 203
; delay(100);}
ldi R16,100
ldi R17,0
rcall _delay
.dbline 203
L61:
.dbline 204
; DDRA |=0xff; //重新设置SDA为输出
in R24,0x1a
ori R24,255
out 0x1a,R24
.dbline -2
.dbline 205
; }
L59:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Write_Bit0 _Write_Bit0 fV
.even
_Write_Bit0::
.dbline -1
.dbline 208
;
; void Write_Bit0() //写1bit数据:0
; {Set_SDA(0); //SDA=0;
.dbline 208
clr R16
rcall _Set_SDA
.dbline 209
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 210
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 211
; Set_SCL(0); //SCL=0;
clr R16
.dbline -2
.dbline 212
; }
L62:
.dbline 0 ; func end
rjmp _Set_SCL
.dbend
.dbfunc e Write_Bit1 _Write_Bit1 fV
.even
_Write_Bit1::
.dbline -1
.dbline 215
;
; void Write_Bit1() //写1bit数据:1
; {Set_SDA(1); //SDA=1;
.dbline 215
ldi R16,1
rcall _Set_SDA
.dbline 216
; Set_SCL(1); //SCL=1;
ldi R16,1
rcall _Set_SCL
.dbline 217
; delay(100);
ldi R16,100
ldi R17,0
rcall _delay
.dbline 218
; Set_SCL(0); //SCL=0;
clr R16
rcall _Set_SCL
.dbline 219
; Set_SDA(0); //SDA=0;
clr R16
.dbline -2
.dbline 220
; }
L63:
.dbline 0 ; func end
rjmp _Set_SDA
.dbend
.dbfunc e Write_Byte _Write_Byte fV
; i -> R20
; Data -> R22
.even
_Write_Byte::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 223
;
; void Write_Byte(uchar Data) //写一字节数据Data
; {uchar i;
.dbline 224
; for(i=0;i<8;i++)
clr R20
rjmp L68
L65:
.dbline 225
; {if(Data & 0x80) Write_Bit1(); //传输位从高位到低位,先传最高位
.dbline 225
sbrs R22,7
rjmp L69
.dbline 225
rcall _Write_Bit1
rjmp L70
L69:
.dbline 226
; else Write_Bit0();
rcall _Write_Bit0
L70:
.dbline 227
lsl R22
.dbline 227
L66:
.dbline 224
inc R20
L68:
.dbline 224
cpi R20,8
brlo L65
.dbline -2
.dbline 228
; Data <<=1;} //数据左移
; }
L64:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Data 22 c
.dbend
.dbfunc e Read_Byte _Read_Byte fc
; j -> R20
; Read_Data -> R22
.even
_Read_Byte::
rcall push_gset2
.dbline -1
.dbline 231
;
; uchar Read_Byte() //读一字节数据:返回值即读的数据
; {uchar Read_Data=0xff; // Read_Data为读入的数据,初始值为0xff
.dbline 231
ldi R22,255
.dbline 233
; uchar j;
; for (j=0;j<8;j++)
clr R20
rjmp L75
L72:
.dbline 234
; {Set_SDA(1);
.dbline 234
ldi R16,1
rcall _Set_SDA
.dbline 235
; Set_SCL(1);
ldi R16,1
rcall _Set_SCL
.dbline 236
; DDRA &=0xbf;
in R24,0x1a
andi R24,191
out 0x1a,R24
.dbline 237
; if((PINA & 0x40)==0)
sbic 0x19,6
rjmp L76
.dbline 238
; {Read_Data <<=1;
.dbline 238
lsl R22
.dbline 239
; Read_Data=(Read_Data & 0xfe);
andi R22,254
.dbline 240
; Set_SCL(0);}
clr R16
rcall _Set_SCL
.dbline 240
rjmp L77
L76:
.dbline 242
; else
; {Read_Data <<=1;
.dbline 242
lsl R22
.dbline 243
; Read_Data =( Read_Data | 0x01);
ori R22,1
.dbline 244
clr R16
rcall _Set_SCL
.dbline 244
L77:
.dbline 244
L73:
.dbline 233
inc R20
L75:
.dbline 233
cpi R20,8
brlo L72
.dbline 245
; Set_SCL(0);}}
; DDRA |=0x40;
sbi 0x1a,6
.dbline 246
; return(Read_Data);
mov R16,R22
.dbline -2
L71:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r Read_Data 22 c
.dbend
.dbfunc e Write_1byte _Write_1byte fV
; Data -> R20
; Address -> R22
; Slave -> R10
.even
_Write_1byte::
rcall push_gset3
mov R22,R18
mov R10,R16
ldd R20,y+6
.dbline -1
.dbline 252
; }
;
; //***************************写一字节数据****************************//
; //向从地址为Slave的IIC器件的Address地址写一字节数据Data
; void Write_1byte(uchar Slave,uchar Address,uchar Data)
; {Start(); //开始
.dbline 252
rcall _Start
.dbline 253
; Write_Byte(Slave); //写I2C器件地址
mov R16,R10
rcall _Write_Byte
L79:
.dbline 254
; do Check_Ack(); //检查应答位
rcall _Check_Ack
L80:
.dbline 255
; while(Ack_Flag==1);
lds R24,_Ack_Flag
cpi R24,1
breq L79
.dbline 256
; Write_Byte(Address); //送寄存器地址
mov R16,R22
rcall _Write_Byte
L82:
.dbline 257
; do Check_Ack(); //检查应答位
rcall _Check_Ack
L83:
.dbline 258
; while(Ack_Flag==1);
lds R24,_Ack_Flag
cpi R24,1
breq L82
.dbline 259
; Write_Byte(Data); //写入一字节数据
mov R16,R20
rcall _Write_Byte
L85:
.dbline 260
; do Check_Ack(); //检查应答位
rcall _Check_Ack
L86:
.dbline 261
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -