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

📄 main.lst

📁 键盘操作 键盘扫描 用的是单片机mega16
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0084)    #if KEY_USE_INT==0
(0085)    Delay100us(1);   //使用中断进行扫描不加延时
(0086)    #endif
(0087)    if(HAVE_KEY_DOWN)
    0132 B389      IN	R24,0x19
    0133 708F      ANDI	R24,0xF
    0134 308F      CPI	R24,0xF
    0135 F409      BNE	0x0137
    0136 C053      RJMP	0x018A
(0088)    {
(0089)    
(0090)  #if BEEP_EN ==1
(0091)    BEEP_PORT |= (1<<BEEP_BIT);							   //蜂鸣器响
    0137 9A90      SBI	0x12,0
(0092)  #endif
(0093)  
(0094)     temp_key = ( KEY_COL_ALL & KEY_PIN_COL );			   //读取键值
    0138 B369      IN	R22,0x19
    0139 706F      ANDI	R22,0xF
(0095) 	
(0096) 	switch(temp_key)
    013A 2EA6      MOV	R10,R22
    013B 24BB      CLR	R11
    013C 01C5      MOVW	R24,R10
    013D 3087      CPI	R24,7
    013E E0E0      LDI	R30,0
    013F 079E      CPC	R25,R30
    0140 F099      BEQ	0x0154
    0141 308B      CPI	R24,0xB
    0142 E0E0      LDI	R30,0
    0143 079E      CPC	R25,R30
    0144 F069      BEQ	0x0152
    0145 308D      CPI	R24,0xD
    0146 E0E0      LDI	R30,0
    0147 079E      CPC	R25,R30
    0148 F039      BEQ	0x0150
    0149 308E      CPI	R24,0xE
    014A E0E0      LDI	R30,0
    014B 079E      CPC	R25,R30
    014C F009      BEQ	0x014E
    014D C007      RJMP	0x0155
(0097) 	{
(0098) 	 case (KEY_COL_ALL&(~(1<<KEY_COL_0))):
(0099) 	       key_i = 0;
    014E 2744      CLR	R20
(0100) 		   break;
    014F C005      RJMP	0x0155
(0101) 	 case (KEY_COL_ALL&(~(1<<KEY_COL_1))):
(0102) 	 	   key_i = 1;
    0150 E041      LDI	R20,1
(0103) 		   break;
    0151 C003      RJMP	0x0155
(0104) 	 case (KEY_COL_ALL&(~(1<<KEY_COL_2))):
(0105) 	       key_i = 2;
    0152 E042      LDI	R20,2
(0106) 		   break;
    0153 C001      RJMP	0x0155
(0107) 	 case (KEY_COL_ALL&(~(1<<KEY_COL_3))):
(0108) 	       key_i = 3;
    0154 E043      LDI	R20,3
(0109) 		   break;
(0110) 		   
(0111) 	// 扩展
(0112) 	#if PER_COL>4
(0113) 	case (KEY_COL_ALL&(~(1<<KEY_COL_4))):
(0114) 	       key_i = 4;
(0115) 		   break;
(0116)     #endif
(0117) 	#if PER_COL>5
(0118) 	case (KEY_COL_ALL&(~(1<<KEY_COL_5))):
(0119) 	       key_i = 5;
(0120) 		   break;
(0121)     #endif
(0122) 	#if PER_COL>6
(0123) 	case (KEY_COL_ALL&(~(1<<KEY_COL_6))):
(0124) 	       key_i = 6;
(0125) 		   break;
(0126)     #endif
(0127) 	#if PER_COL>7
(0128) 	case (KEY_COL_ALL&(~(1<<KEY_COL_7))):
(0129) 	       key_i = 7;
(0130) 		   break;
(0131)     #endif
(0132) 	
(0133) 	default:break;
(0134)     }//end switch
(0135)    
(0136)    //翻转,与初始化恰好相反
(0137)     KEY_DDR_ROW   &=~  KEY_ROW_ALL;							   //行输入,并使能内部上拉
    0155 B38A      IN	R24,0x1A
    0156 708F      ANDI	R24,0xF
    0157 BB8A      OUT	0x1A,R24
(0138) 	KEY_PORT_ROW  |=  KEY_ROW_ALL;
    0158 B38B      IN	R24,0x1B
    0159 6F80      ORI	R24,0xF0
    015A BB8B      OUT	0x1B,R24
(0139) 	KEY_DDR_COL   |=  KEY_COL_ALL;							   //列输出,低
    015B B38A      IN	R24,0x1A
    015C 608F      ORI	R24,0xF
    015D BB8A      OUT	0x1A,R24
(0140)     KEY_PORT_COL  &=~  KEY_COL_ALL;
    015E B38B      IN	R24,0x1B
    015F 7F80      ANDI	R24,0xF0
    0160 BB8B      OUT	0x1B,R24
(0141) 	
(0142)     NOP();		  	   			   							   //等待啊你家安稳定,此步骤不能少
    0161 0000      NOP
(0143)    
(0144)     temp_key = ( KEY_ROW_ALL & KEY_PIN_ROW );			   	   //读取翻转后键值
    0162 B369      IN	R22,0x19
    0163 7F60      ANDI	R22,0xF0
(0145) 	
(0146) 	switch(temp_key)
    0164 2777      CLR	R23
    0165 3B60      CPI	R22,0xB0
    0166 E0E0      LDI	R30,0
    0167 077E      CPC	R23,R30
    0168 F0C9      BEQ	0x0182
    0169 EB80      LDI	R24,0xB0
    016A E090      LDI	R25,0
    016B 1786      CP	R24,R22
    016C 0797      CPC	R25,R23
    016D F02C      BLT	0x0173
    016E 3760      CPI	R22,0x70
    016F E0E0      LDI	R30,0
    0170 077E      CPC	R23,R30
    0171 F091      BEQ	0x0184
    0172 C012      RJMP	0x0185
    0173 3D60      CPI	R22,0xD0
    0174 E0E0      LDI	R30,0
    0175 077E      CPC	R23,R30
    0176 F049      BEQ	0x0180
    0177 3D60      CPI	R22,0xD0
    0178 E0E0      LDI	R30,0
    0179 077E      CPC	R23,R30
    017A F054      BLT	0x0185
    017B 3E60      CPI	R22,0xE0
    017C E0E0      LDI	R30,0
    017D 077E      CPC	R23,R30
    017E F031      BEQ	0x0185
    017F C005      RJMP	0x0185
(0147) 	{
(0148) 	 case (KEY_ROW_ALL&(~(1<<KEY_ROW_0))):
(0149) 	       // key_i += 0; //加零,直接省掉
(0150) 		   break;
(0151) 	 case (KEY_ROW_ALL&(~(1<<KEY_ROW_1))):
(0152) 	 	   key_i += PER_POW;
    0180 5F4C      SUBI	R20,0xFC
(0153) 		   break;
    0181 C003      RJMP	0x0185
(0154) 	 case (KEY_ROW_ALL&(~(1<<KEY_ROW_2))):
(0155) 	       key_i += PER_POW*2;
    0182 5F48      SUBI	R20,0xF8
(0156) 		   break;
    0183 C001      RJMP	0x0185
(0157) 	 case (KEY_ROW_ALL&(~(1<<KEY_ROW_3))):
(0158) 	       key_i += PER_POW*3;
    0184 5F44      SUBI	R20,0xF4
(0159) 		   break;
(0160) 		   
(0161) 	// 扩展 PER_POW 最大值为8
(0162) 	#if PER_POW>4
(0163) 	case (KEY_ROW_ALL&(~(1<<KEY_ROW_4))):
(0164) 	       key_i += PER_POW*4;
(0165) 		   break;
(0166) 	#endif
(0167) 	#if PER_POW>5
(0168) 	case (KEY_ROW_ALL&(~(1<<KEY_ROW_5))):
(0169) 	       key_i += PER_POW*5;
(0170) 		   break;
(0171) 	#endif
(0172) 	#if PER_POW>6
(0173) 	case (KEY_ROW_ALL&(~(1<<KEY_ROW_6))):
(0174) 	       key_i += PER_POW*6;
(0175) 		   break;
(0176) 	#endif
(0177) 	#if PER_POW>7
(0178) 	case (KEY_ROW_ALL&(~(1<<KEY_ROW_7))):
(0179) 	       key_i += PER_POW*7;
(0180) 		   break;
(0181) 	#endif
(0182) 	
(0183) 	default:break;
(0184)     }//end switch
(0185) 
(0186) 	//检测按键抬起
(0187) 	#if WAIT_KEY_UP==1
(0188)  		 while((KEY_ROW_ALL & KEY_PIN_ROW)!=KEY_ROW_ALL)
    0185 B389      IN	R24,0x19
    0186 7F80      ANDI	R24,0xF0
    0187 3F80      CPI	R24,0xF0
    0188 F7E1      BNE	0x0185
(0189)   		 ;
(0190) 	#endif
(0191) 	
(0192) 	key_board_int(); 		  							//恢复键盘IO口的初时状态
    0189 DF90      RCALL	_key_board_int
(0193) 	
(0194)    }//end if have key
(0195)    return key_board_table[key_i];						//返回键值
    018A E685      LDI	R24,0x65
    018B E090      LDI	R25,0
    018C 2FE4      MOV	R30,R20
    018D 27FF      CLR	R31
    018E 0FE8      ADD	R30,R24
    018F 1FF9      ADC	R31,R25
    0190 9104      LPM	R16,0(Z)
    0191 C001      RJMP	0x0193
(0196)   }
(0197)   else
(0198)   return 0xFF;
    0192 EF0F      LDI	R16,0xFF
    0193 940E01E1  CALL	pop_gset3
    0195 9508      RET
FILE: D:\avrvi\democode\key_4\source\main.c
(0001) /************************************************************
(0002) 文   件:main.c
(0003) 用   途:演示矩阵键盘的库函数和七段数码管的库函数的使用
(0004) Target : M16
(0005) Crystal: 1.0000Mhz
(0006) 说   明:标有[]的为与key_3中不同的地方
(0007) 创   建:2008.2.20
(0008) 修   改:2008.2.20
(0009) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0010) ************************************************************/
(0011) 
(0012) #include "config.h"
(0013) 
(0014) void main(void)
(0015) {
(0016)   uint8 i=0;
_main:
  i                    --> R20
    0196 2744      CLR	R20
(0017)   
(0018)   key_board_int();						//矩阵按键初始化
    0197 940E011A  CALL	_key_board_int
(0019)   Seg7_Led_Init();						//七段数码管显示初始化
    0199 940E0089  CALL	_Seg7_Led_Init
(0020)   
(0021)   key_int_init();						//中断初始化  []
    019B 940E0114  CALL	_key_int_init
(0022)   SEI();								//开全局中断  []
    019D 9478      BSET	7
    019E C024      RJMP	0x01C3
(0023)   
(0024)   while(1)
(0025)   {
(0026)    if(KEY_FLAG)							   //如果有键按下,此变量在key_board.c中定义,并会在中断中改变 []
    019F 90200060  LDS	R2,KEY_FLAG
    01A1 2022      TST	R2
    01A2 F0F1      BEQ	0x01C1
(0027)    {
(0028)     KEY_FLAG = 0; 						   //         []							
    01A3 2422      CLR	R2
    01A4 92200060  STS	KEY_FLAG,R2
(0029) 	
(0030) 	if(key!=0xFF)						   //key为在key_board.c中定义的全局变量
    01A6 91800061  LDS	R24,key
    01A8 3F8F      CPI	R24,0xFF
    01A9 F0B9      BEQ	0x01C1
(0031) 	{
(0032) 	 for(i=3;i!=0;i--)						//左移位显示
    01AA E043      LDI	R20,3
    01AB C00F      RJMP	0x01BB
(0033) 	 {
(0034) 	 Seg7_Led_Buf[i]=Seg7_Led_Buf[i-1];
    01AC E681      LDI	R24,0x61
    01AD E090      LDI	R25,0
    01AE 2FE4      MOV	R30,R20
    01AF 27FF      CLR	R31
    01B0 0FE8      ADD	R30,R24
    01B1 1FF9      ADC	R31,R25
    01B2 8020      LDD	R2,Z+0
    01B3 E682      LDI	R24,0x62
    01B4 E090      LDI	R25,0
    01B5 2FE4      MOV	R30,R20
    01B6 27FF      CLR	R31
    01B7 0FE8      ADD	R30,R24
    01B8 1FF9      ADC	R31,R25
    01B9 8220      STD	Z+0,R2
    01BA 954A      DEC	R20
    01BB 2344      TST	R20
    01BC F779      BNE	0x01AC
(0035) 	 }
(0036) 	 Seg7_Led_Buf[0]=key;			   		
    01BD 90200061  LDS	R2,key
    01BF 92200062  STS	Seg7_Led_Buf,R2
(0037) 	}
(0038) 
(0039) 	/*
(0040) 	if(key!=0xFF)							//0xFF为无效按键
(0041) 	{
(0042) 	 switch(key)							//判断按键进行相关操作
(0043) 	 {
(0044) 	  case 'A':
(0045) 	    PORTA ^=(1<<PA0);
(0046) 		break;
(0047) 	  case 'B':
(0048) 	    PORTA ^=(1<<PA1);
(0049) 		break;
(0050) 	  case 'C':
(0051) 	    PORTA ^=(1<<PA2);
(0052) 		break;
(0053) 	  case 'D':
(0054) 	    PORTA ^=(1<<PA3);
(0055) 		break;
(0056) 	  default:
(0057) 	    break;
(0058) 	 } //end switch
(0059) 	}//end if(key!=0xFF)
(0060) 	*/
(0061) 	
(0062)    }//end if(HAVE_KEY_DOWN)
(0063)    //Delay100us(10);
(0064) 
(0065)   Seg7_Led_Update();	   					//按键显示
FILE: <library>
    01C1 940E009D  CALL	_Seg7_Led_Update
    01C3 CFDB      RJMP	0x019F
    01C4 9508      RET
mod16u:
    01C5 9468      BSET	6
    01C6 C001      RJMP	xdiv16u
div16u:
    01C7 94E8      BCLR	6
xdiv16u:
    01C8 92EA      ST	R14,-Y
    01C9 92FA      ST	R15,-Y
    01CA 938A      ST	R24,-Y
    01CB 24EE      CLR	R14
    01CC 24FF      CLR	R15
    01CD E180      LDI	R24,0x10
    01CE 0F00      LSL	R16
    01CF 1F11      ROL	R17
    01D0 1CEE      ROL	R14
    01D1 1CFF      ROL	R15
    01D2 16E2      CP	R14,R18
    01D3 06F3      CPC	R15,R19
    01D4 F018      BCS	0x01D8
    01D5 1AE2      SUB	R14,R18
    01D6 0AF3      SBC	R15,R19
    01D7 9503      INC	R16
    01D8 958A      DEC	R24
    01D9 F7A1      BNE	0x01CE
    01DA F416      BRTC	0x01DD
    01DB 2D0E      MOV	R16,R14
    01DC 2D1F      MOV	R17,R15
    01DD 9189      LD	R24,Y+
    01DE 90F9      LD	R15,Y+
    01DF 90E9      LD	R14,Y+
    01E0 9508      RET
pop_gset3:
    01E1 E0E4      LDI	R30,4
    01E2 940C01F0  JMP	pop
push_gset5:
    01E4 92FA      ST	R15,-Y
    01E5 92EA      ST	R14,-Y
push_gset4:
    01E6 92DA      ST	R13,-Y
    01E7 92CA      ST	R12,-Y
push_gset3:
    01E8 92BA      ST	R11,-Y
    01E9 92AA      ST	R10,-Y
push_gset2:
    01EA 937A      ST	R23,-Y
    01EB 936A      ST	R22,-Y
push_gset1:
    01EC 935A      ST	R21,-Y
    01ED 934A      ST	R20,-Y
    01EE 9508      RET
pop_gset1:
    01EF E0E1      LDI	R30,1
pop:
    01F0 9149      LD	R20,Y+
    01F1 9159      LD	R21,Y+
    01F2 FDE0      SBRC	R30,0
    01F3 9508      RET
    01F4 9169      LD	R22,Y+
    01F5 9179      LD	R23,Y+
    01F6 FDE1      SBRC	R30,1
    01F7 9508      RET
    01F8 90A9      LD	R10,Y+
    01F9 90B9      LD	R11,Y+
    01FA FDE2      SBRC	R30,2
    01FB 9508      RET
    01FC 90C9      LD	R12,Y+
    01FD 90D9      LD	R13,Y+
    01FE FDE3      SBRC	R30,3
    01FF 9508      RET
    0200 90E9      LD	R14,Y+
    0201 90F9      LD	R15,Y+
    0202 9508      RET
push_lset:
    0203 93FA      ST	R31,-Y
    0204 93EA      ST	R30,-Y
    0205 93BA      ST	R27,-Y
    0206 93AA      ST	R26,-Y
    0207 939A      ST	R25,-Y
    0208 938A      ST	R24,-Y
    0209 933A      ST	R19,-Y
    020A 932A      ST	R18,-Y
    020B 931A      ST	R17,-Y
    020C 930A      ST	R16,-Y
    020D 929A      ST	R9,-Y
    020E 928A      ST	R8,-Y
    020F 927A      ST	R7,-Y
    0210 926A      ST	R6,-Y
    0211 925A      ST	R5,-Y
    0212 924A      ST	R4,-Y
    0213 923A      ST	R3,-Y
    0214 922A      ST	R2,-Y
    0215 921A      ST	R1,-Y
    0216 920A      ST	R0,-Y
    0217 B60F      IN	R0,0x3F
    0218 920A      ST	R0,-Y
    0219 9508      RET
pop_lset:
    021A 9009      LD	R0,Y+
    021B BE0F      OUT	0x3F,R0
    021C 9009      LD	R0,Y+
    021D 9019      LD	R1,Y+
    021E 9029      LD	R2,Y+
    021F 9039      LD	R3,Y+
    0220 9049      LD	R4,Y+
    0221 9059      LD	R5,Y+
    0222 9069      LD	R6,Y+
    0223 9079      LD	R7,Y+
    0224 9089      LD	R8,Y+
    0225 9099      LD	R9,Y+
    0226 9109      LD	R16,Y+
    0227 9119      LD	R17,Y+
    0228 9129      LD	R18,Y+
    0229 9139      LD	R19,Y+
    022A 9189      LD	R24,Y+
    022B 9199      LD	R25,Y+
    022C 91A9      LD	R26,Y+
    022D 91B9      LD	R27,Y+
    022E 91E9      LD	R30,Y+
    022F 91F9      LD	R31,Y+
    0230 9508      RET

⌨️ 快捷键说明

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