📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile D:\桌面\教程\简单按键\main.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 18
0000 ; //ICC-AVR application builder : 2007-4-17 8:26:01
0000 ; // Target : M16
0000 ; // Crystal: 7.3728Mhz
0000 ; // www.avrvi.com AVR与虚拟仪器
0000 ;
0000 ; // 最简单的键盘读取方式,直接读键盘对应脚的电平
0000 ; // 硬件连接:
0000 ; // PA0~PA3 —————— LED0~LED3
0000 ; // PB0~PB3 —————— 独立按键A~D
0000 ;
0000 ; // 实验效果:
0000 ; // 按下键时,键盘对应的灯亮。
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 19
0000 ; PORTA = 0x0F;
0000 8FE0 ldi R24,15
0002 8BBB out 0x1b,R24
0004 .dbline 20
0004 ; DDRA = 0x0F; //PA0~PA3输出
0004 8ABB out 0x1a,R24
0006 .dbline 21
0006 ; PORTB = 0x0F; //PB0~PB3使能内部上拉
0006 88BB out 0x18,R24
0008 .dbline 22
0008 ; DDRB = 0x00; //PB0~PB3为键盘输入,一定要设置为输入
0008 2224 clr R2
000A 27BA out 0x17,R2
000C .dbline 23
000C ; PORTC = 0x00; //m103 output only
000C 25BA out 0x15,R2
000E .dbline 24
000E ; DDRC = 0x00;
000E 24BA out 0x14,R2
0010 .dbline 25
0010 ; PORTD = 0x00;
0010 22BA out 0x12,R2
0012 .dbline 26
0012 ; DDRD = 0x00;
0012 21BA out 0x11,R2
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbend
0016 .dbfunc e init_devices _init_devices fV
.even
0016 _init_devices::
0016 .dbline -1
0016 .dbline 31
0016 ; }
0016 ;
0016 ; //call this routine to initialize all peripherals
0016 ; void init_devices(void)
0016 ; {
0016 .dbline 33
0016 ; //stop errant interrupts until set up
0016 ; CLI(); //disable all interrupts
0016 F894 cli
0018 .dbline 34
0018 ; port_init();
0018 F3DF xcall _port_init
001A .dbline 36
001A ;
001A ; MCUCR = 0x00;
001A 2224 clr R2
001C 25BE out 0x35,R2
001E .dbline 37
001E ; GICR = 0x00;
001E 2BBE out 0x3b,R2
0020 .dbline 38
0020 ; TIMSK = 0x00; //timer interrupt sources
0020 29BE out 0x39,R2
0022 .dbline 39
0022 ; SEI(); //re-enable interrupts
0022 7894 sei
0024 .dbline -2
0024 L2:
0024 .dbline 0 ; func end
0024 0895 ret
0026 .dbend
0026 .dbfunc e delay _delay fV
0026 ; i -> R16
.even
0026 _delay::
0026 .dbline -1
0026 .dbline 44
0026 ; //all peripherals are now initialized
0026 ; }
0026 ; //延时函数
0026 ; void delay(void)
0026 ; {
0026 .dbline 46
0026 ; unsigned char i;
0026 ; for(i=254;i!=0;i--)
0026 0EEF ldi R16,254
0028 02C0 xjmp L7
002A L4:
002A .dbline 47
002A .dbline 48
002A 0000 nop
002C .dbline 49
002C L5:
002C .dbline 46
002C 0A95 dec R16
002E L7:
002E .dbline 46
002E 0023 tst R16
0030 E1F7 brne L4
0032 .dbline -2
0032 L3:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbsym r i 16 c
0034 .dbend
0034 .dbfunc e main _main fV
0034 ; temp -> R20
.even
0034 _main::
0034 .dbline -1
0034 .dbline 53
0034 ; {
0034 ; asm("nop"); //空操作用于延时
0034 ; }
0034 ; }
0034 ;
0034 ; void main(void)
0034 ; {
0034 .dbline 55
0034 ; unsigned char temp;
0034 ; init_devices();
0034 F0DF xcall _init_devices
0036 07C0 xjmp L10
0038 L9:
0038 .dbline 57
0038 ; while(1)
0038 ; {
0038 .dbline 58
0038 ; temp=PINB;
0038 46B3 in R20,0x16
003A .dbline 59
003A ; delay(); //延时去抖
003A F5DF xcall _delay
003C .dbline 60
003C ; if(temp==PINB) //再次读键盘值,如果和temp相同,则为有效按键,继续下一步操作
003C 26B2 in R2,0x16
003E 4215 cp R20,R2
0040 11F4 brne L12
0042 .dbline 61
0042 ; {
0042 .dbline 62
0042 ; PORTA=PINB; //把PINB口的值直接赋给PORTA
0042 26B2 in R2,0x16
0044 2BBA out 0x1b,R2
0046 .dbline 63
0046 ; }
0046 L12:
0046 .dbline 64
0046 L10:
0046 .dbline 56
0046 F8CF xjmp L9
0048 X0:
0048 .dbline -2
0048 L8:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbsym r temp 20 c
004A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -