📄 key.lis
字号:
.module key.c
.area text(rom, con, rel)
0000 .dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
0000 .dbfunc e key_scan _key_scan fc
.even
0000 _key_scan::
0000 .dbline -1
0000 .dbline 20
0000 ;
0000 ; /*
0000 ; * Copyright (c) 2005, 广州力源电器公司开发部
0000 ; * All rights reserved.
0000 ; * 文件名称:key.c 负责驱动键盘以获得按键状态
0000 ;
0000 ; * 当前版本: 1.0
0000 ; * 作者: 张洪强
0000 ; * 完成日期: 2005.7.25
0000 ; */
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #include <eeprom.h>
0000 ; //#include <interrupt.h>
0000 ; #include "init.h"
0000 ;
0000 ; extern void CHECK_EDATA_A(void);
0000 ;
0000 ; unsigned char key_scan(void) //键盘函数
0000 ; {
0000 .dbline 21
0000 ; if(!( PINB & 0x01 )) //是第一行
0000 B099 sbic 0x16,0
0002 02C0 rjmp L2
0004 .dbline 22
0004 ; {
0004 .dbline 23
0004 ; return POWER_DOWN; //电源键按下
0004 01E0 ldi R16,1
0006 0DC0 rjmp L1
0008 L2:
0008 .dbline 25
0008 ; }
0008 ; else if(!( PINB & 0x02 )) //是第二行
0008 B199 sbic 0x16,1
000A 02C0 rjmp L4
000C .dbline 26
000C ; {
000C .dbline 27
000C ; return A_V_DOWN; //电流/电压切换键按下
000C 02E0 ldi R16,2
000E 09C0 rjmp L1
0010 L4:
0010 .dbline 29
0010 ; }
0010 ; else if(!( PINB & 0x04 )) //是第二行
0010 B299 sbic 0x16,2
0012 02C0 rjmp L6
0014 .dbline 30
0014 ; {
0014 .dbline 31
0014 ; return CC_CV_DOWN; //稳流/稳压切换键按下
0014 04E0 ldi R16,4
0016 05C0 rjmp L1
0018 L6:
0018 .dbline 33
0018 ; }
0018 ; else if(!( PINB & 0x08 )) //是第二行
0018 B399 sbic 0x16,3
001A 02C0 rjmp L8
001C .dbline 34
001C ; {
001C .dbline 35
001C ; return AUTO_MAN_DOWN; //自动/手动切换键按下
001C 08E0 ldi R16,8
001E 01C0 rjmp L1
0020 L8:
0020 .dbline 37
0020 ; }
0020 ; return 0; //返回键值
0020 0027 clr R16
0022 .dbline -2
0022 L1:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbend
0024 .dbfunc e key_down _key_down fc
.even
0024 _key_down::
0024 .dbline -1
0024 .dbline 41
0024 ; }
0024 ;
0024 ; unsigned char key_down(void) //判键盘是否活动函数
0024 ; {
0024 .dbline 42
0024 ; if (( PINB & 0x0f) != 0x0f ) //如果有键按下
0024 86B3 in R24,0x16
0026 8F70 andi R24,15
0028 8F30 cpi R24,15
002A 11F0 breq L11
002C .dbline 43
002C ; {
002C .dbline 44
002C ; return 1; //返回1
002C 01E0 ldi R16,1
002E 01C0 rjmp L10
0030 L11:
0030 .dbline 47
0030 ; }
0030 ; else
0030 ; {
0030 .dbline 48
0030 ; return 0; //否则返回0
0030 0027 clr R16
0032 .dbline -2
0032 L10:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
.area data(ram, con, rel)
0000 .dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
0000 L14:
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
0002 L15:
0002 .blkb 2
.area idata
0002 0000 .word 0
.area data(ram, con, rel)
0004 .dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
0004 L16:
0004 .blkb 2
.area idata
0004 0000 .word 0
.area data(ram, con, rel)
0006 .dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
.area text(rom, con, rel)
0034 .dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\key.c
0034 .dbfunc e key_board _key_board fV
0034 .dbsym s i L16 i
0034 .dbsym s NUM_CHANGE L15 i
0034 .dbsym s KEY_DOWN_TIME L14 i
0034 ; key_first -> R10
0034 ; key_end -> R20
0034 ; key_press -> R22
.even
0034 _key_board::
0034 00D0 rcall push_gset3
0036 2297 sbiw R28,2
0038 .dbline -1
0038 .dbline 53
0038 ; }
0038 ; }
0038 ;
0038 ; void key_board(void)
0038 ; {
0038 .dbline 54
0038 ; unsigned char key_first, key_end, key_press = 0;
0038 6627 clr R22
003A .dbline 57
003A ; static unsigned int KEY_DOWN_TIME = 0,NUM_CHANGE = FALSE,i = 0;
003A ;
003A ; if ( ( TIMER_NUM > 500 ) && SET_STATU )
003A 84EF ldi R24,500
003C 91E0 ldi R25,1
003E 20900900 lds R2,_TIMER_NUM
0042 30900A00 lds R3,_TIMER_NUM+1
0046 8215 cp R24,R2
0048 9305 cpc R25,R3
004A 78F5 brsh L17
004C 20900700 lds R2,_SET_STATU
0050 2220 tst R2
0052 59F1 breq L17
0054 .dbline 59
0054 ; //如果超时
0054 ; {
0054 .dbline 60
0054 ; SET_STATU = FALSE;
0054 2224 clr R2
0056 20920700 sts _SET_STATU,R2
005A .dbline 61
005A ; TIMER_EN = FALSE;
005A 20920800 sts _TIMER_EN,R2
005E .dbline 62
005E ; if ( NUM_CHANGE )
005E 20900200 lds R2,L15
0062 30900300 lds R3,L15+1
0066 2220 tst R2
0068 11F4 brne X0
006A 3320 tst R3
006C 91F0 breq L19
006E X0:
006E .dbline 63
006E ; {
006E .dbline 64
006E ; NUM_CHANGE = FALSE;
006E 2224 clr R2
0070 3324 clr R3
0072 30920300 sts L15+1,R3
0076 20920200 sts L15,R2
007A .dbline 65
007A ; eeprom_busy_wait();
007A 00D0 rcall _eeprom_busy_wait
007C .dbline 66
007C ; cli();
007C 00D0 rcall _cli
007E .dbline 67
007E ; eeprom_write_block( (char*)MAX_A,(char*)0x20,6 );
007E 86E0 ldi R24,6
0080 90E0 ldi R25,0
0082 9983 std y+1,R25
0084 8883 std y+0,R24
0086 20E2 ldi R18,32
0088 30E0 ldi R19,0
008A 00E0 ldi R16,<_MAX_A
008C 10E0 ldi R17,>_MAX_A
008E 00D0 rcall _eeprom_write_block
0090 .dbline 68
0090 ; sei();
0090 00D0 rcall _sei
0092 .dbline 69
0092 ; }
0092 L19:
0092 .dbline 70
0092 ; KEY_DOWN_TIME = 0;
0092 2224 clr R2
0094 3324 clr R3
0096 30920100 sts L14+1,R3
009A 20920000 sts L14,R2
009E .dbline 71
009E ; TIMER_NUM = 0;
009E 30920A00 sts _TIMER_NUM+1,R3
00A2 20920900 sts _TIMER_NUM,R2
00A6 .dbline 72
00A6 ; delayMS(100); //延时10MS
00A6 04E6 ldi R16,100
00A8 00D0 rcall _delayMS
00AA .dbline 73
00AA ; }
00AA L17:
00AA .dbline 74
00AA ; if ( key_down() )
00AA BCDF rcall _key_down
00AC 0023 tst R16
00AE 09F4 brne X5
00B0 09C1 rjmp L21
00B2 X5:
00B2 .dbline 75
00B2 ; {
00B2 .dbline 76
00B2 ; key_first = key_scan(); //得到键值
00B2 A6DF rcall _key_scan
00B4 A02E mov R10,R16
00B6 .dbline 77
00B6 ; delayMS(20); //延时10MS;
00B6 04E1 ldi R16,20
00B8 00D0 rcall _delayMS
00BA .dbline 78
00BA ; key_end = key_scan();
00BA A2DF rcall _key_scan
00BC 402F mov R20,R16
00BE .dbline 79
00BE ; if ( key_end == key_first )
00BE 0A15 cp R16,R10
00C0 09F0 breq X6
00C2 58C0 rjmp L23
00C4 X6:
00C4 .dbline 80
00C4 ; {
00C4 .dbline 81
00C4 ; key_press = KEY_TEMP ^ key_end;
00C4 60910600 lds R22,_KEY_TEMP
00C8 6027 eor R22,R16
00CA .dbline 82
00CA ; if ( key_end == A_V_DOWN ) //如果是电压/电流切换键
00CA 0230 cpi R16,2
00CC E9F4 brne L25
00CE .dbline 83
00CE ; {
00CE .dbline 84
00CE ; KEY_DOWN_TIME++; //按键记时
00CE 80910000 lds R24,L14
00D2 90910100 lds R25,L14+1
00D6 0196 adiw R24,1
00D8 90930100 sts L14+1,R25
00DC 80930000 sts L14,R24
00E0 .dbline 85
00E0 ; if ( KEY_DOWN_TIME > 1000 ) //如果持续按下
00E0 88EE ldi R24,1000
00E2 93E0 ldi R25,3
00E4 20900000 lds R2,L14
00E8 30900100 lds R3,L14+1
00EC 8215 cp R24,R2
00EE 9305 cpc R25,R3
00F0 58F4 brsh L27
00F2 .dbline 86
00F2 ; {
00F2 .dbline 87
00F2 ; SET_STATU = TRUE;
00F2 81E0 ldi R24,1
00F4 80930700 sts _SET_STATU,R24
00F8 .dbline 88
00F8 ; TIMER_EN = TRUE;
00F8 80930800 sts _TIMER_EN,R24
00FC .dbline 89
00FC ; KEY_DOWN_TIME = 0;
00FC 2224 clr R2
00FE 3324 clr R3
0100 30920100 sts L14+1,R3
0104 20920000 sts L14,R2
0108 .dbline 90
0108 ; }
0108 L27:
0108 .dbline 91
0108 ; }
0108 L25:
0108 .dbline 92
0108 ; if (( KEY_INPUT == AUTO_MAN_DOWN ) && SET_STATU )
0108 80910500 lds R24,_KEY_INPUT
010C 8830 cpi R24,8
010E 91F5 brne L29
0110 20900700 lds R2,_SET_STATU
0114 2220 tst R2
0116 71F1 breq L29
0118 .dbline 94
0118 ; //如果是电压/电流切换键
0118 ; {
0118 .dbline 95
0118 ; SET_STATU = FALSE;
0118 2224 clr R2
011A 20920700 sts _SET_STATU,R2
011E .dbline 96
011E ; TIMER_EN = FALSE;
011E 20920800 sts _TIMER_EN,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -