"51 마이크로 컨트롤러 C 언어 응용 기술 개발 백과사전"에서 하나를 찾았습니다.
SCH 다이어그램이 그려지고 있습니다. . .
#include lt; //51 마이크로컨트롤러의 헤더 파일
typedef unsigned char uchar; //유형 정의, uchar 유형 정의
typedef unsigned int uint; //유형 정의, uint 유형 정의
//키보드 서브루틴 관련 명령.
#define BLANKCHAR 10 //빈 상수 정의
#define PCHAR 11 //문자 P 상수 정의
#define OPENCHAR 12 //잠금 해제 문자 상수 정의
#define ALARMCHAR 13 //문자 A 상수 정의
#define LINECHAR 14 //문자 상수 정의
#define BACKKEY 0X0D //백스페이스 키 정의 상수
#define ENTERKEY 0X0F //확인 키 상수 정의
#define LOCKKEY 0X0E //잠금 키 상수 정의
#define NO_KEY 20 //정의 아니요 키 반환 값
#define KEYPORT P2 //키보드 포트 정의
//Delay1Ms
void Delay1Ms()
{< / p>
uint i;
for (i=0; ilt; 1000; i );
}
//키 스캔 코드 정의 언제 테이블 키가 스캔되고, 4비트 열 라인과 4비트 행 라인이 바이트 데이터 테이블을 형성합니다.
uchar 코드 KEYCODE[]=
{0XEE, 0XED, 0XEB, 0XE7 ,
p>0XDE, 0XDD, 0XDB, 0XD7,
0XBE, 0XBD, 0XBB, 0XB7,
0X7E, 0X7D, 0X7B, 0X77};< /p>
uchar KeyPre; //마지막으로 스캔한 키의 키 값을 저장합니다.
uchar KeyUp;//키 디바운스 작업을 제어하는 데 사용됩니다. 1: 스캔 시 디바운스 2: 릴리스 대기 중 3: 릴리스 시 디바운스.
#define LEDPORT P0 //디스플레이 세그먼트 코드 출력 포트 정의
#define LEDCON P1 //디스플레이 비트 제어 포트 정의
uchar code SEGCODE[ ]=
{0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, //*** 양극 코드 0~9
0xff, // 표시되지 않음 ***양극 세그먼트 코드
0X8C, //*** 문자 P의 양극 세그먼트 코드
0X8F, //*** ┝의 양극 세그먼트 코드 p>
0X88, //*** 문자 A의 양극 세그먼트 코드
0XBF, //*** 문자의 양극 세그먼트 코드 -
}; >
//LED 비트 코드 제어 코드 정의
uchar 코드 BITCODE[]={0Xfe, 0Xfd, 0Xfb, 0Xf7, 0Xef, 0Xdf, 0Xbf, 0X7f}
uchar DispBuf[6]; //표시된 문자를 저장합니다.
bit DispNormal; //표시할 때 정상적으로 표시할지, 깜박일지 제어합니다.
uchar DispCnt; //디스플레이 깜박임 빈도를 제어합니다.
#define SHORT_TIME 10 //부저가 200ms 동안 울립니다.
#define LONG_TIME 100 //부저가 2초간 울립니다.
#define LONGER_TIME 9000 //The 부저 소리 3분간 부저가 울립니다.
sbit ALARMCON=P3^4; //알람 제어 핀 정의
bit AlarmEnable; //알람 또는 소리 프롬프트가 있는지 여부< /p>
uint AlarmTime; //알람 시간 길이 제어
sbit LOCKCON=P3^3; //전자 잠금 제어 핀 정의
PassWord[] ={1, 2, 3 , 4, 5}; //초기 비밀번호 테이블 정의
uchar PassInBuf[6] //입력된 비밀번호 문자를 저장합니다.
uchar PassPosi; //사용자가 입력한 비밀번호 문자는 PassInBuf[]의 위치에 저장됩니다.
bit TimerBit; //20ms 타이머 만료
uchar SysMode; //시스템이 모드 0: 비밀번호 모드 입력 1: 알람 모드 2: 잠금 해제 모드
< p>uchar ErrorCnt; //사용자가 연속적으로 비밀번호 오류를 범한 횟수입니다./*
입력 매개변수:
FillChar: 버퍼에 기록된 문자
종료 매개변수: 없음
*/
void Fill_Buf(uchar FillChar)
{
uchar i;
for(i=0; ilt; 6 ; i )
{
DispBuf[i]=FillChar; //DispBuf[i]를 FillChar로 채웁니다.
PassInBuf[i]=FillChar; /FillChar [i] 문자로 PassInBuf 채우기
}
}
void Fill_Buf_P()
{
Fill_Buf(BLANKCHAR); // DispBuf[1..5]= ' '
DispBuf[0]=PCHAR; // DispBuf[0]='P'
}
void Fill_Buf_O()
{
Fill_Buf(BLANKCHAR); // DispBuf[1..5]= ' '
DispBuf[0]=OPENCHAR; // DispBuf[0]='┝'
}
void Fill_Buf_A()
{
Fill_Buf(LINECHAR); // DispBuf[1..5]= ' -----'
DispBuf[0]=ALARMCHAR; // DispBuf[0]='A' p >
}
/*
입력 매개변수:
DispPosi: 데이터를 표시하는 LED 번호.
DispChar: 표시할 콘텐츠입니다.
내보내기 매개변수: 없음
*/
void Disp_Led_Sin(uchar DispChar, uchar DispPosi)
{
LEDPORT=SEGCODE[DispChar]; //디스플레이 세그먼트 코드 출력
LEDCONamp;=BITCODE[DispPosi] //디스플레이 비트 코드 출력
Delay1Ms(); 지연 1MS
LEDCON|=0X3F; //디스플레이 끄기
}
/* (2) 디스플레이 기능 Disp_Led_OFF를 끕니다.
Disp_Led_OFF 기능은 디스플레이에 공백 문자를 표시하며 주로 깜박이는 디스플레이에 사용됩니다. 이 함수는 Disp_Led_Sin을 6번 호출하여 필요한 기능을 달성합니다.
코드는 다음과 같습니다: */
void Disp_Led_OFF()
{
uchar i;
LEDCON|=0X3F; / 디스플레이 끄기
for(i=0;ilt;6;i)
{
Disp_Led_Sin(BLANKCHAR, i) //공백 표시 문자를 하나씩
}
}
void Disp_Led_All()
{
uchar i;< /p>
LEDCON |=0X3F; // 디스플레이 끄기
for(i=0;ilt;6;i)
{
Disp_Led_Sin(DispBuf[i], i ); //DispBuf[]에 값을 표시합니다.
}
}
void Disp_LED()
{
DispCnt;
DispCnt=10
if(DispCnt==0)
{
DispNormal=~DispNormal; //깜박이는 디스플레이 제어 비트를 200ms 후에 반전
}
if(SysMode==1)
{/ /알람 모드, 점멸 표시
if(!DispNormal)
{
Disp_Led_OFF() //공백 표시
return ;
}
}
Disp_Led_All(); //DispBuf에 값을 표시합니다[]
}
< p>/* < p>입력 매개변수:stime: 부저 소리 시간.
매개변수 내보내기: 없음
*/
void Sys_Speaker(단위 시간)
{
AlarmEnable= 1; //알람 허용
AlarmTime=stime; //알람 시간 길이
}
void Sys_Alarm()
{< /p>
if(AlarmEnable==1)
{//알람 허용
ALARMCON=0; //알람
AlarmTime--;
if(AlarmTime==0)
{//알람 시간 중지
AlarmEnable=0
ALARMCON=1; /알람 비활성화
if(SysMode==1)
{//모드 1에서 알람이 발생하면 모드 0으로 복귀합니다.
SysMode=0;
Fill_Buf_P(); //P 표시
}
}
}
}
/*
입력 매개변수: 없음
종료 매개변수: 키 값 또는 키 없음
*/
uchar Find_Key ()
{
uchar KeyTemp, i;
KEYPORT=0xf0; //행 라인은 0을 출력하고, 열 라인은 모두 1을 출력합니다. >< p> KeyTemp=KEYPORT; //키 포트 값 읽기
if(KeyTemp==0xf0)
return NO_KEY; //키를 누르지 않으면 return
KEYPORT=KeyTemp|0x0f; //열 라인 출력, 행 라인 입력
KeyTemp=KEYPORT; //키 포트 값 읽기
for(i=0; ilt; 16 ; i )
{
if(KeyTemp==KEYCODE[i])//키 포트 스캔 값을 기준으로 키 값 찾기
return i ;/ /반환 키 값
}
return NO_KEY
}
/*
입력 매개변수 : 없음
매개변수 내보내기: 키 값 또는 키 없음
*/
uchar Scan_Key()
{
< p> uchar KeyTemp;KeyTemp=Find_Key(); //키보드를 스캔하여 키 값을 가져옵니다.
if(KeyTemp==NO_KEY)
{
if(KeyUplt; 2)
{//키를 누르지 않으면 반환
KeyUp=0;
return NO_KEY;< /p>
}
if(KeyUp==2)
{//키를 해제하려면 디바운스를 지연하세요.
KeyUp=3;
NO_KEY 반환;
}
if(KeyUp==3)
{//키를 놓고 키 값을 반환합니다.
KeyUp=0;
return KeyPre; p>
else
{
if(KeyUp==0)
{//키를 눌렀을 때 키 값을 저장
p>KeyUp=1;
KeyPre=KeyTemp;
}
else if(KeyUp==1)
{//Go 흔든 후 키 누름이 다시 감지됩니다.
if(KeyPre==KeyTemp)
KeyUp=2;
else
KeyPre=KeyTemp;
} else if(KeyUp==3)
{//키 해제 대기
KeyUp=2; p>
}
}
NO_KEY 반환
}
/*
입력 매개변수 :
키: 키 값
내보내기 매개변수: 없음
*/
void Key_Process(uchar Key)
< p>{< /p>uchar i;
if(Key==NO_KEY)
return; //키 없음, 처리 없음
switch(SysMode)
{
사례 0: //비밀번호 입력
switch(Key)
{
< p> 사례 0 :사례 1:
사례 2:
사례 3:
사례 4:
< p> 사례 5:사례 6:
사례 7:
사례 8:
사례 9:
< p> DispBuf[ PassPosi]=LINECHAR; //'-' 표시PassInBuf[PassPosi]=Key; //사용자가 입력한 비밀번호를 저장합니다.
if (PassPosilt; 5 )
< p> PassPosi; //비밀번호 입력 위치 조정Sys_Speaker(SHORT_TIME) //키 프롬프트 톤 보내기
break;
case BACKKEY: //스페이스 키 종료
DispBuf[PassPosi]=BLANKCHAR; //' ' 표시
PassInBuf[PassPosi]=BLANKCHAR; //현재 위치의 비밀번호를 지웁니다.
if (PassPosigt; 1)
PassPosi--; //표시 위치 조정
Sys_Speaker(SHORT_TIME);/
/키 톤 보내기
break;
case ENTERKEY: //키 확인
for(i=0; ilt; 5; i)
{//사용자가 입력한 비밀번호가 시스템 기본 비밀번호와 일치하는지 비교
if(PassInBuf[i 1]!=PassWord[i])
break ;
p>}
if(igt;=5)
{//비밀번호를 정확하게 입력하세요
Fill_Buf_O(); //잠금 해제 상태 표시< /p>
PassPosi=1;
LOCKCON=1; //잠금 해제
ErrorCnt=0; LONG_TIME); //긴 프롬프트 톤 보내기
SysMode=2; // 모드 2로 전환
}
else
{
ErrorCnt; //오류 개수를 1개 늘립니다.
if(ErrorCntgt; 2)
{//오류 개수가 3회를 초과합니다
p>
ErrorCnt=0;
Fill_Buf_A(); //알람 상태 표시
PassPosi=1;
Sys_Speaker(LONGER_TIME) // 알람 소리 보내기
SysMode=1 ;
}
else
{//오류 개수가 3개 미만입니다. 사용자가 다시 입력합니다.
Fill_Buf_P();
p>PassPosi=1
Sys_Speaker(LONG_TIME)
} p>
}
break;
case LOCKKEY: //잠금 키
Fill_Buf_P() //P 표시
PassPosi=1;
Sys_Speaker(SHORT_TIME);
p>중단
}
중단; p> 사례 2: //잠금 해제 상태
if(Key== LOCKKEY)
{//사용자가 잠금 버튼을 누름
Fill_Buf_P();
SysMode=0;
LOCKCON=0; //잠금
Sys_Speaker(SHORT_TIME); p> 중단;
}
} p>
void Ini_Timer0()
{
TMODamp;=0XF0;
TMOD|=0X01; // T0 초기화, 모드 1
TR0=0;
TH0=(65536-20000)/256; //T0은 초기 카운트 값을 할당합니다.
TL0=(65536-20000)256;
TR0=1; T0
ET0=1; //T0 인터럽트 허용
}
void Timer0() 인터럽트 1
{
TR0=0;
TH0=(65536-20000)/256; //T0은 초기 카운트 값을 할당합니다.
TL0=(65536-20000)256;
TR0=1;
TimerBit=1; // 타이밍 시간이 다 되었습니다
}
void Ini_System()
{
PassPosi=1;
LOCKCON=0; //래치
Ini_Timer0() //T0 초기화
Fill_Buf_P ( );
EA=1; //시스템 인터럽트 허용
}
void main()
{
< p> uchar KeyTemp;Ini_System();
while(1)
{
if (TimerBit==1) < /p>
{//예약 시간 종료
Disp_LED(); //디스플레이 새로 고침
Sys_Alarm();
KeyTemp =Scan_Key(); //키 스캔
Key_Process(KeyTemp) //키 처리
TimerBit=0;
} p>
}
}