댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
어셈블리어 key 읽는 것 관련해서 질문드립니다.
out portd,temp ;PORTD 모두 h
nop
in temp,pind
cp temp,before_key ; key가 줄렸는지 체크 채터링 방지로 1회 순환
brne key_end ;
mov key_value,temp
key_end:mov before_key,temp
sw1_on: bst key_value,0 ; 현재 키값이 눌리지 않았으면 다음키 진행
brts sw1_off
bst key_status,0 ; 이전loop 에서 눌렸었던 키면 종료
brts sw1_end
bst key_toggle,0 ; 현재 led 상태가 off 일경우 on으로 분기
brts ktg0h
ktg0l: sbrs key_toggle,0 ; bit0 번째 led off
rjmp ktg0
ktg0h: sbrc key_toggle,0 ; bit0 번째 led on
ktg0:
sbrs key_status,0 ; 다음 loop 돌때 키가 눌렸었음을 기억해둠
rjmp sw1_end
sw1_off:sbrc key_status,0
sw1_end:;
sw2_on: bst key_value,1
brts sw2_off
bst key_status,1
brts sw2_end
bst key_toggle,1
brts ktg1h
ktg1l: sbrs key_toggle,1
rjmp ktg1
ktg1h: sbrc key_toggle,1
ktg1:
sbrs key_status,1
rjmp sw2_end
sw2_off: sbrc key_status,1
sw2_end:;
sw3_on: bst key_value, 2
brts sw3_off
bst key_status,2
brts sw3_end
bst key_toggle,2
brts ktg2h
ktg2l: sbrs key_toggle,2
rjmp ktg2
ktg2h: sbrc key_toggle,2
ktg2:
sbrs key_status,2
rjmp sw3_end
sw3_off: sbrc key_status,2
sw3_end:;
sw4_on: bst key_value,3
brts sw4_off
bst key_status, 3
brts sw4_end
bst key_toggle,3
brts ktg3h
ktg3l: sbrs key_toggle,3
rjmp ktg3
ktg3h: sbrc key_toggle,3
ktg3:
sbrs key_status,3
rjmp sw4_end
sw4_off: sbrc key_status,3
sw4_end:;
sw5_on: bst key_value,4
brts sw5_off
bst key_status,4
brts sw5_end
bst key_toggle,4
brts ktg4h
ktg4l: sbrs key_toggle,4
rjmp ktg4
ktg4h: sbrc key_toggle,4
ktg4:
sbrs key_status,4
rjmp sw5_end
sw5_off: sbrc key_status,4
sw5_end:;
sw6_on: bst key_value,5
brts sw6_off
bst key_status,5
brts sw6_end
bst key_toggle,5
brts ktg5h
ktg5l: sbrs key_toggle,5
rjmp ktg5
ktg5h: sbrc key_toggle,5
ktg5:
sbrs key_status,5
rjmp sw6_end
sw6_off: sbrc key_status,5
sw6_end:;
sw7_on: bst key_value,6
brts sw7_off
bst key_status,6
brts sw7_end
bst key_toggle,6
brts ktg6h
ktg6l: sbrs key_toggle,6
rjmp ktg6
ktg6h: sbrc key_toggle,6
ktg6:
sbrs key_status,6
rjmp sw7_end
sw7_off: sbrc key_status,6
sw7_end:;
sw8_on: bst key_value,7
brts sw8_off
bst key_status,7
brts sw8_end
bst key_toggle,7
brts ktg7h
ktg7l: sbrs key_toggle,7
rjmp ktg7
ktg7h: sbrc key_toggle,7
ktg7:
sbrs key_status,7
rjmp sw8_end
sw8_off: sbrc key_status,7
sw8_end:;
out portd,key_toggle
rcall d1ms
이렇게 소스를 짰는데요(나머지 key2부터 주석은 똑같이 1,2,3,...7 이렇게 진행 되므로 달지 않았습니다.)
sbrc key_status,0
sbrs key_status,0
이 부분도 실제 레지스터에서는 변화가 없습니다.
명령을 잘못 사용한건가요
아해 사진은 주석이 글자랑 같이 보여서 사진으로 다시 올립니다.

주석처리된 부분이 잘 안보여서 사진 같이 올립니다.
컴파일러로는 avrstudio4를 사용하구요
mcu는 atmega8을 사용합니다.
제가 뭐 실수 한것이 있는지 봐주세요 소스 같이 첨부 합니다.
당근이 avr http://cafe.naver.com/carroty.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=110991 질문입니다.
파일 첨부가 없습니다.
파일 은 위 당근이 카페에 있습니다.
-
?
-
?
brne PC+3, brne PC+6, brne PC-5 이 명령은 잘 이해를 못하겠는데요
대충 무슨 뜻인지요?
프로그램카운터에 왜 더하고 빼는지 이해가 안가서요...
제가 하고 싶었던 것은 portd에 스위치와 led가 병렬로 달려 있는데요
어떤키가 눌리든지 led가 토글기능이 있게 하는겁니다.
즉 키가 계속 눌려 있으면 루프가 1회 돌면 led가 토글 되므로
키가 눌려 있으면 루프가 계속 돌더라도 1번 눌린걸로 인식하고
혹시 순간적(버튼 누를때)으로 채터링이 있더라도
1번 루프 도는정도는 지나칠수 있도록 하고 싶었습니다.
그리고... 비트 1개씩 bst명령으로 로드해서 brts 명령으로 분기하시는데.이 방법을 쓰시게 되면..
만약에.. 비트 0을 먼저 검사한다면.
키 값이 0과 1을 동시에 눌렀다면 무조건 0을 누른것으로 인식하고 0으로 분기하겠죠.
0,1,2,3,4,5 키를 5개를 다 눌러도 0만을 누른것으로 인식하겠죠.
이 부분은 동시에 눌러도 키를 한 개씩 확인하므로 led 의 토글은 상관 없지 않나요 ?
키값을 t빗트로 복사하고 다음 빗트를 t빗트로 복사 하게되면 이전 명령에의한 영향을 주는 건가요?
또하나
sbrc key_toggle,3
sbrs key_toggle,3
이명령인데요 도움말을보면 이렇게 사용할 수 있도록 된 것 같은데...
전혀 레지스터의 변화가 없는데 제가 잘못 사용한건가요?
89c51와는 많이 다르네요 ....
sbt,cbt 이 명령으로 빗트제어가 됬는데
sbt portc.1 이런식으로요.... avr은 뭐랄까 좀 많이 달라서 ...
cjne 이런명령을 하나로 되던 것도 cp,brne이런 명령을 두 번씩 써야하고...
어떨때 cp,cpi 명령을 써야 하는지 .....
ㅠ.ㅠ 눈물이 앞을 가리네요.... 독학을 하려니 산은높고....
학원을 다니자니 여건은 안되고.....
이전에는 회사에 프로그래머 형이 있었는데....
지금은 관련 업종을 떠난 지 한 7년이 넘어 이젠 생소해지기도 하고.....
후배놈이랑 같이 공부 하는데요 둘다 도토리 키재기다보니.....
무엇보다 어셈 책을 보아야 할것 같은데 추천좀 부탁 드릴게요...
-
?
brne PC+3, brne PC+6, brne PC-5 이 명령은 잘 이해를 못하겠는데요
답변,,,,,
rjmp label_a
nop
nop
nop
label_a:
,,,,,
이것과
,,,,
rjmp PC+4
nop
nop
nop
,,,,
이것과 같습니다.
8051에도 어셈을 하셨으면 프로그램카운터의 개념을 아실텐데요.
AVR C언어를 컴파일 하도 나오는 lss파일에도 역시 rjmp .+13 이런식으로 나옵니다.
암튼 jmp같은 직접주소를 지정하는것은 0x01ff 이런식의 주소를 넣어줍니다.
jmp 0x01ff
다만 우리는 편의살 라벨을 붙여주면 어셈블러가 알아서 주소를 넣어주지요.
만약 라벨이란게 없고 절대주소를 값을 그냥 넣었다면 소스를 수정할 엄두가 안나겠지요.
참고로 jmp, call같은 명령은 32비트입니다. 명령어 하나가 두개의 명령어 용량을 잡아먹는다는 소리입니다.
왜냐하면 jmp, call명령은 주소만 해도 22비트를 차지하거든요!
이걸 설명하는 이유는
brne PC+2
rjmp PC-77
NOP
이렇게 있다고 하고, Z플레그가 0이라 brne에서 분기한다고 치면
PC+2가 필요합니다.
rjmp는 16비트니까요!
그러나,
brne PC+3
jmp 0x01ff
NOP
이렇게 됬다 치면 PC+3을 넣어야 하는데, 이유는 jmp명령은 32비트니까...
딴길로 샜는데 jmp에 이어 rjmp는
relative jump이지요. 즉 상대주조지하는 방식은
프로그램 카운터에 값을 더하거나 빼서 점프합니다.
이 부분은 동시에 눌러도 키를 한 개씩 확인하므로 led 의 토글은 상관 없지 않나요 ?
LED를 토글하고자 하는거라면 님 방법이 더 나은방법이 되겠습니다.
sbrc key_toggle,3
sbrs key_toggle,3
이명령인데요 도움말을보면 이렇게 사용할 수 있도록 된 것 같은데...
전혀 레지스터의 변화가 없는데 제가 잘못 사용한건가요?
전혀 잘못 사용하셨습니다.
SBRC와 SBRS의 명령은
skip bit register clear와 skip bit register set의 약자입니다. <- 외운거라 틀렸을수도 있음...
즉...
sbrc key_toggle,3
이것은... key_toggle레지스터의 3번 비트가 clear이면 다음 명령을 skip한다는 뜻입니다.
이렇게 써먹을 수 있죠.
sbrc r16,0
jmp 0x1fff ; r16레지스터 0비트가 1이면 0x1fff로
jmp 0x10ff ; r16레지스터 0비트가 0이면 0x10ff로
이렇게요...
혹은...
lds r16,TWSR ; TWI State register이라고 치고
sbrs r16,TWIE ; TWIE가 1인 경우 다음명령 스킵
rjmp PC-1 ; TWIE가 0이면 1될때까지 PC-1
이렇게 쓰지요...
이런것도 있습니다.
sbrc r16,7 ; 부호를 확인
neg r16 ; 음수면 2의 보수를 취함
이렇게도 가능하겠죠!
써먹는 방법은 다양하네요...
아무튼 AVR에는 님께서 원하시는 8051의 sbt,cbt명령은 없습니다.
저도 이런게 비트단위 토글기능이 있었으면 얼마나 좋을까 하는 생각을 많이 했습니다.
그냥...
bst key_toggle,3
brts PC+3
ori key_toggle,0x08
rjmp PC+2
andi key_toggle,~0x08
혹은...
mov r16,key_toggle
andi key_togle,~0x08
com r16
andi r16,~0x08
ori r16,key_toggle
이런식으로 해결하셔야 할 것 같습니다.
8051에는 1개 명령이면 될것을 AVR은 5개 명령이나 필요하네요.^^
참고로 ori, andi랑 비슷한게 sbr, cbr이 있는데, 이것은 기계어 코드마저 같고, andi, cbr명령에서 어셈블할 때 하나는 보수를 취해주고 하나는 보수를 안취해주는 차이만 있습니다...
-
?
키 토글 완성 했습니다.
가소롭게 생각 하실 수 있지만 몇일 애기보면서 짬내서 완성 했습니다. 다 민주님 가르쳐 주신 거지만 ㅎㅎ
생략......
ldi temp,0xff ; PORTD 모두 high
out portd,temp
nop
in temp,pind ; S/W값을 읽어들임
cp temp,before_key ; 이전에 눌렸던 S/W와 비교
brne key_end ; 이전에 눌렸던 S/W와 같지 않으면 "key_end"로 분기
mov key_value,temp ; S/W가 정상적으로 눌렸으므로 S/W값 저장
key_end:mov before_key,temp ; S/W값 저장
mov temp,key_status ;
;################################################################################# S/W 1
sw1_on: cpi key_value, 254 ;
brne sw1_off ; 이S/W 가 아니면 S/W 종료
andi temp, 1 ;
cpi temp, 1
brne PC + 2
rjmp sw1_end ; 눌렸었던 S/W이면 종료
sw1_tg: ori key_status,1 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 0 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 1 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 254 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw1_end
sw1_off:andi key_status,254 ; 현재 S/W 상태 초기화
sw1_end:;
;################################################################################# S/W 2
sw2_on: cpi key_value, 253 ;
brne sw2_off ; 이S/W 가 아니면 S/W 종료
andi temp, 2 ;
cpi temp, 2
brne PC + 2
rjmp sw2_end ; 눌렸었던 S/W이면 종료
sw2_tg: ori key_status,2 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 1 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 2 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 253 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw2_end
sw2_off:andi key_status,253 ; 현재 S/W 상태 초기화
sw2_end:;
;################################################################################# S/W 3
sw3_on: cpi key_value, 251 ;
brne sw3_off ; 이S/W 가 아니면 S/W 종료
andi temp, 4 ;
cpi temp, 4
brne PC + 2
rjmp sw3_end ; 눌렸었던 S/W이면 종료
sw3_tg: ori key_status,4 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 2 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 4 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 251 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw3_end
sw3_off:andi key_status,251 ; 현재 S/W 상태 초기화
sw3_end:;
;################################################################################# S/W 4
sw4_on: cpi key_value, 247 ;
brne sw4_off ; 이S/W 가 아니면 S/W 종료
andi temp, 8 ;
cpi temp, 8
brne PC + 2
rjmp sw4_end ; 눌렸었던 S/W이면 종료
sw4_tg: ori key_status,8 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 3 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 8 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 247 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw4_end
sw4_off:andi key_status,247 ; 현재 S/W 상태 초기화
sw4_end:;
;################################################################################# S/W 5
sw5_on: cpi key_value, 239 ;
brne sw5_off ; 이S/W 가 아니면 S/W 종료
andi temp, 16 ;
cpi temp, 16
brne PC + 2
rjmp sw5_end ; 눌렸었던 S/W이면 종료
sw5_tg: ori key_status,16 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 4 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 16 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 239 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw5_end
sw5_off:andi key_status,239 ; 현재 S/W 상태 초기화
sw5_end:;
;################################################################################# S/W 6
sw6_on: cpi key_value, 223 ;
brne sw6_off ; 이S/W 가 아니면 S/W 종료
andi temp, 32 ;
cpi temp, 32
brne PC + 2
rjmp sw6_end ; 눌렸었던 S/W이면 종료
sw6_tg: ori key_status,32 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 5 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 32 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 223 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw6_end
sw6_off:andi key_status,223 ; 현재 S/W 상태 초기화
sw6_end:;
;################################################################################# S/W 7
sw7_on: cpi key_value, 191
brne sw7_off ; 이 S/W가 아니면 S/W 종료
andi temp, 64
cpi temp, 64
brne PC + 2
rjmp sw7_end ; 눌렸었던 S/W이면 종료
sw7_tg: ori key_status,64 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 6 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle, 64 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle, 191 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw7_end
sw7_off:andi key_status,191 ; 현재 S/W 상태 초기화
sw7_end:;
;################################################################################# S/W 8
sw8_on: cpi key_value,127
brne sw8_off ; 이 S/W가 아니면 S/W 종료
andi temp,128
cpi temp,128
brne PC + 2
rjmp sw8_end ; 눌렸었던 S/W이면 종료
sw8_tg: ori key_status,128 ; 키가 눌렸음을 기억
;/////////////////////////////////////////////////////////////////////////////
bst key_toggle, 7 ; 이전 led 상태를 t빗트로 복사
brts PC + 3 ; led가 off이면 pc+3
ori key_toggle,128 ; led on
rjmp PC + 2 ; pc+2
andi key_toggle,127 ; led off
;/////////////////////////////////////////////////////////////////////////////
rjmp sw8_end
sw8_off:andi key_status,127 ; 현재 S/W 상태 초기화
sw8_end:;
ldi temp,0xff ; PORTD 5,6,7번핀 입출력모드 입력으로 변경
out ddrd,temp
out portd,key_toggle
rcall d1ms -
?
| 번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|---|
| 공지 | 안내사항 | 구 SORELL 질문과 답변 게시판 | 이민주 | 2008.04.03 | 7885 |
| 공지 | 안내사항 |
질문과 답변 게시판 이용 방법[비회원인 경우 실명 사용]
[1] |
이 민주 | 2006.09.30 | 7817 |
| 863 | 질문 | lm3915관련 문의좀 드리겠습니다.;; [1] | 조진철 | 2011.04.10 | 857 |
| 862 | 질문 | 프로젝트 의 대하여 [1] | 전기계측제어 | 2011.04.08 | 647 |
| 861 | 질문 | 당근이님 까페에서 달아주신 답글보고 여기까지 왔습니다. [10] | 마곰 | 2011.03.24 | 930 |
| 860 | 질문 | 안녕하세요..! 제작 도움좀 받고자 글을 씁니다. [1] | 빵 | 2011.03.20 | 1061 |
| 859 | 질문 | PCB 설계 문의 [1] | 나윤수 | 2011.03.16 | 1015 |
| 858 | 질문 | 안녕하세요 민주님. [5] | 주은 아빠 | 2010.12.14 | 1516 |
| 857 | 질문 | 이퀄라이저때문에 질문드립니다. [1] | 최재욱 | 2010.12.06 | 1557 |
| 856 | 질문 | GPS 시계 오류 제보. [6] | 주은 아빠 | 2010.12.01 | 1486 |
| 855 | 질문 | 구입문의 [1] | 박성학 | 2010.11.27 | 1450 |
| 854 | 질문 | GPS 시계문의 [3] | 주은 아빠 | 2010.11.24 | 1489 |
| 853 | 질문 | 레이저 경보기 구입 질문입니다 [1] | 찐상 | 2010.11.08 | 1238 |
| 852 | 질문 | 질문 ! [1] | 오동길 | 2010.10.27 | 1176 |
| 851 | 질문 | 레이저 경보기 구입 질문 [1] | 찐상 | 2010.10.26 | 1154 |
| 850 | 질문 | 레이저경보기 [1] | 영원이란 | 2010.10.10 | 1406 |
| 849 | 질문 | gps 사용자 설명서도 다운로드를 받을수 없다고 나오네요? [2] | 프라이 | 2010.09.21 | 1355 |
| 848 | 질문 | gps도트메트릭스시계문의 [31] | 스피드 | 2010.09.10 | 2101 |
| 847 | 질문 | 프로그램 카운터 관련 & 램 사용관련 질문 있습니다. [3] | Happy_day | 2010.08.23 | 1678 |
| 846 | 질문 | 민주님 avr어셈블리어 책좀 추천해 주세요 [2] | Happy_day | 2010.08.20 | 1979 |
| » | 질문 |
어셈블리어 key 읽는 것 관련해서 질문드립니다.
[5] |
Happy_day | 2010.08.14 | 2912 |
| 844 | 안녕하세요 자료... [1] | 원스톤 | 2010.08.10 | 1279 |


소스 전체가 올려져 있다보니, 분석해서 하기가 좀 번거로운것 같습니다.
일단 대충 봤는데 문제점을 지적하자면..
ldi temp,0xff ; portd s/w값 읽을 준비
out portd,temp ;PORTD 모두 h
이것이 저는 이해가 되지 않습니다.
portD를 모두 hi상태로 해놓고선 1cycle 뒤에
in temp,pind
이것이 무슨 의미가 있는걸까요..?
어차피 temp레지스터에는 0xff만 읽힐것 같은데요.
DDRD 설정을 in으로 하고 풀업을 위해 0xff라고 하신것이라면 이에 대한 설명이 없잖아요.
주석에는 "s/w 읽을 준비"라고 되어있지만 뭘 준비한다는건지..
풀업을 한다는건지, 뭘한다는건지 모르겠네요.
참고로 풀업을 하려면 PUD레지스터 0이어야 하는데 이것도 참고하시구요.
그리고 의문점 또하나...
in temp,pind
cp temp,before_key ; key가 줄렸는지 체크 채터링 방지로 1회 순환
주석을 보아하니 두번 읽어서 두 값을 비교한 뒤 이상 없으면 이것을 키값으로 사용하고자 하시는것 같네요.
그러나 위 코드 위에 라벨이 없는것을 보아하니, 다시 위로 가는 명령이나 라벨은 없어보이는데요...
저같으면 이렇게 하겠습니다.
in temp,PIND
rcall wait_20ms ; 20ms딜레이
in temp2,PIND
cp temp,temp2 ; temp레지스터와 temp2레지스터를 비교
brne PC+3 ; 비교 결과 같지 않으면 프로그램 카운터+3
mov key_data,temp ; 입력값을 키 값으로 사용
rjmp PC+2 ; 프로그램 카운터+2로 무조건 분기
ldi key_data,0xff ; 키를 안누른 값을 로드
.....
아니면..
in temp,PIND
ldi loop_count,150 ; 150회 루프
in temp2,PIND
cp temp,temp2 ; 검사
brne PC+6
mov temp,temp2 ; 값을 복사
subi loop_count,1 ; loop_count 1 감소
brne PC-5
mov key_data,temp ; 인식된 키를 key값으로 로드
ret
ldi key_data,0x0f ; 키를 안누른 값으로 로드
ret
이런식으로 하면 여러번 검사하니깐 좋겠지요!
그리고... 비트 1개씩 bst명령으로 로드해서 brts 명령으로 분기하시는데.
이 방법을 쓰시게 되면..
만약에.. 비트 0을 먼저 검사한다면.
키 값이 0과 1을 동시에 눌렀다면 무조건 0을 누른것으로 인식하고 0으로 분기하겠죠.
0,1,2,3,4,5 키를 5개를 다 눌러도 0만을 누른것으로 인식하겠죠.
차라리..
.... 키 값을 읽은 후...
cpi key_data,0x01 ; 비트1에 해당하는 키를 검사
breq ...
cpi key_data,0x02 ; 비트 2에 해당하는 키 검사
breq ..
cpi key_data,0x04 ; 비트 3에 해당하는 키 검사
breq ...
cpi key_data,0x08 ; 비트 4에 해당하는 키 검사
breq
이런식으로 짜면 되겠죠?
저처럼 짜면 2~3개를 누르면 키 값을 무시할 수도 있고,
필요에 따라
cpi key_data,0x0c
이렇게 하면 비트 3,4 동시 눌려야 인식되게도 구성 가능하고요!!
그럼 참조하세요!~