⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diy0816_09.lis

📁 AVR单片机应用开发指南及实例,包含许多实例,挺不错
💻 LIS
字号:
                        .module diy0816_09.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\SL-DIY~1\diy0208_16_9\diy0816_09.c
 0000                   .dbfunc e delay_us _delay_us fV
 0000           ;           time -> R16,R17
                        .even
 0000           _delay_us::
 0000                   .dbline -1
 0000                   .dbline 12
 0000           ; //9.  I/O端口的又一应用-发声。
 0000           ; //PB.0端口开关控制PC.0输出报警声程序! 
 0000           ; //请你修改程序改变报警声音调及快慢。
 0000           ; //     www.sl.com.cn
 0000           ; //     teny@sl.com.cn    05-11-12
 0000           ; // Target : mega16     Crystal: 8.0000Mhz
 0000           ; 
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ;                //微秒级延时
 0000           ; void delay_us(int time)
 0000           ; {     
 0000           L2:
 0000                   .dbline 14
 0000           ;  do
 0000           ;  {
 0000                   .dbline 15
 0000           ;   time--;
 0000 0150              subi R16,1
 0002 1040              sbci R17,0
 0004                   .dbline 16
 0004           ;  }    
 0004           L3:
 0004                   .dbline 17
 0004           ;   while (time>1);
 0004 81E0              ldi R24,1
 0006 90E0              ldi R25,0
 0008 8017              cp R24,R16
 000A 9107              cpc R25,R17
 000C CCF3              brlt L2
 000E                   .dbline -2
 000E           L1:
 000E                   .dbline 0 ; func end
 000E 0895              ret
 0010                   .dbsym r time 16 I
 0010                   .dbend
 0010                   .dbfunc e delay_ms _delay_ms fV
 0010           ;           time -> R20,R21
                        .even
 0010           _delay_ms::
 0010 0E940000          xcall push_gset1
 0014 A801              movw R20,R16
 0016                   .dbline -1
 0016                   .dbline 21
 0016           ; }       
 0016           ;               //毫秒级延时
 0016           ; void delay_ms(unsigned int time)
 0016           ; {
 0016 05C0              xjmp L7
 0018           L6:
 0018                   .dbline 23
 0018                   .dbline 24
 0018 08EE              ldi R16,1000
 001A 13E0              ldi R17,3
 001C F1DF              xcall _delay_us
 001E                   .dbline 25
 001E 4150              subi R20,1
 0020 5040              sbci R21,0
 0022                   .dbline 26
 0022           L7:
 0022                   .dbline 22
 0022           ;  while(time!=0)
 0022 4030              cpi R20,0
 0024 4507              cpc R20,R21
 0026 C1F7              brne L6
 0028           X0:
 0028                   .dbline -2
 0028           L5:
 0028 0E940000          xcall pop_gset1
 002C                   .dbline 0 ; func end
 002C 0895              ret
 002E                   .dbsym r time 20 i
 002E                   .dbend
 002E                   .dbfunc e port_init _port_init fV
                        .even
 002E           _port_init::
 002E                   .dbline -1
 002E                   .dbline 30
 002E           ;  {            
 002E           ;   delay_us(1000);
 002E           ;   time--;
 002E           ;  }
 002E           ; }             
 002E           ; 
 002E           ; void port_init(void)
 002E           ; {      //端口初始化
 002E                   .dbline 31
 002E           ;  DDRA  = 0x00;PORTA = 0xFF;
 002E 2224              clr R2
 0030 2ABA              out 0x1a,R2
 0032                   .dbline 31
 0032 8FEF              ldi R24,255
 0034 8BBB              out 0x1b,R24
 0036                   .dbline 32
 0036           ;  DDRB  = 0x00;PORTB = 0xFF;
 0036 27BA              out 0x17,R2
 0038                   .dbline 32
 0038 88BB              out 0x18,R24
 003A                   .dbline 33
 003A           ;  DDRC  = 0xFF;PORTC = 0xFF;
 003A 84BB              out 0x14,R24
 003C                   .dbline 33
 003C 85BB              out 0x15,R24
 003E                   .dbline 34
 003E           ;  DDRD  = 0x00;PORTD = 0xFF; 
 003E 21BA              out 0x11,R2
 0040                   .dbline 34
 0040 82BB              out 0x12,R24
 0042                   .dbline -2
 0042           L9:
 0042                   .dbline 0 ; func end
 0042 0895              ret
 0044                   .dbend
 0044                   .dbfunc e timer1_init _timer1_init fV
                        .even
 0044           _timer1_init::
 0044                   .dbline -1
 0044                   .dbline 41
 0044           ; }
 0044           ; 
 0044           ; //TIMER1 initialisation - prescale:8
 0044           ; // desired value: 100uSec
 0044           ; // actual value: 100.000uSec (0.0%)
 0044           ; void timer1_init(void)
 0044           ; {      //定时/计数器1初始化
 0044                   .dbline 42
 0044           ;  TCCR1B = 0x00; //stop
 0044 2224              clr R2
 0046 2EBC              out 0x2e,R2
 0048                   .dbline 43
 0048           ;  TCNT1H = 0xFe; //setup
 0048 8EEF              ldi R24,254
 004A 8DBD              out 0x2d,R24
 004C                   .dbline 44
 004C           ;  TCNT1L = 0x86;
 004C 86E8              ldi R24,134
 004E 8CBD              out 0x2c,R24
 0050                   .dbline 45
 0050           ;  OCR1AH = 0x00;
 0050 2BBC              out 0x2b,R2
 0052                   .dbline 46
 0052           ;  OCR1AL = 0x64;
 0052 84E6              ldi R24,100
 0054 8ABD              out 0x2a,R24
 0056                   .dbline 47
 0056           ;  OCR1BH = 0x00;
 0056 29BC              out 0x29,R2
 0058                   .dbline 48
 0058           ;  OCR1BL = 0x64;
 0058 88BD              out 0x28,R24
 005A                   .dbline 49
 005A           ;  TCCR1A = 0x00;
 005A 2FBC              out 0x2f,R2
 005C                   .dbline 50
 005C           ;  TCCR1B = 0x02; //start Timer
 005C 82E0              ldi R24,2
 005E 8EBD              out 0x2e,R24
 0060                   .dbline -2
 0060           L10:
 0060                   .dbline 0 ; func end
 0060 0895              ret
 0062                   .dbend
                        .area vector(rom, abs)
                        .org 32
 0020 0C943100          jmp _timer1_ovf_isr
                        .area text(rom, con, rel)
 0062                   .dbfile D:\SL-DIY~1\diy0208_16_9\diy0816_09.c
 0062                   .dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
                        .even
 0062           _timer1_ovf_isr::
 0062 2A92              st -y,R2
 0064 8A93              st -y,R24
 0066 9A93              st -y,R25
 0068 2FB6              in R2,0x3f
 006A 2A92              st -y,R2
 006C                   .dbline -1
 006C                   .dbline 55
 006C           ; }
 006C           ; 
 006C           ; #pragma interrupt_handler timer1_ovf_isr:9
 006C           ; void timer1_ovf_isr(void)
 006C           ; {      //定时/计数器1溢出中断处理函数
 006C                   .dbline 56
 006C           ;  TCNT1 = 0xFe86; //reload counter value
 006C 86E8              ldi R24,65158
 006E 9EEF              ldi R25,254
 0070 9DBD              out 0x2d,R25
 0072 8CBD              out 0x2c,R24
 0074                   .dbline 57
 0074           ;  PORTC^=0x01;
 0074 81E0              ldi R24,1
 0076 25B2              in R2,0x15
 0078 2826              eor R2,R24
 007A 25BA              out 0x15,R2
 007C                   .dbline -2
 007C           L11:
 007C 2990              ld R2,y+
 007E 2FBE              out 0x3f,R2
 0080 9991              ld R25,y+
 0082 8991              ld R24,y+
 0084 2990              ld R2,y+
 0086                   .dbline 0 ; func end
 0086 1895              reti
 0088                   .dbend
 0088                   .dbfunc e init_devices _init_devices fV
                        .even
 0088           _init_devices::
 0088                   .dbline -1
 0088                   .dbline 62
 0088           ; }
 0088           ; 
 0088           ; //call this routine to initialise all peripherals
 0088           ; void init_devices(void)
 0088           ; {//芯片初始化
 0088                   .dbline 64
 0088           ;  //stop errant interrupts until set up
 0088           ;  CLI(); //关中断
 0088 F894              cli
 008A                   .dbline 65
 008A           ;  port_init();//调用端口初始化函数
 008A D1DF              xcall _port_init
 008C                   .dbline 66
 008C           ;  timer1_init();//调用定时/计数器1初始化函数
 008C DBDF              xcall _timer1_init
 008E                   .dbline 68
 008E           ; 
 008E           ;  MCUCR = 0x00;
 008E 2224              clr R2
 0090 25BE              out 0x35,R2
 0092                   .dbline 69
 0092           ;  GICR = 0x00;
 0092 2BBE              out 0x3b,R2
 0094                   .dbline 70
 0094           ;  TIMSK = 0x04;
 0094 84E0              ldi R24,4
 0096 89BF              out 0x39,R24
 0098                   .dbline -2
 0098           L12:
 0098                   .dbline 0 ; func end
 0098 0895              ret
 009A                   .dbend
 009A                   .dbfunc e main _main fV
 009A           ;         pb_buf -> R20
                        .even
 009A           _main::
 009A                   .dbline -1
 009A                   .dbline 75
 009A           ; // SEI(); //开中断
 009A           ; }
 009A           ; 
 009A           ; void main(void)
 009A           ; {      //主函数
 009A                   .dbline 77
 009A           ;  unsigned char pb_buf;//定义局部字符型变量
 009A           ;  init_devices();//调用芯片初始化函数
 009A F6DF              xcall _init_devices
 009C 04C0              xjmp L15
 009E           L14:
 009E                   .dbline 79
 009E           ;  while(1) //等待PB0按键按下
 009E           ;  {              //无键按下等待
 009E                   .dbline 80
 009E           ;   pb_buf=PINB & 0x01;
 009E 46B3              in R20,0x16
 00A0 4170              andi R20,1
 00A2                   .dbline 81
 00A2           ;   if(pb_buf==0x00){break;}
 00A2 09F4              brne L17
 00A4                   .dbline 81
 00A4                   .dbline 81
 00A4 01C0              xjmp L16
 00A6           L17:
 00A6                   .dbline 82
 00A6           L15:
 00A6                   .dbline 78
 00A6 FBCF              xjmp L14
 00A8           L16:
 00A8                   .dbline 83
 00A8           ;  }//有键按下运行下面的程序
 00A8           ;  SEI();//开中断
 00A8 7894              sei
 00AA 0AC0              xjmp L20
 00AC           L19:
 00AC                   .dbline 85
 00AC                   .dbline 86
 00AC 8FEF              ldi R24,255
 00AE 84BB              out 0x14,R24
 00B0                   .dbline 87
 00B0 04EF              ldi R16,500
 00B2 11E0              ldi R17,1
 00B4 ADDF              xcall _delay_ms
 00B6                   .dbline 88
 00B6 2224              clr R2
 00B8 24BA              out 0x14,R2
 00BA                   .dbline 89
 00BA 04EF              ldi R16,500
 00BC 11E0              ldi R17,1
 00BE A8DF              xcall _delay_ms
 00C0                   .dbline 90
 00C0           L20:
 00C0                   .dbline 84
 00C0 F5CF              xjmp L19
 00C2           X1:
 00C2                   .dbline -2
 00C2           L13:
 00C2                   .dbline 0 ; func end
 00C2 0895              ret
 00C4                   .dbsym r pb_buf 20 c
 00C4                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -