📄 m16t1.s
字号:
.module M16T1.c
.area text(rom, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\..\ICC_H\SOFTWARE.h
.dbfunc e ChangeIntToHex _ChangeIntToHex fV
; dec -> R20,R21
.even
_ChangeIntToHex::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 136
; /*******************************************************************
; 实验十一
; 实验名称: 定时器1中断实验
; 实验目的: 学习AVR单片机的定时器功能
; 实验现象: 定时器每秒加一,0到255循环,通过数码管显示计数值
; 环 境: ICCAVR6.31A
; 设 计 者: shinea8868
; 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 作商业用途请保留本段文字
; 完成日期: 2007年4月10日
; *******************************************************************/
;
; #include <iom16v.h>
; #include <macros.h>
; #include "..\ICC_H\SOFTWARE.h"
;
; uchar TimerCnt = 0; //定时器1计数个数
; uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
;
; /*-----------------------------------------------------------------
; 延时程序计算方法
; 计数个数j = 延时时间/6*晶振频率 - 1
; 函数名称: void DelayMs(uchar i)
; 函数功能: 毫秒延时
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void DelayMs(uchar i)
; {
; uchar j;
; while(i--)
; {
; j = 167;//1mhz 1ms延时
; while(j--);
; }
; }
;
; /*-----------------------------------------------------------------
; 函数名称: void SPIMasterInit(void)
; 函数功能: SPI初始化为主机
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPIMasterInit(void)
; {
; // MOSI,MISO,SCK等都需要设计的数据方向定义
; DDRB |= (1<<PB5) | (1<<PB7); // 设置MOSI 和SCK 为输出,其他为输入 M16
; // DDRB |= (1<<PB2) | (1<<PB3); // 设置MOSI 和SCK 为输出,其他为输入 M64
; // SPI控制寄存器
; // SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
; // SPIE 中断使能 SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
; // MSTR 主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
; // SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
; // MSTR 进入主机模式。
; // CPOL: 时钟极性见ATMEGA16L(中文)P130
; // CPHA: 时钟相位
; // SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。
; // 使能SPI 主机模式,设置时钟速率为fck/128 */
; SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
; }
; /*-----------------------------------------------------------------
; 函数名称: void SPIMasterTransmit(unsigned char i)
; 函数功能: SPI数据发送
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPIMasterTransmit(uchar TranData)
; {
; SPDR = TranData; // 启动数据传输
; while (!(SPSR & (1<<SPIF))); // 等待传输结束
; }
; /*-----------------------------------------------------------------
; 函数名称: void SPI595Out(unsigned char i)
; 函数功能: 通过74HC595输出数据
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPI595Out(unsigned char i)
; {
; PORTB &= ~(1 << 4); //准备锁存
; SPIMasterTransmit(i);
; PORTB |= (1 << 4); //锁存数据
; }
; /*-----------------------------------------------------------------
; 函数名称: void Timer1Init(void)
; 函数功能: 定时器1初始化 256预分频 定时一秒
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void Timer1Init(void)
; {
; TCCR1B = 0x00; //关定时器
; TCNT1H = 0xF0; //设置定时初值
; TCNT1L = 0xBE;
; OCR1AH = 0x0F;
; OCR1AL = 0x42;
; OCR1BH = 0x0F;
; OCR1BL = 0x42;
; ICR1H = 0x0F;
; ICR1L = 0x42;
; TCCR1A = 0x00;
; TCCR1B = 0x04; //开始计数
; }
;
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {
; TCNT1H = 0xF0; //重新装载计数值
; TCNT1L = 0xBE;
; TimerCnt++;
; }
; /*-----------------------------------------------------------------
; 函数名称: void InitDevices(void)
; 函数功能: 初始化各种信息
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void InitDevices(void)
; {
; CLI(); //关全部中断
; SPIMasterInit(); //SPI初始化为主机
; Timer1Init();
;
; TIMSK = 0x04; //timer interrupt sources
; SEI(); //开中断
; }
;
; void main(void)
; {
; uchar temp;
; DDRA = 0x00; //方向输入
; PORTA = 0xFF; //打开上拉
; DDRB = 0xFF; //方向输出
; PORTB = 0xF0; //电平设置
; DDRC = 0x00;
; PORTC = 0xFF;
.dbline 137
; DDRD = 0xFF;
movw R30,R20
ldd R2,z+0
clr R3
ldi R17,10
mov R16,R2
xcall mod8u
mov R4,R16
ldi R17,10
mov R16,R2
xcall div8u
mov R24,R16
andi R24,#0x0F
swap R24
or R24,R4
movw R30,R20
std z+0,R24
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dec 20 pc
.dbend
.dbfunc e ChangeHexToInt _ChangeHexToInt fV
; hex -> R16,R17
.even
_ChangeHexToInt::
.dbline -1
.dbline 166
; PORTD = 0xFF;
; InitDevices();
; while (1)
; {
; if( TimerCnt > 9)
; {
; if( TimerCnt > 99)
; {
; DDRB = 0xff;
; PORTB = 0xff;
; temp = TimerCnt / 100;
; SPI595Out(disp[temp]);
; PORTB = 0xfb;
; DelayMs(1);
; PORTB = 0xff;
; temp = TimerCnt%100/10;
; SPI595Out(disp[temp]);
; PORTB = 0xfd;
; DelayMs(1);
; PORTB = 0xff;
; temp = TimerCnt%10;
; SPI595Out(disp[temp]);
; PORTB = 0xfe;
; }
; else
; {
; DDRB = 0xff;
; PORTB = 0xff;
; temp = TimerCnt/10;
.dbline 167
; SPI595Out(disp[temp]);
movw R30,R16
ldd R2,z+0
clr R3
mov R24,R2
swap R24
andi R24,#0x0F
ldi R25,10
mul R25,R24
mov R24,R2
andi R24,15
mov R2,R0
add R2,R24
std z+0,R2
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r hex 16 pc
.dbend
.dbfunc e Delay _Delay fV
; i -> R16
.even
_Delay::
.dbline -1
.dbline 180
; PORTB = 0xfd;
; DelayMs(1);
; PORTB = 0xff;
; temp = TimerCnt%10;
; SPI595Out(disp[temp]);
; PORTB = 0xfe;
; }
; }
; else
; {
; DDRB = 0xff;
; PORTB = 0xfe;
; SPI595Out(disp[TimerCnt]);
.dbline 182
; }
; DelayMs(1);
ldi R16,200
L4:
.dbline 183
L5:
.dbline 183
; }
mov R2,R16
clr R3
subi R16,1
tst R2
brne L4
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\..\ICC_H\SOFTWARE.h
_TimerCnt::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\..\ICC_H\SOFTWARE.h
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.dbsym e TimerCnt _TimerCnt c
_disp::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.dbsym e disp _disp A[10:10]c
.area text(rom, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.dbfunc e DelayMs _DelayMs fV
; j -> R20
; i -> R16
.even
_DelayMs::
xcall push_gset1
.dbline -1
.dbline 29
xjmp L9
L8:
.dbline 32
.dbline 33
ldi R20,167
L11:
.dbline 34
L12:
.dbline 34
mov R2,R20
clr R3
subi R20,1
tst R2
brne L11
.dbline 35
L9:
.dbline 31
mov R2,R16
clr R3
subi R16,1
tst R2
brne L8
.dbline -2
L7:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r i 16 c
.dbend
.dbfunc e SPIMasterInit _SPIMasterInit fV
.even
_SPIMasterInit::
.dbline -1
.dbline 45
.dbline 47
in R24,0x17
ori R24,160
out 0x17,R24
.dbline 59
ldi R24,83
out 0xd,R24
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SPIMasterTransmit _SPIMasterTransmit fV
; TranData -> R16
.even
_SPIMasterTransmit::
.dbline -1
.dbline 68
.dbline 69
out 0xf,R16
L16:
.dbline 70
L17:
.dbline 70
sbis 0xe,7
rjmp L16
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbsym r TranData 16 c
.dbend
.dbfunc e SPI595Out _SPI595Out fV
; i -> R20
.even
_SPI595Out::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 79
.dbline 80
cbi 0x18,4
.dbline 81
mov R16,R20
xcall _SPIMasterTransmit
.dbline 82
sbi 0x18,4
.dbline -2
L19:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e Timer1Init _Timer1Init fV
.even
_Timer1Init::
.dbline -1
.dbline 91
.dbline 92
clr R2
out 0x2e,R2
.dbline 93
ldi R24,240
out 0x2d,R24
.dbline 94
ldi R24,190
out 0x2c,R24
.dbline 95
ldi R24,15
out 0x2b,R24
.dbline 96
ldi R24,66
out 0x2a,R24
.dbline 97
ldi R24,15
out 0x29,R24
.dbline 98
ldi R24,66
out 0x28,R24
.dbline 99
ldi R24,15
out 0x27,R24
.dbline 100
ldi R24,66
out 0x26,R24
.dbline 101
out 0x2f,R2
.dbline 102
ldi R24,4
out 0x2e,R24
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 32
jmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile F:\job\M16学习板\定时器中断实验(实验十一)\M16T1.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 107
.dbline 108
ldi R24,240
out 0x2d,R24
.dbline 109
ldi R24,190
out 0x2c,R24
.dbline 110
lds R24,_TimerCnt
subi R24,255 ; addi 1
sts _TimerCnt,R24
.dbline -2
L21:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e InitDevices _InitDevices fV
.even
_InitDevices::
.dbline -1
.dbline 119
.dbline 120
cli
.dbline 121
xcall _SPIMasterInit
.dbline 122
xcall _Timer1Init
.dbline 124
ldi R24,4
out 0x39,R24
.dbline 125
sei
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; temp -> R20
.even
_main::
.dbline -1
.dbline 129
.dbline 131
clr R2
out 0x1a,R2
.dbline 132
ldi R24,255
out 0x1b,R24
.dbline 133
out 0x17,R24
.dbline 134
ldi R24,240
out 0x18,R24
.dbline 135
out 0x14,R2
.dbline 136
ldi R24,255
out 0x15,R24
.dbline 137
out 0x11,R24
.dbline 138
out 0x12,R24
.dbline 139
xcall _InitDevices
xjmp L25
L24:
.dbline 141
.dbline 142
ldi R24,9
lds R2,_TimerCnt
cp R24,R2
brlo X1
xjmp L27
X1:
.dbline 143
.dbline 144
ldi R24,99
cp R24,R2
brlo X2
xjmp L29
X2:
.dbline 145
.dbline 146
ldi R24,255
out 0x17,R24
.dbline 147
out 0x18,R24
.dbline 148
ldi R17,100
mov R16,R2
xcall div8u
mov R20,R16
.dbline 149
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 150
ldi R24,251
out 0x18,R24
.dbline 151
ldi R16,1
xcall _DelayMs
.dbline 152
ldi R24,255
out 0x18,R24
.dbline 153
ldi R17,100
lds R16,_TimerCnt
xcall mod8u
ldi R17,10
xcall div8u
mov R20,R16
.dbline 154
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 155
ldi R24,253
out 0x18,R24
.dbline 156
ldi R16,1
xcall _DelayMs
.dbline 157
ldi R24,255
out 0x18,R24
.dbline 158
ldi R17,10
lds R16,_TimerCnt
xcall mod8u
mov R20,R16
.dbline 159
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 160
ldi R24,254
out 0x18,R24
.dbline 161
xjmp L28
L29:
.dbline 163
.dbline 164
ldi R24,255
out 0x17,R24
.dbline 165
out 0x18,R24
.dbline 166
ldi R17,10
lds R16,_TimerCnt
xcall div8u
mov R20,R16
.dbline 167
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 168
ldi R24,253
out 0x18,R24
.dbline 169
ldi R16,1
xcall _DelayMs
.dbline 170
ldi R24,255
out 0x18,R24
.dbline 171
ldi R17,10
lds R16,_TimerCnt
xcall mod8u
mov R20,R16
.dbline 172
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 173
ldi R24,254
out 0x18,R24
.dbline 174
.dbline 175
xjmp L28
L27:
.dbline 177
.dbline 178
ldi R24,255
out 0x17,R24
.dbline 179
ldi R24,254
out 0x18,R24
.dbline 180
ldi R24,<_disp
ldi R25,>_disp
lds R30,_TimerCnt
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 181
L28:
.dbline 182
ldi R16,1
xcall _DelayMs
.dbline 183
L25:
.dbline 140
xjmp L24
X0:
.dbline -2
L23:
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -