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

📄 main.lst

📁 用AVR实现简单按键的程序与proteus的结合
💻 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 + -