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

📄 key.s

📁 用ICCAVR编辑通过的
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module key.c
	.area text(rom, con, rel)
	.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
	.dbfunc e key_scan _key_scan fc
	.even
_key_scan::
	.dbline -1
	.dbline 20
; 
; /*
; * Copyright (c) 2005, 广州力源电器公司开发部
; * All rights reserved.
; * 文件名称:key.c  负责驱动键盘以获得按键状态
; 
; * 当前版本: 1.0
; * 作者:	 张洪强
; * 完成日期: 2005.7.25
; */
; #include <iom8v.h>
; #include <macros.h>
; #include <eeprom.h> 
; //#include <interrupt.h>
; #include "init.h"
; 
; extern void CHECK_EDATA_A(void);
; 
; unsigned char key_scan(void)	 					//键盘函数
; {
	.dbline 21
;  	if(!( PINB & 0x01 ))							//是第一行
	sbic 0x16,0
	rjmp L2
	.dbline 22
;  	{
	.dbline 23
; 		return POWER_DOWN;  	 	  				//电源键按下
	ldi R16,1
	rjmp L1
L2:
	.dbline 25
;  	}
;  	else if(!( PINB & 0x02 ))						//是第二行
	sbic 0x16,1
	rjmp L4
	.dbline 26
;  	{
	.dbline 27
; 		return A_V_DOWN;  	 	  					//电流/电压切换键按下
	ldi R16,2
	rjmp L1
L4:
	.dbline 29
;  	}
;  	else if(!( PINB & 0x04 ))						//是第二行
	sbic 0x16,2
	rjmp L6
	.dbline 30
;  	{
	.dbline 31
; 		return CC_CV_DOWN;  	 	  				//稳流/稳压切换键按下
	ldi R16,4
	rjmp L1
L6:
	.dbline 33
;  	}
;  	else if(!( PINB & 0x08 ))						//是第二行
	sbic 0x16,3
	rjmp L8
	.dbline 34
;  	{
	.dbline 35
; 		return AUTO_MAN_DOWN;  	 	  			//自动/手动切换键按下
	ldi R16,8
	rjmp L1
L8:
	.dbline 37
;  	}	
; 	return 0;  	 	  							//返回键值
	clr R16
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e key_down _key_down fc
	.even
_key_down::
	.dbline -1
	.dbline 41
; }
; 
; unsigned char key_down(void)                      //判键盘是否活动函数
; {    
	.dbline 42
;     if (( PINB & 0x0f) != 0x0f )                   //如果有键按下
	in R24,0x16
	andi R24,15
	cpi R24,15
	breq L11
	.dbline 43
;     {
	.dbline 44
;         return 1;                 					//返回1
	ldi R16,1
	rjmp L10
L11:
	.dbline 47
;     }
;     else
;     {
	.dbline 48
; 		return 0;                  				//否则返回0
	clr R16
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.area data(ram, con, rel)
	.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
L14:
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
L15:
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
L16:
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
	.area text(rom, con, rel)
	.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
	.dbfunc e key_board _key_board fV
	.dbsym s i L16 i
	.dbsym s NUM_CHANGE L15 i
	.dbsym s KEY_DOWN_TIME L14 i
;      key_first -> R10
;        key_end -> R20
;      key_press -> R22
	.even
_key_board::
	rcall push_gset3
	sbiw R28,2
	.dbline -1
	.dbline 53
; 	} 
; }
; 
; void key_board(void)
; {
	.dbline 54
; 	unsigned char key_first, key_end, key_press = 0;
	clr R22
	.dbline 57
; 	static unsigned int KEY_DOWN_TIME = 0,NUM_CHANGE = FALSE,i = 0;
; 	
; 	if ( ( TIMER_NUM > 500 ) && SET_STATU )			
	ldi R24,500
	ldi R25,1
	lds R2,_TIMER_NUM
	lds R3,_TIMER_NUM+1
	cp R24,R2
	cpc R25,R3
	brsh L17
	lds R2,_SET_STATU
	tst R2
	breq L17
	.dbline 59
; 													//如果超时
; 	{
	.dbline 60
; 		SET_STATU = FALSE;
	clr R2
	sts _SET_STATU,R2
	.dbline 61
; 		TIMER_EN = FALSE;
	sts _TIMER_EN,R2
	.dbline 62
; 		if ( NUM_CHANGE )
	lds R2,L15
	lds R3,L15+1
	tst R2
	brne X0
	tst R3
	breq L19
X0:
	.dbline 63
; 		{
	.dbline 64
; 			NUM_CHANGE = FALSE;
	clr R2
	clr R3
	sts L15+1,R3
	sts L15,R2
	.dbline 65
; 			eeprom_busy_wait();
	rcall _eeprom_busy_wait
	.dbline 66
; 			cli();
	rcall _cli
	.dbline 67
; 			eeprom_write_block( (char*)MAX_A,(char*)0x20,6 );
	ldi R24,6
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,32
	ldi R19,0
	ldi R16,<_MAX_A
	ldi R17,>_MAX_A
	rcall _eeprom_write_block
	.dbline 68
; 			sei();
	rcall _sei
	.dbline 69
; 		}
L19:
	.dbline 70
; 		KEY_DOWN_TIME = 0;
	clr R2
	clr R3
	sts L14+1,R3
	sts L14,R2
	.dbline 71
; 		TIMER_NUM = 0;
	sts _TIMER_NUM+1,R3
	sts _TIMER_NUM,R2
	.dbline 72
; 		delayMS(100);						//延时10MS
	ldi R16,100
	rcall _delayMS
	.dbline 73
; 	}
L17:
	.dbline 74
; 	if ( key_down() )
	rcall _key_down
	tst R16
	brne X5
	rjmp L21
X5:
	.dbline 75
; 	{  
	.dbline 76
; 		key_first = key_scan();						//得到键值
	rcall _key_scan
	mov R10,R16
	.dbline 77
; 		delayMS(20);								//延时10MS;
	ldi R16,20
	rcall _delayMS
	.dbline 78
; 		key_end   = key_scan(); 
	rcall _key_scan
	mov R20,R16
	.dbline 79
; 		if ( key_end == key_first )
	cp R16,R10
	breq X6
	rjmp L23
X6:
	.dbline 80
; 		{
	.dbline 81
; 			key_press  = KEY_TEMP ^ key_end;
	lds R22,_KEY_TEMP
	eor R22,R16
	.dbline 82
; 			if ( key_end == A_V_DOWN )				//如果是电压/电流切换键
	cpi R16,2
	brne L25
	.dbline 83
; 			{
	.dbline 84
; 				KEY_DOWN_TIME++;					//按键记时
	lds R24,L14
	lds R25,L14+1
	adiw R24,1
	sts L14+1,R25
	sts L14,R24
	.dbline 85
; 				if ( KEY_DOWN_TIME > 1000 )			//如果持续按下
	ldi R24,1000
	ldi R25,3
	lds R2,L14
	lds R3,L14+1
	cp R24,R2
	cpc R25,R3
	brsh L27
	.dbline 86
; 				{
	.dbline 87
; 					SET_STATU = TRUE;
	ldi R24,1
	sts _SET_STATU,R24
	.dbline 88
; 					TIMER_EN = TRUE;
	sts _TIMER_EN,R24
	.dbline 89
; 					KEY_DOWN_TIME = 0;
	clr R2
	clr R3
	sts L14+1,R3
	sts L14,R2
	.dbline 90
; 				}
L27:
	.dbline 91
; 			}
L25:
	.dbline 92
; 			if (( KEY_INPUT == AUTO_MAN_DOWN ) && SET_STATU )			
	lds R24,_KEY_INPUT
	cpi R24,8
	brne L29
	lds R2,_SET_STATU
	tst R2
	breq L29
	.dbline 94
; 													//如果是电压/电流切换键
; 			{
	.dbline 95
; 				SET_STATU = FALSE;
	clr R2
	sts _SET_STATU,R2
	.dbline 96
; 				TIMER_EN = FALSE;
	sts _TIMER_EN,R2
	.dbline 97
; 				if ( NUM_CHANGE )
	lds R2,L15
	lds R3,L15+1
	tst R2
	brne X1
	tst R3
	breq L31
X1:
	.dbline 98
; 				{
	.dbline 99
; 					NUM_CHANGE = FALSE;
	clr R2
	clr R3
	sts L15+1,R3
	sts L15,R2
	.dbline 100
; 					eeprom_busy_wait();
	rcall _eeprom_busy_wait
	.dbline 101
; 					cli();
	rcall _cli
	.dbline 102
; 					eeprom_write_block( (char*)MAX_A,(char*)0x20,6 );
	ldi R24,6
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,32
	ldi R19,0
	ldi R16,<_MAX_A
	ldi R17,>_MAX_A
	rcall _eeprom_write_block
	.dbline 103
; 					sei();
	rcall _sei
	.dbline 104
; 				}
L31:
	.dbline 105
; 				key_press = 0x00;
	clr R22
	.dbline 106
; 				KEY_INPUT = 0x00;
	clr R2
	sts _KEY_INPUT,R2
	.dbline 107
; 				KEY_DOWN_TIME = 0;
	clr R3
	sts L14+1,R3
	sts L14,R2
	.dbline 108
; 				TIMER_NUM = 0;
	sts _TIMER_NUM+1,R3
	sts _TIMER_NUM,R2
	.dbline 109
; 				delayMS(100);						//延时10MS
	ldi R16,100
	rcall _delayMS
	.dbline 110
; 			}
L29:
	.dbline 111
; 		}
L23:
	.dbline 112
; 		if ( key_press ) 
	tst R22
	brne X7
	rjmp L22
X7:
	.dbline 113
; 		{
	.dbline 114
; 			KEY_INPUT = KEY_TEMP = key_end;
	sts _KEY_TEMP,R20
	sts _KEY_INPUT,R20
	.dbline 115
; 			if ( !SET_STATU )
	lds R2,_SET_STATU
	tst R2
	breq X8
	rjmp L22
X8:
	.dbline 116
; 			{
	.dbline 118
; 				//处理电源键
; 				if ( KEY_INPUT == POWER_DOWN )
	cpi R20,1
	brne L37
	.dbline 119
; 				{
	.dbline 120
; 					POWER_STATE = !POWER_STATE;		//改变电源按键的状态
	lds R2,_POWER_STATE
	tst R2
	brne L39
	ldi R20,1
	ldi R21,0
	rjmp L40
L39:
	clr R20
	clr R21
L40:
	sts _POWER_STATE,R20
	.dbline 121
; 					KEY_INPUT = 0;
	clr R2
	sts _KEY_INPUT,R2
	.dbline 122
; 					if ( POWER_STATE )
	tst R20
	breq L41
	.dbline 123
; 					{
	.dbline 124
; 						PORTB |= ( 1 << POWER );	//开启电源
	sbi 0x18,4
	.dbline 125
; 						eeprom_busy_wait();
	rcall _eeprom_busy_wait
	.dbline 126
; 						cli();
	rcall _cli
	.dbline 127
; 						eeprom_write_byte ( (char*)0x07, 0x01 );
	ldi R18,1
	ldi R19,0
	ldi R16,7
	ldi R17,0
	rcall _eeprom_write_byte
	.dbline 128
; 						sei();
	rcall _sei
	.dbline 129
; 					}
	rjmp L38
L41:
	.dbline 131
; 					else
; 					{
	.dbline 132
; 						PORTB &= ~( 1 << POWER );	//关闭电源
	cbi 0x18,4
	.dbline 133
; 						eeprom_busy_wait();
	rcall _eeprom_busy_wait
	.dbline 134
; 						cli();
	rcall _cli
	.dbline 135
; 						eeprom_write_byte ( (char*)0x07, 0x00 );
	clr R18
	clr R19
	ldi R16,7
	ldi R17,0
	rcall _eeprom_write_byte
	.dbline 136
; 						sei();
	rcall _sei
	.dbline 137
; 					}
	.dbline 138
; 				}	
	rjmp L38

⌨️ 快捷键说明

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