当前位置:首页 > 51开发板使用手册 - 图文
AT89S5X Demo Board User’s Manual Owen Studio P3_3=1; /*关喇叭*/
P2=0x00; /*熄灭8个发光二极管*/ while(1) {
IdleForLogin(); } }
/********************************************************************/ void IdleForLogin() /*登陆系统前的密码检测模块*/ {
static uint s_UARTSendCounter; uchar keyPtr;
keyPtr=KeyJudge(); /*键盘扫描判断*/ if(keyPtr!=0x55) {
switch(c_keyCode[keyPtr]) {
case 0x0a: ReadPassword(); /*按A键:读取24C02中的密码并显示*/ for(i=0;i<5;i++) /*显示密码1秒后恢复*/ {
Delay(20000); } ClearScr(); break;
case 0x0b: WritePassword(); /*按B键:将屏幕中的六位数字设为密码*/ ClearScr(); break;
case 0x0c: ClearScr(); /*按C键:清屏*/ break;
case 0x0d: Login(); /*按D键:比较密码,如果密码正确则进入系统*/ break; case 0x0e: break; /*按*键:保留*/
case 0x0f: break; /*按#键:保留*/
default: ScrShift(keyPtr); /*以上均不是则为数字键,六位数码管顺序左移*/ break; }
UARTKeyFlag=0xaa; /*清串口命令标志位*/ }
if(++s_UARTSendCounter>200) /*定期上传系统状态*/ {
s_UARTSendCounter=0; StatusSend(); } }
- 24 -
AT89S5X Demo Board User’s Manual Owen Studio /********************************************************************/ void Login(void) /*系统登录模块*/ { for(i=0;i<6;i++) /*比较密码是否正确*/ {
if(DisplayArray[i]!=password[i]) { return;
} }
TR1=1; /*启动系统时基Timer1,中断周期10ms*/ ClearScr(); /*清屏*/ s_musicCounter=0x01; LEDFlag=0x01;
ModifyTime(); /*初始设定时间*/ while (1) {
MainSystem(); /*进入系统主程序*/ } }
/********************************************************************/ void MainSystem(void) /*系统主程序*/ {
static uint s_UARTSendCounter; uchar keyPtr;
keyPtr=KeyJudge(); /*键盘扫描判断*/
if(keyPtr!=0x55) /*如果按某键则进行相应处理*/ {
KeyHandle(keyPtr); }
LEDHandle(); /*流水灯处理模块*/
if(++s_UARTSendCounter>200) /*定期上传系统状态*/ {
s_UARTSendCounter=0; StatusSend(); }
if(modifyTimeFlag==1) {
ModifyTime(); /*根据新秒值调整时间*/ modifyTimeFlag=0; } }
/********************************************************************/ void ScanKeys(void) /*扫描键盘模块*/ {
- 25 -
AT89S5X Demo Board User’s Manual Owen Studio uchar scanValue=0xef,iScan,scanTempUchar; for(iScan=0;iScan<4;iScan++) {
P1=scanValue; /*发扫描值*/ scanTempUchar=P1; /*读入扫描值*/ if((scanTempUchar&0x01)==0x00) /*第一列被按*/ {
keyFlag|=(0x0001<<(iScan*4+0)); /*置此键的标志位*/ } else {
keyFlag&=~(0x0001<<(iScan*4+0)); /*清此键的标志位*/ }
if((scanTempUchar&0x02)==0x00) /*第二列被按*/ {
keyFlag|=(0x0001<<(iScan*4+1)); /*置此键的标志位*/ } else {
keyFlag&=~(0x0001<<(iScan*4+1)); /*清此键的标志位*/ }
if((scanTempUchar&0x04)==0x00) /*第三列被按*/ {
keyFlag|=0x0001<<(iScan*4+2); /*置此键的标志位*/ } else {
keyFlag&=~(0x0001<<(iScan*4+2)); /*清此键的标志位*/ }
if((scanTempUchar&0x08)==0x00) /*第四列被按*/ {
keyFlag|=0x0001<<(iScan*4+3); /*置此键的标志位*/ } else {
keyFlag&=~(0x0001<<(iScan*4+3)); /*清此键的标志位*/ }
scanValue=scanValue<<1|0x01; /*置下一次扫描值*/ } }
/********************************************************************/ uchar KeyJudge(void) /*按键预处理*/ {
uchar j,counterKeyPressedNum;
- 26 -
AT89S5X Demo Board User’s Manual Owen Studio uchar keyRet=0x55; /*初始按键返回码设定为无按码0x55*/ uint uintTemp;
ScanKeys(); /*扫描键盘*/ if(keyFlag!=0) {
Delay(1000); /*延时10ms以消除抖动*/ ScanKeys(); P1=0x0f;
while((P1&0x0f)!=0x0f); /*没松开按键就等按键松开*/ counterKeyPressedNum=0; for(j=0;j<16;j++) {
uintTemp=((uint)0x0001)< if((keyFlag&uintTemp)==uintTemp) /*依次检测键盘扫描标志KeyFlag*/ { /*如某位置一则按键个数寄存器加一*/ counterKeyPressedNum++; keyRet=j; } } if(counterKeyPressedNum>1) /*如果不止一个键被按则返回无按码0x55*/ { return 0x55; } else /*某键被按,返回此键的标识码*/ { return(keyRet); } } if(UARTKeyFlag!=0xaa) { return(UARTKeyFlag); } return(0x55); } /********************************************************************/ void KeyHandle(uchar keyIndex) /*按键处理模块*/ { switch(c_keyCode[keyIndex]) /*按数字键N:循环播放第N首音乐*/ { case 0x01: s_musicCounter=1; musicAutoFlag=0; s_tableCounter=0x00; break; case 0x02: s_musicCounter=2; musicAutoFlag=0; s_tableCounter=0x00; break; case 0x03: s_musicCounter=3; musicAutoFlag=0; s_tableCounter=0x00; break; case 0x04: s_musicCounter=4; musicAutoFlag=0; s_tableCounter=0x00; break; case 0x0a: sec++; /*按A键:调整时钟秒值*/ ModifyTime(); - 27 -
共分享92篇相关文档