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

📄 2x8_key.lst

📁 WINAVR写的2x8键盘扫描程序
💻 LST
字号:
   1               		.file	"2X8_key.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  74               	.global	key_init
  76               	key_init:
   1:2X8_key.c     **** /*---------------------------------------
   2:2X8_key.c     **** 2X8键盘扫描程序
   3:2X8_key.c     **** M16的PA5~PA7接74HC138的A.B.C输入端,74HC138的输出端接键盘的8列
   4:2X8_key.c     **** M16的PC6.PC7接键盘的2行
   5:2X8_key.c     **** 用定时器0定时中断来进行键盘扫描,返回键值,不能多键同时按,不能长按
   6:2X8_key.c     **** -----------------------------------------*/
   7:2X8_key.c     **** //定义MCU与按键的接口
   8:2X8_key.c     **** #include <avr/io.h>
   9:2X8_key.c     **** #include "2X8_key.h"
  10:2X8_key.c     **** #include "type.h"
  11:2X8_key.c     **** 
  12:2X8_key.c     **** #define key_SEL_PORT    PORTA
  13:2X8_key.c     **** #define key_SEL_DDR     DDRA
  14:2X8_key.c     **** #define key_PORT        PORTC
  15:2X8_key.c     **** #define key_DDR         DDRC
  16:2X8_key.c     **** #define key_PIN         PINC
  17:2X8_key.c     **** 
  18:2X8_key.c     **** #define key_SELA        PA5   //portA5
  19:2X8_key.c     **** #define key_SELB        PA6   //portA6
  20:2X8_key.c     **** #define key_SELC        PA7   //portA7
  21:2X8_key.c     **** #define key_KIN0        PC6   //portC6
  22:2X8_key.c     **** #define key_KIN1        PC7   //portC7
  23:2X8_key.c     **** 
  24:2X8_key.c     **** 
  25:2X8_key.c     **** /*----------------------------------------------------------
  26:2X8_key.c     **** key_init :按键相关端口初始化函数
  27:2X8_key.c     **** 输入参数 :无
  28:2X8_key.c     **** 输出参数 :无
  29:2X8_key.c     **** 作者     :ken
  30:2X8_key.c     **** 日期     :2007-08-15
  31:2X8_key.c     **** --------------------------------------------------------------*/
  32:2X8_key.c     **** void key_init(void)
  33:2X8_key.c     **** {
  78               	.LM1:
  79               	/* prologue: frame size=0 */
  80 0000 CF93      		push r28
  81 0002 DF93      		push r29
  82 0004 CDB7      		in r28,__SP_L__
  83 0006 DEB7      		in r29,__SP_H__
  84               	/* prologue end (size=4) */
  34:2X8_key.c     ****   key_SEL_DDR|=((1<<key_SELA)|(1<<key_SELB)|(1<<key_SELC));      //设置为输出
  86               	.LM2:
  87 0008 8091 3A00 		lds r24,58
  88 000c 806E      		ori r24,lo8(-32)
  89 000e 8093 3A00 		sts 58,r24
  35:2X8_key.c     ****   key_SEL_PORT&=~(1<<key_SELA);
  91               	.LM3:
  92 0012 8091 3B00 		lds r24,59
  93 0016 8F7D      		andi r24,lo8(-33)
  94 0018 8093 3B00 		sts 59,r24
  36:2X8_key.c     **** 	key_SEL_PORT&=~(1<<key_SELB);
  96               	.LM4:
  97 001c 8091 3B00 		lds r24,59
  98 0020 8F7B      		andi r24,lo8(-65)
  99 0022 8093 3B00 		sts 59,r24
  37:2X8_key.c     **** 	key_SEL_PORT&=~(1<<key_SELC);
 101               	.LM5:
 102 0026 9FE7      		ldi r25,lo8(127)
 103 0028 8091 3B00 		lds r24,59
 104 002c 8923      		and r24,r25
 105 002e 8093 3B00 		sts 59,r24
  38:2X8_key.c     **** 	key_PORT|=((1<<key_KIN0)|(1<<key_KIN1));                       //设置内部上拉电阻
 107               	.LM6:
 108 0032 8091 3500 		lds r24,53
 109 0036 806C      		ori r24,lo8(-64)
 110 0038 8093 3500 		sts 53,r24
  39:2X8_key.c     ****   key_DDR&=~(1<<key_KIN0);                                        //设置为输入  
 112               	.LM7:
 113 003c 8091 3400 		lds r24,52
 114 0040 8F7B      		andi r24,lo8(-65)
 115 0042 8093 3400 		sts 52,r24
  40:2X8_key.c     **** 	key_DDR&=~(1<<key_KIN1);
 117               	.LM8:
 118 0046 9FE7      		ldi r25,lo8(127)
 119 0048 8091 3400 		lds r24,52
 120 004c 8923      		and r24,r25
 121 004e 8093 3400 		sts 52,r24
 122               	/* epilogue: frame size=0 */
 123 0052 DF91      		pop r29
 124 0054 CF91      		pop r28
 125 0056 0895      		ret
 126               	/* epilogue end (size=3) */
 127               	/* function key_init size 44 (37) */
 129               	.Lscope0:
 131               	.global	key
 133               	key:
  41:2X8_key.c     **** }
  42:2X8_key.c     **** 
  43:2X8_key.c     **** 
  44:2X8_key.c     **** /*-------------------------------------------------------------------
  45:2X8_key.c     **** key :按键扫描函数
  46:2X8_key.c     **** 输入参数 :无
  47:2X8_key.c     **** 输出参数 :键码
  48:2X8_key.c     **** 作者     :ken
  49:2X8_key.c     **** 日期     :2007-08-15
  50:2X8_key.c     **** ---------------------------------------------------------------*/
  51:2X8_key.c     **** unsigned char key(void)
  52:2X8_key.c     **** {
 135               	.LM9:
 136               	/* prologue: frame size=3 */
 137 0058 CF93      		push r28
 138 005a DF93      		push r29
 139 005c CDB7      		in r28,__SP_L__
 140 005e DEB7      		in r29,__SP_H__
 141 0060 2397      		sbiw r28,3
 142 0062 0FB6      		in __tmp_reg__,__SREG__
 143 0064 F894      		cli
 144 0066 DEBF      		out __SP_H__,r29
 145 0068 0FBE      		out __SREG__,__tmp_reg__
 146 006a CDBF      		out __SP_L__,r28
 147               	/* prologue end (size=10) */
  53:2X8_key.c     ****   unsigned char row;                         //col表示行,row表示列
  54:2X8_key.c     ****   for(row=0;row<8;row++)
 149               	.LM10:
 150 006c 1982      		std Y+1,__zero_reg__
 151               	.L3:
 153               	.LM11:
 154 006e 8981      		ldd r24,Y+1
 155 0070 8830      		cpi r24,lo8(8)
 156 0072 70F5      		brsh .L4
  55:2X8_key.c     ****   {
  56:2X8_key.c     ****     key_SEL_PORT&=0x1f;                       
 158               	.LM12:
 159 0074 8091 3B00 		lds r24,59
 160 0078 8F71      		andi r24,lo8(31)
 161 007a 8093 3B00 		sts 59,r24
  57:2X8_key.c     ****     key_SEL_PORT|=(row<<5);                  //把row值送到高3位
 163               	.LM13:
 164 007e 8981      		ldd r24,Y+1
 165 0080 9927      		clr r25
 166 0082 880F      		lsl r24
 167 0084 991F      		rol r25
 168 0086 8295      		swap r24
 169 0088 9295      		swap r25
 170 008a 907F      		andi r25,0xf0
 171 008c 9827      		eor r25,r24
 172 008e 807F      		andi r24,0xf0
 173 0090 9827      		eor r25,r24
 174 0092 2091 3B00 		lds r18,59
 175 0096 822B      		or r24,r18
 176 0098 8093 3B00 		sts 59,r24
  58:2X8_key.c     **** 
  59:2X8_key.c     **** 		if((key_PIN&(1<<key_KIN1))==0)           //第二行有按键按下
 178               	.LM14:
 179 009c 8091 3300 		lds r24,51
 180 00a0 8823      		tst r24
 181 00a2 34F0      		brlt .L6
  60:2X8_key.c     **** 		{
  61:2X8_key.c     **** 		  return(10+row);                        //返回第二行键值10-17
 183               	.LM15:
 184 00a4 8981      		ldd r24,Y+1
 185 00a6 865F      		subi r24,lo8(-(10))
 186 00a8 9927      		clr r25
 187 00aa 9B83      		std Y+3,r25
 188 00ac 8A83      		std Y+2,r24
 189 00ae 14C0      		rjmp .L2
 190               	.L6:
  62:2X8_key.c     **** 		}
  63:2X8_key.c     ****     
  64:2X8_key.c     **** 		if((key_PIN&(1<<key_KIN0))==0)           //第一行有按键按下
 192               	.LM16:
 193 00b0 8091 3300 		lds r24,51
 194 00b4 9927      		clr r25
 195 00b6 8074      		andi r24,lo8(64)
 196 00b8 9070      		andi r25,hi8(64)
 197 00ba 0097      		sbiw r24,0
 198 00bc 29F4      		brne .L5
  65:2X8_key.c     ****     {
  66:2X8_key.c     **** 		  return(row);                           //返回第一行键值00-07
 200               	.LM17:
 201 00be 8981      		ldd r24,Y+1
 202 00c0 9927      		clr r25
 203 00c2 9B83      		std Y+3,r25
 204 00c4 8A83      		std Y+2,r24
 205 00c6 08C0      		rjmp .L2
 206               	.L5:
 208               	.LM18:
 209 00c8 8981      		ldd r24,Y+1
 210 00ca 8F5F      		subi r24,lo8(-(1))
 211 00cc 8983      		std Y+1,r24
 212 00ce CFCF      		rjmp .L3
 213               	.L4:
  67:2X8_key.c     **** 		}		
  68:2X8_key.c     **** 	
  69:2X8_key.c     **** 	}
  70:2X8_key.c     **** 	return(9);
 215               	.LM19:
 216 00d0 89E0      		ldi r24,lo8(9)
 217 00d2 90E0      		ldi r25,hi8(9)
 218 00d4 9B83      		std Y+3,r25
 219 00d6 8A83      		std Y+2,r24
 220               	.L2:
  71:2X8_key.c     **** }		
 222               	.LM20:
 223 00d8 8A81      		ldd r24,Y+2
 224 00da 9B81      		ldd r25,Y+3
 225               	/* epilogue: frame size=3 */
 226 00dc 2396      		adiw r28,3
 227 00de 0FB6      		in __tmp_reg__,__SREG__
 228 00e0 F894      		cli
 229 00e2 DEBF      		out __SP_H__,r29
 230 00e4 0FBE      		out __SREG__,__tmp_reg__
 231 00e6 CDBF      		out __SP_L__,r28
 232 00e8 DF91      		pop r29
 233 00ea CF91      		pop r28
 234 00ec 0895      		ret
 235               	/* epilogue end (size=9) */
 236               	/* function key size 75 (56) */
 241               	.Lscope1:
 242               		.text
 244               	Letext:
 245               	/* File "2X8_key.c": code  119 = 0x0077 (  93), prologues  14, epilogues  12 */
DEFINED SYMBOLS
                            *ABS*:00000000 2X8_key.c
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:3      *ABS*:0000003f __SREG__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:4      *ABS*:0000003e __SP_H__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:5      *ABS*:0000003d __SP_L__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:6      *ABS*:00000000 __tmp_reg__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:7      *ABS*:00000001 __zero_reg__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:76     .text:00000000 key_init
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:133    .text:00000058 key
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccohbaaa.s:244    .text:000000ee Letext

UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss

⌨️ 快捷键说明

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