📄 m16int.s
字号:
.module M16Int.c
.area text(rom, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.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
; /*******************************************************************
; 实验五
; 实验名称: 中断实验,LED数码管显示中断数据
; 实验目的: 学习AVR单片机的中断功能
; 实验现象: 按键按下计数,数码管显示计数结果
; 环 境: ICCAVR6.31A
; 设 计 者: shinea8868
; 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 作商业用途请保留本段文字
; 完成日期: 2007年4月9日
; *******************************************************************/
;
; #include <iom16v.h>
; #include <macros.h>
; #include "..\ICC_H\SOFTWARE.h"
;
;
; uchar IntCnt = 0; //记录中断次数
; uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
;
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
; IntCnt++;
; }
; /*-----------------------------------------------------------------
; 延时程序计算方法
; 计数个数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 InitDevices(void)
; 函数功能: 初始化各种信息
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void InitDevices(void)
; {
; CLI(); //关全部中断
; SPIMasterInit(); //SPI初始化为主机
;
; MCUCR = 0x02; //中断0,下降沿触发
; GICR = 0x40; //开中断0,
; SEI(); //开中断
; }
;
; void main(void)
; {
; uchar temp;
; DDRA = 0x00; //方向输入
; PORTA = 0xFF; //打开上拉
; DDRB = 0xFF; //方向输出
; PORTB = 0xF0; //电平设置
; DDRC = 0x00;
; PORTC = 0xFF;
; DDRD = 0xFF;
; PORTD = 0xFF;
; InitDevices();
; while (1)
; {
; if( IntCnt > 9)
; {
; if( IntCnt > 99)
; {
; DDRB = 0xff;
; PORTB = 0xff;
; temp = IntCnt / 100;
; SPI595Out(disp[temp]);
; PORTB = 0xfb;
; DelayMs(1);
; PORTB = 0xff;
; temp = IntCnt%100/10;
; SPI595Out(disp[temp]);
; PORTB = 0xfd;
; DelayMs(1);
; PORTB = 0xff;
; temp = IntCnt%10;
.dbline 137
; SPI595Out(disp[temp]);
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
; PORTB = 0xfe;
; }
; else
; {
; DDRB = 0xff;
; PORTB = 0xff;
; temp = IntCnt/10;
; SPI595Out(disp[temp]);
; PORTB = 0xfd;
; DelayMs(1);
; PORTB = 0xff;
; temp = IntCnt%10;
; SPI595Out(disp[temp]);
; PORTB = 0xfe;
; }
; }
; else
; {
; DDRB = 0xff;
; PORTB = 0xfe;
; SPI595Out(disp[IntCnt]);
; }
; DelayMs(1);
; }
; }
;
;
;
;
.dbline 167
;
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
;
;
;
;
;
;
;
;
;
;
;
;
;
.dbline 182
;
;
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
_IntCnt::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.dbsym e IntCnt _IntCnt c
_disp::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.dbsym e disp _disp A[10:10]c
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area data(ram, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.area text(rom, con, rel)
.dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 23
.dbline 24
lds R24,_IntCnt
subi R24,255 ; addi 1
sts _IntCnt,R24
.dbline -2
L7:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e DelayMs _DelayMs fV
; j -> R20
; i -> R16
.even
_DelayMs::
xcall push_gset1
.dbline -1
.dbline 35
xjmp L10
L9:
.dbline 38
.dbline 39
ldi R20,167
L12:
.dbline 40
L13:
.dbline 40
mov R2,R20
clr R3
subi R20,1
tst R2
brne L12
.dbline 41
L10:
.dbline 37
mov R2,R16
clr R3
subi R16,1
tst R2
brne L9
.dbline -2
L8:
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 51
.dbline 53
in R24,0x17
ori R24,160
out 0x17,R24
.dbline 65
ldi R24,83
out 0xd,R24
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SPIMasterTransmit _SPIMasterTransmit fV
; TranData -> R16
.even
_SPIMasterTransmit::
.dbline -1
.dbline 74
.dbline 75
out 0xf,R16
L17:
.dbline 76
L18:
.dbline 76
sbis 0xe,7
rjmp L17
.dbline -2
L16:
.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 85
.dbline 86
cbi 0x18,4
.dbline 87
mov R16,R20
xcall _SPIMasterTransmit
.dbline 88
sbi 0x18,4
.dbline -2
L20:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e InitDevices _InitDevices fV
.even
_InitDevices::
.dbline -1
.dbline 97
.dbline 98
cli
.dbline 99
xcall _SPIMasterInit
.dbline 101
ldi R24,2
out 0x35,R24
.dbline 102
ldi R24,64
out 0x3b,R24
.dbline 103
sei
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; temp -> R20
.even
_main::
.dbline -1
.dbline 107
.dbline 109
clr R2
out 0x1a,R2
.dbline 110
ldi R24,255
out 0x1b,R24
.dbline 111
out 0x17,R24
.dbline 112
ldi R24,240
out 0x18,R24
.dbline 113
out 0x14,R2
.dbline 114
ldi R24,255
out 0x15,R24
.dbline 115
out 0x11,R24
.dbline 116
out 0x12,R24
.dbline 117
xcall _InitDevices
xjmp L24
L23:
.dbline 119
.dbline 120
ldi R24,9
lds R2,_IntCnt
cp R24,R2
brlo X1
xjmp L26
X1:
.dbline 121
.dbline 122
ldi R24,99
cp R24,R2
brlo X2
xjmp L28
X2:
.dbline 123
.dbline 124
ldi R24,255
out 0x17,R24
.dbline 125
out 0x18,R24
.dbline 126
ldi R17,100
mov R16,R2
xcall div8u
mov R20,R16
.dbline 127
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 128
ldi R24,251
out 0x18,R24
.dbline 129
ldi R16,1
xcall _DelayMs
.dbline 130
ldi R24,255
out 0x18,R24
.dbline 131
ldi R17,100
lds R16,_IntCnt
xcall mod8u
ldi R17,10
xcall div8u
mov R20,R16
.dbline 132
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 133
ldi R24,253
out 0x18,R24
.dbline 134
ldi R16,1
xcall _DelayMs
.dbline 135
ldi R24,255
out 0x18,R24
.dbline 136
ldi R17,10
lds R16,_IntCnt
xcall mod8u
mov R20,R16
.dbline 137
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 138
ldi R24,254
out 0x18,R24
.dbline 139
xjmp L27
L28:
.dbline 141
.dbline 142
ldi R24,255
out 0x17,R24
.dbline 143
out 0x18,R24
.dbline 144
ldi R17,10
lds R16,_IntCnt
xcall div8u
mov R20,R16
.dbline 145
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 146
ldi R24,253
out 0x18,R24
.dbline 147
ldi R16,1
xcall _DelayMs
.dbline 148
ldi R24,255
out 0x18,R24
.dbline 149
ldi R17,10
lds R16,_IntCnt
xcall mod8u
mov R20,R16
.dbline 150
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 151
ldi R24,254
out 0x18,R24
.dbline 152
.dbline 153
xjmp L27
L26:
.dbline 155
.dbline 156
ldi R24,255
out 0x17,R24
.dbline 157
ldi R24,254
out 0x18,R24
.dbline 158
ldi R24,<_disp
ldi R25,>_disp
lds R30,_IntCnt
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI595Out
.dbline 159
L27:
.dbline 160
ldi R16,1
xcall _DelayMs
.dbline 161
L24:
.dbline 118
xjmp L23
X0:
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -