채우기 문자

"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, //*** ┝의 양극 세그먼트 코드

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'

}

/*

입력 매개변수:

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;

}

}

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)

}

}

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> 중단;

}

}

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;

}

}

}