📄 diy0816_09.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 + -