📄 key_lcd.lst
字号:
__text_start:
__start:
002F E5CF LDI R28,0x5F
0030 E0D2 LDI R29,2
0031 BFCD OUT 0x3D,R28
0032 BFDE OUT 0x3E,R29
0033 51C0 SUBI R28,0x10
0034 40D0 SBCI R29,0
0035 EA0A LDI R16,0xAA
0036 8308 STD Y+0,R16
0037 2400 CLR R0
0038 E8E2 LDI R30,0x82
0039 E0F0 LDI R31,0
003A E010 LDI R17,0
003B 39E2 CPI R30,0x92
003C 07F1 CPC R31,R17
003D F011 BEQ 0x0040
003E 9201 ST R0,Z+
003F CFFB RJMP 0x003B
0040 8300 STD Z+0,R16
0041 E3EC LDI R30,0x3C
0042 E0F0 LDI R31,0
0043 E6A0 LDI R26,0x60
0044 E0B0 LDI R27,0
0045 E010 LDI R17,0
0046 35EE CPI R30,0x5E
0047 07F1 CPC R31,R17
0048 F021 BEQ 0x004D
0049 95C8 LPM
004A 9631 ADIW R30,1
004B 920D ST R0,X+
004C CFF9 RJMP 0x0046
004D D0A2 RCALL _main
_exit:
004E CFFF RJMP _exit
FILE: F:\AVR练习\key_lcd\key.c
(0001)
(0002) #include <macros.h>
(0003) #include "includes.h"
(0004) //#pragma interrupt_handler icp_time1:6
(0005) //#define BIT(x) (1<<(x))
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) const unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
(0009) 0x77,0x7c,0x39,0x5e,79,71};//七段译码字形表
(0010) const uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0011) uchar ledbuff[6];//显示缓冲区
(0012) uchar led[6];
(0013) uint oldcount;
(0014) uint newcount;
(0015) /*
(0016) 键盘扫描函数
(0017) 读取当前键盘的状态
(0018) 有按键按下返回相应按键值
(0019) 无按键按下返回"0x00"
(0020) */
(0021) uchar key_read(){
(0022) uchar i;
(0023) DDRA = 0x00;/*获取列地址*/
_key_read:
i --> R16
004F 2422 CLR R2
0050 BA2A OUT 0x1A,R2
(0024) PORTA = 0x0F;
0051 E08F LDI R24,0xF
0052 BB8B OUT 0x1B,R24
(0025) DDRA = 0xF0;
0053 EF80 LDI R24,0xF0
0054 BB8A OUT 0x1A,R24
(0026) i = PINA;
0055 B309 IN R16,0x19
(0027) DDRA = 0x00;/*获取行地址*/
0056 BA2A OUT 0x1A,R2
(0028) PORTA = 0xF0;
0057 BB8B OUT 0x1B,R24
(0029) DDRA = 0x0F;
0058 E08F LDI R24,0xF
0059 BB8A OUT 0x1A,R24
(0030) i&=PINA;
005A B229 IN R2,0x19
005B 2102 AND R16,R2
(0031)
(0032) DDRA = 0x00;/*输出复位*/
005C 2422 CLR R2
005D BA2A OUT 0x1A,R2
(0033) PORTA = 0xFF;
005E EF8F LDI R24,0xFF
005F BB8B OUT 0x1B,R24
(0034)
(0035) switch (i) {/*将按键码转换成键值*/
0060 2711 CLR R17
0061 3201 CPI R16,0x21
0062 E0E0 LDI R30,0
0063 071E CPC R17,R30
0064 F409 BNE 0x0066
0065 C05F RJMP 0x00C5
0066 3202 CPI R16,0x22
0067 E0E0 LDI R30,0
0068 071E CPC R17,R30
0069 F409 BNE 0x006B
006A C05C RJMP 0x00C7
006B 3204 CPI R16,0x24
006C E0E0 LDI R30,0
006D 071E CPC R17,R30
006E F409 BNE 0x0070
006F C059 RJMP 0x00C9
0070 3208 CPI R16,0x28
0071 E0E0 LDI R30,0
0072 071E CPC R17,R30
0073 F409 BNE 0x0075
0074 C056 RJMP 0x00CB
0075 E288 LDI R24,0x28
0076 E090 LDI R25,0
0077 1780 CP R24,R16
0078 0791 CPC R25,R17
0079 F0AC BLT 0x008F
007A 3101 CPI R16,0x11
007B E0E0 LDI R30,0
007C 071E CPC R17,R30
007D F409 BNE 0x007F
007E C04E RJMP 0x00CD
007F 3102 CPI R16,0x12
0080 E0E0 LDI R30,0
0081 071E CPC R17,R30
0082 F409 BNE 0x0084
0083 C04B RJMP 0x00CF
0084 3104 CPI R16,0x14
0085 E0E0 LDI R30,0
0086 071E CPC R17,R30
0087 F409 BNE 0x0089
0088 C048 RJMP 0x00D1
0089 3108 CPI R16,0x18
008A E0E0 LDI R30,0
008B 071E CPC R17,R30
008C F409 BNE 0x008E
008D C045 RJMP 0x00D3
008E C046 RJMP 0x00D5
008F 3401 CPI R16,0x41
0090 E0E0 LDI R30,0
0091 071E CPC R17,R30
0092 F151 BEQ 0x00BD
0093 3402 CPI R16,0x42
0094 E0E0 LDI R30,0
0095 071E CPC R17,R30
0096 F141 BEQ 0x00BF
0097 3404 CPI R16,0x44
0098 E0E0 LDI R30,0
0099 071E CPC R17,R30
009A F131 BEQ 0x00C1
009B 3408 CPI R16,0x48
009C E0E0 LDI R30,0
009D 071E CPC R17,R30
009E F121 BEQ 0x00C3
009F 3401 CPI R16,0x41
00A0 E0E0 LDI R30,0
00A1 071E CPC R17,R30
00A2 F40C BGE 0x00A4
00A3 C031 RJMP 0x00D5
00A4 3801 CPI R16,0x81
00A5 E0E0 LDI R30,0
00A6 071E CPC R17,R30
00A7 F069 BEQ 0x00B5
00A8 3802 CPI R16,0x82
00A9 E0E0 LDI R30,0
00AA 071E CPC R17,R30
00AB F059 BEQ 0x00B7
00AC 3804 CPI R16,0x84
00AD E0E0 LDI R30,0
00AE 071E CPC R17,R30
00AF F049 BEQ 0x00B9
00B0 3808 CPI R16,0x88
00B1 E0E0 LDI R30,0
00B2 071E CPC R17,R30
00B3 F039 BEQ 0x00BB
00B4 C020 RJMP 0x00D5
(0036) case 0x81: return 0x00;
00B5 2700 CLR R16
00B6 C01F RJMP 0x00D6
(0037) case 0x82: return 'a';
00B7 E601 LDI R16,0x61
00B8 C01D RJMP 0x00D6
(0038) case 0x84: return 'b';
00B9 E602 LDI R16,0x62
00BA C01B RJMP 0x00D6
(0039) case 0x88: return 'c';
00BB E603 LDI R16,0x63
00BC C019 RJMP 0x00D6
(0040) case 0x41: return '1';
00BD E301 LDI R16,0x31
00BE C017 RJMP 0x00D6
(0041) case 0x42: return 0x02;
00BF E002 LDI R16,2
00C0 C015 RJMP 0x00D6
(0042) case 0x44: return 0x03;
00C1 E003 LDI R16,3
00C2 C013 RJMP 0x00D6
(0043) case 0x48: return 'd';
00C3 E604 LDI R16,0x64
00C4 C011 RJMP 0x00D6
(0044) case 0x21: return 0x04;
00C5 E004 LDI R16,4
00C6 C00F RJMP 0x00D6
(0045) case 0x22: return 0x05;
00C7 E005 LDI R16,5
00C8 C00D RJMP 0x00D6
(0046) case 0x24: return 0x06;
00C9 E006 LDI R16,6
00CA C00B RJMP 0x00D6
(0047) case 0x28: return 'e';
00CB E605 LDI R16,0x65
00CC C009 RJMP 0x00D6
(0048) case 0x11: return 0x07;
00CD E007 LDI R16,7
00CE C007 RJMP 0x00D6
(0049) case 0x12: return 0x08;
00CF E008 LDI R16,0x8
00D0 C005 RJMP 0x00D6
(0050) case 0x14: return 0x09;
00D1 E009 LDI R16,0x9
00D2 C003 RJMP 0x00D6
(0051) case 0x18: return 'f';
00D3 E606 LDI R16,0x66
00D4 C001 RJMP 0x00D6
(0052) default : return 0x00;
00D5 2700 CLR R16
00D6 9508 RET
(0053) }
(0054) }
(0055)
(0056) /*****************************************
(0057) 延时1MS
(0058) ******************************************/
(0059) void delay_ms()
(0060) {uint i;
(0061) for(i+0;i<1142;i++)
_delay_ms:
i --> R16
00D7 C002 RJMP 0x00DA
00D8 5F0F SUBI R16,0xFF
00D9 4F1F SBCI R17,0xFF
00DA 3706 CPI R16,0x76
00DB E0E4 LDI R30,4
00DC 071E CPC R17,R30
00DD F3D0 BCS 0x00D8
00DE 9508 RET
_delay:
i --> R20
t --> R16
00DF D1DF RCALL push_gset1
(0062) ;
(0063) }
(0064) void delay(uint t)
(0065) {uchar i;
(0066) for(i=0;i<t;i++)
00E0 2744 CLR R20
00E1 C001 RJMP 0x00E3
00E2 9543 INC R20
00E3 2E24 MOV R2,R20
00E4 2433 CLR R3
00E5 1620 CP R2,R16
00E6 0631 CPC R3,R17
00E7 F3D0 BCS 0x00E2
00E8 D1D9 RCALL pop_gset1
00E9 9508 RET
(0067) ;
(0068) }
(0069)
(0070) /****************************************
(0071) mcu初始化
(0072) *****************************************/
(0073) void init()
(0074) { //DDRA=0x00;
(0075) DDRD=0xff;
_init:
00EA EF8F LDI R24,0xFF
00EB BB81 OUT 0x11,R24
(0076) DDRB=0xff;
00EC BB87 OUT 0x17,R24
(0077) // PORTA=0xff;
(0078) PORTB=0xff;
00ED BB88 OUT 0x18,R24
(0079) PORTD=0xff;
00EE BB82 OUT 0x12,R24
00EF 9508 RET
_main:
i --> Y+3
space --> R20
x_position --> R20
key --> R10
00F0 9722 SBIW R28,2
(0080)
(0081) }
(0082) void main()
(0083) { uchar key;
(0084) uchar i;
(0085) uchar x_position;
(0086) uchar *space = " ";
00F1 E64E LDI R20,0x6E
00F2 E050 LDI R21,0
(0087) Init_LCD();
00F3 D117 RCALL _Init_LCD
(0088) //PORTD = 0xff;
(0089) //DDRD = 0xf0;
(0090) PORTA = 0xff;
00F4 EF8F LDI R24,0xFF
00F5 BB8B OUT 0x1B,R24
(0091) DDRA = 0xf8;
00F6 EF88 LDI R24,0xF8
00F7 BB8A OUT 0x1A,R24
(0092) LCD_DisplayString(1,1,"key scan test");
00F8 E680 LDI R24,0x60
00F9 E090 LDI R25,0
00FA 8399 STD Y+1,R25
00FB 8388 STD Y+0,R24
00FC E021 LDI R18,1
00FD E001 LDI R16,1
00FE D13F RCALL _LCD_DisplayString
(0093) x_position = 2;
00FF E042 LDI R20,2
(0094) init();
0100 DFE9 RCALL _init
(0095) for( ; ; )
(0096) {
(0097) key=key_read();
0101 DF4D RCALL _key_read
0102 2EA0 MOV R10,R16
(0098) //针对4X4的键盘
(0099) switch(key)
0103 2D6A MOV R22,R10
0104 2777 CLR R23
0105 3061 CPI R22,1
0106 E0E0 LDI R30,0
0107 077E CPC R23,R30
0108 F409 BNE 0x010A
0109 C038 RJMP 0x0142
010A 3062 CPI R22,2
010B E0E0 LDI R30,0
010C 077E CPC R23,R30
010D F409 BNE 0x010F
010E C039 RJMP 0x0148
010F 3063 CPI R22,3
0110 E0E0 LDI R30,0
0111 077E CPC R23,R30
0112 F409 BNE 0x0114
0113 C03A RJMP 0x014E
0114 3064 CPI R22,4
0115 E0E0 LDI R30,0
0116 077E CPC R23,R30
0117 F409 BNE 0x0119
0118 C03B RJMP 0x0154
0119 3065 CPI R22,5
011A E0E0 LDI R30,0
011B 077E CPC R23,R30
011C F409 BNE 0x011E
011D C03C RJMP 0x015A
011E 3066 CPI R22,6
011F E0E0 LDI R30,0
0120 077E CPC R23,R30
0121 F409 BNE 0x0123
0122 C03D RJMP 0x0160
0123 3067 CPI R22,7
0124 E0E0 LDI R30,0
0125 077E CPC R23,R30
0126 F409 BNE 0x0128
0127 C03E RJMP 0x0166
0128 3068 CPI R22,0x8
0129 E0E0 LDI R30,0
012A 077E CPC R23,R30
012B F409 BNE 0x012D
012C C03F RJMP 0x016C
012D 3069 CPI R22,0x9
012E E0E0 LDI R30,0
012F 077E CPC R23,R30
0130 F409 BNE 0x0132
0131 C040 RJMP 0x0172
0132 306A CPI R22,0xA
0133 E0E0 LDI R30,0
0134 077E CPC R23,R30
0135 F409 BNE 0x0137
0136 C041 RJMP 0x0178
0137 306B CPI R22,0xB
0138 E0E0 LDI R30,0
0139 077E CPC R23,R30
013A F409 BNE 0x013C
013B C042 RJMP 0x017E
013C 306C CPI R22,0xC
013D E0E0 LDI R30,0
013E 077E CPC R23,R30
013F F409 BNE 0x0141
0140 C043 RJMP 0x0184
0141 CFBF RJMP 0x0101
(0100) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -