?? myboard.c
字號(hào):
0x04,0x05,0x06,0x0b, /*鍵盤4,5,6,B*/
0x07,0x08,0x09,0x0c, /*鍵盤7,8,9,C*/
0x0e,0x00,0x0f,0x0d}; /*鍵盤*,0,#,D*/
const uint code c_musicFreq[]={64260,64400,64524,64580, /*低音5,6,7,中音1*/
64684,64777,64820,64898, /*中音2,3,4,5*/
64968,65030,65058,65110, /*中音6,7,高音1,2*/
65157,65178,65217}; /*高音3,4,5*/
/*Constant Tables Over*/
/*************************************************************************/
/*System Variables*/
uint keyFlag;
uchar hour=10;min=0;sec=0;
uchar DisplayArray[6];
uchar password[6]={0x00,0x00,0x00,0x00,0x00,0x00};
static uchar LEDFlag=0;
bit LEDCycle100msFlag=0,LEDCycle500usFlag=0,LEDCycle10msFlag=0,LEDAutoFlag=1,LEDKeyFlag=0;
static uchar s_musicCounter=0x00,s_tableCounter;
bit musicAutoFlag=1,musicKeyFlag=1;
uchar Int0Flag,TH0Global,TL0Global;
uchar UARTKeyFlag=0xaa,modifyTimeFlag=0;
/*System Variables Over*/
/*************************************************************************/
/*System Functions*/
void IdleForLogin(); /*登陸系統(tǒng)前的密碼檢測(cè)模塊*/
void Login(void); /*系統(tǒng)登錄模塊*/
void MainSystem(void); /*系統(tǒng)主程序*/
void ScanKeys(void); /*掃描鍵盤模塊*/
uchar KeyJudge(void); /*按鍵預(yù)處理*/
void KeyHandle(uchar keyIndex); /*按鍵處理模塊*/
void LEDHandle(void); /*流水燈方案選擇*/
void AutoShow(void); /*開始流水燈自動(dòng)循環(huán)演示*/
void StopAutoShow(void); /*停止流水燈自動(dòng)循環(huán)演示*/
void DropDown(void); /*水滴方案*/
void CircleFlash(void); /*環(huán)掃方案*/
void GradualFlash(void); /*漸明漸暗方案*/
void SlowFlash(void); /*慢閃方案*/
void FastFlash(void); /*快閃方案*/
void ScrShift(uchar keyIndex); /*六位數(shù)碼管順序左移*/
void ClearScr(void); /*清屏*/
void ReadPassword(); /*從24C02中讀取密碼*/
void WritePassword(); /*將屏幕的六位數(shù)字作為密碼存入24C02中*/
void StatusSend(void); /*下位機(jī)狀態(tài)反饋(串口)*/
void Delay (uint value); /*10us延時(shí)*/
void ModifyTime(void); /*調(diào)整時(shí)間*/
void ScanSeg7(); /*數(shù)碼管掃描顯示*/
/*System Functions Over*/
/*************************************************************************/
/*IIC Varialbes & Functions*/
sbit SCL=P3^4; /*定義IIC總線的時(shí)鐘線*/
sbit SDA=P3^5; /*定義IIC總線的數(shù)據(jù)線*/
void StartIIC(); /*發(fā)送IIC總線啟動(dòng)時(shí)序*/
void StopIIC(); /*發(fā)送IIC總線停止時(shí)序*/
void IICClockDelay(); /*IIC總線時(shí)鐘電平延時(shí)*/
void IICAck(bit ackValue); /*MCU對(duì)24C02的應(yīng)答函數(shù)*/
uchar IICRcvByte(); /*MCU從24C02接收一個(gè)字節(jié)*/
bit IICSendByte(uchar byteData); /*MCU向24C02發(fā)送一個(gè)字節(jié)*/
/*MCU向24C02的指定地址寫入若干個(gè)字節(jié)數(shù)據(jù)函數(shù)*/
bit IICWrite(uchar slaveAddress,uchar subAddress,uchar *dataPointer,uchar num);
/*MCU從24C02的指定地址度去若干個(gè)字節(jié)數(shù)據(jù)函數(shù)*/
bit IICRead(uchar slaveAddress,uchar subAddress,uchar *dataPointer,uchar num);
/*IIC Varialbes & Functions Over*/
/*************************************************************************/
/*************************************************************************/
void main(void) /*主程序入口*/
{
TMOD=0x11; /*Timer0工作在案MODE1,16位定時(shí)器,Timer1工作在MODE2,自動(dòng)重新裝載模式*/
/*| 定時(shí)器1 | 定時(shí)器1 |*/
/*| GATE|C/T| M1 | M0 | GATE|C/T| M1 | M0 |*/
TH0=(65536-SCAN_CYCLE)/256; /*設(shè)定Timer0每隔SCAN_CYCLEu中斷一次*/
TL0=(65536-SCAN_CYCLE)%256;
TR0=1; /*啟動(dòng)TEMER0*/
TH1=(65536-10000)/256; /*設(shè)定Timer1每10ms中斷一次*/
TL1=(65536-10000)%256;
T2CON=0x38; /*令定時(shí)器2作為串口波特率發(fā)生器
/*|TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|*/
TL2=0xd9; /*設(shè)定串口波特率為9600,晶振為12MHz*/
TH2=0xff;
RCAP2L=0xd9; /*根據(jù)串口波特率9600設(shè)定自動(dòng)重載寄存器*/
RCAP2H=0xff;
TR2=1; /*啟動(dòng)定時(shí)器2*/
SCON=0x50; /*設(shè)定UART工作在MODE3模式,可傳送和接收數(shù)據(jù),REN=1*/
/*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
IE=0x9a; /*使能總中斷、Timer0,1中斷、外部中斷1,2*/
/*| EA| - | ET2| ES | ET1| EX1| ET0| EX0|*/
IP=0x12; /*優(yōu)先Timer0中斷*/
/*| - | - | PT2| PS | PT1| PX1| PT0| PX0|*/
ReadPassword(); /*先把24C02中的密碼讀到密碼緩沖區(qū)中*/
ClearScr(); /*預(yù)清屏*/
P3_3=1; /*關(guān)喇叭*/
P2=0x00; /*點(diǎn)亮8個(gè)發(fā)光二極管*/
while(1)
{
IdleForLogin();
}
}
/*************************************************************************/
void IdleForLogin() /*登陸系統(tǒng)前的密碼檢測(cè)模塊*/
{
static uint s_UARTSendCounter;
uchar keyPtr,i;
keyPtr=KeyJudge(); /*鍵盤掃描判斷*/
if(keyPtr!=0x55)
{
switch(c_keyCode[keyPtr])
{
case 0x0a: ReadPassword(); /*按A鍵:讀取24C02中的密碼并顯示*/
for(i=0;i<5;i++) /*顯示密碼1秒后恢復(fù)*/
{
Delay(20000);
}
ClearScr();
break;
case 0x0b: WritePassword(); /*按B鍵:將屏幕中的六位數(shù)字設(shè)為密碼*/
ClearScr();
break;
case 0x0c: ClearScr(); /*按C鍵:清屏*/
break;
case 0x0d: Login(); /*按D鍵:比較密碼,如果密碼正確則進(jìn)入系統(tǒng)*/
break;
case 0x0e: /*按*鍵:保留*/
break;
case 0x0f: /*按#鍵:保留*/
break;
default: ScrShift(keyPtr); /*以上均不是則為數(shù)字鍵,六位數(shù)碼管順序左移*/
break;
}
UARTKeyFlag=0xaa; /*清串口鍵盤命令標(biāo)志位*/
}
if(++s_UARTSendCounter>200) /*定期上傳系統(tǒng)狀態(tài)*/
{
s_UARTSendCounter=0;
StatusSend();
}
}
/*************************************************************************/
void Login(void) /*系統(tǒng)登錄模塊*/
{
uchar i;
for(i=0;i<6;i++) /*比較密碼是否正確*/
{
if(DisplayArray[i]!=password[i])
{
return;
}
}
TR1=1; /*啟動(dòng)系統(tǒng)時(shí)基Timer1,中斷周期10ms*/
ClearScr(); /*清屏*/
s_musicCounter=0x01;
LEDFlag=0x01;
ModifyTime(); /*初始設(shè)定時(shí)間*/
while (1)
{
MainSystem(); /*進(jìn)入系統(tǒng)主程序*/
}
}
/*************************************************************************/
void MainSystem(void) /*系統(tǒng)主程序*/
{
static uint s_UARTSendCounter;
uchar keyPtr;
keyPtr=KeyJudge(); /*鍵盤掃描判斷*/
if(keyPtr!=0x55) /*如果按某鍵則進(jìn)行相應(yīng)處理*/
{
KeyHandle(keyPtr);
UARTKeyFlag=0xaa; /*清串口鍵盤命令標(biāo)志位*/
}
LEDHandle(); /*流水燈處理模塊*/
if(++s_UARTSendCounter>200) /*定期上傳系統(tǒng)狀態(tài)*/
{
s_UARTSendCounter=0;
StatusSend();
}
if(modifyTimeFlag==1)
{
ModifyTime(); /*根據(jù)新秒值調(diào)整時(shí)間*/
modifyTimeFlag=0;
}
}
/*************************************************************************/
void ScanKeys(void) /*掃描鍵盤模塊*/
{
uchar scanValue=0xef,iScan,scanTempUchar;
for(iScan=0;iScan<4;iScan++)
{
P1=scanValue; /*發(fā)掃描值*/
scanTempUchar=P1; /*讀入掃描值*/
if((scanTempUchar&0x01)==0x00) /*第一列被按*/
{
keyFlag|=(0x0001<<(iScan*4+0)); /*置此鍵的標(biāo)志位*/
}
else
{
keyFlag&=~(0x0001<<(iScan*4+0));/*清此鍵的標(biāo)志位*/
}
if((scanTempUchar&0x02)==0x00) /*第二列被按*/
{
keyFlag|=(0x0001<<(iScan*4+1)); /*置此鍵的標(biāo)志位*/
}
else
{
keyFlag&=~(0x0001<<(iScan*4+1));/*清此鍵的標(biāo)志位*/
}
if((scanTempUchar&0x04)==0x00) /*第三列被按*/
{
keyFlag|=0x0001<<(iScan*4+2); /*置此鍵的標(biāo)志位*/
}
else
{
keyFlag&=~(0x0001<<(iScan*4+2));/*清此鍵的標(biāo)志位*/
}
if((scanTempUchar&0x08)==0x00) /*第四列被按*/
{
keyFlag|=0x0001<<(iScan*4+3); /*置此鍵的標(biāo)志位*/
}
else
{
keyFlag&=~(0x0001<<(iScan*4+3));/*清此鍵的標(biāo)志位*/
}
scanValue=scanValue<<1|0x01; /*置下一次掃描值*/
}
}
/*************************************************************************/
uchar KeyJudge(void) /*按鍵預(yù)處理*/
{
uchar j,counterKeyPressedNum;
uchar keyRet=0x55; /*初始按鍵返回碼設(shè)定為無按碼0x55*/
uint uintTemp;
ScanKeys(); /*掃描鍵盤*/
if(keyFlag!=0)
{
Delay(1000); /*延時(shí)10ms以消除抖動(dòng)*/
ScanKeys();
P1=0x0f;
while((P1&0x0f)!=0x0f); /*沒松開按鍵就等按鍵松開*/
counterKeyPressedNum=0;
for(j=0;j<16;j++)
{
uintTemp=((uint)0x0001)<<j;
if((keyFlag&uintTemp)==uintTemp)/*依次檢測(cè)鍵盤掃描標(biāo)志KeyFlag,如某位置一則按鍵個(gè)數(shù)寄存器加一*/
{
counterKeyPressedNum++;
keyRet=j;
}
}
if(counterKeyPressedNum>1) /*如果不止一個(gè)鍵被按則丟棄此狀態(tài)返回?zé)o按碼0x55*/
{
return 0x55;
}
else /*某鍵被按,返回此鍵的標(biāo)識(shí)碼*/
{
return(keyRet);
}
}
if(UARTKeyFlag!=0xaa) /*如果上位機(jī)發(fā)鍵盤指令則返回此鍵盤值*/
{
return(UARTKeyFlag);
}
return(0x55);
}
/*************************************************************************/
void KeyHandle(uchar keyIndex) /*按鍵處理模塊*/
{
switch(c_keyCode[keyIndex]) /*按數(shù)字鍵N:循環(huán)播放第N首音樂*/
{
case 0x00: s_musicCounter=0; musicAutoFlag=0; s_tableCounter=0x00; break;
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 0x05: s_musicCounter=5; musicAutoFlag=0; s_tableCounter=0x00; break;
case 0x06: s_musicCounter=6; musicAutoFlag=0; s_tableCounter=0x00; break;
case 0x07: s_musicCounter=7; musicAutoFlag=0; s_tableCounter=0x00; break;
case 0x08: s_musicCounter=8; musicAutoFlag=0; s_tableCounter=0x00; break;
case 0x09: s_musicCounter=9; musicAutoFlag=0; s_tableCounter=0x00; break;
case 0x0a: sec++; /*按A鍵:調(diào)整時(shí)鐘秒值*/
ModifyTime();
break;
case 0x0b: min++; /*按B鍵:調(diào)整時(shí)鐘分值*/
ModifyTime();
break;
case 0x0c: hour++; /*按C鍵:調(diào)整時(shí)鐘時(shí)值*/
ModifyTime();
break;
case 0x0d: if(musicKeyFlag==1) /*按D鍵:開始/停止音樂自動(dòng)循環(huán)播放*/
{
s_musicCounter=1;
musicAutoFlag=1;
musicKeyFlag=~musicKeyFlag;
}
else
{
s_musicCounter=0;
musicAutoFlag=0;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -