?? 8wei mimasuo.c
字號:
#include<reg52.h>
#include<math.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define data_IO P2
sbit rs=P3^0;//指令和數據寄存器 “1是數據,” “0是指令”
sbit rw=P3^1;//讀寫控制,“1讀” “0寫”
sbit e=P3^2;//片選信號
sbit p=P2^7;//參看061行
sbit deng=P3^7;///鎖的開關
sbit md=P3^4;///響音樂的端口
sbit kg=P3^6;///
uchar pwflag;//密碼是否正確的標志位
uchar count;//
uchar gg=0 ;//只有輸入正確的密碼才能修改密碼
uchar cs=3 ;//輸入密碼的錯誤次數
uchar m[]={1,1,1,1,1,1,1,1}; ///初始密碼
static uchar mbuf[8];///輸入的密碼位數
char d[32]={' ','I','M','P','O','R','T',' ','C','I','P','H','E','R',':',' ',
' ',' ',' ',' ','_','_','_','_','_','_','_','_',' ',' ',' ',' '};//輸入密碼
code char ks[32]={'C','O','N','G','R','A','T','U','L','A','T','E',' ','Y','O','U',
' ','O','P','E','N','I','N','G',' ',' ','L','O','C','K','!',' '};////開鎖
code char cw[32]={' ','C','I','P','H','E','R',' ',' ','E','R','R','O','R',' ',' ',
'~','~','~','~','~','~','~','~','~','~','~','~','~','~','~','~' };////錯誤
code char xc[32]={' ',' ','A','M','E','N','D',' ','S','U','C','C','E','E','D',' ',
' ',' ',' ',' ',' ','!','!','!','!','!','!',' ',' ',' ',' ',' '};//修改成功
code char xg[32]={' ','A','M','E','N','D',' ',' ','C','I','P','H','E','R',':',' ',
' ',' ',' ',' ',' ','_','_','_','_','_','_','_',' ',' ',' ',' '};///修改密碼*/
void yanshi(uint n)///////////////延時函數///////////////////////////////////
{
uint i;
for(i=0;i<n;i++){};
}
void delay(uint n)///////////////延時函數///////////////////////////////////
{
uint i,j;
for(i=0;i<1000;i++)
{for(j=0;j<n;j++){}}
}
void busy() ////////////////////判斷是否忙////////////////////////////////////////
{data_IO=0xff;
rs=0; //寫指令 RS="L" :數據D0-D7 與指令寄存器通信 ////////////////////
rw=1; //表示讀狀態 高電平:讀數據 // 三個的狀態表示 //
e=1; //下降延// 高電平有效,下降沿鎖定數據 // 判忙狀態 //
while(!p); ////////////////////
// e=0;
}
void xiezl(uchar shuju) /////////////////////*寫指令*/////////////////////////////
{
busy();/*yanshi(6500);*/
data_IO=shuju;
rs=0; //寫指令 ////////////////////
rw=0; //表示寫狀態 // 三個的狀態表示 //
e=1; //下降延// // 寫指令 //
e=0; ///////// ////////////////////
}
void w_dat(uint n)//////////////////寫數據//////////////////////////
{
busy(); /*yanshi(6500) ;*/
data_IO=n;
rs=1; //寫數據 ////////////////////
rw=0; //表示寫狀態 // 三個的狀態表示 //
e=1; //下降延// //寫數據 //
e=0; ///////// ////////////////////
// return;
}
void xianshi(uchar js[]) //////////////////顯示函數///////////////////////////////
{
uchar h,v;
xiezl(0x01); //清屏顯示
yanshi(2000) ;
xiezl(0x80); // DDRAM地址的設置
for(h=0;h<16;h++)
{w_dat(js[h]); ///n表示有寫幾位數據
yanshi(100) ;
}
xiezl(0xc0);//換行
for(v=(16);v<32;v++)
{w_dat(js[v]); ///n表示有寫幾位數據
yanshi(100) ;
}
}
void chushihua(void)///////////////////*液晶模塊初始化*/
{ uchar i;
rs=0; //寫指令
rw=0; //表示寫狀態
e=0; //使能
for(i=0;i<3;i++)
{
xiezl(0x38); //功能設置,8位,一行顯示,5*7點陣
yanshi(1000);
}
xiezl(0x38); //兩行顯示
xiezl(0x0f); //顯示開關控制位
xiezl(0x18); //移位控制,光標和顯示一起左移
xiezl(0x06); //設置輸入模式
xiezl(0x01); //清屏顯示
xiezl(0x80); // DDRAM地址的設置
}
bit pwcmp(void)
{
bit flag;
uchar i;
for (i=0;i<8;i++)
{
if (m[i]==mbuf[i])
flag = 1; //*密碼正確*/
else { flag = 0; i=8; } //*密碼錯誤*/
}
return(flag);
}
void gb(void)/////////轉移光標
{ uchar c;
xiezl(0xc0);//換行
yanshi(3000) ;
for(c=0;c<4;c++)
{w_dat(' ');///n表示有寫幾位數據
yanshi(2000) ;
}
}
uchar getkey(void)///得到鍵值
{ uchar h,l,k;
while(P1!=0x0f)
{
h=P1&0x0f;
P1=0xf0;
l=P1&0xf0;
k=h|l;
return(k);
}
}
void diaoyong(uchar i)///////////調用各鍵的函數//////輸入密碼
{ uchar lq;
switch(i)
{
case 0x7e: if (count<8) { mbuf[count]=1; count++; w_dat('1');} break; // 01111110 1
case 0xbe: if (count<8) { mbuf[count]=2; count++; w_dat('2');} break; // 10111110 2
case 0xde: if (count<8) { mbuf[count]=3; count++; w_dat('3');} break; // 11011110 3
case 0xee: if (count<8) { mbuf[count]=4; count++; w_dat('4');} break; // 11101110 4
case 0x7d: if (count<8) { mbuf[count]=5; count++; w_dat('5');} break; // 01111101 5
case 0xbd: if (count<8) { mbuf[count]=6; count++; w_dat('6');} break; // 10111101 6
case 0xdd: if (count<8) { mbuf[count]=7; count++; w_dat('7');} break; // 11011101 7
case 0xed: if (count<8) { mbuf[count]=8; count++; w_dat('8');} break; // 11101101 8
case 0x7b: if (count<8) { mbuf[count]=9; count++; w_dat('9');} break; // 01111011 9
case 0xbb: if (count<8) { mbuf[count]=0; count++; w_dat('0');} break; // 10111011 0
case 0xdb: if (count==8) { pwflag = pwcmp();} else pwflag = 0;// 只有輸入8個密碼后按確認鍵才作密碼比較
if(pwflag) {deng=1; xianshi(ks);gg=1; } else { cs--;deng=0; xianshi(cw); delay(200); xianshi(d);gb();count = 0; }
break; // 11011011 a
case 0xeb: count = 0;deng=0; xianshi(d); gb();gg=0; /*取消鍵*/
break; // 11101011 b
case 0x77: if(gg==1){ count=0;xianshi(xg); gb();} //修該密碼
break; // 01110111 c
case 0xb7: if((count==8)&&(gg==1)) { count=0;
for (lq=0;lq<8;lq++){ m[lq]=mbuf[lq]; yanshi(10000);} md=0; xianshi(xc); delay(200); xianshi(d);yanshi(2000);gb();yanshi(200);gg=0;}//保存密碼
break; // 10110111 d
/*case 0xd7: sr[jm]='e'; break; // 11010111 e
case 0xe7: sr[jm]='f'; break; // 11100111 f */
default: break;
}
}
void main(void)
{uchar key;
chushihua();
xianshi(d);//顯示函數
gb(); //移光標到第二行第六位
while(cs)
{
P1=0x0f;
if(P1!=0x0f)
{
yanshi(20);
key=getkey();
md=1;
diaoyong(key);
yanshi(20000);
md=0;
}
}while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -