?? 程序(c語言).c
字號:
#include <REG51.h>
#include<intrins.h>
#define LCM_Data P0
#define uchar unsigned char
#define uint unsigned int
#define w 6 //定義密碼位數
sbit lcd1602_rs=P2^5;
sbit lcd1602_rw=P2^6;
sbit lcd1602_en=P2^7;
sbit Scl=P3^4; //24C02串行時鐘
sbit Sda=P3^5; //24C02串行數據
sbit ALAM = P2^1; //報警
sbit KEY = P2^0; //開鎖
sbit open_led=P2^2; //開鎖指示燈
bit operation=0; //操作標志位
bit pass=0; //密碼正確標志
bit ReInputEn=0; //重置輸入充許標志
bit s3_keydown=0; //3秒按鍵標志位
bit key_disable=0; //鎖定鍵盤標志
unsigned char countt0,second; //t0中斷計數器,秒計數器
void Delay5Ms(void);
unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表
unsigned char code start_line[] = {"password: "};
unsigned char code name[] = {"===Coded Lock==="}; //顯示名稱
unsigned char code Correct[] = {" correct "}; //輸入正確
unsigned char code Error[] = {" error "}; //輸入錯誤
unsigned char code codepass[] = {" pass "};
unsigned char code LockOpen[] = {" open "}; //OPEN
unsigned char code SetNew[] = {"SetNewWordEnable"};
unsigned char code Input[] = {"input: "}; //INPUT
unsigned char code ResetOK[] = {"ResetPasswordOK "};
unsigned char code initword[] = {"Init password..."};
unsigned char code Er_try[] = {"error,try again!"};
unsigned char code again[] = {"input again "};
unsigned char InputData[6]; //輸入密碼暫存區
unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //當前密碼值
unsigned char TempPassword[6];
unsigned char N=0; //密碼輸入位數記數
unsigned char ErrorCont; //錯誤次數計數
unsigned char CorrectCont; //正確輸入計數
unsigned char ReInputCont; //重新輸入計數
unsigned char code initpassword[6]={0,0,0,0,0,0};
//=====================5ms延時==============================
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//===================400ms延時==============================
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
//=============================================================================================
//================================24C02========================================================
//=============================================================================================
void mDelay(uint t) //延時
{
uchar i;
while(t--)
{
for(i=0;i<125;i++)
{;}
}
}
void Nop(void) //空操作
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*起始條件*/
void Start(void)
{
Sda=1;
Scl=1;
Nop();
Sda=0;
Nop();
}
/*停止條件*/
void Stop(void)
{
Sda=0;
Scl=1;
Nop();
Sda=1;
Nop();
}
/*應答位*/
void Ack(void)
{
Sda=0;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*反向應答位*/
void NoAck(void)
{
Sda=1;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*發送數據子程序,Data為要求發送的數據*/
void Send(uchar Data)
{
uchar BitCounter=8;
uchar temp;
do
{
temp=Data;
Scl=0;
Nop();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*讀一字節的數據,并返回該字節值*/
uchar Read(void)
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
Nop();
Scl=1;
Nop();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Send(*(PData+i));
Ack();
Stop();
mDelay(20);
}
}
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
//==================================================================================================
//=======================================LCD1602====================================================
//==================================================================================================
#define yi 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)
//----------------延時函數,后面經常調用----------------------
void delay(uint xms)//延時函數,有參函數
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
//--------------------------寫指令---------------------------
write_1602com(uchar com)//****液晶寫入指令函數****
{
lcd1602_rs=0;//數據/指令選擇置為指令
lcd1602_rw=0; //讀寫選擇置為寫
P0=com;//送入數據
delay(1);
lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備
delay(1);
lcd1602_en=0;//en由高變低,產生下降沿,液晶執行命令
}
//-------------------------寫數據-----------------------------
write_1602dat(uchar dat)//***液晶寫入數據函數****
{
lcd1602_rs=1;//數據/指令選擇置為數據
lcd1602_rw=0; //讀寫選擇置為寫
P0=dat;//送入數據
delay(1);
lcd1602_en=1; //en置高電平,為制造下降沿做準備
delay(1);
lcd1602_en=0; //en由高變低,產生下降沿,液晶執行命令
}
//-------------------------初始化-------------------------
void lcd_init(void)
{
write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
write_1602com(0x0c);//開顯示不顯示光標
write_1602com(0x06);//整屏不移動,光標自動右移
write_1602com(0x01);//清顯示
}
//========================================================================================
//=========================================================================================
//==============將按鍵值編碼為數值=========================
unsigned char coding(unsigned char m)
{
unsigned char k;
switch(m)
{
case (0x18): k=1;break;
case (0x28): k=2;break;
case (0x48): k=3;break;
case (0x88): k='A';break;
case (0x14): k=4;break;
case (0x24): k=5;break;
case (0x44): k=6;break;
case (0x84): k='B';break;
case (0x12): k=7;break;
case (0x22): k=8;break;
case (0x42): k=9;break;
case (0x82): k='C';break;
case (0x11): k='*';break;
case (0x21): k=0;break;
case (0x41): k='#';break;
case (0x81): k='D';break;
}
return(k);
}
//=====================按鍵檢測并返回按鍵值===============================
unsigned char keynum(void)
{
unsigned char row,col,i;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{
Delay5Ms();
Delay5Ms();
if((P1&0xf0)!=0xf0)
{
row=P1^0xf0; //確定行線
i=0;
P1=a[i]; //精確定位
while(i<4)
{
if((P1&0xf0)!=0xf0)
{
col=~(P1&0xff); //確定列線
break; //已定位后提前退出
}
else
{
i++;
P1=a[i];
}
}
}
else
{
return 0;
}
while((P1&0xf0)!=0xf0);
return (row|col); //行線與列線組合后返回
}
else return 0; //無鍵按下時返回0
}
//=======================一聲提示音,表示有效輸入========================
void OneAlam(void)
{
ALAM=0;
Delay5Ms();
ALAM=1;
}
//========================二聲提示音,表示操作成功========================
void TwoAlam(void)
{
ALAM=0;
Delay5Ms();
ALAM=1;
Delay5Ms();
ALAM=0;
Delay5Ms();
ALAM=1;
}
//========================三聲提示音,表示錯誤========================
void ThreeAlam(void)
{
ALAM=0;
Delay5Ms();
ALAM=1;
Delay5Ms();
ALAM=0;
Delay5Ms();
ALAM=1;
Delay5Ms();
ALAM=0;
Delay5Ms();
ALAM=1;
}
//=====================顯示輸入的N個數字,用H代替以便隱藏============================
void DisplayOne(void)
{
// DisplayOneChar(9+N,1,'*');
write_1602com(yi+5+N);
write_1602dat('*');
}
//=======================顯示提示輸入=========================
void DisplayChar(void)
{
unsigned char i;
if(pass==1)
{
//DisplayListChar(0,1,LockOpen);
write_1602com(er);
for(i=0;i<16;i++)
{
write_1602dat(LockOpen[i]);
}
}
else
{
if(N==0)
{
//DisplayListChar(0,1,Error);
write_1602com(er);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -