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

📄 4x4key.s

📁 meg16 的所有功能实例
💻 S
字号:
	.module _4x4key.c
	.area text(rom, con, rel)
	.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
	.dbfunc e KEY_Init _KEY_Init fV
	.even
_KEY_Init::
	.dbline -1
	.dbline 96
; /****************************************Copyright (c)**************************************************
; **                               ADEmbed Development Co.,LTD.                                    
; **                                 http://www.adembed.com
; **--------------File Info-------------------------------------------------------------------------------
; ** File name:			main.c
; ** Last modified Date:  2008-12-13
; ** Last Version:		1.0
; ** Descriptions:		4*4Key Test.
; ** 
; **------------------------------------------------------------------------------------------------------
; ** Created by:			junbolu
; ** Created date:		2008-12-13
; ** Version:				1.0
; ** Descriptions:		
; **
; **------------------------------------------------------------------------------------------------------
; ** Modified by:
; ** Modified date:
; ** Version:
; ** Descriptions:
; **
; **------------------------------------------------------------------------------------------------------
; **ICC-AVR application builder : 2008-12-13
; **Target : M16
; **Crystal: 7.3728Mhz
; **PA0--->L1			PA1--->L2			PA2--->L3			PA3--->L4			
; **PA4--->H1			PA5--->H2			PA6--->H3			PA7--->H4	
; --------------------------
; | H4   C    D    E    F  |
; | H3   8    9    A    B  |
; | H2   4    5    6    7  |
; | H1   0    1    2    3  |
; | /    L1   L2   L3   L4 |
; --------------------------	   
; **描述:扫描4*4按键的状态,扫描到按键被按下后,将此键码发送到串口
; **      
; **
; **涉及知识点:
; **          DI输入DO输出
; **          while循环,case循环
; **			8位定时器,串口的应用
; *******************************************************************************************************/
; 
; #include<iom16v.h>
; #include<macros.h>
; #include"Define.h"
; 
; 
; #define F_osc           7372800
; #define Baud_rate       9600   	   		  		 
; //管脚定义
; #define PIN_RXD			0 	//PD0   RXD
; #define PIN_TXD			1 	//PD1   TXD
; 
; 
; #define L1   	     BIT0	
; #define L2   	     BIT1
; #define L3   	     BIT2
; #define L4   	     BIT3
; #define H1   	     BIT4	
; #define H2   	     BIT5
; #define H3   	     BIT6
; #define H4   	     BIT7
; 
; #define KEY_DDR		 DDRA
; #define KEY_PORT	 PORTA
; #define KEY_IN		 PINA
; 
; 
; #define L1_H1		 0x00
; #define L2_H1		 0x01
; #define L3_H1		 0x02
; #define L4_H1		 0x03
; #define L1_H2		 0x04
; #define L2_H2		 0x05
; #define L3_H2		 0x06
; #define L4_H2		 0x07
; #define L1_H3		 0x08
; #define L2_H3		 0x09
; #define L3_H3		 0x0A
; #define L4_H3		 0x0B
; #define L1_H4		 0x0C
; #define L2_H4		 0x0D
; #define L3_H4		 0x0E
; #define L4_H4		 0x0F
; 
; #define ON_PUSH		 0xFF
; 
; unsigned char Key_State;
; unsigned char Key_Value;
; 
; void Uart_Init(void); 
; void USART_TXD(uint8 data);
; 
; void KEY_Init(void)
; {
	.dbline 97
;  KEY_DDR |= L1&L2&L3&L4;  	            //设为输出
	in R2,0x1a
	out 0x1a,R2
	.dbline 98
;  KEY_PORT|= L1&L2&L3&L4;				//输出为高
	in R2,0x1b
	out 0x1b,R2
	.dbline 99
;  KEY_DDR &= ~(H1&H2&H3&H4);				//设为输入
	in R24,0x1a
	andi R24,255
	out 0x1a,R24
	.dbline 100
;  KEY_PORT|= H1&H2&H3&H4;				//上拉输入
	in R2,0x1b
	out 0x1b,R2
	.dbline 103
;  
;  //t/c0初始化
;  TCCR0=0X0D;
	ldi R24,13
	out 0x33,R24
	.dbline 104
;  TCNT0=0X00;
	clr R2
	out 0x32,R2
	.dbline 105
;  OCR0=0XF0;         //定时30ms
	ldi R24,240
	out 0x3c,R24
	.dbline 106
;  TIMSK|=0X02;
	in R24,0x39
	ori R24,2
	out 0x39,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 76
	jmp _timer0comp
	.area text(rom, con, rel)
	.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
	.dbfunc e timer0comp _timer0comp fV
	.even
_timer0comp::
	xcall push_lset
	.dbline -1
	.dbline 112
;  
; }
; 
; #pragma interrupt_handler timer0comp:20
; void timer0comp (void)
; { 
	.dbline 113
;  Read_Key();
	xcall _Read_Key
	.dbline -2
L2:
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e KEYDIN _KEYDIN fc
	.even
_KEYDIN::
	.dbline -1
	.dbline 118
; }
; 
; //=======================================================================
; unsigned char KEYDIN(void)
; {
	.dbline 119
;  	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	in R2,0x1b
	out 0x1b,R2
	.dbline 120
; 	KEY_PORT &= ~L1;						//扫描L1
	cbi 0x1b,0
	.dbline 122
; 	
;  	if((KEY_IN&H1)==H1)	 return L1_H1;
	in R24,0x19
	andi R24,16
	cpi R24,16
	brne L4
	.dbline 122
	clr R16
	xjmp L3
L4:
	.dbline 123
; 	if((KEY_IN&H2)==H2)	 return L1_H2;
	in R24,0x19
	andi R24,32
	cpi R24,32
	brne L6
	.dbline 123
	ldi R16,4
	xjmp L3
L6:
	.dbline 124
; 	if((KEY_IN&H3)==H3)	 return L1_H3;
	in R24,0x19
	andi R24,64
	cpi R24,64
	brne L8
	.dbline 124
	ldi R16,8
	xjmp L3
L8:
	.dbline 125
; 	if((KEY_IN&H4)==H4)	 return L1_H4;
	in R24,0x19
	andi R24,128
	cpi R24,128
	brne L10
	.dbline 125
	ldi R16,12
	xjmp L3
L10:
	.dbline 127
; 	
; 	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	in R2,0x1b
	out 0x1b,R2
	.dbline 128
; 	KEY_PORT &= ~L2;						//扫描L2
	cbi 0x1b,1
	.dbline 130
; 	
;  	if((KEY_IN&H1)==H1)	 return L2_H1;
	in R24,0x19
	andi R24,16
	cpi R24,16
	brne L12
	.dbline 130
	ldi R16,1
	xjmp L3
L12:
	.dbline 131
; 	if((KEY_IN&H2)==H2)	 return L2_H2;
	in R24,0x19
	andi R24,32
	cpi R24,32
	brne L14
	.dbline 131
	ldi R16,5
	xjmp L3
L14:
	.dbline 132
; 	if((KEY_IN&H3)==H3)	 return L2_H3;
	in R24,0x19
	andi R24,64
	cpi R24,64
	brne L16
	.dbline 132
	ldi R16,9
	xjmp L3
L16:
	.dbline 133
; 	if((KEY_IN&H4)==H4)	 return L2_H4;
	in R24,0x19
	andi R24,128
	cpi R24,128
	brne L18
	.dbline 133
	ldi R16,13
	xjmp L3
L18:
	.dbline 135
; 	
; 	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	in R2,0x1b
	out 0x1b,R2
	.dbline 136
; 	KEY_PORT &= ~L3;						//扫描L3
	cbi 0x1b,2
	.dbline 138
; 	
;  	if((KEY_IN&H1)==H1)	 return L3_H1;
	in R24,0x19
	andi R24,16
	cpi R24,16
	brne L20
	.dbline 138
	ldi R16,2
	xjmp L3
L20:
	.dbline 139
; 	if((KEY_IN&H2)==H2)	 return L3_H2;
	in R24,0x19
	andi R24,32
	cpi R24,32
	brne L22
	.dbline 139
	ldi R16,6
	xjmp L3
L22:
	.dbline 140
; 	if((KEY_IN&H3)==H3)	 return L3_H3;
	in R24,0x19
	andi R24,64
	cpi R24,64
	brne L24
	.dbline 140
	ldi R16,10
	xjmp L3
L24:
	.dbline 141
; 	if((KEY_IN&H4)==H4)	 return L3_H4;
	in R24,0x19
	andi R24,128
	cpi R24,128
	brne L26
	.dbline 141
	ldi R16,14
	xjmp L3
L26:
	.dbline 143
; 	
; 	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	in R2,0x1b
	out 0x1b,R2
	.dbline 144
; 	KEY_PORT &= ~L4;						//扫描L4
	cbi 0x1b,3
	.dbline 146
; 	
;  	if((KEY_IN&H1)==H1)	 return L4_H1;
	in R24,0x19
	andi R24,16
	cpi R24,16
	brne L28
	.dbline 146
	ldi R16,3
	xjmp L3
L28:
	.dbline 147
; 	if((KEY_IN&H2)==H2)	 return L4_H2;
	in R24,0x19
	andi R24,32
	cpi R24,32
	brne L30
	.dbline 147
	ldi R16,7
	xjmp L3
L30:
	.dbline 148
; 	if((KEY_IN&H3)==H3)	 return L4_H3;
	in R24,0x19
	andi R24,64
	cpi R24,64
	brne L32
	.dbline 148
	ldi R16,11
	xjmp L3
L32:
	.dbline 149
; 	if((KEY_IN&H4)==H4)	 return L4_H4;
	in R24,0x19
	andi R24,128
	cpi R24,128
	brne L34
	.dbline 149
	ldi R16,15
	xjmp L3
L34:
	.dbline 151
; 
; 	return ON_PUSH;
	ldi R16,255
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Read_Key _Read_Key fV
	.even
_Read_Key::
	xcall push_gset1
	.dbline -1
	.dbline 157
; 	
; }
; 
; //=======================================================================
; void Read_Key(void)
; {
	.dbline 158
;  switch(Key_State)
	lds R20,_Key_State
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L40
X0:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L43
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L46
	xjmp L37
X1:
	.dbline 159
;      {
L40:
	.dbline 161
;   	 case 0:
;          if(KEYDIN() != ON_PUSH)
	xcall _KEYDIN
	cpi R16,255
	breq L38
	.dbline 162
; 		 	{
	.dbline 163
; 			Key_State++;
	lds R24,_Key_State
	subi R24,255    ; addi 1
	sts _Key_State,R24
	.dbline 164
; 			}  
	.dbline 165
; 		 break;
	xjmp L38
L43:
	.dbline 167
;   	 case 1:
;          if(KEYDIN() != ON_PUSH)
	xcall _KEYDIN
	cpi R16,255
	breq L44
	.dbline 168
; 		    {
	.dbline 169
; 			 Key_State++;
	lds R24,_Key_State
	subi R24,255    ; addi 1
	sts _Key_State,R24
	.dbline 170
; 			 Key_Value=KEYDIN();
	xcall _KEYDIN
	sts _Key_Value,R16
	.dbline 171
; 			}
	xjmp L38
L44:
	.dbline 173
; 		 else 
; 		    {
	.dbline 174
; 			Key_State--;
	lds R24,_Key_State
	subi R24,1
	sts _Key_State,R24
	.dbline 175
; 			}
	.dbline 176
; 		 break;
	xjmp L38
L46:
	.dbline 178
;      case 2:
;          if(KEYDIN() == ON_PUSH)
	xcall _KEYDIN
	cpi R16,255
	brne L38
	.dbline 179
; 		    {
	.dbline 180
; 			Key_State=0;
	clr R2
	sts _Key_State,R2
	.dbline 181
; 			}
	.dbline 182
; 		 break;
L37:
L38:
	.dbline -2
L36:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 188
;      }
;  
; }
; 
; void main(void)
; {
	.dbline 189
;  KEY_Init();
	xcall _KEY_Init
	.dbline 191
;  
;  Key_State = 0;
	clr R2
	sts _Key_State,R2
	.dbline 192
;  Key_Value = ON_PUSH;
	ldi R24,255
	sts _Key_Value,R24
	.dbline 194
;  
;  Uart_Init();                 //TART初始化
	xcall _Uart_Init
	.dbline 195
;  SEI();                       //全局中断使能
	sei
	xjmp L51
L50:
	.dbline 198
;  
;  while(1)
;      {
	.dbline 199
;      if(Key_Value != ON_PUSH)
	lds R24,_Key_Value
	cpi R24,255
	breq L53
	.dbline 200
;          {
	.dbline 201
; 	     USART_TXD(Key_Value);
	mov R16,R24
	xcall _USART_TXD
	.dbline 202
; 		 Key_Value = ON_PUSH;
	ldi R24,255
	sts _Key_Value,R24
	.dbline 203
; 	     }
L53:
	.dbline 204
L51:
	.dbline 197
	xjmp L50
X2:
	.dbline -2
L49:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Uart_Init _Uart_Init fV
	.even
_Uart_Init::
	.dbline -1
	.dbline 209
;      }
; }
; 
; //===============================================================
; void Uart_Init(void)          //UART初始化
;   { 
	.dbline 213
;      
;     //设置侦格式
; 	//异步,8位数据,无奇偶校验,一个停止位,无倍速
; 	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	ldi R24,134
	out 0x20,R24
	.dbline 216
; 	
;     //设置波特率
;     UBRRL= (F_osc/Baud_rate/16-1)%256;
	ldi R24,47
	out 0x9,R24
	.dbline 217
;     UBRRH= (F_osc/Baud_rate/16-1)/256;
	clr R2
	out 0x20,R2
	.dbline 220
; 
; 	//使能接收中断,使能接收,使能发送
;     UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
	ldi R24,152
	out 0xa,R24
	.dbline -2
L55:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e USART_TXD _USART_TXD fV
;           data -> R16
	.even
_USART_TXD::
	.dbline -1
	.dbline 226
;   }
;   
; 
; //===============================================================
; void USART_TXD(uint8 data) //发送采用查询方式
; {
L57:
	.dbline 227
L58:
	.dbline 227
; 	while( !(UCSRA & BIT(UDRE)) );
	sbis 0xb,5
	rjmp L57
	.dbline 228
; 	UDR=data;
	out 0xc,R16
L60:
	.dbline 229
L61:
	.dbline 229
; 	while( !(UCSRA & BIT(TXC )) );
	sbis 0xb,6
	rjmp L60
	.dbline 230
; 	UCSRA|=BIT(TXC);
	sbi 0xb,6
	.dbline -2
L56:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbend
	.area vector(rom, abs)
	.org 44
	jmp _USART_RXC
	.area text(rom, con, rel)
	.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
	.dbfunc e USART_RXC _USART_RXC fV
	.even
_USART_RXC::
	.dbline -1
	.dbline 237
; }
; 
; //=======================================================================
; 
; #pragma interrupt_handler USART_RXC:12
; void USART_RXC(void)
; {
	.dbline -2
L63:
	.dbline 0 ; func end
	reti
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
_Key_Value::
	.blkb 1
	.dbsym e Key_Value _Key_Value c
_Key_State::
	.blkb 1
	.dbsym e Key_State _Key_State c

⌨️ 快捷键说明

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