📄 main.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0065 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\教程\简单按键\main.c
(0001) //ICC-AVR application builder : 2007-4-17 8:26:01
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // www.avrvi.com AVR与虚拟仪器
(0005)
(0006) // 最简单的键盘读取方式,直接读键盘对应脚的电平
(0007) // 硬件连接:
(0008) // PA0~PA3 —————— LED0~LED3
(0009) // PB0~PB3 —————— 独立按键A~D
(0010)
(0011) // 实验效果:
(0012) // 按下键时,键盘对应的灯亮。
(0013)
(0014) #include <iom16v.h>
(0015) #include <macros.h>
(0016)
(0017) void port_init(void)
(0018) {
(0019) PORTA = 0x0F;
_port_init:
004B E08F LDI R24,0xF
004C BB8B OUT 0x1B,R24
(0020) DDRA = 0x0F; //PA0~PA3输出
004D BB8A OUT 0x1A,R24
(0021) PORTB = 0x0F; //PB0~PB3使能内部上拉
004E BB88 OUT 0x18,R24
(0022) DDRB = 0x00; //PB0~PB3为键盘输入,一定要设置为输入
004F 2422 CLR R2
0050 BA27 OUT 0x17,R2
(0023) PORTC = 0x00; //m103 output only
0051 BA25 OUT 0x15,R2
(0024) DDRC = 0x00;
0052 BA24 OUT 0x14,R2
(0025) PORTD = 0x00;
0053 BA22 OUT 0x12,R2
(0026) DDRD = 0x00;
0054 BA21 OUT 0x11,R2
0055 9508 RET
(0027) }
(0028)
(0029) //call this routine to initialize all peripherals
(0030) void init_devices(void)
(0031) {
(0032) //stop errant interrupts until set up
(0033) CLI(); //disable all interrupts
_init_devices:
0056 94F8 BCLR 7
(0034) port_init();
0057 DFF3 RCALL _port_init
(0035)
(0036) MCUCR = 0x00;
0058 2422 CLR R2
0059 BE25 OUT 0x35,R2
(0037) GICR = 0x00;
005A BE2B OUT 0x3B,R2
(0038) TIMSK = 0x00; //timer interrupt sources
005B BE29 OUT 0x39,R2
(0039) SEI(); //re-enable interrupts
005C 9478 BSET 7
005D 9508 RET
(0040) //all peripherals are now initialized
(0041) }
(0042) //延时函数
(0043) void delay(void)
(0044) {
(0045) unsigned char i;
(0046) for(i=254;i!=0;i--)
_delay:
i --> R16
005E EF0E LDI R16,0xFE
005F C002 RJMP 0x0062
(0047) {
(0048) asm("nop"); //空操作用于延时
0060 0000 NOP
0061 950A DEC R16
0062 2300 TST R16
0063 F7E1 BNE 0x0060
0064 9508 RET
(0049) }
(0050) }
(0051)
(0052) void main(void)
(0053) {
(0054) unsigned char temp;
(0055) init_devices();
_main:
temp --> R20
0065 DFF0 RCALL _init_devices
0066 C007 RJMP 0x006E
(0056) while(1)
(0057) {
(0058) temp=PINB;
0067 B346 IN R20,0x16
(0059) delay(); //延时去抖
0068 DFF5 RCALL _delay
(0060) if(temp==PINB) //再次读键盘值,如果和temp相同,则为有效按键,继续下一步操作
0069 B226 IN R2,0x16
006A 1542 CP R20,R2
006B F411 BNE 0x006E
(0061) {
(0062) PORTA=PINB; //把PINB口的值直接赋给PORTA
FILE: <library>
006C B226 IN R2,0x16
006D BA2B OUT 0x1B,R2
006E CFF8 RJMP 0x0067
006F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -