📄 m16int.lis
字号:
.module M16Int.c
.area text(rom, con, rel)
0000 .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
0000 .dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
0000 .dbfunc e ChangeIntToHex _ChangeIntToHex fV
0000 ; dec -> R20,R21
.even
0000 _ChangeIntToHex::
0000 0E940000 xcall push_gset1
0004 A801 movw R20,R16
0006 .dbline -1
0006 .dbline 136
0006 ; /*******************************************************************
0006 ; 实验五
0006 ; 实验名称: 中断实验,LED数码管显示中断数据
0006 ; 实验目的: 学习AVR单片机的中断功能
0006 ; 实验现象: 按键按下计数,数码管显示计数结果
0006 ; 环 境: ICCAVR6.31A
0006 ; 设 计 者: shinea8868
0006 ; 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
0006 ; 作商业用途请保留本段文字
0006 ; 完成日期: 2007年4月9日
0006 ; *******************************************************************/
0006 ;
0006 ; #include <iom16v.h>
0006 ; #include <macros.h>
0006 ; #include "..\ICC_H\SOFTWARE.h"
0006 ;
0006 ;
0006 ; uchar IntCnt = 0; //记录中断次数
0006 ; uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
0006 ;
0006 ; #pragma interrupt_handler int0_isr:2
0006 ; void int0_isr(void)
0006 ; {
0006 ; IntCnt++;
0006 ; }
0006 ; /*-----------------------------------------------------------------
0006 ; 延时程序计算方法
0006 ; 计数个数j = 延时时间/6*晶振频率 - 1
0006 ; 函数名称: void DelayMs(uchar i)
0006 ; 函数功能: 毫秒延时
0006 ; 参 数:
0006 ; 返 回 值: 无
0006 ; -----------------------------------------------------------------*/
0006 ; void DelayMs(uchar i)
0006 ; {
0006 ; uchar j;
0006 ; while(i--)
0006 ; {
0006 ; j = 167;//1mhz 1ms延时
0006 ; while(j--);
0006 ; }
0006 ; }
0006 ;
0006 ; /*-----------------------------------------------------------------
0006 ; 函数名称: void SPIMasterInit(void)
0006 ; 函数功能: SPI初始化为主机
0006 ; 参 数:
0006 ; 返 回 值: 无
0006 ; -----------------------------------------------------------------*/
0006 ; void SPIMasterInit(void)
0006 ; {
0006 ; // MOSI,MISO,SCK等都需要设计的数据方向定义
0006 ; DDRB |= (1<<PB5) | (1<<PB7); // 设置MOSI 和SCK 为输出,其他为输入 M16
0006 ; // DDRB |= (1<<PB2) | (1<<PB3); // 设置MOSI 和SCK 为输出,其他为输入 M64
0006 ; // SPI控制寄存器
0006 ; // SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
0006 ; // SPIE 中断使能 SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
0006 ; // MSTR 主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
0006 ; // SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
0006 ; // MSTR 进入主机模式。
0006 ; // CPOL: 时钟极性见ATMEGA16L(中文)P130
0006 ; // CPHA: 时钟相位
0006 ; // SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。
0006 ; // 使能SPI 主机模式,设置时钟速率为fck/128 */
0006 ; SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
0006 ; }
0006 ; /*-----------------------------------------------------------------
0006 ; 函数名称: void SPIMasterTransmit(unsigned char i)
0006 ; 函数功能: SPI数据发送
0006 ; 参 数:
0006 ; 返 回 值: 无
0006 ; -----------------------------------------------------------------*/
0006 ; void SPIMasterTransmit(uchar TranData)
0006 ; {
0006 ; SPDR = TranData; // 启动数据传输
0006 ; while (!(SPSR & (1<<SPIF))); // 等待传输结束
0006 ; }
0006 ; /*-----------------------------------------------------------------
0006 ; 函数名称: void SPI595Out(unsigned char i)
0006 ; 函数功能: 通过74HC595输出数据
0006 ; 参 数:
0006 ; 返 回 值: 无
0006 ; -----------------------------------------------------------------*/
0006 ; void SPI595Out(unsigned char i)
0006 ; {
0006 ; PORTB &= ~(1 << 4); //准备锁存
0006 ; SPIMasterTransmit(i);
0006 ; PORTB |= (1 << 4); //锁存数据
0006 ; }
0006 ; /*-----------------------------------------------------------------
0006 ; 函数名称: void InitDevices(void)
0006 ; 函数功能: 初始化各种信息
0006 ; 参 数:
0006 ; 返 回 值: 无
0006 ; -----------------------------------------------------------------*/
0006 ; void InitDevices(void)
0006 ; {
0006 ; CLI(); //关全部中断
0006 ; SPIMasterInit(); //SPI初始化为主机
0006 ;
0006 ; MCUCR = 0x02; //中断0,下降沿触发
0006 ; GICR = 0x40; //开中断0,
0006 ; SEI(); //开中断
0006 ; }
0006 ;
0006 ; void main(void)
0006 ; {
0006 ; uchar temp;
0006 ; DDRA = 0x00; //方向输入
0006 ; PORTA = 0xFF; //打开上拉
0006 ; DDRB = 0xFF; //方向输出
0006 ; PORTB = 0xF0; //电平设置
0006 ; DDRC = 0x00;
0006 ; PORTC = 0xFF;
0006 ; DDRD = 0xFF;
0006 ; PORTD = 0xFF;
0006 ; InitDevices();
0006 ; while (1)
0006 ; {
0006 ; if( IntCnt > 9)
0006 ; {
0006 ; if( IntCnt > 99)
0006 ; {
0006 ; DDRB = 0xff;
0006 ; PORTB = 0xff;
0006 ; temp = IntCnt / 100;
0006 ; SPI595Out(disp[temp]);
0006 ; PORTB = 0xfb;
0006 ; DelayMs(1);
0006 ; PORTB = 0xff;
0006 ; temp = IntCnt%100/10;
0006 ; SPI595Out(disp[temp]);
0006 ; PORTB = 0xfd;
0006 ; DelayMs(1);
0006 ; PORTB = 0xff;
0006 ; temp = IntCnt%10;
0006 .dbline 137
0006 ; SPI595Out(disp[temp]);
0006 FA01 movw R30,R20
0008 2080 ldd R2,z+0
000A 3324 clr R3
000C 1AE0 ldi R17,10
000E 022D mov R16,R2
0010 0E940000 xcall mod8u
0014 402E mov R4,R16
0016 1AE0 ldi R17,10
0018 022D mov R16,R2
001A 0E940000 xcall div8u
001E 802F mov R24,R16
0020 8F70 andi R24,#0x0F
0022 8295 swap R24
0024 8429 or R24,R4
0026 FA01 movw R30,R20
0028 8083 std z+0,R24
002A .dbline -2
002A L1:
002A 0E940000 xcall pop_gset1
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r dec 20 pc
0030 .dbend
0030 .dbfunc e ChangeHexToInt _ChangeHexToInt fV
0030 ; hex -> R16,R17
.even
0030 _ChangeHexToInt::
0030 .dbline -1
0030 .dbline 166
0030 ; PORTB = 0xfe;
0030 ; }
0030 ; else
0030 ; {
0030 ; DDRB = 0xff;
0030 ; PORTB = 0xff;
0030 ; temp = IntCnt/10;
0030 ; SPI595Out(disp[temp]);
0030 ; PORTB = 0xfd;
0030 ; DelayMs(1);
0030 ; PORTB = 0xff;
0030 ; temp = IntCnt%10;
0030 ; SPI595Out(disp[temp]);
0030 ; PORTB = 0xfe;
0030 ; }
0030 ; }
0030 ; else
0030 ; {
0030 ; DDRB = 0xff;
0030 ; PORTB = 0xfe;
0030 ; SPI595Out(disp[IntCnt]);
0030 ; }
0030 ; DelayMs(1);
0030 ; }
0030 ; }
0030 ;
0030 ;
0030 ;
0030 ;
0030 .dbline 167
0030 ;
0030 F801 movw R30,R16
0032 2080 ldd R2,z+0
0034 3324 clr R3
0036 822D mov R24,R2
0038 8295 swap R24
003A 8F70 andi R24,#0x0F
003C 9AE0 ldi R25,10
003E 989F mul R25,R24
0040 822D mov R24,R2
0042 8F70 andi R24,15
0044 202C mov R2,R0
0046 280E add R2,R24
0048 2082 std z+0,R2
004A .dbline -2
004A L2:
004A .dbline 0 ; func end
004A 0895 ret
004C .dbsym r hex 16 pc
004C .dbend
004C .dbfunc e Delay _Delay fV
004C ; i -> R16
.even
004C _Delay::
004C .dbline -1
004C .dbline 180
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C ;
004C .dbline 182
004C ;
004C ;
004C 08EC ldi R16,200
004E L4:
004E .dbline 183
004E L5:
004E .dbline 183
004E ;
004E 202E mov R2,R16
0050 3324 clr R3
0052 0150 subi R16,1
0054 2220 tst R2
0056 D9F7 brne L4
0058 .dbline -2
0058 L3:
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r i 16 c
005A .dbend
.area data(ram, con, rel)
0000 .dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
0000 _IntCnt::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile F:\job\M16学习板\中断实验(实验五)\..\ICC_H\SOFTWARE.h
0001 .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
0001 .dbsym e IntCnt _IntCnt c
0001 _disp::
0001 .blkb 2
.area idata
0001 C0F9 .byte 192,249
.area data(ram, con, rel)
0003 .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
0003 .blkb 2
.area idata
0003 A4B0 .byte 164,176
.area data(ram, con, rel)
0005 .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
0005 .blkb 2
.area idata
0005 9992 .byte 153,146
.area data(ram, con, rel)
0007 .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
0007 .blkb 2
.area idata
0007 82F8 .byte 130,248
.area data(ram, con, rel)
0009 .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
0009 .blkb 2
.area idata
0009 8090 .byte 128,144
.area data(ram, con, rel)
000B .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
000B .dbsym e disp _disp A[10:10]c
.area vector(rom, abs)
.org 4
0004 0C942D00 jmp _int0_isr
.area data(ram, con, rel)
000B .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
.area text(rom, con, rel)
005A .dbfile F:\job\M16学习板\中断实验(实验五)\M16Int.c
005A .dbfunc e int0_isr _int0_isr fV
.even
005A _int0_isr::
005A 8A93 st -y,R24
005C 9A93 st -y,R25
005E 8FB7 in R24,0x3f
0060 8A93 st -y,R24
0062 .dbline -1
0062 .dbline 23
0062 .dbline 24
0062 80910000 lds R24,_IntCnt
0066 8F5F subi R24,255 ; addi 1
0068 80930000 sts _IntCnt,R24
006C .dbline -2
006C L7:
006C 8991 ld R24,y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -