📄 4x4key.lst
字号:
__start:
__text_start:
2A E5CF LDI R28,0x5F
2B E0D4 LDI R29,4
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51CE SUBI R28,0x1E
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 36E3 CPI R30,0x63
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A 940E 01C6 CALL _main
_exit:
4C CFFF RJMP _exit
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\ch595.h
(0001) //向ch595写数据
(0002) #define clk 1
(0003) #define rclk 2
(0004) #define dat 3
(0005)
(0006) //延时函数
(0007) void s_ms(unsigned int t)
(0008) {
(0009) for(;t>1;t--)
_s_ms:
t --> R16
4D C002 RJMP 0x0050
4E 5001 SUBI R16,1
4F 4010 SBCI R17,0
50 E081 LDI R24,1
51 E090 LDI R25,0
52 1780 CP R24,R16
53 0791 CPC R25,R17
54 F3C8 BCS 0x004E
55 9508 RET
_sendbyte:
tem --> R10
i --> R22
byte --> R20
56 940E 020E CALL push_xgsetF00C
58 2F40 MOV R20,R16
(0010) {
(0011) }
(0012) }
(0013) //写74hc595函数
(0014) void sendbyte(uchar byte)
(0015) {
(0016) uchar i,tem;
(0017) byte=encoder(byte); //译码
59 2F04 MOV R16,R20
5A 2711 CLR R17
5B D018 RCALL _encoder
5C 2F40 MOV R20,R16
(0018) for(i=0;i<8;i++)
5D 2766 CLR R22
5E C00C RJMP 0x006B
(0019) {
(0020) PORTA&=~(1<<clk);
5F 98D9 CBI 0x1B,1
(0021) tem=(byte&0x80);
60 2F84 MOV R24,R20
61 7880 ANDI R24,0x80
62 2EA8 MOV R10,R24
(0022) if(tem==0)
63 2388 TST R24
64 F411 BNE 0x0067
(0023) {
(0024) PORTA&=~(1<<dat);
65 98DB CBI 0x1B,3
(0025) }
66 C001 RJMP 0x0068
(0026) else
(0027) {
(0028) PORTA|=(1<<dat);
67 9ADB SBI 0x1B,3
(0029) }
(0030) byte=byte<<1;
68 0F44 LSL R20
(0031) PORTA|=(1<<clk);
69 9AD9 SBI 0x1B,1
6A 9563 INC R22
6B 3068 CPI R22,0x8
6C F390 BCS 0x005F
(0032) }
(0033) PORTA&=~(1<<rclk);
6D 98DA CBI 0x1B,2
(0034) s_ms(100);
6E E604 LDI R16,0x64
6F E010 LDI R17,0
70 DFDC RCALL _s_ms
(0035) PORTA|=(1<<rclk);
71 9ADA SBI 0x1B,2
72 940C 0215 JMP pop_xgsetF00C
_encoder:
code --> R20
num --> R16
74 940E 0204 CALL push_xgsetF000
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\encoder.h
(0001) //数码管译码函数
(0002) uchar encoder(uchar num)
(0003) {
(0004) uchar code;
(0005) switch(num)
76 2F60 MOV R22,R16
77 2777 CLR R23
78 3060 CPI R22,0
79 0767 CPC R22,R23
7A F129 BEQ 0x00A0
7B 3061 CPI R22,1
7C E0E0 LDI R30,0
7D 077E CPC R23,R30
7E F119 BEQ 0x00A2
7F 3062 CPI R22,2
80 E0E0 LDI R30,0
81 077E CPC R23,R30
82 F109 BEQ 0x00A4
83 3063 CPI R22,3
84 E0E0 LDI R30,0
85 077E CPC R23,R30
86 F0F9 BEQ 0x00A6
87 3064 CPI R22,4
88 E0E0 LDI R30,0
89 077E CPC R23,R30
8A F0E9 BEQ 0x00A8
8B 3065 CPI R22,5
8C E0E0 LDI R30,0
8D 077E CPC R23,R30
8E F0D9 BEQ 0x00AA
8F 3066 CPI R22,6
90 E0E0 LDI R30,0
91 077E CPC R23,R30
92 F0C9 BEQ 0x00AC
93 3067 CPI R22,7
94 E0E0 LDI R30,0
95 077E CPC R23,R30
96 F0B9 BEQ 0x00AE
97 3068 CPI R22,0x8
98 E0E0 LDI R30,0
99 077E CPC R23,R30
9A F0A9 BEQ 0x00B0
9B 3069 CPI R22,0x9
9C E0E0 LDI R30,0
9D 077E CPC R23,R30
9E F099 BEQ 0x00B2
9F C013 RJMP 0x00B3
(0006) {
(0007) case 0x00:
(0008) code=0xc0;break;
A0 EC40 LDI R20,0xC0
A1 C011 RJMP 0x00B3
(0009) case 0x01:
(0010) code=0xf9;break;
A2 EF49 LDI R20,0xF9
A3 C00F RJMP 0x00B3
(0011) case 0x02:
(0012) code=0xa4;break;
A4 EA44 LDI R20,0xA4
A5 C00D RJMP 0x00B3
(0013) case 0x03:
(0014) code=0xb0;break;
A6 EB40 LDI R20,0xB0
A7 C00B RJMP 0x00B3
(0015) case 0x04:
(0016) code=0x99;break;
A8 E949 LDI R20,0x99
A9 C009 RJMP 0x00B3
(0017) case 0x05:
(0018) code=0x92;break;
AA E942 LDI R20,0x92
AB C007 RJMP 0x00B3
(0019) case 0x06:
(0020) code=0x82;break;
AC E842 LDI R20,0x82
AD C005 RJMP 0x00B3
(0021) case 0x07:
(0022) code=0xf8;break;
AE EF48 LDI R20,0xF8
AF C003 RJMP 0x00B3
(0023) case 0x08:
(0024) code=0x80;break;
B0 E840 LDI R20,0x80
B1 C001 RJMP 0x00B3
(0025) case 0x09:
(0026) code=0x90;break;
B2 E940 LDI R20,0x90
(0027) }
(0028) return(code);
B3 2F04 MOV R16,R20
B4 940C 0209 JMP pop_xgsetF000
_key_value:
i --> Y,+1
tem2 --> R10
rem --> R20
tem1 --> R22
B6 940E 020E CALL push_xgsetF00C
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\key_value.h
(0001) //读键盘值 键盘在端口B
(0002) uchar key_value()
(0003) {
(0004) uchar tem1,tem2,rem,i;
(0005) rem=0; //不清零会返回一个不可预知的值
B8 2744 CLR R20
(0006) DDRB=0xf0; //B口高四位输出 低四位输入
B9 EF80 LDI R24,0xF0
BA BB87 OUT 0x17,R24
(0007) PORTB=0x0f; //输入有上拉电阻 输出低电平
BB E08F LDI R24,0xF
BC BB88 OUT 0x18,R24
(0008) s_ms(1);
BD E001 LDI R16,1
BE E010 LDI R17,0
BF DF8D RCALL _s_ms
(0009) tem1=PINB; //读取端口B
C0 B366 IN R22,0x16
(0010) tem1=tem1&0x0f;
C1 706F ANDI R22,0xF
(0011) if(tem1!=0x0f) //判断是否有键被按下
C2 306F CPI R22,0xF
C3 F0A1 BEQ 0x00D8
(0012) {
(0013) s_ms(200); //延时
C4 EC08 LDI R16,0xC8
C5 E010 LDI R17,0
C6 DF86 RCALL _s_ms
(0014) tem2=PINB; //读取端口B
C7 B2A6 IN R10,0x16
(0015) tem2=tem2&0x0f;
C8 2D8A MOV R24,R10
C9 708F ANDI R24,0xF
CA 2EA8 MOV R10,R24
(0016) if(tem1==tem2) //判断是否为干扰
CB 1768 CP R22,R24
CC F459 BNE 0x00D8
(0017) {
(0018) DDRB=0x0f; //B口高四位输入 低四位输出
CD E08F LDI R24,0xF
CE BB87 OUT 0x17,R24
(0019) PORTB=0xf0; //反相输出
CF EF80 LDI R24,0xF0
D0 BB88 OUT 0x18,R24
(0020) s_ms(50); //换向后要延时
D1 E302 LDI R16,0x32
D2 E010 LDI R17,0
D3 DF79 RCALL _s_ms
(0021) rem=PINB; //读取端口B
D4 B346 IN R20,0x16
(0022) rem=rem&0xf0; //取高四位
D5 7F40 ANDI R20,0xF0
(0023) rem=rem+tem1; //合并
D6 0F46 ADD R20,R22
(0024) rem=~rem; //反向输出
D7 9540 COM R20
(0025) //do //判断按键是否被释放
(0026) //{
(0027) // PORTB=0xf0;
(0028) //s_ms(200);
(0029) //}
(0030) //while(PINB!=0xf0);
(0031) }
(0032) }
(0033) return(rem);
D8 2F04 MOV R16,R20
D9 940C 0215 JMP pop_xgsetF00C
_disa:
data --> R10
DB 92AA ST R10,-Y
DC 2EA0 MOV R10,R16
FILE: E:\产品\开发板\光盘\16实验程序\4x4键盘\disp.h
(0001) //数码管显示子程序
(0002)
(0003) #define ls138a 7
(0004) #define ls138b 6
(0005) #define ls138c 5
(0006) #define ls138en 4
(0007) uchar a1,a2,a3;
(0008) void disa(uchar data)
(0009) {
(0010) a3=data/100;
DD E614 LDI R17,0x64
DE 2D0A MOV R16,R10
DF 940E 01DE CALL div8u
E1 9300 0060 STS a3,R16
(0011) a2=(data-a3*100)/10;
E3 2E20 MOV R2,R16
E4 E684 LDI R24,0x64
E5 9D82 MUL R24,R2
E6 2D0A MOV R16,R10
E7 1900 SUB R16,R0
E8 E01A LDI R17,0xA
E9 940E 01DE CALL div8u
EB 9300 0061 STS a2,R16
(0012) a1=(data-a3*100-a2*10);
ED 9020 0060 LDS R2,a3
EF E684 LDI R24,0x64
F0 9D82 MUL R24,R2
F1 2C2A MOV R2,R10
F2 1820 SUB R2,R0
F3 2E30 MOV R3,R16
F4 E08A LDI R24,0xA
F5 9D83 MUL R24,R3
F6 1820 SUB R2,R0
F7 9220 0062 STS a1,R2
F9 90A9 LD R10,Y+
FA 9508 RET
_disp:
bb --> R12
aa --> R10
FB 940E 01FF CALL push_xgset003C
FD 2EA0 MOV R10,R16
(0013) }
(0014)
(0015) void disp(uchar aa)
(0016) {
(0017) uint bb=0;
FE 24CC CLR R12
FF 24DD CLR R13
(0018) DDRA=0xff; //初始化端口A
100 EF8F LDI R24,0xFF
101 BB8A OUT 0x1A,R24
(0019) PORTA=0xff;
102 BB8B OUT 0x1B,R24
(0020) disa(aa);//提取aa的各位
103 2D0A MOV R16,R10
104 DFD6 RCALL _disa
(0021) sendbyte(a1);//数码管1
105 9100 0062 LDS R16,a1
107 DF4E RCALL _sendbyte
(0022) PORTA&=~(1<<ls138a);
108 98DF CBI 0x1B,7
(0023) PORTA&=~(1<<ls138b);
109 98DE CBI 0x1B,6
(0024) PORTA&=~(1<<ls138c);
10A 98DD CBI 0x1B,5
(0025) s_ms(600);
10B E508 LDI R16,0x58
10C E012 LDI R17,2
10D DF3F RCALL _s_ms
(0026) sendbyte(a2);//数码管2
10E 9100 0061 LDS R16,a2
110 DF45 RCALL _sendbyte
(0027) PORTA|=(1<<ls138a);
111 9ADF SBI 0x1B,7
(0028) PORTA&=~(1<<ls138b);
112 98DE CBI 0x1B,6
(0029) PORTA&=~(1<<ls138c);
113 98DD CBI 0x1B,5
(0030) s_ms(600);
114 E508 LDI R16,0x58
115 E012 LDI R17,2
116 DF36 RCALL _s_ms
(0031) sendbyte(a3);//数码管3
117 9100 0060 LDS R16,a3
119 DF3C RCALL _sendbyte
(0032) PORTA&=~(1<<ls138a);
11A 98DF CBI 0x1B,7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -