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

📄 16按键.lst

📁 AVR之ATMega16
💻 LST
字号:
__start:
__text_start:
    003E E5CF      LDI	R28,0x5F
    003F E0D4      LDI	R29,4
    0040 BFCD      OUT	0x3D,R28
    0041 BFDE      OUT	0x3E,R29
    0042 51C0      SUBI	R28,0x10
    0043 40D0      SBCI	R29,0
    0044 EA0A      LDI	R16,0xAA
    0045 8308      STD	Y+0,R16
    0046 2400      CLR	R0
    0047 E8E8      LDI	R30,0x88
    0048 E0F0      LDI	R31,0
    0049 E010      LDI	R17,0
    004A 38E9      CPI	R30,0x89
    004B 07F1      CPC	R31,R17
    004C F011      BEQ	0x004F
    004D 9201      ST	R0,Z+
    004E CFFB      RJMP	0x004A
    004F 8300      STD	Z+0,R16
    0050 E5E4      LDI	R30,0x54
    0051 E0F0      LDI	R31,0
    0052 E6A0      LDI	R26,0x60
    0053 E0B0      LDI	R27,0
    0054 E010      LDI	R17,0
    0055 37EC      CPI	R30,0x7C
    0056 07F1      CPC	R31,R17
    0057 F021      BEQ	0x005C
    0058 95C8      LPM
    0059 9631      ADIW	R30,1
    005A 920D      ST	R0,X+
    005B CFF9      RJMP	0x0055
    005C 940E00D0  CALL	_main
_exit:
    005E CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\delay.h
(0001) #define xtal  8                      //8MS
(0002) /************************************************************
(0003) *   函数名称:void DelayUS(unsigned int time)
(0004) *   功    能:软件延时1.1Us 
(0005) *   入口参数:time 延时时间
(0006) *   出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {   
_DelayUS:
  time                 --> R16
    005F C002      RJMP	0x0062
(0010)      while(time>1)
(0011) 	    time--; 
    0060 5001      SUBI	R16,1
    0061 4010      SBCI	R17,0
    0062 E081      LDI	R24,1
    0063 E090      LDI	R25,0
    0064 1780      CP	R24,R16
    0065 0791      CPC	R25,R17
    0066 F3C8      BCS	0x0060
    0067 9508      RET
_DelayMS:
  i                    --> R20
  time                 --> R16
    0068 940E00EE  CALL	push_gset1
(0012) }
(0013) /************************************************************
(0014) *   函数名称:void DelayMS(unsigned int time)
(0015) *   功    能:软件延时  1/1000s
(0016) *   入口参数:time 延时时间 MS  
(0017) *   出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
    006A C009      RJMP	0x0074
(0021)     unsigned int i;
(0022)     while(time--)	
(0023) 	{
(0024) 	  for(i=1;i<(unsigned int)(xtal*143-2);i++)
    006B E041      LDI	R20,1
    006C E050      LDI	R21,0
    006D C002      RJMP	0x0070
    006E 5F4F      SUBI	R20,0xFF
    006F 4F5F      SBCI	R21,0xFF
    0070 3746      CPI	R20,0x76
    0071 E0E4      LDI	R30,4
    0072 075E      CPC	R21,R30
    0073 F3D0      BCS	0x006E
    0074 0118      MOVW	R2,R16
    0075 5001      SUBI	R16,1
    0076 4010      SBCI	R17,0
    0077 2022      TST	R2
    0078 F791      BNE	0x006B
    0079 2033      TST	R3
    007A F781      BNE	0x006B
    007B 940E00F1  CALL	pop_gset1
    007D 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
(0001) //内部晶振 8M
(0002) //包含所需头文件
(0003) #include <ioM16v.h>
(0004) #include <macros.h>
(0005) #include"delay.h"
(0006) 
(0007) 
(0008) 
(0009) /*------宏定义------*/
(0010) #define uchar	unsigned char
(0011) #define uint	unsigned int
(0012) 
(0013) uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
(0014)                   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管段位
(0015) uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选
(0016) uchar key_board[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,
(0017)                    0xb7,0xbb,0xbd,0xbe,0x77,0x7b,0x7d,0x7e};    //按键键值
(0018) uchar anjianzhi;
(0019) //端口初始化
(0020) void port_init(void)
(0021) {
(0022)  PORTA = 0x00;//A口数据置0
_port_init:
    007E 2422      CLR	R2
    007F BA2B      OUT	0x1B,R2
(0023)  DDRA  = 0xFF;//A口方向设为输出
    0080 EF8F      LDI	R24,0xFF
    0081 BB8A      OUT	0x1A,R24
(0024)  PORTB = 0x00;//B口数据置0
    0082 BA28      OUT	0x18,R2
(0025)  DDRB  = 0xFF;//B口方向设为输出
    0083 BB87      OUT	0x17,R24
(0026)  PORTC = 0xFF;
    0084 BB85      OUT	0x15,R24
(0027)  DDRC  = 0xFF;
    0085 BB84      OUT	0x14,R24
(0028)  PORTD = 0xFF;
    0086 BB82      OUT	0x12,R24
(0029)  DDRD  = 0xFF;
    0087 BB81      OUT	0x11,R24
    0088 9508      RET
(0030) }
(0031) 
(0032) 
(0033) void init_devices(void)
(0034) {
(0035)  CLI(); //禁止所有中断
_init_devices:
    0089 94F8      BCLR	7
(0036)  MCUCR  = 0x00;//外部中断触发方式
    008A 2422      CLR	R2
    008B BE25      OUT	0x35,R2
(0037)  MCUCSR = 0x80;//禁止JTAG
    008C E880      LDI	R24,0x80
    008D BF84      OUT	0x34,R24
(0038)  GICR   = 0x00;//外部中断使能
    008E BE2B      OUT	0x3B,R2
(0039)  port_init();
    008F DFEE      RCALL	_port_init
    0090 9508      RET
_keyboard:
  i                    --> R20
  key                  --> R20
  b                    --> R22
  a                    --> R10
    0091 940E00EA  CALL	push_gset3
(0040)  //SEI();//开全局中断
(0041) }
(0042) uchar keyboard(void)  //读取键盘
(0043)       {
(0044)        		      uchar i=0;
    0093 2744      CLR	R20
(0045)       		      uchar a=0;
    0094 24AA      CLR	R10
(0046)       		      uchar b=0;
    0095 2766      CLR	R22
(0047)       		      uchar key=0;
(0048)       		      DDRC=0x0f;//D口前四位输入,后四位输出
    0096 E08F      LDI	R24,0xF
    0097 BB84      OUT	0x14,R24
(0049)       		      //DelayUS(10);
(0050) 				  PORTC=0xf0;//D口前四位置1,后四位置0
    0098 EF80      LDI	R24,0xF0
    0099 BB85      OUT	0x15,R24
(0051)       		      DelayUS(10);
    009A E00A      LDI	R16,0xA
    009B E010      LDI	R17,0
    009C DFC2      RCALL	_DelayUS
(0052)       		      a=PINC&0xf0; //读取D口前四位数值
    009D B383      IN	R24,0x13
    009E 7F80      ANDI	R24,0xF0
    009F 2EA8      MOV	R10,R24
(0053)       		      DDRC=0xf0;//D口前四位输出,后四位输入
    00A0 EF80      LDI	R24,0xF0
    00A1 BB84      OUT	0x14,R24
(0054)       		      //DelayUS(10);
(0055) 				  PORTC=0x0f;//D口后四位置1,前四位置0
    00A2 E08F      LDI	R24,0xF
    00A3 BB85      OUT	0x15,R24
(0056)       		      DelayUS(10);
    00A4 E00A      LDI	R16,0xA
    00A5 E010      LDI	R17,0
    00A6 DFB8      RCALL	_DelayUS
(0057)       		      b=PINC&0x0f; //读取D口后四位数值
    00A7 B363      IN	R22,0x13
    00A8 706F      ANDI	R22,0xF
(0058)       		      key=a+b;//D口八位数据赋予key
    00A9 2D4A      MOV	R20,R10
    00AA 0F46      ADD	R20,R22
(0059)       		      return key;
    00AB 2F04      MOV	R16,R20
    00AC 940E00E3  CALL	pop_gset3
    00AE 9508      RET
_jianzhi:
  m2                   --> R10
  m1                   --> R20
  i                    --> R22
    00AF 940E00EA  CALL	push_gset3
(0060)       }
(0061) void jianzhi(void)//取得键值
(0062)      {
(0063) 	 uchar m1,m2,i=0;
    00B1 2766      CLR	R22
(0064)       	    if (keyboard()!=0xff)
    00B2 DFDE      RCALL	_keyboard
    00B3 3F0F      CPI	R16,0xFF
    00B4 F0C1      BEQ	0x00CD
(0065)      	    {
(0066)      	       	  m1=keyboard();//调用读取键盘程序
    00B5 DFDB      RCALL	_keyboard
    00B6 2F40      MOV	R20,R16
(0067)      	    	  DelayMS(10);
    00B7 E00A      LDI	R16,0xA
    00B8 E010      LDI	R17,0
    00B9 DFAE      RCALL	_DelayMS
(0068)      	    	  m2=keyboard();//调用两次
    00BA DFD6      RCALL	_keyboard
    00BB 2EA0      MOV	R10,R16
(0069)      	    	  if (m1==m2)
    00BC 1740      CP	R20,R16
    00BD F479      BNE	0x00CD
(0070)      	    	  {
(0071)      	    	        for (i=0;i<16;i++)
    00BE C00C      RJMP	0x00CB
(0072)      	    	  	{
(0073)      	    	  	    if (m1==key_board[i])//循环判断读取数值与按键键值是否相同
    00BF E788      LDI	R24,0x78
    00C0 E090      LDI	R25,0
    00C1 2FE6      MOV	R30,R22
    00C2 27FF      CLR	R31
    00C3 0FE8      ADD	R30,R24
    00C4 1FF9      ADC	R31,R25
    00C5 8020      LDD	R2,Z+0
    00C6 1542      CP	R20,R2
    00C7 F411      BNE	0x00CA
(0074)      	    	  	    {
(0075)      	    	  	       		anjianzhi=i;//数值赋予变量
    00C8 93600088  STS	anjianzhi,R22
    00CA 9563      INC	R22
    00CB 3160      CPI	R22,0x10
    00CC F390      BCS	0x00BF
(0076)      	    	  	    }
(0077)      	    	  	}
(0078)      	    	  }
(0079)      	    }
    00CD 940E00E3  CALL	pop_gset3
    00CF 9508      RET
(0080)      }
(0081) //主函数
(0082) void main(void)
(0083) { 
(0084)  init_devices();
_main:
    00D0 DFB8      RCALL	_init_devices
    00D1 C00F      RJMP	0x00E1
(0085) 
(0086)   while(1)
(0087)  {
(0088) 
(0089)     jianzhi();//调用取得键值函数
    00D2 DFDC      RCALL	_jianzhi
(0090)     PORTA=led_date[anjianzhi];//数码管显示按键键值
    00D3 E680      LDI	R24,0x60
    00D4 E090      LDI	R25,0
    00D5 91E00088  LDS	R30,anjianzhi
    00D7 27FF      CLR	R31
    00D8 0FE8      ADD	R30,R24
    00D9 1FF9      ADC	R31,R25
    00DA 8020      LDD	R2,Z+0
    00DB BA2B      OUT	0x1B,R2
(0091)     PORTB=0xfe;//片选数码管
    00DC EF8E      LDI	R24,0xFE
    00DD BB88      OUT	0x18,R24
(0092)     DelayMS(100);
FILE: <library>
    00DE E604      LDI	R16,0x64
    00DF E010      LDI	R17,0
    00E0 DF87      RCALL	_DelayMS
    00E1 CFF0      RJMP	0x00D2
    00E2 9508      RET
pop_gset3:
    00E3 E0E4      LDI	R30,4
    00E4 940C00F2  JMP	pop
push_gset5:
    00E6 92FA      ST	R15,-Y
    00E7 92EA      ST	R14,-Y
push_gset4:
    00E8 92DA      ST	R13,-Y
    00E9 92CA      ST	R12,-Y
push_gset3:
    00EA 92BA      ST	R11,-Y
    00EB 92AA      ST	R10,-Y
push_gset2:
    00EC 937A      ST	R23,-Y
    00ED 936A      ST	R22,-Y
push_gset1:
    00EE 935A      ST	R21,-Y
    00EF 934A      ST	R20,-Y
    00F0 9508      RET
pop_gset1:
    00F1 E0E1      LDI	R30,1
pop:
    00F2 9149      LD	R20,Y+
    00F3 9159      LD	R21,Y+
    00F4 FDE0      SBRC	R30,0
    00F5 9508      RET
    00F6 9169      LD	R22,Y+
    00F7 9179      LD	R23,Y+
    00F8 FDE1      SBRC	R30,1
    00F9 9508      RET
    00FA 90A9      LD	R10,Y+
    00FB 90B9      LD	R11,Y+
    00FC FDE2      SBRC	R30,2
    00FD 9508      RET
    00FE 90C9      LD	R12,Y+
    00FF 90D9      LD	R13,Y+
    0100 FDE3      SBRC	R30,3
    0101 9508      RET
    0102 90E9      LD	R14,Y+
    0103 90F9      LD	R15,Y+
    0104 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -