📄 m16pwm-led.s
字号:
.module m16pwm-led.c
.area data(ram, con, rel)
_AdResult::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e AdResult _AdResult c
_SpeedMode::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e SpeedMode _SpeedMode c
_SpeedVal::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e SpeedVal _SpeedVal c
_M8Mode::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e M8Mode _M8Mode c
_LedTab::
.blkb 2
.area idata
.byte 235,'A
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 179,186
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 'x,218
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 219,168
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 251,250
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 249,251
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 195,235
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.blkb 2
.area idata
.byte 211,209
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e LedTab _LedTab A[16:16]c
_LedBuf::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e LedBuf _LedBuf A[2:2]c
_LedDp::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e LedDp _LedDp c
_UartBufCount::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e UartBufCount _UartBufCount c
_LRledReg::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbsym e LRledReg _LRledReg c
.area text(rom, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 44
; ////////////////////////////////////////////////////////////////////////////////
; //ICC-AVR application builder : 2006-8-1 上午 08:05:37
; // Target : M16
; // Crystal: 16.0000Mhz
; // ADc2采集转把信号
; ////////////////////////////////////////////////////////////////////////////////
; #include <iom16v.h>
; #include <macros.h>
;
; #define fre 125
; #define uchar unsigned char
; #define uint unsigned int
; unsigned char kk;
; int k;
; uchar temp_data,hour_data,minut_data,second_data,second_flag;
; uchar AdResult=0;
; uchar SpeedMode=0;//SpeedMode=0 手动模式;SpeedMode=0x55 巡航模式
; uchar SpeedVal=0;//保存当前速度参数,用于巡航模式
; uchar M8Mode=0x0;//M8控制字=Rev,Rev,Rev,RevMode,Rev,Rev,LEFT_LED,RIGHT_LED
; uchar LedTab[16]={0xEB,0x41,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA,
; 0xF9,0xFB,0xC3,0xEB,0xD3,0xD1};
; uchar LedBuf[2]={0,0};
; uchar LedDp=0;
; uchar UartBuf[10],UartBufCount=0;
; uchar LRledReg=0;
;
;
; ////////////////////////////////////////////////////////////////////////////////
; //function declare
; void port_init(void);
; void uart0_init(void);
; void uart0_rx_isr(void);
; void uart0_tx(uchar tdata);
; void tx_pack(void);
; void timer1_init(void);
; void timer1_comp_isr(void);
; void led_display(uchar delay);
; void HexToDec(uchar hex,uchar dec);
; void ms_delay(uint delay);
; void init_devices(void);
; void adc_init(void);
; ////////////////////////////////////////////////////////////////////////////////
; void port_init(void)
; {
.dbline 45
; PORTA = 0xFF;
ldi R24,255
out 0x1b,R24
.dbline 46
; DDRA = 0xFB; //PA2=ADC2,输入
ldi R24,251
out 0x1a,R24
.dbline 47
; PORTB = 0xFF;
ldi R24,255
out 0x18,R24
.dbline 48
; DDRB = 0x1F; //数码管片选信号,低有效,常态为高,PB4=LED-dp
ldi R24,31
out 0x17,R24
.dbline 49
; PORTC = 0xFF; //m103 output only
ldi R24,255
out 0x15,R24
.dbline 50
; DDRC = 0x00; //PC0,1=RL_in
clr R2
out 0x14,R2
.dbline 51
; PORTD = 0x9F;
ldi R24,159
out 0x12,R24
.dbline 52
; DDRD = 0x78;
ldi R24,120
out 0x11,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 61
; }
;
;
; //TIMER1 initialisation - prescale:1
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 1Sec
; // actual value: 1.000Sec (0.0%)
; void timer1_init(void)
; {
.dbline 62
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 63
; TCNT1H = 0xC2; //setup
ldi R24,194
out 0x2d,R24
.dbline 64
; TCNT1L = 0xF7;
ldi R24,247
out 0x2c,R24
.dbline 65
; OCR1AH = 0x3D;
ldi R24,61
out 0x2b,R24
.dbline 66
; OCR1AL = 0x09;
ldi R24,9
out 0x2a,R24
.dbline 67
; OCR1BH = 0x3D;
ldi R24,61
out 0x29,R24
.dbline 68
; OCR1BL = 0x09;
ldi R24,9
out 0x28,R24
.dbline 71
; //OCR1CH = $OCR1CH$;
; //OCR1CL = $OCR1CL$;
; ICR1H = 0x3D;
ldi R24,61
out 0x27,R24
.dbline 72
; ICR1L = 0x09;
ldi R24,9
out 0x26,R24
.dbline 73
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 74
; TCCR1B = 0x05; //start Timer
ldi R24,5
out 0x2e,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 85
; }
; /***************************************************************************
;
; ****************************************************************************/
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9615 (0.2%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
.dbline 86
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 87
; UCSRA = 0x00;
out 0xb,R2
.dbline 88
; UCSRC = BIT(URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 89
; UBRRL = 0x67; //set baud rate lo
ldi R24,103
out 0x9,R24
.dbline 90
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 91
; UCSRB = 0x98;
ldi R24,152
out 0xa,R24
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 44
jmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
; voldata -> R20
.even
_uart0_rx_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
xcall push_gset1
.dbline -1
.dbline 98
; }
; /***************************************************************************
;
; ****************************************************************************/
; #pragma interrupt_handler uart0_rx_isr:12
; void uart0_rx_isr(void)
; {
.dbline 101
; uchar voldata;
; //uart has received a character in UDR
; UartBuf[UartBufCount++]= UDR;
lds R2,_UartBufCount
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _UartBufCount,R24
ldi R24,<_UartBuf
ldi R25,>_UartBuf
mov R30,R2
clr R31
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 102
; if(UartBuf[0]==0xaa)//包头
lds R24,_UartBuf
cpi R24,170
brne L5
.dbline 103
; {
.dbline 105
; //UartBuf[3]=Rev,Rev,Rev,Rev,Rev,Rev,LEFT_LED,RIGHT_LED
; if(UartBufCount>4)
ldi R24,4
lds R2,_UartBufCount
cp R24,R2
brsh L6
.dbline 106
; {
.dbline 107
; if( ((UartBuf[1]+UartBuf[2])==0xff)&&
lds R2,_UartBuf+2
lds R24,_UartBuf+1
add R24,R2
cpi R24,255
brne L9
lds R2,_UartBuf+4
lds R24,_UartBuf+3
add R24,R2
cpi R24,255
brne L9
.dbline 109
; ((UartBuf[3]+UartBuf[4])==0xff) )
; {
.dbline 110
; LedBuf[0]=UartBuf[1];//SpeedVal
lds R2,_UartBuf+1
sts _LedBuf,R2
.dbline 111
; voldata=UartBuf[3];
lds R20,_UartBuf+3
.dbline 112
; if(voldata<105)voldata=105; //电压范围21~29.5,每个码表示0.2V
cpi R20,105
brsh L17
.dbline 112
ldi R20,105
L17:
.dbline 114
; // result=100*((tmpvol/5)-21)/(29.5-21)
; LedBuf[1]=40*(voldata-105)/17;//+24V
ldi R24,40
mul R24,R20
movw R16,R0
subi R16,104
sbci R17,16
ldi R18,17
ldi R19,0
xcall div16s
sts _LedBuf+1,R16
.dbline 116
;
; }
L9:
.dbline 117
; UartBufCount=0;
clr R2
sts _UartBufCount,R2
.dbline 118
; }
.dbline 119
; }
xjmp L6
L5:
.dbline 120
clr R2
sts _UartBufCount,R2
L6:
.dbline -2
L4:
xcall pop_gset1
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbsym r voldata 20 c
.dbend
.dbfunc e uart0_tx _uart0_tx fV
; tdata -> R16
.even
_uart0_tx::
.dbline -1
.dbline 126
; else UartBufCount=0;
; }
; /***************************************************************************
;
; ****************************************************************************/
; void uart0_tx(uchar tdata)
; {
L21:
.dbline 127
L22:
.dbline 127
; while(!(UCSRA & (1<<UDRE) ));
sbis 0xb,5
rjmp L21
.dbline 128
; UDR = tdata;
out 0xc,R16
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbsym r tdata 16 c
.dbend
.dbfunc e tx_pack _tx_pack fV
.even
_tx_pack::
.dbline -1
.dbline 131
; }
; void tx_pack(void)
; {
.dbline 133
;
; uart0_tx(0xaa);
ldi R16,170
xcall _uart0_tx
.dbline 134
; if(SpeedMode)
lds R2,_SpeedMode
tst R2
breq L25
.dbline 135
; { //巡航模式
.dbline 136
; uart0_tx(SpeedVal);
lds R16,_SpeedVal
xcall _uart0_tx
.dbline 137
; uart0_tx(0xff-SpeedVal);
lds R2,_SpeedVal
clr R3
ldi R16,255
sub R16,R2
sbc R17,R3
xcall _uart0_tx
.dbline 138
; }
xjmp L26
L25:
.dbline 140
; else
; { //手动模式
.dbline 141
; uart0_tx(AdResult);
lds R16,_AdResult
xcall _uart0_tx
.dbline 142
; uart0_tx(0xff-AdResult);
lds R2,_AdResult
clr R3
ldi R16,255
sub R16,R2
sbc R17,R3
xcall _uart0_tx
.dbline 143
; }
L26:
.dbline 144
; uart0_tx(M8Mode);
lds R16,_M8Mode
xcall _uart0_tx
.dbline 145
; uart0_tx(0xff-M8Mode);
lds R2,_M8Mode
clr R3
ldi R16,255
sub R16,R2
sbc R17,R3
xcall _uart0_tx
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area text(rom, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R2
st -y,R24
in R2,0x3f
st -y,R2
.dbline -1
.dbline 152
; }
; /***************************************************************************
; 用于手动模式和巡航模式的选择
; ****************************************************************************/
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
.dbline 154
; //external interupt on INT0
; if(SpeedMode)
lds R2,_SpeedMode
tst R2
breq L28
.dbline 155
; {
.dbline 156
; SpeedMode=0;//手动模式
clr R2
sts _SpeedMode,R2
.dbline 157
; LedDp=0;
sts _LedDp,R2
.dbline 158
; }
xjmp L29
L28:
.dbline 160
.dbline 161
ldi R24,85
sts _SpeedMode,R24
.dbline 162
ldi R24,1
sts _LedDp,R24
.dbline 163
lds R2,_AdResult
sts _SpeedVal,R2
.dbline 164
L29:
.dbline -2
L27:
ld R2,y+
out 0x3f,R2
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 170
; else
; {
; SpeedMode=0x55;//巡航模式
; LedDp=0x01;
; SpeedVal=AdResult;
; }
; }
; /***************************************************************************
; A/D初始化
; ****************************************************************************/
; void adc_init(void)
; {
.dbline 171
; ADCSRA =0x0; //关闭AD
clr R2
out 0x6,R2
.dbline 172
; ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //选择外部参考电源 ADC2 左对齐
ldi R24,98
out 0x7,R24
.dbline 173
; ACSR = (1<<ACD); //关闭模拟比较器
ldi R24,128
out 0x8,R24
.dbline 174
; ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频
ldi R24,157
out 0x6,R24
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 56
jmp _Adc_isr
.area text(rom, con, rel)
.dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
.dbfunc e Adc_isr _Adc_isr fV
; ad_tmp -> R20,R21
.even
_Adc_isr::
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
in R16,0x3f
st -y,R16
xcall push_gset1
.dbline -1
.dbline 181
; }
; /***************************************************************************
; A/D中断处理
; ****************************************************************************/
; #pragma interrupt_handler Adc_isr:15
; void Adc_isr(void)
; {
.dbline 183
; uint ad_tmp;
; ad_tmp=ADCH; //读取高位数据(左对齐)
in R20,0x5
clr R21
.dbline 184
; if(ad_tmp>0xd0)ad_tmp=0xd0;
ldi R24,208
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -