📄 key.s
字号:
.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 + -