?? 4x4key.lis
字號:
.module _4x4key.c
.area text(rom, con, rel)
0000 .dbfile E:\MYWORK~1\開發設計\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
0000 .dbfunc e KEY_Init _KEY_Init fV
.even
0000 _KEY_Init::
0000 .dbline -1
0000 .dbline 96
0000 ; /****************************************Copyright (c)**************************************************
0000 ; ** ADEmbed Development Co.,LTD.
0000 ; ** http://www.adembed.com
0000 ; **--------------File Info-------------------------------------------------------------------------------
0000 ; ** File name: main.c
0000 ; ** Last modified Date: 2008-12-13
0000 ; ** Last Version: 1.0
0000 ; ** Descriptions: 4*4Key Test.
0000 ; **
0000 ; **------------------------------------------------------------------------------------------------------
0000 ; ** Created by: junbolu
0000 ; ** Created date: 2008-12-13
0000 ; ** Version: 1.0
0000 ; ** Descriptions:
0000 ; **
0000 ; **------------------------------------------------------------------------------------------------------
0000 ; ** Modified by:
0000 ; ** Modified date:
0000 ; ** Version:
0000 ; ** Descriptions:
0000 ; **
0000 ; **------------------------------------------------------------------------------------------------------
0000 ; **ICC-AVR application builder : 2008-12-13
0000 ; **Target : M16
0000 ; **Crystal: 7.3728Mhz
0000 ; **PA0--->L1 PA1--->L2 PA2--->L3 PA3--->L4
0000 ; **PA4--->H1 PA5--->H2 PA6--->H3 PA7--->H4
0000 ; --------------------------
0000 ; | H4 C D E F |
0000 ; | H3 8 9 A B |
0000 ; | H2 4 5 6 7 |
0000 ; | H1 0 1 2 3 |
0000 ; | / L1 L2 L3 L4 |
0000 ; --------------------------
0000 ; **描述:掃描4*4按鍵的狀態,掃描到按鍵被按下后,將此鍵碼發送到串口
0000 ; **
0000 ; **
0000 ; **涉及知識點:
0000 ; ** DI輸入DO輸出
0000 ; ** while循環,case循環
0000 ; ** 8位定時器,串口的應用
0000 ; *******************************************************************************************************/
0000 ;
0000 ; #include<iom16v.h>
0000 ; #include<macros.h>
0000 ; #include"Define.h"
0000 ;
0000 ;
0000 ; #define F_osc 7372800
0000 ; #define Baud_rate 9600
0000 ; //管腳定義
0000 ; #define PIN_RXD 0 //PD0 RXD
0000 ; #define PIN_TXD 1 //PD1 TXD
0000 ;
0000 ;
0000 ; #define L1 BIT0
0000 ; #define L2 BIT1
0000 ; #define L3 BIT2
0000 ; #define L4 BIT3
0000 ; #define H1 BIT4
0000 ; #define H2 BIT5
0000 ; #define H3 BIT6
0000 ; #define H4 BIT7
0000 ;
0000 ; #define KEY_DDR DDRA
0000 ; #define KEY_PORT PORTA
0000 ; #define KEY_IN PINA
0000 ;
0000 ;
0000 ; #define L1_H1 0x00
0000 ; #define L2_H1 0x01
0000 ; #define L3_H1 0x02
0000 ; #define L4_H1 0x03
0000 ; #define L1_H2 0x04
0000 ; #define L2_H2 0x05
0000 ; #define L3_H2 0x06
0000 ; #define L4_H2 0x07
0000 ; #define L1_H3 0x08
0000 ; #define L2_H3 0x09
0000 ; #define L3_H3 0x0A
0000 ; #define L4_H3 0x0B
0000 ; #define L1_H4 0x0C
0000 ; #define L2_H4 0x0D
0000 ; #define L3_H4 0x0E
0000 ; #define L4_H4 0x0F
0000 ;
0000 ; #define ON_PUSH 0xFF
0000 ;
0000 ; unsigned char Key_State;
0000 ; unsigned char Key_Value;
0000 ;
0000 ; void Uart_Init(void);
0000 ; void USART_TXD(uint8 data);
0000 ;
0000 ; void KEY_Init(void)
0000 ; {
0000 .dbline 97
0000 ; KEY_DDR |= L1&L2&L3&L4; //設為輸出
0000 2AB2 in R2,0x1a
0002 2ABA out 0x1a,R2
0004 .dbline 98
0004 ; KEY_PORT|= L1&L2&L3&L4; //輸出為高
0004 2BB2 in R2,0x1b
0006 2BBA out 0x1b,R2
0008 .dbline 99
0008 ; KEY_DDR &= ~(H1&H2&H3&H4); //設為輸入
0008 8AB3 in R24,0x1a
000A 8F7F andi R24,255
000C 8ABB out 0x1a,R24
000E .dbline 100
000E ; KEY_PORT|= H1&H2&H3&H4; //上拉輸入
000E 2BB2 in R2,0x1b
0010 2BBA out 0x1b,R2
0012 .dbline 103
0012 ;
0012 ; //t/c0初始化
0012 ; TCCR0=0X0D;
0012 8DE0 ldi R24,13
0014 83BF out 0x33,R24
0016 .dbline 104
0016 ; TCNT0=0X00;
0016 2224 clr R2
0018 22BE out 0x32,R2
001A .dbline 105
001A ; OCR0=0XF0; //定時30ms
001A 80EF ldi R24,240
001C 8CBF out 0x3c,R24
001E .dbline 106
001E ; TIMSK|=0X02;
001E 89B7 in R24,0x39
0020 8260 ori R24,2
0022 89BF out 0x39,R24
0024 .dbline -2
0024 L1:
0024 .dbline 0 ; func end
0024 0895 ret
0026 .dbend
.area vector(rom, abs)
.org 76
004C 0C941300 jmp _timer0comp
.area text(rom, con, rel)
0026 .dbfile E:\MYWORK~1\開發設計\EasyAVR\程序范例\Mega16例程\4x4key\4x4key.c
0026 .dbfunc e timer0comp _timer0comp fV
.even
0026 _timer0comp::
0026 0E940000 xcall push_lset
002A .dbline -1
002A .dbline 112
002A ;
002A ; }
002A ;
002A ; #pragma interrupt_handler timer0comp:20
002A ; void timer0comp (void)
002A ; {
002A .dbline 113
002A ; Read_Key();
002A 71D0 xcall _Read_Key
002C .dbline -2
002C L2:
002C 0E940000 xcall pop_lset
0030 .dbline 0 ; func end
0030 1895 reti
0032 .dbend
0032 .dbfunc e KEYDIN _KEYDIN fc
.even
0032 _KEYDIN::
0032 .dbline -1
0032 .dbline 118
0032 ; }
0032 ;
0032 ; //=======================================================================
0032 ; unsigned char KEYDIN(void)
0032 ; {
0032 .dbline 119
0032 ; KEY_PORT |= L1&L2&L3&L4; //輸出為高
0032 2BB2 in R2,0x1b
0034 2BBA out 0x1b,R2
0036 .dbline 120
0036 ; KEY_PORT &= ~L1; //掃描L1
0036 D898 cbi 0x1b,0
0038 .dbline 122
0038 ;
0038 ; if((KEY_IN&H1)==H1) return L1_H1;
0038 89B3 in R24,0x19
003A 8071 andi R24,16
003C 8031 cpi R24,16
003E 11F4 brne L4
0040 .dbline 122
0040 0027 clr R16
0042 64C0 xjmp L3
0044 L4:
0044 .dbline 123
0044 ; if((KEY_IN&H2)==H2) return L1_H2;
0044 89B3 in R24,0x19
0046 8072 andi R24,32
0048 8032 cpi R24,32
004A 11F4 brne L6
004C .dbline 123
004C 04E0 ldi R16,4
004E 5EC0 xjmp L3
0050 L6:
0050 .dbline 124
0050 ; if((KEY_IN&H3)==H3) return L1_H3;
0050 89B3 in R24,0x19
0052 8074 andi R24,64
0054 8034 cpi R24,64
0056 11F4 brne L8
0058 .dbline 124
0058 08E0 ldi R16,8
005A 58C0 xjmp L3
005C L8:
005C .dbline 125
005C ; if((KEY_IN&H4)==H4) return L1_H4;
005C 89B3 in R24,0x19
005E 8078 andi R24,128
0060 8038 cpi R24,128
0062 11F4 brne L10
0064 .dbline 125
0064 0CE0 ldi R16,12
0066 52C0 xjmp L3
0068 L10:
0068 .dbline 127
0068 ;
0068 ; KEY_PORT |= L1&L2&L3&L4; //輸出為高
0068 2BB2 in R2,0x1b
006A 2BBA out 0x1b,R2
006C .dbline 128
006C ; KEY_PORT &= ~L2; //掃描L2
006C D998 cbi 0x1b,1
006E .dbline 130
006E ;
006E ; if((KEY_IN&H1)==H1) return L2_H1;
006E 89B3 in R24,0x19
0070 8071 andi R24,16
0072 8031 cpi R24,16
0074 11F4 brne L12
0076 .dbline 130
0076 01E0 ldi R16,1
0078 49C0 xjmp L3
007A L12:
007A .dbline 131
007A ; if((KEY_IN&H2)==H2) return L2_H2;
007A 89B3 in R24,0x19
007C 8072 andi R24,32
007E 8032 cpi R24,32
0080 11F4 brne L14
0082 .dbline 131
0082 05E0 ldi R16,5
0084 43C0 xjmp L3
0086 L14:
0086 .dbline 132
0086 ; if((KEY_IN&H3)==H3) return L2_H3;
0086 89B3 in R24,0x19
0088 8074 andi R24,64
008A 8034 cpi R24,64
008C 11F4 brne L16
008E .dbline 132
008E 09E0 ldi R16,9
0090 3DC0 xjmp L3
0092 L16:
0092 .dbline 133
0092 ; if((KEY_IN&H4)==H4) return L2_H4;
0092 89B3 in R24,0x19
0094 8078 andi R24,128
0096 8038 cpi R24,128
0098 11F4 brne L18
009A .dbline 133
009A 0DE0 ldi R16,13
009C 37C0 xjmp L3
009E L18:
009E .dbline 135
009E ;
009E ; KEY_PORT |= L1&L2&L3&L4; //輸出為高
009E 2BB2 in R2,0x1b
00A0 2BBA out 0x1b,R2
00A2 .dbline 136
00A2 ; KEY_PORT &= ~L3; //掃描L3
00A2 DA98 cbi 0x1b,2
00A4 .dbline 138
00A4 ;
00A4 ; if((KEY_IN&H1)==H1) return L3_H1;
00A4 89B3 in R24,0x19
00A6 8071 andi R24,16
00A8 8031 cpi R24,16
00AA 11F4 brne L20
00AC .dbline 138
00AC 02E0 ldi R16,2
00AE 2EC0 xjmp L3
00B0 L20:
00B0 .dbline 139
00B0 ; if((KEY_IN&H2)==H2) return L3_H2;
00B0 89B3 in R24,0x19
00B2 8072 andi R24,32
00B4 8032 cpi R24,32
00B6 11F4 brne L22
00B8 .dbline 139
00B8 06E0 ldi R16,6
00BA 28C0 xjmp L3
00BC L22:
00BC .dbline 140
00BC ; if((KEY_IN&H3)==H3) return L3_H3;
00BC 89B3 in R24,0x19
00BE 8074 andi R24,64
00C0 8034 cpi R24,64
00C2 11F4 brne L24
00C4 .dbline 140
00C4 0AE0 ldi R16,10
00C6 22C0 xjmp L3
00C8 L24:
00C8 .dbline 141
00C8 ; if((KEY_IN&H4)==H4) return L3_H4;
00C8 89B3 in R24,0x19
00CA 8078 andi R24,128
00CC 8038 cpi R24,128
00CE 11F4 brne L26
00D0 .dbline 141
00D0 0EE0 ldi R16,14
00D2 1CC0 xjmp L3
00D4 L26:
00D4 .dbline 143
00D4 ;
00D4 ; KEY_PORT |= L1&L2&L3&L4; //輸出為高
00D4 2BB2 in R2,0x1b
00D6 2BBA out 0x1b,R2
00D8 .dbline 144
00D8 ; KEY_PORT &= ~L4; //掃描L4
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -