스캔 기능을 시작합니다. 엡슨 ds770 스캐너의 기능은 대상 애플리케이션이나 엡슨 사진 공유 사이트로 데이터를 스캔하고 전송하는 것입니다. 사용하기 전에 스캔해야 할 파일을 엡슨 ds770 에 넣은 다음 스캐너 버튼을 클릭하여 스캔해야 합니다.
단일 칩 키보드 스캐너
2*3 키보드는 너무 간단해서 재활용할 가치가 없다. 특히 이중순환이다.
가장 간결하고 효과적인 절차는 다음과 같습니다.
Sbitp10 = p10;
Sbitp11= p11;
Sbitp12 = p12;
Sbitp13 = p13;
Sbitp14 = p14;
Charscan_key(void)
{
P13 = 0;
만약 (! P10) 복귀 0;
만약 (! P11) return1;
만약 (! P12) 복귀 2;
P13 =1;
P14 = 0;
만약 (! P10) return 3 :
만약 (! P11) return 4;
만약 (! P12) return 5;
}
이 프로세스는 가장 적은 변수를 사용하며 다른 인터페이스는 포함하지 않습니다.
코드가 가장 적고 실행 효율이 가장 높다.
이 키보드 스캐너를 어떻게 해석합니까?
0x 10 이 이진으로 변환될 때 000 10000 이고, 고 4 자리가 열인 경우 프로그램은 열별로 스캔하고, 가장 낮은 열부터 마스크로 1 명만 남깁니다.
P1= 0xf0; //모든 0 행 스캔 코드를 보냅니다. 즉, 모든 열이 먼저 높고 행 위치가 낮습니다. 이것이 초기 값입니다. 회로도를 보고 버튼을 누르면 머릿속에서 프로그램을 분석할 수 있는 것이 좋습니다.
If((P 10xf0)! =0xf0)// 키를 눌렀을 경우, 이 말이 참일 경우, 키가 하나 이상 눌러져 있지만 어느 열인지 분간할 수 없습니다. 그것은 버튼만 눌렀다는 것을 증명할 수 있을 뿐, 물론 어느 줄인지 분간할 수 없다.
Scancode = 0xfe// 이 말은 스캔 코드에 초기 값을 설정하는 것이고 0xfe 는 바이너리1111/kloc 입니다
While((scancode0x 10)! =0)// 한 줄씩 스캔합니다. 아까 말씀드렸듯이 이 0x 10 은 바이너리 000 10000, 스캔 코드1/kloc-0 입니다 이 방법은 여러 키를 동시에 누르는 경우를 처리할 수 없습니다. 한 키를 누르면 뒤가 스캔되지 않기 때문에 낮은 것이 우선입니다. 이때 스캔 코드 자체가 해당 행의 값입니다.
P 1 = 스캔 코드; //라인 스캔 코드를 출력합니다. 스캔 코드의 값은111111/kloc 입니다
If((P 10xf0)! =0xf0)// 이 판단에서 P 1 은 AND 입니다. 키가 없는 경우 P 1 은 scancode 의 값과 같아야 합니다. 0xf0 이후와 그 후, 고 4 자리는 1 1 10000 을 남겼다. 확실히 1 1 10000 과 같지 않습니다. 예를 들어 1 1 100000 이면 표현식은 참입니다.
Tmp 코드 = (p10xf0) | 0x0f; //이 문장에서 P 1 의 값과 0x0f 는 또는 연산하고, 낮은 4 자리는 1 열 스캔 코드입니다.
Return ((~ scan code)+(~ tmpcode)); //다른 비트는 모두 1 으로 채워져 있기 때문에 각 획의 결과는 1 이고, 반대로 출력한 결과는 1 코드만 있습니다.
Else scan code = (scan code1) | 0x01; //줄 스캔 코드를 왼쪽으로 한 자리 이동하여 스캔 코드를111111/kloc-0 에서 가져옵니다 0x00 1 의 가장 낮은 비트를11111/kloc 로 변경했습니다 1111111및/kloc-가 차례로 변경됩니다
위 절차를 반복하여 모든 검사를 완료합니다.
간단히 말해서, 키 지터를 제거하는 것입니다. 단일 칩 마이크로 컴퓨터가 키 값을 올바르게 읽고 간섭 신호를 차단할 수 있도록 합니다.
일반적으로 키에 사용되는 스위치는 기계적 탄성 스위치입니다. 기계적 접점이 열리거나 닫히면 키 스위치가 닫히면 즉시 안정적으로 켜지지 않으며, 켜도 즉시 꺼지지 않습니다. 그래서 폐쇄와 개방의 순간에 일련의 떨림이 있는데, 이런 현상을 피하는 조치는 키의 떨림을 없애는 것이다.
이 키보드 스캐너를 이해하는 방법 (급함! ! ! ! ) 을 참조하십시오
프로그램에 문제가 있습니다!
#includereg5 1.h
# math.h 포함
#includeintrins.h
#defineucharunsignedchar
# define tur 1
#defineFALSE0
Intkey
Intdel
VoidTkey (유효하지 않음);
* * * * * * * * * * * 주 프로그램 * * * * * * * * *
Voidmain (유효하지 않음)
{
Voidtkey (유효하지 않음);
Void delay (int) :
Scon = 0x00;
TI = 0;;
비록 (정말로)
{
Tkey ();
지연 (2000 년);
}//이것은 무한 루프입니다.
}
VoidTkey (유효하지 않음)
{
Ucharreadkey// 다시 읽기 키;
Ucharx_temp, y _ temp
/* 당신이 준 프로그램은 당신의 키보드가 4X4 */
P1= 0x0f; //행에 하이 레벨을 보내고 열에 로우 레벨을 보냅니다.
X _ temp = p10x0f; //회선 상태 다시 읽기
If (if(x _ temp = = 0x0f)gotokeyout;; /* 행에 로우 레벨이 있는 경우 0x0f 와 같지 않습니다.
/* 키를 눌렀음을 나타냅니다.
P1= 0xf0; //주어진 열에 고평을 보내고, 행에 저평을 보냅니다.
Y _ temp = p10xf0; //줄 상태를 다시 읽습니다.
Readkey = x _ temp | y _ temp// 행 상태 열 상태를 결합하여 키를 나타냅니다.
Readkey = ~ readkey// 반대 접근 방식을 취하다
스위치 (리드 키)//키 코드를 결정합니다.
{
케이스 0x11:키 = 0; 깨뜨리다
Case0x21:key =1; 깨뜨리다
Case0x41:키 = 2; 깨뜨리다
케이스 0x81:키 = 3; 깨뜨리다
케이스 0x12: 키 = 4; 깨뜨리다
Case0x22: 키 = 5; 깨뜨리다
Case0x42: 키 = 6; 깨뜨리다
Case0x82: 키 = 7; 깨뜨리다
케이스 0x14: 키 = 8; 깨뜨리다
Case0x24: 키 = 9; 깨뜨리다
Case0x44: 키 =10; 깨뜨리다
Case0x84: 키 =11; 깨뜨리다
케이스 0x18: 키 =12; 깨뜨리다
Case0x28: 키 =13; 깨뜨리다
Case0x48: 키 =14; 깨뜨리다
Case0x88: 키 =15; 깨뜨리다
기본값: 키 =16; 깨뜨리다
}
Keyout: _ nop _ ();
}
/* * * * * * * * * * * 지연 절차 * * * * * * * * *
잘못된 지연
{
For(del;; Del 0 del-);
}
키보드 스캔은 어떻게 작동합니까? 프로그램에서 어떤 전문가가 답을 주어야 합니까?
*
P2 포트는 4X4 매트릭스 키보드입니다.
P0 포트는 8 개의 발광 다이오드로 버튼을 표시하는 데 사용됩니다.
*/
#includereg52.h
UnsignedcharTrg
UnsignedcharCont
VoidKeyRead(void)
{
UnsignedcharReadData
P2 = 0x0f;;
Readdata = p2;
P2 = 0xf0;
Readdata = (readdata | p2) 0xff;
Trg = trg=readdata(readdata^cont););
Cont = ReadData
}
VoidKeyProc(void)
{
If(Trg)// 누르면.
{
P0=trg^0xff;; //코드가 실행되었습니다
}
If(Cont)// 키를 누르면.
{
}
If(Trg==0Cont==0)// 누르고 놓기.
{
P0 = 0xff
}
}
Voidmain ()
{
Trg = 0;;
Cont = 0;;
While( 1)
{
키 리드 ();
Keyproc ();
}
}