?? 4x4key.lst
字號:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E2 CPI R30,0x62
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0107 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: E:\MYWORK~1\開發設計\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
(0001) /****************************************Copyright (c)**************************************************
(0002) ** ADEmbed Development Co.,LTD.
(0003) ** http://www.adembed.com
(0004) **--------------File Info-------------------------------------------------------------------------------
(0005) ** File name: main.c
(0006) ** Last modified Date: 2008-12-13
(0007) ** Last Version: 1.0
(0008) ** Descriptions: 4*4Key Test.
(0009) **
(0010) **------------------------------------------------------------------------------------------------------
(0011) ** Created by: junbolu
(0012) ** Created date: 2008-12-13
(0013) ** Version: 1.0
(0014) ** Descriptions:
(0015) **
(0016) **------------------------------------------------------------------------------------------------------
(0017) ** Modified by:
(0018) ** Modified date:
(0019) ** Version:
(0020) ** Descriptions:
(0021) **
(0022) **------------------------------------------------------------------------------------------------------
(0023) **ICC-AVR application builder : 2008-12-13
(0024) **Target : M16
(0025) **Crystal: 7.3728Mhz
(0026) **PA0--->L1 PA1--->L2 PA2--->L3 PA3--->L4
(0027) **PA4--->H1 PA5--->H2 PA6--->H3 PA7--->H4
(0028) --------------------------
(0029) | H4 C D E F |
(0030) | H3 8 9 A B |
(0031) | H2 4 5 6 7 |
(0032) | H1 0 1 2 3 |
(0033) | / L1 L2 L3 L4 |
(0034) --------------------------
(0035) **描述:掃描4*4按鍵的狀態,掃描到按鍵被按下后,將此鍵碼發送到串口
(0036) **
(0037) **
(0038) **涉及知識點:
(0039) ** DI輸入DO輸出
(0040) ** while循環,case循環
(0041) ** 8位定時器,串口的應用
(0042) *******************************************************************************************************/
(0043)
(0044) #include<iom16v.h>
(0045) #include<macros.h>
(0046) #include"Define.h"
(0047)
(0048)
(0049) #define F_osc 7372800
(0050) #define Baud_rate 9600
(0051) //管腳定義
(0052) #define PIN_RXD 0 //PD0 RXD
(0053) #define PIN_TXD 1 //PD1 TXD
(0054)
(0055)
(0056) #define L1 BIT0
(0057) #define L2 BIT1
(0058) #define L3 BIT2
(0059) #define L4 BIT3
(0060) #define H1 BIT4
(0061) #define H2 BIT5
(0062) #define H3 BIT6
(0063) #define H4 BIT7
(0064)
(0065) #define KEY_DDR DDRA
(0066) #define KEY_PORT PORTA
(0067) #define KEY_IN PINA
(0068)
(0069)
(0070) #define L1_H1 0x00
(0071) #define L2_H1 0x01
(0072) #define L3_H1 0x02
(0073) #define L4_H1 0x03
(0074) #define L1_H2 0x04
(0075) #define L2_H2 0x05
(0076) #define L3_H2 0x06
(0077) #define L4_H2 0x07
(0078) #define L1_H3 0x08
(0079) #define L2_H3 0x09
(0080) #define L3_H3 0x0A
(0081) #define L4_H3 0x0B
(0082) #define L1_H4 0x0C
(0083) #define L2_H4 0x0D
(0084) #define L3_H4 0x0E
(0085) #define L4_H4 0x0F
(0086)
(0087) #define ON_PUSH 0xFF
(0088)
(0089) unsigned char Key_State;
(0090) unsigned char Key_Value;
(0091)
(0092) void Uart_Init(void);
(0093) void USART_TXD(uint8 data);
(0094)
(0095) void KEY_Init(void)
(0096) {
(0097) KEY_DDR |= L1&L2&L3&L4; //設為輸出
_KEY_Init:
004B B22A IN R2,0x1A
004C BA2A OUT 0x1A,R2
(0098) KEY_PORT|= L1&L2&L3&L4; //輸出為高
004D B22B IN R2,0x1B
004E BA2B OUT 0x1B,R2
(0099) KEY_DDR &= ~(H1&H2&H3&H4); //設為輸入
004F B38A IN R24,0x1A
0050 7F8F ANDI R24,0xFF
0051 BB8A OUT 0x1A,R24
(0100) KEY_PORT|= H1&H2&H3&H4; //上拉輸入
0052 B22B IN R2,0x1B
0053 BA2B OUT 0x1B,R2
(0101)
(0102) //t/c0初始化
(0103) TCCR0=0X0D;
0054 E08D LDI R24,0xD
0055 BF83 OUT 0x33,R24
(0104) TCNT0=0X00;
0056 2422 CLR R2
0057 BE22 OUT 0x32,R2
(0105) OCR0=0XF0; //定時30ms
0058 EF80 LDI R24,0xF0
0059 BF8C OUT 0x3C,R24
(0106) TIMSK|=0X02;
005A B789 IN R24,0x39
005B 6082 ORI R24,2
005C BF89 OUT 0x39,R24
005D 9508 RET
_timer0comp:
005E 940E014C CALL push_lset
(0107)
(0108) }
(0109)
(0110) #pragma interrupt_handler timer0comp:20
(0111) void timer0comp (void)
(0112) {
(0113) Read_Key();
0060 D071 RCALL _Read_Key
0061 940E0163 CALL pop_lset
0063 9518 RETI
(0114) }
(0115)
(0116) //=======================================================================
(0117) unsigned char KEYDIN(void)
(0118) {
(0119) KEY_PORT |= L1&L2&L3&L4; //輸出為高
_KEYDIN:
0064 B22B IN R2,0x1B
0065 BA2B OUT 0x1B,R2
(0120) KEY_PORT &= ~L1; //掃描L1
0066 98D8 CBI 0x1B,0
(0121)
(0122) if((KEY_IN&H1)==H1) return L1_H1;
0067 B389 IN R24,0x19
0068 7180 ANDI R24,0x10
0069 3180 CPI R24,0x10
006A F411 BNE 0x006D
006B 2700 CLR R16
006C C064 RJMP 0x00D1
(0123) if((KEY_IN&H2)==H2) return L1_H2;
006D B389 IN R24,0x19
006E 7280 ANDI R24,0x20
006F 3280 CPI R24,0x20
0070 F411 BNE 0x0073
0071 E004 LDI R16,4
0072 C05E RJMP 0x00D1
(0124) if((KEY_IN&H3)==H3) return L1_H3;
0073 B389 IN R24,0x19
0074 7480 ANDI R24,0x40
0075 3480 CPI R24,0x40
0076 F411 BNE 0x0079
0077 E008 LDI R16,0x8
0078 C058 RJMP 0x00D1
(0125) if((KEY_IN&H4)==H4) return L1_H4;
0079 B389 IN R24,0x19
007A 7880 ANDI R24,0x80
007B 3880 CPI R24,0x80
007C F411 BNE 0x007F
007D E00C LDI R16,0xC
007E C052 RJMP 0x00D1
(0126)
(0127) KEY_PORT |= L1&L2&L3&L4; //輸出為高
007F B22B IN R2,0x1B
0080 BA2B OUT 0x1B,R2
(0128) KEY_PORT &= ~L2; //掃描L2
0081 98D9 CBI 0x1B,1
(0129)
(0130) if((KEY_IN&H1)==H1) return L2_H1;
0082 B389 IN R24,0x19
0083 7180 ANDI R24,0x10
0084 3180 CPI R24,0x10
0085 F411 BNE 0x0088
0086 E001 LDI R16,1
0087 C049 RJMP 0x00D1
(0131) if((KEY_IN&H2)==H2) return L2_H2;
0088 B389 IN R24,0x19
0089 7280 ANDI R24,0x20
008A 3280 CPI R24,0x20
008B F411 BNE 0x008E
008C E005 LDI R16,5
008D C043 RJMP 0x00D1
(0132) if((KEY_IN&H3)==H3) return L2_H3;
008E B389 IN R24,0x19
008F 7480 ANDI R24,0x40
0090 3480 CPI R24,0x40
0091 F411 BNE 0x0094
0092 E009 LDI R16,0x9
0093 C03D RJMP 0x00D1
(0133) if((KEY_IN&H4)==H4) return L2_H4;
0094 B389 IN R24,0x19
0095 7880 ANDI R24,0x80
0096 3880 CPI R24,0x80
0097 F411 BNE 0x009A
0098 E00D LDI R16,0xD
0099 C037 RJMP 0x00D1
(0134)
(0135) KEY_PORT |= L1&L2&L3&L4; //輸出為高
009A B22B IN R2,0x1B
009B BA2B OUT 0x1B,R2
(0136) KEY_PORT &= ~L3; //掃描L3
009C 98DA CBI 0x1B,2
(0137)
(0138) if((KEY_IN&H1)==H1) return L3_H1;
009D B389 IN R24,0x19
009E 7180 ANDI R24,0x10
009F 3180 CPI R24,0x10
00A0 F411 BNE 0x00A3
00A1 E002 LDI R16,2
00A2 C02E RJMP 0x00D1
(0139) if((KEY_IN&H2)==H2) return L3_H2;
00A3 B389 IN R24,0x19
00A4 7280 ANDI R24,0x20
00A5 3280 CPI R24,0x20
00A6 F411 BNE 0x00A9
00A7 E006 LDI R16,6
00A8 C028 RJMP 0x00D1
(0140) if((KEY_IN&H3)==H3) return L3_H3;
00A9 B389 IN R24,0x19
00AA 7480 ANDI R24,0x40
00AB 3480 CPI R24,0x40
00AC F411 BNE 0x00AF
00AD E00A LDI R16,0xA
00AE C022 RJMP 0x00D1
(0141) if((KEY_IN&H4)==H4) return L3_H4;
00AF B389 IN R24,0x19
00B0 7880 ANDI R24,0x80
00B1 3880 CPI R24,0x80
00B2 F411 BNE 0x00B5
00B3 E00E LDI R16,0xE
00B4 C01C RJMP 0x00D1
(0142)
(0143) KEY_PORT |= L1&L2&L3&L4; //輸出為高
00B5 B22B IN R2,0x1B
00B6 BA2B OUT 0x1B,R2
(0144) KEY_PORT &= ~L4; //掃描L4
00B7 98DB CBI 0x1B,3
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -