📄 bu2624.s
字号:
.module bu2624.c
.area eeprom(rom, con, rel)
.area data(ram, con, rel)
.area text(rom, con, rel)
.dbfile D:\avrmcu\AT980\bu2624\bu2624.c
.dbfunc s soft_delay _soft_delay fI
; i -> R16
.even
_soft_delay::
.dbline -1
.dbline 75
; //Use SANYO LC72130 PLL Frequency Synthesizer //dzh 2001/03/23
; #include "..\main.h"
; #include "..\bu1923\bu1923.h"
; #define BU2624
; //#define TEST_IF
; #ifdef BU2624
; #include <iom163.h>
; #include "bu2624.h"
; #include "..\io.h"
; #pragma data:eeprom
; NV_SETTINGS gps;
; #pragma data:data
; unsigned char search_dir;
; extern void MCU_mute(void);
; #ifdef SGJM_RDS
; extern unsigned char rds_status;
; extern unsigned char rds_display_type;
; extern unsigned char display_type;
; extern unsigned char rds_step,pty_is_searching;
; extern RDS_DATA_STRUCT rds_data;
; extern unsigned char rds_dis_string[65];
; #endif
; unsigned char rdelay20ms;
; extern unsigned char g_ui_tmp_msg_cnt;
; #ifdef TTY
; extern BOOL key_is_pressed;
; #endif
; #define AM_BAND 1
; static unsigned int dataout0;
; static unsigned char dataout1;
; static unsigned int In_Pdata;
; static unsigned int In_Cdata;
; unsigned int radio_count;
; extern unsigned char muted;
; unsigned char radio_is_muted;
; //unsigned int FMreq_DIVIDER;
; #include <eeprom.h>
; unsigned char autosrch_step;
; unsigned char search_ok;
; /*0--search is not ok
; 1-- search a station
; 2-- full search end;
; */
; //unsigned char radio_delay200ms;
; unsigned char is_autosearching;
; unsigned char is_stereo;
; unsigned char station_no;
; unsigned char amfm_flag;
; //unsigned char ok_count;
; //unsigned char unok_count;
; //#define FM_SHIFT 1
; unsigned int freq;
; //unsigned long Ifcount;//Ifcount1;
; void mute_radio(void);
; //extern unsigned char radio_station_changed;
; //unsigned char station_num;
; #define IF_FM 1070
; #define IF_AM 450
;
; #define IF_CENTER 160
; #define IFM_MIN (IF_FM*160-480+IF_CENTER)
; #define IFM_MAX (IF_FM*160+480+IF_CENTER)
;
; #define IAM_MIN (IF_AM*16-64)
; #define IAM_MAX (IF_AM*16+64)
;
; //void ps_restore_amfm();
; //void ps_restore_station();
; //void use_addr_as_io(void);
; void switch_fmam(void);
; #ifdef TTY
; extern void wait_key_pressed(void);
; #endif
; void soft_delay(void)
; {
.dbline 77
; register unsigned char i;
; for(i=0;i<30;i++)
clr R16
xjmp L6
L3:
.dbline 78
.dbline 79
L4:
.dbline 77
inc R16
L6:
.dbline 77
cpi R16,30
brlo L3
.dbline -2
.dbline 80
; {
; }
; }
L2:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbfunc s init_radio _init_radio fI
.even
_init_radio::
sbiw R28,2
.dbline -1
.dbline 83
;
; void init_radio(void) //default MONO out
; {
.dbline 92
;
; //register unsigned char addr;
; //set_dout_in();
; //radio_stb_lo();
; //radio_clk_hi();
; //AMreq_STEP = radio_country[gps->ps_radio_standard].AM_step;
; //FMreq_STEP = radio_country[gps->ps_radio_standard].FM_step;
; //unsigned int *addr;
; radio_is_muted = 1;
ldi R24,1
sts _radio_is_muted,R24
.dbline 93
; mute_radio();
xcall _mute_radio
.dbline 94
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 95
; amfm_flag=EEPROMread((int)&(gps.ps_amfm_flag));
ldi R16,<_gps
ldi R17,>_gps
xcall _EEPROMread
movw R2,R16
sts _amfm_flag,R2
.dbline 96
; if(amfm_flag)
tst R2
breq L8
.dbline 97
; {
.dbline 98
; station_no = EEPROMread((int)&(gps.ps_am_no));
ldi R16,<_gps+3
ldi R17,>_gps+3
xcall _EEPROMread
movw R2,R16
sts _station_no,R2
.dbline 99
; if(station_no>=MAX_AM_STATION)
mov R24,R2
cpi R24,20
brlo L11
.dbline 100
; {
.dbline 101
; station_no = 0;
clr R2
sts _station_no,R2
.dbline 102
; EEPROMwrite((int)&(gps.ps_am_no),0);
clr R18
ldi R16,<_gps+3
ldi R17,>_gps+3
xcall _EEPROMwrite
.dbline 103
L11:
.dbline 103
; };
.dbline 104
; EEPROM_READ((int)&gps.ps_amfre,freq);
ldi R24,2
ldi R25,0
std y+0,R24
std y+1,R25
ldi R18,<_freq
ldi R19,>_freq
ldi R16,<_gps+6
ldi R17,>_gps+6
xcall _EEPROMReadBytes
.dbline 106
; //station_no = gps.ps_am_no;
; }
xjmp L9
L8:
.dbline 108
; else
; {
.dbline 109
; station_no = EEPROMread((int)&(gps.ps_fm_no));
ldi R16,<_gps+2
ldi R17,>_gps+2
xcall _EEPROMread
movw R2,R16
sts _station_no,R2
.dbline 110
; if(station_no>=MAX_FM_STATION)
mov R24,R2
cpi R24,30
brlo L16
.dbline 111
; {
.dbline 112
; station_no = 0;
clr R2
sts _station_no,R2
.dbline 113
; EEPROMwrite((int)&(gps.ps_fm_no),0);
clr R18
ldi R16,<_gps+2
ldi R17,>_gps+2
xcall _EEPROMwrite
.dbline 114
L16:
.dbline 114
; };
.dbline 116
; //*addr = &gps.ps_fm_station[station_no];
; EEPROM_READ((int)&gps.ps_fmfre,freq);
ldi R24,2
ldi R25,0
std y+0,R24
std y+1,R25
ldi R18,<_freq
ldi R19,>_freq
ldi R16,<_gps+4
ldi R17,>_gps+4
xcall _EEPROMReadBytes
.dbline 117
; }
L9:
.dbline 123
; // AMreq_MIN = radio_country[gps->ps_radio_standard].AM_start;
; // AMreq_MAX = radio_country[gps->ps_radio_standard].AM_end;
; // FMreq_MIN = radio_country[gps->ps_radio_standard].FM_start;
; // FMreq_MAX = radio_country[gps->ps_radio_standard].FM_end;
;
; is_autosearching = 0;
clr R2
sts _is_autosearching,R2
.dbline 124
; switch_fmam();
xcall _switch_fmam
.dbline 125
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 126
; radio_is_muted = 0;
clr R2
sts _radio_is_muted,R2
.dbline 127
; mute_radio();
xcall _mute_radio
.dbline 130
;
; #ifdef SGJM_RDS
; rds_init();
xcall _rds_init
.dbline 131
; pty_is_searching = 0;
clr R2
sts _pty_is_searching,R2
.dbline -2
.dbline 134
; #endif
;
; }
L7:
adiw R28,2
.dbline 0 ; func end
ret
.dbfunc s send_word_to_bu2624 _send_word_to_bu2624 fI
; i -> R20
; data1 -> R22,R23
.even
_send_word_to_bu2624::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 137
;
; void send_word_to_bu2624( unsigned int data1)
; {
.dbline 140
; char i;
;
; for( i=0; i<16; i++)
clr R20
xjmp L24
L21:
.dbline 141
; {
.dbline 142
; radio_clk_lo();
CBI 0x12,4
.dbline 143
; if( data1 & 0x01)
movw R24,R22
andi R24,1
andi R25,0
cpi R24,0
cpc R24,R25
breq L25
.dbline 144
; {
.dbline 145
; radio_din_hi();
SBI 0x12,5
.dbline 146
; }
xjmp L26
L25:
.dbline 148
; else
; {
.dbline 149
; radio_din_lo();
CBI 0x12,5
.dbline 150
; }
L26:
.dbline 151
xcall _soft_delay
.dbline 152
SBI 0x12,4
.dbline 153
lsr R23
ror R22
.dbline 154
xcall _soft_delay
.dbline 155
L22:
.dbline 140
inc R20
L24:
.dbline 140
cpi R20,16
brlo L21
.dbline -2
.dbline 156
; soft_delay();
; radio_clk_hi();
; data1 >>= 1;
; soft_delay();
; }
; }
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r data1 22 i
.dbfunc s send_cmd_to_bu2624 _send_cmd_to_bu2624 fI
.even
_send_cmd_to_bu2624::
.dbline -1
.dbline 159
;
; void send_cmd_to_bu2624(void)
; {
.dbline 161
;
; radio_clk_hi();
SBI 0x12,4
.dbline 162
; radio_stb_hi();
SBI 0x12,0
.dbline 164
;
; soft_delay();
xcall _soft_delay
.dbline 165
; send_word_to_bu2624(In_Pdata);
lds R17,_In_Pdata+1
lds R16,_In_Pdata
xcall _send_word_to_bu2624
.dbline 166
; send_word_to_bu2624(In_Cdata);
lds R17,_In_Cdata+1
lds R16,_In_Cdata
xcall _send_word_to_bu2624
.dbline 167
; radio_stb_lo();
CBI 0x12,0
.dbline -2
.dbline 168
; }
L27:
.dbline 0 ; func end
ret
.dbfunc s mute_radio _mute_radio fI
.even
_mute_radio::
.dbline -1
.dbline 171
;
; void mute_radio(void)
; {
.dbline 172
; if(radio_is_muted)
lds R2,_radio_is_muted
tst R2
breq L29
.dbline 173
; {
.dbline 174
; Enable_IF_OUT();//In_Cdata = In_Cdata&(~P1_IF_NOOUT);
lds R25,_In_Cdata+1
lds R24,_In_Cdata
andi R24,253
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 175
; muted = 1;
ldi R24,1
sts _muted,R24
.dbline 176
; MCU_mute();
xcall _MCU_mute
.dbline 177
; }
xjmp L30
L29:
.dbline 179
; else
; {
.dbline 180
; Disable_IF_OUT();//In_Cdata |= P1_IF_NOOUT;
lds R25,_In_Cdata+1
lds R24,_In_Cdata
ori R24,2
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 181
; Enable_SD_OUT();//In_Cdata &=(~(COUNTER_START|IF_COUNTER_16MS));
andi R24,127
andi R25,191
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 182
; muted = 0; //
clr R2
sts _muted,R2
.dbline 183
; MCU_mute();
xcall _MCU_mute
.dbline 185
;
; }
L30:
.dbline 186
; send_cmd_to_bu2624();
xcall _send_cmd_to_bu2624
.dbline -2
.dbline 187
; }
L28:
.dbline 0 ; func end
ret
.dbfunc s read_data_from_bu2624 _read_data_from_bu2624 fI
; value1 -> R20
; i -> R22
; value -> R10,R11
.even
_read_data_from_bu2624::
xcall push_gset3
.dbline -1
.dbline 190
;
; void read_data_from_bu2624()
; {
.dbline 194
; register unsigned int value;
; register unsigned char i,value1;
; //set_dout_in();
; radio_stb_lo();
CBI 0x12,0
.dbline 195
; soft_delay();
xcall _soft_delay
.dbline 196
; dataout0 = 0;
clr R2
clr R3
sts _dataout0+1,R3
sts _dataout0,R2
.dbline 197
; dataout1 = 0;
sts _dataout1,R2
.dbline 200
;
;
; value = 0;
clr R10
clr R11
.dbline 201
; for(i=0;i<16;i++)
clr R22
xjmp L35
L32:
.dbline 202
; {
.dbline 203
; value >>=1;
lsr R11
ror R10
.dbline 204
; radio_clk_lo();
CBI 0x12,4
.dbline 205
; soft_delay();
xcall _soft_delay
.dbline 206
; if(radio_dout()) value |= 0x8000;
sbis 0x10,7
rjmp L36
.dbline 206
movw R24,R10
ori R25,128
movw R10,R24
L36:
.dbline 208
SBI 0x12,4
.dbline 209
xcall _soft_delay
.dbline 210
L33:
.dbline 201
inc R22
L35:
.dbline 201
cpi R22,16
brlo L32
.dbline 211
;
; radio_clk_hi();
; soft_delay();
; }
; dataout0 = value;
sts _dataout0+1,R11
sts _dataout0,R10
.dbline 213
;
; value1 = 0;
clr R20
.dbline 214
; for(i=0;i<8;i++)
clr R22
xjmp L41
L38:
.dbline 215
; {
.dbline 216
; value1 >>=1;
lsr R20
.dbline 217
; radio_clk_lo();
CBI 0x12,4
.dbline 218
; soft_delay();
xcall _soft_delay
.dbline 220
;
; if(radio_dout()) value1 |= 0x80;
sbis 0x10,7
rjmp L42
.dbline 220
ori R20,128
L42:
.dbline 222
SBI 0x12,4
.dbline 223
xcall _soft_delay
.dbline 224
L39:
.dbline 214
inc R22
L41:
.dbline 214
cpi R22,8
brlo L38
.dbline 226
;
; radio_clk_hi();
; soft_delay();
; }
;
; dataout1 = value1;
sts _dataout1,R20
.dbline -2
.dbline 227
; }
L31:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r value1 20 c
.dbsym r i 22 c
.dbsym r value 10 i
.dbfunc s switch_audio_channel _switch_audio_channel fI
.even
_switch_audio_channel::
.dbline -1
.dbline 231
;
;
; void switch_audio_channel(void)
; {
.dbline 232
; if(is_stereo)
lds R2,_is_stereo
tst R2
breq L45
.dbline 233
; {
.dbline 234
; Set_Stereo();//In_Cdata &= (~P4_MONO);
lds R25,_In_Cdata+1
lds R24,_In_Cdata
andi R24,239
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 235
; }
xjmp L46
L45:
.dbline 237
; else
; {
.dbline 238
; Set_Mono();//In_Cdata |= P4_MONO;
lds R25,_In_Cdata+1
lds R24,_In_Cdata
ori R24,16
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 239
; }
L46:
.dbline 240
; send_cmd_to_bu2624();
xcall _send_cmd_to_bu2624
.dbline -2
.dbline 241
; }
L44:
.dbline 0 ; func end
ret
.dbfunc s switch_fmam _switch_fmam fI
.even
_switch_fmam::
.dbline -1
.dbline 244
;
; void switch_fmam(void)
; {
.dbline 246
; //unsigned char i;
; radio_is_muted = 1;
ldi R24,1
sts _radio_is_muted,R24
.dbline 247
; if(amfm_flag)
lds R2,_amfm_flag
tst R2
breq L48
.dbline 248
; {
.dbline 249
; if((freq < AMreq_MIN)||(freq > AMreq_MAX))
lds R25,_freq+1
lds R24,_freq
cpi R24,10
ldi R30,2
cpc R25,R30
brlo L52
ldi R24,1611
ldi R25,6
lds R3,_freq+1
lds R2,_freq
cp R24,R2
cpc R25,R3
brsh L50
L52:
.dbline 250
; freq = AMreq_MIN;
ldi R24,522
ldi R25,2
sts _freq+1,R25
sts _freq,R24
L50:
.dbline 261
;
; /* switch(AMreq_STEP)
; {
; case 9:
; Rfreq = Rfreq_009KHZ;
; break;
; case 10:
; Rfreq = Rfreq_010KHZ;
; break;
; };*/
; In_Cdata = P0_AM | P4_MONO | P3_MUTE | Rfreq_009KHZ| AMIN | IF2 | IF_COUNTER_8MS;
ldi R24,11537
ldi R25,45
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 264
; //AM:IF_OUT: MUTE ON : MONO:PLL OPERATION: RESET COUNT
; //:PLL :AMIN : PS=1:IF2:8MS: TS
; In_Pdata = ((freq+IF_AM)/AMreq_STEP)<<4;
ldi R18,9
ldi R19,0
lds R17,_freq+1
lds R16,_freq
subi R16,62 ; offset = 450
sbci R17,254
xcall div16u
movw R2,R16
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
sts _In_Pdata+1,R3
sts _In_Pdata,R2
.dbline 266
; //is_stereo = 0;
; }
xjmp L49
L48:
.dbline 268
; else
; {
.dbline 269
; if((freq < FMreq_MIN)||(freq > FMreq_MAX))
lds R25,_freq+1
lds R24,_freq
cpi R24,46
ldi R30,34
cpc R25,R30
brlo L55
ldi R24,10800
ldi R25,42
lds R3,_freq+1
lds R2,_freq
cp R24,R2
cpc R25,R3
brsh L53
L55:
.dbline 270
; freq = FMreq_MIN;
ldi R24,8750
ldi R25,34
sts _freq+1,R25
sts _freq,R24
L53:
.dbline 272
; //In_Cdata = 0;
; In_Cdata =(unsigned int) (P0_FM |P3_MUTE| Rfreq_025KHZ | FMIN | IF2 | IF_COUNTER_8MS);
ldi R24,8192
ldi R25,32
sts _In_Cdata+1,R25
sts _In_Cdata,R24
.dbline 274
; //FM:IF_OUT:PLL OPERATE:RESET COUNT:PLL: FMIN:PS=X: 16MS
; In_Pdata = ((freq+IF_FM)/5);
ldi R18,5
ldi R19,0
lds R17,_freq+1
lds R16,_freq
subi R16,210 ; offset = 1070
sbci R17,251
xcall div16u
sts _In_Pdata+1,R17
sts _In_Pdata,R16
.dbline 276
lds R2,_is_stereo
tst R2
breq L58
lds R2,_is_autosearching
tst R2
breq L56
L58:
.dbline 276
;
; if(!is_stereo || is_autosearching) In_Cdata |= P4_MONO;
lds R25,_In_Cdata+1
lds R24,_In_Cdata
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -