📄 intkey.lst
字号:
__start:
__text_start:
0018 E5CF LDI R28,0x5F
0019 E0D4 LDI R29,4
001A BFCD OUT 0x3D,R28
001B BFDE OUT 0x3E,R29
001C 51C0 SUBI R28,0x10
001D 40D0 SBCI R29,0
001E EA0A LDI R16,0xAA
001F 8308 STD Y+0,R16
0020 2400 CLR R0
0021 E6E0 LDI R30,0x60
0022 E0F0 LDI R31,0
0023 E010 LDI R17,0
0024 36E1 CPI R30,0x61
0025 07F1 CPC R31,R17
0026 F011 BEQ 0x0029
0027 9201 ST R0,Z+
0028 CFFB RJMP 0x0024
0029 8300 STD Z+0,R16
002A E3E0 LDI R30,0x30
002B E0F0 LDI R31,0
002C E6A0 LDI R26,0x60
002D E0B0 LDI R27,0
002E E010 LDI R17,0
002F 33E0 CPI R30,0x30
0030 07F1 CPC R31,R17
0031 F021 BEQ 0x0036
0032 95C8 LPM
0033 9631 ADIW R30,1
0034 920D ST R0,X+
0035 CFF9 RJMP 0x002F
0036 D0B4 RCALL _main
_exit:
0037 CFFF RJMP _exit
_delay_us:
i --> R20
n --> R16
0038 D109 RCALL push_gset1
FILE: F:\Learn\AVR\Pro_Mega8\中断\IntKey\Delay.h
(0001)
(0002) void delay_us(unsigned int n)
(0003) {
(0004) unsigned int i;
(0005) for(i=n;i>0;i--);
0039 01A8 MOVW R20,R16
003A C002 RJMP 0x003D
003B 5041 SUBI R20,1
003C 4050 SBCI R21,0
003D 3040 CPI R20,0
003E 0745 CPC R20,R21
003F F7D9 BNE 0x003B
(0006) }
0040 D104 RCALL pop_gset1
0041 9508 RET
(0007)
(0008) //延时1MS
(0009) void delay_1ms(void)
(0010) {
(0011) unsigned int i;
(0012) for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
i --> R16
0042 E001 LDI R16,1
0043 E010 LDI R17,0
0044 C002 RJMP 0x0047
0045 5F0F SUBI R16,0xFF
0046 4F1F SBCI R17,0xFF
0047 3706 CPI R16,0x76
0048 E0E4 LDI R30,4
0049 071E CPC R17,R30
004A F3D0 BCS 0x0045
(0013) ;
(0014) }
004B 9508 RET
_delay_ms:
i --> R20
n --> R22
004C D10C RCALL push_gset2
004D 01B8 MOVW R22,R16
(0015)
(0016) //延时nMS
(0017) void delay_ms(unsigned int n)
(0018) {
(0019) unsigned int i=0;
004E 2744 CLR R20
004F 2755 CLR R21
0050 C003 RJMP 0x0054
(0020) while(i<n)
(0021) {
(0022) delay_1ms();
0051 DFF0 RCALL _delay_1ms
(0023) i++;
0052 5F4F SUBI R20,0xFF
0053 4F5F SBCI R21,0xFF
0054 1746 CP R20,R22
0055 0757 CPC R21,R23
0056 F3D0 BCS 0x0051
(0024) }
(0025) }
0057 D0E6 RCALL pop_gset2
0058 9508 RET
_ScanKey:
temp1 --> R22
key --> R20
temp --> R20
0059 D102 RCALL push_gset3
FILE: F:\Learn\AVR\Pro_Mega8\中断\IntKey\IntKey.C
(0001) /******************************************/
(0002) //文件名:IntKey.c
(0003) //功能: 中断触发键盘扫描的应用
(0004) //作者: young
(0005) //时间: 2006.11.6
(0006) //目标MCU:ATmega8
(0007) //晶振: 8MHZ
(0008) /******************************************/
(0009) #include <iom8v.h>
(0010) #include <macros.h>
(0011) #include "Delay.h"
(0012)
(0013) unsigned char KeyDown;
(0014)
(0015) //按键扫描函数,返回按键的值
(0016) unsigned char ScanKey(void)
(0017) {
(0018) unsigned char temp,temp1,key;
(0019) temp=PINC;
005A B343 IN R20,0x13
(0020) temp&=0x38;
005B 7348 ANDI R20,0x38
(0021) switch(temp) //判断行中哪条线有低电平
005C 2755 CLR R21
005D 3248 CPI R20,0x28
005E E0E0 LDI R30,0
005F 075E CPC R21,R30
0060 F1A1 BEQ 0x0095
0061 E288 LDI R24,0x28
0062 E090 LDI R25,0
0063 1784 CP R24,R20
0064 0795 CPC R25,R21
0065 F034 BLT 0x006C
0066 3148 CPI R20,0x18
0067 E0E0 LDI R30,0
0068 075E CPC R21,R30
0069 F409 BNE 0x006B
006A C04F RJMP 0x00BA
006B C071 RJMP 0x00DD
006C 3340 CPI R20,0x30
006D E0E0 LDI R30,0
006E 075E CPC R21,R30
006F F009 BEQ 0x0071
0070 C06C RJMP 0x00DD
(0022) {
(0023) case 0x30:
(0024) DDRC=0X38;
0071 E388 LDI R24,0x38
0072 BB84 OUT 0x14,R24
(0025) PORTC=0X07;
0073 E087 LDI R24,7
0074 BB85 OUT 0x15,R24
(0026) delay_us(1);
0075 E001 LDI R16,1
0076 E010 LDI R17,0
0077 DFC0 RCALL _delay_us
(0027) temp1=PINC;
0078 B363 IN R22,0x13
(0028) temp1&=0x07;
0079 7067 ANDI R22,7
(0029) switch(temp1) //判断列中哪条线有低电平
007A 2F46 MOV R20,R22
007B 2755 CLR R21
007C 3043 CPI R20,3
007D E0E0 LDI R30,0
007E 075E CPC R21,R30
007F F069 BEQ 0x008D
0080 3045 CPI R20,5
0081 E0E0 LDI R30,0
0082 075E CPC R21,R30
0083 F039 BEQ 0x008B
0084 3046 CPI R20,6
0085 E0E0 LDI R30,0
0086 075E CPC R21,R30
0087 F009 BEQ 0x0089
0088 C006 RJMP 0x008F
(0030) {
(0031) case 0x06: key=0x01; //得到键值
0089 E041 LDI R20,1
(0032) break;
008A C005 RJMP 0x0090
(0033) case 0x05: key=0x04;
008B E044 LDI R20,4
(0034) break;
008C C003 RJMP 0x0090
(0035) case 0x03: key=0x07;
008D E047 LDI R20,7
(0036) break;
008E C001 RJMP 0x0090
(0037) default: key=0;
008F 2744 CLR R20
(0038) break;
(0039) }
(0040) DDRC=0X07;
0090 E087 LDI R24,7
0091 BB84 OUT 0x14,R24
(0041) PORTC=0X38;
0092 E388 LDI R24,0x38
0093 BB85 OUT 0x15,R24
(0042) break;
0094 C049 RJMP 0x00DE
(0043)
(0044) case 0x28:
(0045) DDRC=0X38;
0095 E388 LDI R24,0x38
0096 BB84 OUT 0x14,R24
(0046) PORTC=0X07;
0097 E087 LDI R24,7
0098 BB85 OUT 0x15,R24
(0047) delay_us(1);
0099 E001 LDI R16,1
009A E010 LDI R17,0
009B DF9C RCALL _delay_us
(0048) temp1=PINC;
009C B363 IN R22,0x13
(0049) temp1&=0x07;
009D 7067 ANDI R22,7
(0050) switch(temp1)
009E 2EA6 MOV R10,R22
009F 24BB CLR R11
00A0 01C5 MOVW R24,R10
00A1 3083 CPI R24,3
00A2 E0E0 LDI R30,0
00A3 079E CPC R25,R30
00A4 F069 BEQ 0x00B2
00A5 3085 CPI R24,5
00A6 E0E0 LDI R30,0
00A7 079E CPC R25,R30
00A8 F039 BEQ 0x00B0
00A9 3086 CPI R24,6
00AA E0E0 LDI R30,0
00AB 079E CPC R25,R30
00AC F009 BEQ 0x00AE
00AD C006 RJMP 0x00B4
(0051) {
(0052) case 0x06: key=0x02;
00AE E042 LDI R20,2
(0053) break;
00AF C005 RJMP 0x00B5
(0054) case 0x05: key=0x05;
00B0 E045 LDI R20,5
(0055) break;
00B1 C003 RJMP 0x00B5
(0056) case 0x03: key=0x08;
00B2 E048 LDI R20,0x8
(0057) break;
00B3 C001 RJMP 0x00B5
(0058) default: key=0;
00B4 2744 CLR R20
(0059) break;
(0060) }
(0061) DDRC=0X07;
00B5 E087 LDI R24,7
00B6 BB84 OUT 0x14,R24
(0062) PORTC=0X38;
00B7 E388 LDI R24,0x38
00B8 BB85 OUT 0x15,R24
(0063) break;
00B9 C024 RJMP 0x00DE
(0064)
(0065) case 0x18:
(0066) DDRC=0X38;
00BA E388 LDI R24,0x38
00BB BB84 OUT 0x14,R24
(0067) PORTC=0X07;
00BC E087 LDI R24,7
00BD BB85 OUT 0x15,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -