📄 main.lst
字号:
00FB 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
00FC 940E01E2 CALL push_gset2
00FE 2F62 MOV R22,R18
00FF 2F40 MOV R20,R16
(0108) }
(0109)
(0110) }
(0111)
(0112) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0113) {
(0114) LCD_set_xy( X, Y ); //写地址
0100 2F26 MOV R18,R22
0101 2F04 MOV R16,R20
0102 DFD3 RCALL _LCD_set_xy
(0115) LCD_write_data( data);
0103 810C LDD R16,Y+4
0104 DFB1 RCALL _LCD_write_data
0105 940E01D6 CALL pop_gset2
0107 9508 RET
_key_read:
i --> R20
0108 940E01E4 CALL push_gset1
FILE: D:\avr\+++精华+++\44键盘\key.h
(0001) //函数说明
(0002) //--------------------------------
(0003) unsigned char get_key(void);
(0004) //--------------------------------
(0005)
(0006) unsigned char key_read(void)
(0007) {
(0008) unsigned char i;
(0009) /*获取列地址*/
(0010) DDRB=0xf0; //高4位输出,低4位输入
010A EF80 LDI R24,0xF0
010B BB87 OUT 0x17,R24
(0011) PORTB=0x0f;//高4位输出0,低4位带上拉输入
010C E08F LDI R24,0xF
010D BB88 OUT 0x18,R24
(0012) delay_nms(1);
010E E001 LDI R16,1
010F E010 LDI R17,0
0110 DF5B RCALL _delay_nms
(0013)
(0014) i=PINB&0x0f;
0111 B346 IN R20,0x16
0112 704F ANDI R20,0xF
(0015)
(0016) /*获取行地址*/
(0017) DDRB=0x0f;//高4位输入,低4位输出
0113 E08F LDI R24,0xF
0114 BB87 OUT 0x17,R24
(0018) PORTB=0xf0;//低4位输出0,高4位带上拉输入
0115 EF80 LDI R24,0xF0
0116 BB88 OUT 0x18,R24
(0019) delay_nms(1);
0117 E001 LDI R16,1
0118 E010 LDI R17,0
0119 DF52 RCALL _delay_nms
(0020)
(0021) i|=PINB&0xf0;
011A B386 IN R24,0x16
011B 7F80 ANDI R24,0xF0
011C 2B48 OR R20,R24
(0022)
(0023) switch(i)
011D 2755 CLR R21
011E 3D47 CPI R20,0xD7
011F E0E0 LDI R30,0
0120 075E CPC R21,R30
0121 F409 BNE 0x0123
0122 C075 RJMP 0x0198
0123 3D4B CPI R20,0xDB
0124 E0E0 LDI R30,0
0125 075E CPC R21,R30
0126 F409 BNE 0x0128
0127 C068 RJMP 0x0190
0128 3D4D CPI R20,0xDD
0129 E0E0 LDI R30,0
012A 075E CPC R21,R30
012B F409 BNE 0x012D
012C C05B RJMP 0x0188
012D 3D4E CPI R20,0xDE
012E E0E0 LDI R30,0
012F 075E CPC R21,R30
0130 F409 BNE 0x0132
0131 C04E RJMP 0x0180
0132 ED8E LDI R24,0xDE
0133 E090 LDI R25,0
0134 1784 CP R24,R20
0135 0795 CPC R25,R21
0136 F164 BLT 0x0163
0137 3747 CPI R20,0x77
0138 E0E0 LDI R30,0
0139 075E CPC R21,R30
013A F409 BNE 0x013C
013B C060 RJMP 0x019C
013C 374B CPI R20,0x7B
013D E0E0 LDI R30,0
013E 075E CPC R21,R30
013F F409 BNE 0x0141
0140 C053 RJMP 0x0194
0141 374D CPI R20,0x7D
0142 E0E0 LDI R30,0
0143 075E CPC R21,R30
0144 F409 BNE 0x0146
0145 C046 RJMP 0x018C
0146 374E CPI R20,0x7E
0147 E0E0 LDI R30,0
0148 075E CPC R21,R30
0149 F409 BNE 0x014B
014A C039 RJMP 0x0184
014B 3747 CPI R20,0x77
014C E0E0 LDI R30,0
014D 075E CPC R21,R30
014E F40C BGE 0x0150
014F C04E RJMP 0x019E
0150 3B47 CPI R20,0xB7
0151 E0E0 LDI R30,0
0152 075E CPC R21,R30
0153 F409 BNE 0x0155
0154 C045 RJMP 0x019A
0155 3B4B CPI R20,0xBB
0156 E0E0 LDI R30,0
0157 075E CPC R21,R30
0158 F409 BNE 0x015A
0159 C038 RJMP 0x0192
015A 3B4D CPI R20,0xBD
015B E0E0 LDI R30,0
015C 075E CPC R21,R30
015D F161 BEQ 0x018A
015E 3B4E CPI R20,0xBE
015F E0E0 LDI R30,0
0160 075E CPC R21,R30
0161 F101 BEQ 0x0182
0162 C03B RJMP 0x019E
0163 3E47 CPI R20,0xE7
0164 E0E0 LDI R30,0
0165 075E CPC R21,R30
0166 F179 BEQ 0x0196
0167 3E4B CPI R20,0xEB
0168 E0E0 LDI R30,0
0169 075E CPC R21,R30
016A F119 BEQ 0x018E
016B 3E4D CPI R20,0xED
016C E0E0 LDI R30,0
016D 075E CPC R21,R30
016E F0B9 BEQ 0x0186
016F 3E4E CPI R20,0xEE
0170 E0E0 LDI R30,0
0171 075E CPC R21,R30
0172 F059 BEQ 0x017E
0173 3E47 CPI R20,0xE7
0174 E0E0 LDI R30,0
0175 075E CPC R21,R30
0176 F13C BLT 0x019E
0177 3F4F CPI R20,0xFF
0178 E0E0 LDI R30,0
0179 075E CPC R21,R30
017A F009 BEQ 0x017C
017B C022 RJMP 0x019E
(0024) {
(0025) case 0xff:return 0x00;
017C 2700 CLR R16
017D C021 RJMP 0x019F
(0026) case 0xee:return 'D';
017E E404 LDI R16,0x44
017F C01F RJMP 0x019F
(0027) case 0xde:return '#';
0180 E203 LDI R16,0x23
0181 C01D RJMP 0x019F
(0028) case 0xbe:return '0';
0182 E300 LDI R16,0x30
0183 C01B RJMP 0x019F
(0029) case 0x7e:return '*';
0184 E20A LDI R16,0x2A
0185 C019 RJMP 0x019F
(0030) case 0xed:return 'C';
0186 E403 LDI R16,0x43
0187 C017 RJMP 0x019F
(0031) case 0xdd:return '9';
0188 E309 LDI R16,0x39
0189 C015 RJMP 0x019F
(0032) case 0xbd:return '8';
018A E308 LDI R16,0x38
018B C013 RJMP 0x019F
(0033) case 0x7d:return '7';
018C E307 LDI R16,0x37
018D C011 RJMP 0x019F
(0034) case 0xeb:return 'B';
018E E402 LDI R16,0x42
018F C00F RJMP 0x019F
(0035) case 0xdb:return '6';
0190 E306 LDI R16,0x36
0191 C00D RJMP 0x019F
(0036) case 0xbb:return '5';
0192 E305 LDI R16,0x35
0193 C00B RJMP 0x019F
(0037) case 0x7b:return '4';
0194 E304 LDI R16,0x34
0195 C009 RJMP 0x019F
(0038) case 0xe7:return 'A';
0196 E401 LDI R16,0x41
0197 C007 RJMP 0x019F
(0039) case 0xd7:return '3';
0198 E303 LDI R16,0x33
0199 C005 RJMP 0x019F
(0040) case 0xb7:return '2';
019A E302 LDI R16,0x32
019B C003 RJMP 0x019F
(0041) case 0x77:return '1';
019C E301 LDI R16,0x31
019D C001 RJMP 0x019F
(0042) default:return 0x00;
019E 2700 CLR R16
019F 940E01E7 CALL pop_gset1
01A1 9508 RET
_get_key:
i --> R20
01A2 940E01E4 CALL push_gset1
(0043) }
(0044) }
(0045)
(0046) unsigned char get_key(void)
(0047) {unsigned char i;
(0048) static unsigned char j;//按键记录
(0049) i = key_read();
01A4 DF63 RCALL _key_read
01A5 2F40 MOV R20,R16
(0050) if (i == 0x00)//无有效按键按下
01A6 2300 TST R16
01A7 F429 BNE 0x01AD
(0051) {
(0052) j = 0x00;//清除按键记录
01A8 2422 CLR R2
01A9 9220006B STS j,R2
(0053) return 0x00;//程序退出
01AB 2700 CLR R16
01AC C011 RJMP 0x01BE
(0054) }
(0055) if (j == 0x00) //为新按键
01AD 9020006B LDS R2,j
01AF 2022 TST R2
01B0 F461 BNE 0x01BD
(0056) {j = i;//保存本次采样结果
01B1 9340006B STS j,R20
(0057) delay_nms(10);//去按键颤抖
01B3 E00A LDI R16,0xA
01B4 E010 LDI R17,0
01B5 DEB6 RCALL _delay_nms
(0058) i = key_read();
01B6 DF51 RCALL _key_read
01B7 2F40 MOV R20,R16
(0059) if(i == j) {return i;}
01B8 9020006B LDS R2,j
01BA 1502 CP R16,R2
01BB F409 BNE 0x01BD
01BC C001 RJMP 0x01BE
(0060) }
(0061) return 0x00;
01BD 2700 CLR R16
01BE 940E01E7 CALL pop_gset1
01C0 9508 RET
_main:
i --> R20
01C1 9722 SBIW R28,2
FILE: D:\avr\+++精华+++\44键盘\main.c
(0001) /*****************************************
(0002) * 基于4*4键盘程序设计 *
(0003) * 功 能:4*4键盘 *
(0004) * 时钟频率:内部1M *
(0005) * 设 计:莫锦攀 *
(0006) * 修改日期:2007年07月04日 *
(0007) * 编译环境:ICC-AVR6.31 *
(0008) * 实验环境:M16学习板 *
(0009) * 使用端口:PC6,PC7,PA4~PA7,PD0~PD7 *
(0010) *****************************************/
(0011)
(0012) #include <iom16v.h>
(0013) #include "1602.h"
(0014) #include "key.h"
(0015)
(0016) void main(void)
(0017) { unsigned char i;
(0018) LCD_init();
01C2 DEB8 RCALL _LCD_init
01C3 C00F RJMP 0x01D3
(0019)
(0020) while(1)
(0021) {i=get_key();
01C4 DFDD RCALL _get_key
01C5 2F40 MOV R20,R16
(0022) LCD_write_string(3,0,"4*4 by MJP");
01C6 E680 LDI R24,0x60
01C7 E090 LDI R25,0
01C8 8399 STD Y+1,R25
01C9 8388 STD Y+0,R24
01CA 2722 CLR R18
01CB E003 LDI R16,3
01CC DF19 RCALL _LCD_write_string
(0023) if(i!=0x00)
01CD 2344 TST R20
01CE F021 BEQ 0x01D3
(0024) {LCD_write_char(7,1,i);}
FILE: <library>
01CF 8348 STD Y+0,R20
01D0 E021 LDI R18,1
01D1 E007 LDI R16,7
01D2 DF29 RCALL _LCD_write_char
01D3 CFF0 RJMP 0x01C4
01D4 9622 ADIW R28,2
01D5 9508 RET
pop_gset2:
01D6 E0E2 LDI R30,2
01D7 940C01E8 JMP pop
pop_gset3:
01D9 E0E4 LDI R30,4
01DA 940C01E8 JMP pop
push_gset5:
01DC 92FA ST R15,-Y
01DD 92EA ST R14,-Y
push_gset4:
01DE 92DA ST R13,-Y
01DF 92CA ST R12,-Y
push_gset3:
01E0 92BA ST R11,-Y
01E1 92AA ST R10,-Y
push_gset2:
01E2 937A ST R23,-Y
01E3 936A ST R22,-Y
push_gset1:
01E4 935A ST R21,-Y
01E5 934A ST R20,-Y
01E6 9508 RET
pop_gset1:
01E7 E0E1 LDI R30,1
pop:
01E8 9149 LD R20,Y+
01E9 9159 LD R21,Y+
01EA FDE0 SBRC R30,0
01EB 9508 RET
01EC 9169 LD R22,Y+
01ED 9179 LD R23,Y+
01EE FDE1 SBRC R30,1
01EF 9508 RET
01F0 90A9 LD R10,Y+
01F1 90B9 LD R11,Y+
01F2 FDE2 SBRC R30,2
01F3 9508 RET
01F4 90C9 LD R12,Y+
01F5 90D9 LD R13,Y+
01F6 FDE3 SBRC R30,3
01F7 9508 RET
01F8 90E9 LD R14,Y+
01F9 90F9 LD R15,Y+
01FA 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -