📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\003-BUZZ\main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; a -> R20
0000 ; b -> R22
0000 ; i -> R16
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 16
0004 ; /*
0004 ; 实验三:
0004 ; 驱动无源蜂鸣器实验。
0004 ; 1、定时器实验,用定时器的CTC模式驱动无源蜂鸣器,是否输出由按键0控制。
0004 ; 2、内部1 M晶振,程序采用单任务方式,软件延时,驱动无源蜂鸣器由定时器硬件完成。
0004 ; 3、进行此实验请插上BUZ短路块。
0004 ; 4、此实验让大家了解定时器里面的CTC功能,从而可以利用它来产生频率信号。
0004 ;
0004 ; AVR mega128学习板
0004 ; www.iccavr.com 阿发
0004 ; 23:03 2007-10-09
0004 ; */
0004 ; #include "iom128v.h"
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 19
0004 4427 clr R20
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 19
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 0; a < i; a++) {
0008 .dbline 20
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 20
000C L7:
000C .dbline 20
000C 6395 inc R22
000E L9:
000E .dbline 20
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 21
0012 L3:
0012 .dbline 19
0012 4395 inc R20
0014 L5:
0014 .dbline 19
0014 4017 cp R20,R16
0016 C0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 0E940000 xcall pop_gset2
001C .dbline 0 ; func end
001C 0895 ret
001E .dbsym r a 20 c
001E .dbsym r b 22 c
001E .dbsym r i 16 c
001E .dbend
001E .dbfunc e io_init _io_init fV
.even
001E _io_init::
001E .dbline -1
001E .dbline 25
001E ; for (b = 1; b; b++);
001E ; }
001E ; }
001E ;
001E ; /*IO口初始化函数*/
001E ; void io_init(void) {
001E .dbline 27
001E ;
001E ; DDRA = 0x00; /*方向输入*/
001E 2224 clr R2
0020 2ABA out 0x1a,R2
0022 .dbline 28
0022 ; PORTA = 0xFF; /*打开上拉*/
0022 8FEF ldi R24,255
0024 8BBB out 0x1b,R24
0026 .dbline 29
0026 ; DDRB = 0x00; /*方向输入*/
0026 27BA out 0x17,R2
0028 .dbline 30
0028 ; PORTB = 0xFF; /*高电平*/
0028 88BB out 0x18,R24
002A .dbline 31
002A ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
002A 24BA out 0x14,R2
002C .dbline 32
002C ; PORTC = 0xFF;
002C 85BB out 0x15,R24
002E .dbline 33
002E ; DDRD = 0x00;
002E 21BA out 0x11,R2
0030 .dbline 34
0030 ; PORTD = 0xFF;
0030 82BB out 0x12,R24
0032 .dbline 35
0032 ; DDRE = 0x08; /*设置蜂鸣器对应脚为输出*/
0032 88E0 ldi R24,8
0034 82B9 out 0x2,R24
0036 .dbline 36
0036 ; PORTE = 0xF7; /*蜂鸣器脚输出低电平*/
0036 87EF ldi R24,247
0038 83B9 out 0x3,R24
003A .dbline 37
003A ; DDRF = 0x00;
003A 20926100 sts 97,R2
003E .dbline 38
003E ; PORTF = 0xFF;
003E 8FEF ldi R24,255
0040 80936200 sts 98,R24
0044 .dbline 39
0044 ; DDRG = 0x00;
0044 20926400 sts 100,R2
0048 .dbline 40
0048 ; PORTG = 0xFF;
0048 80936500 sts 101,R24
004C .dbline -2
004C L10:
004C .dbline 0 ; func end
004C 0895 ret
004E .dbend
004E .dbfunc e main _main fV
.even
004E _main::
004E .dbline -1
004E .dbline 43
004E ; }
004E ;
004E ; void main(void) {
004E .dbline 45
004E ;
004E ; io_init();
004E E7DF xcall _io_init
0050 16C0 xjmp L13
0052 L12:
0052 .dbline 46
0052 ; while (1) {
0052 .dbline 47
0052 ; if (!(PINE & (1 << PE0))) { /*判断是否有按键按下*/
0052 0899 sbic 0x1,0
0054 14C0 rjmp L15
0056 .dbline 47
0056 .dbline 48
0056 ; TCCR3A = 0x40; /*设置定时器工作在CTC模式*/
0056 80E4 ldi R24,64
0058 80938B00 sts 139,R24
005C .dbline 49
005C ; TCCR3B = 0x09;
005C 89E0 ldi R24,9
005E 80938A00 sts 138,R24
0062 .dbline 50
0062 ; OCR3A = 1000;
0062 88EE ldi R24,1000
0064 93E0 ldi R25,3
0066 90938700 sts 134+1,R25
006A 80938600 sts 134,R24
006E .dbline 51
006E ; delay_ms(200); /*延时一段时间,保证蜂鸣器的最短工作时间*/
006E 08EC ldi R16,200
0070 C7DF xcall _delay_ms
0072 L17:
0072 .dbline 53
0072 L18:
0072 .dbline 53
0072 ;
0072 ; while (!(PINE & (1 << PE0))); /*等待按键松开*/
0072 089B sbis 0x1,0
0074 FECF rjmp L17
0076 .dbline 54
0076 ; TCCR3A = 0x00; /*关闭定时器*/
0076 2224 clr R2
0078 20928B00 sts 139,R2
007C .dbline 55
007C ; PORTE &= ~(1 << PE3); /*人为将蜂鸣器控制脚置低*/
007C 1B98 cbi 0x3,3
007E .dbline 56
007E ; }
007E L15:
007E .dbline 57
007E L13:
007E .dbline 46
007E E9CF xjmp L12
0080 X0:
0080 .dbline -2
0080 L11:
0080 .dbline 0 ; func end
0080 0895 ret
0082 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -