矩阵式按键.lst
来自「ICC mega8例子」· LST 代码 · 共 483 行
LST
483 行
__text_start:
__start:
1B E5CF LDI R28,0x5F
1C E0D4 LDI R29,4
1D BFCD OUT 0x3D,R28
1E BFDE OUT 0x3E,R29
1F 51CE SUBI R28,0x1E
20 40D0 SBCI R29,0
21 EA0A LDI R16,0xAA
22 8308 STD Y+0,R16
23 2400 CLR R0
24 E6E0 LDI R30,0x60
25 E0F0 LDI R31,0
26 E010 LDI R17,0
27 36E0 CPI R30,0x60
28 07F1 CPC R31,R17
29 F011 BEQ 0x002C
2A 9201 ST R0,Z+
2B CFFB RJMP 0x0027
2C 8300 STD Z+0,R16
2D E3E6 LDI R30,0x36
2E E0F0 LDI R31,0
2F E6A0 LDI R26,0x60
30 E0B0 LDI R27,0
31 E010 LDI R17,0
32 E000 LDI R16,0
33 BF0B OUT 0x3B,R16
34 33E6 CPI R30,0x36
35 07F1 CPC R31,R17
36 F021 BEQ 0x003B
37 95C8 LPM
38 9631 ADIW R30,1
39 920D ST R0,X+
3A CFF9 RJMP 0x0034
3B D0C2 RCALL _main
_exit:
3C CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_矩阵式按键\矩阵式按键.c
(0001) //ICC-AVR application builder : 2009-3-12 17:58:29
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
3D 2422 CLR R2
3E BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
3F BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
40 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
41 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
42 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
43 BA21 OUT 0x11,R2
44 9508 RET
(0016) }
(0017)
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021) //stop errant interrupts until set up
(0022) CLI(); //disable all interrupts
_init_devices:
45 94F8 BCLR 7
(0023) port_init();
46 DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
47 2422 CLR R2
48 BE25 OUT 0x35,R2
(0026) GICR = 0x00;
49 BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
4A BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
4B 9478 BSET 7
4C 9508 RET
(0029) //all peripherals are now initialized
(0030) }
(0031)
(0032) /************************************
(0033) 用 途:微秒级延时程序
(0034) Taget :mega8
(0035) crystal :8M
(0036) 介 绍:在8M的晶振上进行us级的延时
(0037) 入口参数:
(0038) *************************************/
(0039) void delay_us(int time)
(0040) {
(0041) do
(0042) {
(0043) time--;
_delay_us:
time --> R16
4D 5001 SUBI R16,1
4E 4010 SBCI R17,0
(0044) }
(0045) while (time > 1);
4F E081 LDI R24,1
50 E090 LDI R25,0
51 1780 CP R24,R16
52 0791 CPC R25,R17
53 F3CC BLT 0x004D
54 9508 RET
_show_2_digit:
i --> Y,+1
digi --> R10
55 92AA ST R10,-Y
56 2EA0 MOV R10,R16
(0046) }
(0047)
(0048)
(0049) /************************************
(0050) 用 途:两位数码管显示一个数
(0051) Taget :mega8
(0052) crystal :8M
(0053) 介 绍:共阳数码管
(0054) 1-PC1(片选)
(0055) 2-PC0
(0056) -----
(0057) a-PB0(数据)
(0058) b-PB1
(0059) ...
(0060) h-PB6
(0061) DP-PB7
(0062) 入口参数:要显示的数,十进制表示
(0063) *************************************/
(0064) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0065) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0066) void show_2_digit(unsigned char digi)
(0067) {
(0068) unsigned char i;
(0069) DDRC=0xff;
57 EF8F LDI R24,0xFF
58 BB84 OUT 0x14,R24
(0070) DDRB=0xff;
59 BB87 OUT 0x17,R24
(0071) PORTC=0;//关片选
5A 2422 CLR R2
5B BA25 OUT 0x15,R2
(0072) PORTB=~num[(unsigned char )(digi/10)];//显示十位
5C E02A LDI R18,0xA
5D E030 LDI R19,0
5E 2D0A MOV R16,R10
5F 2711 CLR R17
60 D0AE RCALL div16s
61 2FE0 MOV R30,R16
62 27FF CLR R31
63 E286 LDI R24,0x26
64 E090 LDI R25,0
65 0FE8 ADD R30,R24
66 1FF9 ADC R31,R25
67 9024 LPM R2,0(Z)
68 9420 COM R2
69 BA28 OUT 0x18,R2
(0073) PORTC=(0x1<<1);//开十位的显示
6A E082 LDI R24,2
6B BB85 OUT 0x15,R24
(0074) delay_us(200);
6C EC08 LDI R16,0xC8
6D E010 LDI R17,0
6E DFDE RCALL _delay_us
(0075) PORTC=0;//关显示
6F 2422 CLR R2
70 BA25 OUT 0x15,R2
(0076) PORTB=~num[(unsigned char )(digi%10)];//显示个位
71 E02A LDI R18,0xA
72 E030 LDI R19,0
73 2D0A MOV R16,R10
74 2711 CLR R17
75 D095 RCALL mod16s
76 2FE0 MOV R30,R16
77 27FF CLR R31
78 E286 LDI R24,0x26
79 E090 LDI R25,0
7A 0FE8 ADD R30,R24
7B 1FF9 ADC R31,R25
7C 9024 LPM R2,0(Z)
7D 9420 COM R2
7E BA28 OUT 0x18,R2
(0077) PORTC=(0x1<<0);//开个位的显示
7F E081 LDI R24,1
80 BB85 OUT 0x15,R24
(0078) delay_us(200);
81 EC08 LDI R16,0xC8
82 E010 LDI R17,0
83 DFC9 RCALL _delay_us
(0079) PORTC=0x0;//关显示
84 2422 CLR R2
85 BA25 OUT 0x15,R2
86 90A9 LD R10,Y+
87 9508 RET
_key_vetrix:
k --> R20
key0 --> R10
88 D0BB RCALL push_xgsetF00C
(0080) }
(0081)
(0082) /************************************
(0083) 用 途:矩阵键盘扫描子程序
(0084) Taget :mega8
(0085) crystal :8M
(0086) 介 绍:用的是D口
(0087) 入口参数:
(0088) 出口参数:没有是-1不然是0-15
(0089) *************************************/
(0090) char key_vetrix()
(0091) {
(0092) char k=-1;
89 EF4F LDI R20,0xFF
(0093) unsigned char key0;
(0094) DDRD=0xf0;
8A EF80 LDI R24,0xF0
8B BB81 OUT 0x11,R24
(0095) PORTD=0x0f;//扫描低位
8C E08F LDI R24,0xF
8D BB82 OUT 0x12,R24
(0096) delay_us(1);
8E E001 LDI R16,1
8F E010 LDI R17,0
90 DFBC RCALL _delay_us
(0097) key0=PIND;
91 B2A0 IN R10,0x10
(0098) key0=~(key0^0xf0);
92 EF80 LDI R24,0xF0
93 E090 LDI R25,0
94 2C2A MOV R2,R10
95 2433 CLR R3
96 2628 EOR R2,R24
97 2639 EOR R3,R25
98 9420 COM R2
99 9430 COM R3
9A 2CA2 MOV R10,R2
(0099) if (key0==0) return -1;
9B 2022 TST R2
9C F411 BNE 0x009F
9D EF0F LDI R16,0xFF
9E C05E RJMP 0x00FD
(0100) //----------------------扫行
(0101) delay_us(500);//延时消抖
9F EF04 LDI R16,0xF4
A0 E011 LDI R17,1
A1 DFAB RCALL _delay_us
(0102) key0=PIND;
A2 B2A0 IN R10,0x10
(0103) key0=~(key0^0xf0);
A3 EF80 LDI R24,0xF0
A4 E090 LDI R25,0
A5 2C2A MOV R2,R10
A6 2433 CLR R3
A7 2628 EOR R2,R24
A8 2639 EOR R3,R25
A9 9420 COM R2
AA 9430 COM R3
AB 2CA2 MOV R10,R2
(0104) if (key0==0) return -1;
AC 2022 TST R2
AD F411 BNE 0x00B0
AE EF0F LDI R16,0xFF
AF C04D RJMP 0x00FD
(0105) switch ((key0))
B0 2D6A MOV R22,R10
B1 2777 CLR R23
B2 3061 CPI R22,1
B3 E0E0 LDI R30,0
B4 077E CPC R23,R30
B5 F069 BEQ 0x00C3
B6 3062 CPI R22,2
B7 E0E0 LDI R30,0
B8 077E CPC R23,R30
B9 F059 BEQ 0x00C5
BA 3064 CPI R22,4
BB E0E0 LDI R30,0
BC 077E CPC R23,R30
BD F049 BEQ 0x00C7
BE 3068 CPI R22,0x8
BF E0E0 LDI R30,0
C0 077E CPC R23,R30
C1 F039 BEQ 0x00C9
C2 C007 RJMP 0x00CA
(0106) {
(0107) case (0x01):k=0;break;
C3 2744 CLR R20
C4 C005 RJMP 0x00CA
(0108) case (0x02):k=4;break;
C5 E044 LDI R20,4
C6 C003 RJMP 0x00CA
(0109) case (0x04):k=8;break;
C7 E048 LDI R20,0x8
C8 C001 RJMP 0x00CA
(0110) case (0x08):k=12;break;
C9 E04C LDI R20,0xC
(0111) }
(0112) //---------------------扫列
(0113) DDRD=0x0f;
CA E08F LDI R24,0xF
CB BB81 OUT 0x11,R24
(0114) PORTD=0xf0;
CC EF80 LDI R24,0xF0
CD BB82 OUT 0x12,R24
(0115) delay_us(1);
CE E001 LDI R16,1
CF E010 LDI R17,0
D0 DF7C RCALL _delay_us
(0116) key0=PIND;
D1 B2A0 IN R10,0x10
(0117) key0=~(key0^0x0f);
D2 E08F LDI R24,0xF
D3 2C2A MOV R2,R10
D4 2628 EOR R2,R24
D5 9420 COM R2
D6 2CA2 MOV R10,R2
(0118) if (0==key0) return -1;
D7 2022 TST R2
D8 F411 BNE 0x00DB
D9 EF0F LDI R16,0xFF
DA C022 RJMP 0x00FD
(0119) switch ((key0>>4))
DB 2D6A MOV R22,R10
DC 2777 CLR R23
DD 9575 ASR R23
DE 9567 ROR R22
DF 9575 ASR R23
E0 9567 ROR R22
E1 9575 ASR R23
E2 9567 ROR R22
E3 9575 ASR R23
E4 9567 ROR R22
E5 3061 CPI R22,1
E6 E0E0 LDI R30,0
E7 077E CPC R23,R30
E8 F069 BEQ 0x00F6
E9 3062 CPI R22,2
EA E0E0 LDI R30,0
EB 077E CPC R23,R30
EC F051 BEQ 0x00F7
ED 3064 CPI R22,4
EE E0E0 LDI R30,0
EF 077E CPC R23,R30
F0 F041 BEQ 0x00F9
F1 3068 CPI R22,0x8
F2 E0E0 LDI R30,0
F3 077E CPC R23,R30
F4 F031 BEQ 0x00FB
F5 C006 RJMP 0x00FC
(0120) {
(0121) case 1:k+=0;break;
F6 C005 RJMP 0x00FC
(0122) case 2:k+=1;break;
F7 9543 INC R20
F8 C003 RJMP 0x00FC
(0123) case 4:k+=2;break;
F9 5F4E SUBI R20,0xFE
FA C001 RJMP 0x00FC
(0124) case 8:k+=3;break;
FB 5F4D SUBI R20,0xFD
(0125) }
(0126) /*while(0!=key0)//等待按起
(0127) {
(0128) key0=pinKEY;
(0129) key0=~(key0^0x0f);
(0130) }*/
(0131) return k;
FC 2F04 MOV R16,R20
FD C04D RJMP pop_xgsetF00C
(0132) }
(0133) //********************************
(0134)
(0135) void main()
(0136) {
(0137) char i,j=0;
_main:
i --> R12
j --> R10
FE 24AA CLR R10
(0138) port_init();
FF DF3D RCALL _port_init
(0139) init_devices();
100 DF44 RCALL _init_devices
101 C007 RJMP 0x0109
(0140)
(0141) while(1)
(0142) {
(0143)
(0144) if((i=key_vetrix())!=-1)
102 DF85 RCALL _key_vetrix
103 2EC0 MOV R12,R16
104 3F0F CPI R16,0xFF
105 F009 BEQ 0x0107
(0145) j=i;
106 2CAC MOV R10,R12
(0146) show_2_digit(j);
FILE: <library>
107 2D0A MOV R16,R10
108 DF4C RCALL _show_2_digit
109 CFF8 RJMP 0x0102
10A 9508 RET
mod16s:
10B 9468 BSET 6
10C 92DA ST R13,-Y
10D 2ED1 MOV R13,R17
10E C004 RJMP 0x0113
div16s:
10F 94E8 BCLR 6
110 92DA ST R13,-Y
111 2ED1 MOV R13,R17
112 26D3 EOR R13,R19
113 FF17 SBRS R17,7
114 C004 RJMP 0x0119
115 9510 COM R17
116 9500 COM R16
117 5F0F SUBI R16,0xFF
118 4F1F SBCI R17,0xFF
119 FF37 SBRS R19,7
11A C004 RJMP 0x011F
11B 9530 COM R19
11C 9520 COM R18
11D 5F2F SUBI R18,0xFF
11E 4F3F SBCI R19,0xFF
11F D00B RCALL xdiv16u
120 FED7 SBRS R13,7
121 C004 RJMP 0x0126
122 9510 COM R17
123 9500 COM R16
124 5F0F SUBI R16,0xFF
125 4F1F SBCI R17,0xFF
126 90D9 LD R13,Y+
127 9508 RET
mod16u:
128 9468 BSET 6
129 C001 RJMP xdiv16u
div16u:
12A 94E8 BCLR 6
xdiv16u:
12B 92EA ST R14,-Y
12C 92FA ST R15,-Y
12D 938A ST R24,-Y
12E 24EE CLR R14
12F 24FF CLR R15
130 E180 LDI R24,0x10
131 0F00 LSL R16
132 1F11 ROL R17
133 1CEE ROL R14
134 1CFF ROL R15
135 16E2 CP R14,R18
136 06F3 CPC R15,R19
137 F018 BCS 0x013B
138 1AE2 SUB R14,R18
139 0AF3 SBC R15,R19
13A 9503 INC R16
13B 958A DEC R24
13C F7A1 BNE 0x0131
13D F416 BRTC 0x0140
13E 2D0E MOV R16,R14
13F 2D1F MOV R17,R15
140 9189 LD R24,Y+
141 90F9 LD R15,Y+
142 90E9 LD R14,Y+
143 9508 RET
push_xgsetF00C:
144 937A ST R23,-Y
145 936A ST R22,-Y
146 935A ST R21,-Y
147 934A ST R20,-Y
148 92BA ST R11,-Y
149 92AA ST R10,-Y
14A 9508 RET
pop_xgsetF00C:
14B 90A9 LD R10,Y+
14C 90B9 LD R11,Y+
14D 9149 LD R20,Y+
14E 9159 LD R21,Y+
14F 9169 LD R22,Y+
150 9179 LD R23,Y+
151 9508 RET
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?