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

📄 key.lis

📁 用ICCAVR编辑通过的
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -