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

📄 key.lst

📁 AVR程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0025) void DelayMs(uchar i)
(0026) {
    007A C006      RJMP	0x0081
(0027)  	uchar j;
(0028) 	while(i--)
(0029) 	{
(0030) 	 	j = 167;//1mhz 1ms延时
    007B EA47      LDI	R20,0xA7
(0031) 	    while(j--);
    007C 2E24      MOV	R2,R20
    007D 2433      CLR	R3
    007E 5041      SUBI	R20,1
    007F 2022      TST	R2
    0080 F7D9      BNE	0x007C
    0081 2E20      MOV	R2,R16
    0082 2433      CLR	R3
    0083 5001      SUBI	R16,1
    0084 2022      TST	R2
    0085 F7A9      BNE	0x007B
    0086 940E0132  CALL	pop_gset1
    0088 9508      RET
_KeyScan:
  KeyNum               --> R20
    0089 940E012D  CALL	push_gset2
(0032) 	}
(0033) }
(0034) 
(0035) /*-----------------------------------------------------------------
(0036) 函数名称: void KeyScan(void)
(0037) 函数功能: 键盘扫描程序
(0038) 参    数: 
(0039) 返 回 值: 无
(0040) -----------------------------------------------------------------*/
(0041) void KeyScan(void)
(0042) {
(0043)  	uchar KeyNum = 0;	  	  //用来存放按键信息
    008B 2744      CLR	R20
(0044)  	DDRA  = 0xff;         //置端口A为输出
    008C EF8F      LDI	R24,0xFF
    008D BB8A      OUT	0x1A,R24
(0045) 	PORTA = 0xff; 		  //全部输出为高电平
    008E BB8B      OUT	0x1B,R24
(0046) 	DelayMs(1);   		  //延时一段时间
    008F E001      LDI	R16,1
    0090 DFE7      RCALL	_DelayMs
(0047) 	DDRA  = 0x00;		  //置端口A为输入
    0091 2422      CLR	R2
    0092 BA2A      OUT	0x1A,R2
(0048) 	if( PINA != 0xff)	  //是否有按键按下
    0093 B389      IN	R24,0x19
    0094 3F8F      CPI	R24,0xFF
    0095 F011      BEQ	0x0098
(0049) 		DelayMs(1);		  //延时去抖动
    0096 E001      LDI	R16,1
    0097 DFE0      RCALL	_DelayMs
(0050) 		
(0051) 	DDRA  = 0xff;         //置端口A为输出
    0098 EF8F      LDI	R24,0xFF
    0099 BB8A      OUT	0x1A,R24
(0052) 	PORTA = 0xff; 		  //全部输出为高电平
    009A BB8B      OUT	0x1B,R24
(0053) 	DelayMs(1);   		  //延时一段时间
    009B E001      LDI	R16,1
    009C DFDB      RCALL	_DelayMs
(0054) 	DDRA  = 0x00;		  //置端口A为输入
    009D 2422      CLR	R2
    009E BA2A      OUT	0x1A,R2
(0055) 	if( PINA != 0xff)	  //是否有按键按下
    009F B389      IN	R24,0x19
    00A0 3F8F      CPI	R24,0xFF
    00A1 F409      BNE	0x00A3
    00A2 C05D      RJMP	0x0100
(0056) 	{		 			  //确实有按键按下
(0057) 	 	switch (PINA & 0xff)//判断是哪个按键按下
    00A3 B369      IN	R22,0x19
    00A4 2777      CLR	R23
    00A5 7070      ANDI	R23,0
    00A6 3D6F      CPI	R22,0xDF
    00A7 E0E0      LDI	R30,0
    00A8 077E      CPC	R23,R30
    00A9 F409      BNE	0x00AB
    00AA C036      RJMP	0x00E1
    00AB ED8F      LDI	R24,0xDF
    00AC E090      LDI	R25,0
    00AD 1786      CP	R24,R22
    00AE 0797      CPC	R25,R23
    00AF F074      BLT	0x00BE
    00B0 376F      CPI	R22,0x7F
    00B1 E0E0      LDI	R30,0
    00B2 077E      CPC	R23,R30
    00B3 F189      BEQ	0x00E5
    00B4 376F      CPI	R22,0x7F
    00B5 E0E0      LDI	R30,0
    00B6 077E      CPC	R23,R30
    00B7 F40C      BGE	0x00B9
    00B8 C041      RJMP	0x00FA
    00B9 3B6F      CPI	R22,0xBF
    00BA E0E0      LDI	R30,0
    00BB 077E      CPC	R23,R30
    00BC F131      BEQ	0x00E3
    00BD C03C      RJMP	0x00FA
    00BE 3E6F      CPI	R22,0xEF
    00BF E0E0      LDI	R30,0
    00C0 077E      CPC	R23,R30
    00C1 F0E9      BEQ	0x00DF
    00C2 3E6F      CPI	R22,0xEF
    00C3 E0E0      LDI	R30,0
    00C4 077E      CPC	R23,R30
    00C5 F1A4      BLT	0x00FA
    00C6 3F67      CPI	R22,0xF7
    00C7 E0E0      LDI	R30,0
    00C8 077E      CPC	R23,R30
    00C9 F099      BEQ	0x00DD
    00CA 3F6B      CPI	R22,0xFB
    00CB E0E0      LDI	R30,0
    00CC 077E      CPC	R23,R30
    00CD F069      BEQ	0x00DB
    00CE 3F6D      CPI	R22,0xFD
    00CF E0E0      LDI	R30,0
    00D0 077E      CPC	R23,R30
    00D1 F039      BEQ	0x00D9
    00D2 3F6E      CPI	R22,0xFE
    00D3 E0E0      LDI	R30,0
    00D4 077E      CPC	R23,R30
    00D5 F009      BEQ	0x00D7
    00D6 C023      RJMP	0x00FA
(0058) 		{
(0059) 		 	 case 0b11111110: KeyNum = 1;break;
    00D7 E041      LDI	R20,1
    00D8 C021      RJMP	0x00FA
(0060) 			 case 0b11111101: KeyNum = 2;break;
    00D9 E042      LDI	R20,2
    00DA C01F      RJMP	0x00FA
(0061) 			 case 0b11111011: KeyNum = 3;break;
    00DB E043      LDI	R20,3
    00DC C01D      RJMP	0x00FA
(0062) 			 case 0b11110111: KeyNum = 4;break;
    00DD E044      LDI	R20,4
    00DE C01B      RJMP	0x00FA
(0063) 			 case 0b11101111: KeyNum = 5;break;
    00DF E045      LDI	R20,5
    00E0 C019      RJMP	0x00FA
(0064) 			 case 0b11011111: KeyNum = 6;break;
    00E1 E046      LDI	R20,6
    00E2 C017      RJMP	0x00FA
(0065) 			 case 0b10111111: KeyNum = 7;break;
    00E3 E047      LDI	R20,7
    00E4 C015      RJMP	0x00FA
(0066) 			 case 0b01111111: KeyNum = 8;break;
    00E5 E048      LDI	R20,0x8
(0067) 			 default: break;			 
    00E6 C013      RJMP	0x00FA
(0068) 		}
(0069) 		
(0070) 		while(PINA != 0xff)
(0071) 		{
(0072) 		    DDRB  = 0xff;
    00E7 EF8F      LDI	R24,0xFF
    00E8 BB87      OUT	0x17,R24
(0073) 			PORTB&= ~(1<<(KeyNum-1));//显示对应的发光二极管
    00E9 2F14      MOV	R17,R20
    00EA 5011      SUBI	R17,1
    00EB E001      LDI	R16,1
    00EC 940E0146  CALL	lsl8
    00EE 2E20      MOV	R2,R16
    00EF 9420      COM	R2
    00F0 B238      IN	R3,0x18
    00F1 2032      AND	R3,R2
    00F2 BA38      OUT	0x18,R3
(0074) 			DDRA  = 0xff;         //置端口A为输出
    00F3 EF8F      LDI	R24,0xFF
    00F4 BB8A      OUT	0x1A,R24
(0075) 			PORTA = 0xff; 		  //全部输出为高电平
    00F5 BB8B      OUT	0x1B,R24
(0076) 			DelayMs(1);   		  //延时一段时间
    00F6 E001      LDI	R16,1
    00F7 DF80      RCALL	_DelayMs
(0077) 			DDRA  = 0x00;	
    00F8 2422      CLR	R2
    00F9 BA2A      OUT	0x1A,R2
    00FA B389      IN	R24,0x19
    00FB 3F8F      CPI	R24,0xFF
    00FC F751      BNE	0x00E7
(0078) 		}
(0079) 		DDRB  = 0xff;			  //设为输出
    00FD EF8F      LDI	R24,0xFF
    00FE BB87      OUT	0x17,R24
(0080) 		PORTB = 0xff;			  //灭所有的二极管 
    00FF BB88      OUT	0x18,R24
(0081) 	}
    0100 940E0124  CALL	pop_gset2
    0102 9508      RET
(0082) 	
(0083) }
(0084) /*-----------------------------------------------------------------
(0085) 函数名称: void main(void)
(0086) 函数功能: 
(0087) 参    数: 
(0088) 返 回 值: 无
(0089) -----------------------------------------------------------------*/
(0090) void main(void)
(0091) {
(0092)  	DDRB  = 0xff;
_main:
    0103 EF8F      LDI	R24,0xFF
    0104 BB87      OUT	0x17,R24
(0093) 	PORTB = 0xff;
    0105 BB88      OUT	0x18,R24
    0106 C003      RJMP	0x010A
(0094)  	while(1)
(0095) 	{
(0096) 	 	DelayMs(200);
    0107 EC08      LDI	R16,0xC8
    0108 DF6F      RCALL	_DelayMs
(0097) 		KeyScan();
FILE: <library>
    0109 DF7F      RCALL	_KeyScan
    010A CFFC      RJMP	0x0107
    010B 9508      RET
mod8u:
    010C 9468      BSET	6
    010D C001      RJMP	xdiv8u
div8u:
    010E 94E8      BCLR	6
xdiv8u:
    010F 932A      ST	R18,-Y
    0110 92FA      ST	R15,-Y
    0111 92EA      ST	R14,-Y
    0112 24FF      CLR	R15
    0113 24EE      CLR	R14
    0114 E120      LDI	R18,0x10
    0115 0F00      LSL	R16
    0116 1CFF      ROL	R15
    0117 1CEE      ROL	R14
    0118 16E1      CP	R14,R17
    0119 F010      BCS	0x011C
    011A 1AE1      SUB	R14,R17
    011B 9503      INC	R16
    011C 952A      DEC	R18
    011D F7B9      BNE	0x0115
    011E F40E      BRTC	0x0120
    011F 2D0E      MOV	R16,R14
    0120 90E9      LD	R14,Y+
    0121 90F9      LD	R15,Y+
    0122 9129      LD	R18,Y+
    0123 9508      RET
pop_gset2:
    0124 E0E2      LDI	R30,2
    0125 940C0133  JMP	pop
push_gset5:
    0127 92FA      ST	R15,-Y
    0128 92EA      ST	R14,-Y
push_gset4:
    0129 92DA      ST	R13,-Y
    012A 92CA      ST	R12,-Y
push_gset3:
    012B 92BA      ST	R11,-Y
    012C 92AA      ST	R10,-Y
push_gset2:
    012D 937A      ST	R23,-Y
    012E 936A      ST	R22,-Y
push_gset1:
    012F 935A      ST	R21,-Y
    0130 934A      ST	R20,-Y
    0131 9508      RET
pop_gset1:
    0132 E0E1      LDI	R30,1
pop:
    0133 9149      LD	R20,Y+
    0134 9159      LD	R21,Y+
    0135 FDE0      SBRC	R30,0
    0136 9508      RET
    0137 9169      LD	R22,Y+
    0138 9179      LD	R23,Y+
    0139 FDE1      SBRC	R30,1
    013A 9508      RET
    013B 90A9      LD	R10,Y+
    013C 90B9      LD	R11,Y+
    013D FDE2      SBRC	R30,2
    013E 9508      RET
    013F 90C9      LD	R12,Y+
    0140 90D9      LD	R13,Y+
    0141 FDE3      SBRC	R30,3
    0142 9508      RET
    0143 90E9      LD	R14,Y+
    0144 90F9      LD	R15,Y+
    0145 9508      RET
lsl8:
    0146 2311      TST	R17
    0147 F019      BEQ	0x014B
    0148 0F00      LSL	R16
    0149 951A      DEC	R17
    014A CFFB      RJMP	lsl8
    014B 9508      RET

⌨️ 快捷键说明

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