📄 key5.lis
字号:
.module key5.c
.area text(rom, con, rel)
0000 .dbfile D:\hujie\key5.c
0000 .dbfunc e key_scan _key_scan fc
0000 ; temp -> R20
.even
0000 _key_scan::
0000 00D0 rcall push_gset2
0002 .dbline -1
0002 .dbline 17
0002 ; // key_5.c
0002 ; //
0002 ;
0002 ; #include <io8515v.h>
0002 ; #include <macros.h>
0002 ; #include "1602LCD.h"
0002 ; #include "key5.h"
0002 ; #include "init.h"
0002 ; #include "main.h"
0002 ;
0002 ;
0002 ; /////////////////////////////////////////////
0002 ; // key_san()
0002 ; // 四键扫描函数
0002 ; //
0002 ; unsigned char key_scan(void)
0002 ; {
0002 .dbline 18
0002 ; unsigned char temp=0;
0002 4427 clr R20
0004 .dbline 19
0004 ; PORTD|=0X3B; //高四位置高
0004 82B3 in R24,0x12
0006 8B63 ori R24,59
0008 82BB out 0x12,R24
000A .dbline 20
000A ; DDRD&=0XC4; //高四位输入
000A 81B3 in R24,0x11
000C 847C andi R24,196
000E 81BB out 0x11,R24
0010 .dbline 21
0010 ; temp=PIND&0X3B;
0010 40B3 in R20,0x10
0012 4B73 andi R20,59
0014 .dbline 22
0014 ; if(temp!=0x3B)
0014 4B33 cpi R20,59
0016 89F1 breq L2
0018 .dbline 23
0018 ; {
0018 .dbline 24
0018 ; delay_nms(15);
0018 0FE0 ldi R16,15
001A 10E0 ldi R17,0
001C 00D0 rcall _delay_nms
001E .dbline 25
001E ; temp=PIND&0X3B;
001E 40B3 in R20,0x10
0020 4B73 andi R20,59
0022 .dbline 26
0022 ; if(temp!=0x3B)
0022 4B33 cpi R20,59
0024 51F1 breq L4
0026 .dbline 27
0026 ; switch(temp)
0026 642F mov R22,R20
0028 7727 clr R23
002A 6B32 cpi R22,43
002C E0E0 ldi R30,0
002E 7E07 cpc R23,R30
0030 09F1 breq L12
0032 8BE2 ldi R24,43
0034 90E0 ldi R25,0
0036 8617 cp R24,R22
0038 9707 cpc R25,R23
003A 2CF0 brlt L15
003C L14:
003C 6B31 cpi R22,27
003E E0E0 ldi R30,0
0040 7E07 cpc R23,R30
0042 D1F0 breq L13
0044 1AC0 rjmp L6
0046 L15:
0046 6333 cpi R22,51
0048 E0E0 ldi R30,0
004A 7E07 cpc R23,R30
004C 89F0 breq L11
004E 6333 cpi R22,51
0050 E0E0 ldi R30,0
0052 7E07 cpc R23,R30
0054 94F0 brlt L6
0056 L16:
0056 6933 cpi R22,57
0058 E0E0 ldi R30,0
005A 7E07 cpc R23,R30
005C 39F0 breq L10
005E 6A33 cpi R22,58
0060 E0E0 ldi R30,0
0062 7E07 cpc R23,R30
0064 09F0 breq L9
0066 09C0 rjmp L6
0068 X0:
0068 .dbline 28
0068 ; {
0068 L9:
0068 .dbline 29
0068 ; case 0x3A:temp=1;break;
0068 41E0 ldi R20,1
006A .dbline 29
006A 07C0 rjmp L7
006C L10:
006C .dbline 30
006C ; case 0x39:temp=2;break;
006C 42E0 ldi R20,2
006E .dbline 30
006E 05C0 rjmp L7
0070 L11:
0070 .dbline 31
0070 ; case 0x33:temp=3;break;
0070 43E0 ldi R20,3
0072 .dbline 31
0072 03C0 rjmp L7
0074 L12:
0074 .dbline 32
0074 ; case 0x2B:temp=4;break;
0074 44E0 ldi R20,4
0076 .dbline 32
0076 01C0 rjmp L7
0078 L13:
0078 .dbline 33
0078 ; case 0x1B:temp=5;break;
0078 45E0 ldi R20,5
007A .dbline 33
007A L6:
007A L7:
007A L4:
007A .dbline 35
007A ; }
007A ; }
007A L2:
007A .dbline 36
007A ; return (temp);
007A 042F mov R16,R20
007C .dbline -2
007C L1:
007C 00D0 rcall pop_gset2
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbsym r temp 20 c
0080 .dbend
0080 .dbfunc e keypad _keypad fc
0080 ; temp1 -> R20
0080 ; temp2 -> R22
.even
0080 _keypad::
0080 00D0 rcall push_gset2
0082 .dbline -1
0082 .dbline 44
0082 ; }
0082 ;
0082 ; /////////////////////////////////////////////
0082 ; // key_san()
0082 ; // 四键扫描函数(按键释放检查)
0082 ; //
0082 ; unsigned char keypad(void)
0082 ; {
0082 .dbline 46
0082 ; unsigned char temp1,temp2;
0082 ; temp1=key_scan();
0082 BEDF rcall _key_scan
0084 402F mov R20,R16
0086 .dbline 47
0086 ; if (temp1==0x3B)
0086 0B33 cpi R16,59
0088 11F4 brne L18
008A .dbline 48
008A ; return 0x3B;
008A 0BE3 ldi R16,59
008C 05C0 rjmp L17
008E L18:
008E L20:
008E .dbline 50
008E ; do
008E ; temp2=key_scan();
008E B8DF rcall _key_scan
0090 602F mov R22,R16
0092 L21:
0092 .dbline 51
0092 ; while(temp1==temp2);
0092 4617 cp R20,R22
0094 E1F3 breq L20
0096 .dbline 52
0096 ; return temp1;
0096 042F mov R16,R20
0098 .dbline -2
0098 L17:
0098 00D0 rcall pop_gset2
009A .dbline 0 ; func end
009A 0895 ret
009C .dbsym r temp1 20 c
009C .dbsym r temp2 22 c
009C .dbend
009C .dbfunc e key_service _key_service fV
009C ; temp -> R22
009C ; value -> R20,R21
009C ; data_length -> y+20
009C ; y -> R22
009C ; x -> R10
.even
009C _key_service::
009C 00D0 rcall push_gset3
009E 622F mov R22,R18
00A0 A02E mov R10,R16
00A2 2E97 sbiw R28,14
00A4 4E89 ldd R20,y+22
00A6 5F89 ldd R21,y+23
00A8 .dbline -1
00A8 .dbline 70
00A8 ; }
00A8 ;
00A8 ; ///////////////////////////////////////////////////
00A8 ; // key_service
00A8 ; // 按键服务函数:
00A8 ; // x ——数据显示列
00A8 ; // y ——数据显示行
00A8 ; // data_lentgh —— 数据长度
00A8 ; // *value —— 数据指针
00A8 ; // MODE: 1 2
00A8 ; // KEY: 1 确定
00A8 ; // 2 step+ +
00A8 ; // 3 step- -
00A8 ; // 4 移动光标
00A8 ; // 5 模式选择
00A8 ; //
00A8 ; void key_service(unsigned char x,unsigned char y,unsigned char data_length,unsigned int *value)
00A8 ; {
00A8 .dbline 73
00A8 ; unsigned char temp;
00A8 ;
00A8 ; temp=keypad();
00A8 EBDF rcall _keypad
00AA 602F mov R22,R16
00AC .dbline 74
00AC ; value_temp=*value;
00AC E42F mov R30,R20
00AE F52F mov R31,R21
00B0 2080 ldd R2,z+0
00B2 3180 ldd R3,z+1
00B4 30920100 sts _value_temp+1,R3
00B8 20920000 sts _value_temp,R2
00BC .dbline 75
00BC ; if(mode==1)
00BC 80910000 lds R24,_mode
00C0 8130 cpi R24,1
00C2 09F0 breq X3
00C4 4EC1 rjmp L24
00C6 X3:
00C6 .dbline 76
00C6 ; {
00C6 .dbline 77
00C6 ; switch (temp)
00C6 A62E mov R10,R22
00C8 BB24 clr R11
00CA 8A2D mov R24,R10
00CC 9B2D mov R25,R11
00CE 8130 cpi R24,1
00D0 E0E0 ldi R30,0
00D2 9E07 cpc R25,R30
00D4 51F0 breq L29
00D6 8330 cpi R24,3
00D8 E0E0 ldi R30,0
00DA 9E07 cpc R25,R30
00DC 41F1 breq L31
00DE 8430 cpi R24,4
00E0 E0E0 ldi R30,0
00E2 9E07 cpc R25,R30
00E4 09F4 brne X4
00E6 AFC0 rjmp L38
00E8 X4:
00E8 84C2 rjmp L25
00EA X1:
00EA .dbline 78
00EA ; {
00EA L29:
00EA .dbline 80
00EA ; case KEY_FN:
00EA ; mode=2;
00EA 82E0 ldi R24,2
00EC 80930000 sts _mode,R24
00F0 .dbline 81
00F0 ; LCD_write_string(0,1," ^ seting...");
00F0 80E0 ldi R24,<L30
00F2 90E0 ldi R25,>L30
00F4 9983 std y+1,R25
00F6 8883 std y+0,R24
00F8 21E0 ldi R18,1
00FA 0027 clr R16
00FC 00D0 rcall _LCD_write_string
00FE .dbline 82
00FE ; j=0;
00FE 2224 clr R2
0100 20920000 sts _j,R2
0104 .dbline 83
0104 ; LCD_display(2,0,4,*value);
0104 E42F mov R30,R20
0106 F52F mov R31,R21
0108 2080 ldd R2,z+0
010A 3180 ldd R3,z+1
010C 4424 clr R4
010E 5524 clr R5
0110 2A82 std y+2,R2
0112 3B82 std y+3,R3
0114 4C82 std y+4,R4
0116 5D82 std y+5,R5
0118 84E0 ldi R24,4
011A 8883 std y+0,R24
011C 2227 clr R18
011E 02E0 ldi R16,2
0120 00D0 rcall _LCD_display
0122 .dbline 84
0122 ; data_init(*value); // 送缓冲
0122 E42F mov R30,R20
0124 F52F mov R31,R21
0126 0081 ldd R16,z+0
0128 1181 ldd R17,z+1
012A 00D0 rcall _data_init
012C .dbline 85
012C ; break;
012C 62C2 rjmp L25
012E L31:
012E .dbline 87
012E ; case KEY_INC:
012E ; (*value)++;
012E E42F mov R30,R20
0130 F52F mov R31,R21
0132 8081 ldd R24,z+0
0134 9181 ldd R25,z+1
0136 0196 adiw R24,1
0138 9183 std z+1,R25
013A 8083 std z+0,R24
013C .dbline 88
013C ; if(*value>2000) (*value)=2000;
013C 80ED ldi R24,2000
013E 97E0 ldi R25,7
0140 2080 ldd R2,z+0
0142 3180 ldd R3,z+1
0144 8215 cp R24,R2
0146 9305 cpc R25,R3
0148 10F4 brsh L32
014A .dbline 88
014A 9183 std z+1,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -