久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于51單片機密碼鎖程序,C語言(匯編寫不出)
[打印本頁]
作者:
liuyuxi
時間:
2015-1-10 02:13
標題:
基于51單片機密碼鎖程序,C語言(匯編寫不出)
軟件部分(程序清單):
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define SET 10
#define ENTER 11
#define AT 0 // 密碼保存在E2PROM中的地址
//#define PASSWORD_NUM 6
#define PWY 0xA8 // 密碼存在標志
typedef struct{
uchar flag;
uchar codes[6];
}PASSWORD;
PASSWORD password;
uchar buf[6];
uchar code table[]="______";
sbit rs=P2^5; //LCD1602
sbit rw=P2^6;
sbit en=P2^7;
sbit scl=P1^5; //24C02
sbit sda=P3^6;
sbit buzz=P2^3; //buzz
//uchar temp;
void delay2(uint cnt);
void delay1();
void delay(uint z);
void buzzer();
#include <keyscan.h>
#include <LCD1602.h>
#include<EEPROM(24C02).h>
/***********蜂鳴器發聲************/
void buzzer()
{
uint i;
for(i=0;i<80;i++)
{
buzz=~buzz;
delay2(80);
}
buzz=1;
}
/***********輸入密碼************/
void input_password(uchar *buf)
{
uchar i,k_num;
write_com(0x80+0x40);
for(i=0;i<6;i++) //速度很快,底下寫密碼時不用for循環
{
write_data(table[ i]);
delay(20);
}
i=0; // 密碼的初始位置
while(i<6)
{
k_num=keyscan();
if(k_num==-1)
continue;
else
if((k_num>=0)&&(k_num<=9))
{
buf[ i]=k_num;
write_string(0x80+0x40+i,"*");
i++;
}
}
while(keyscan()!=ENTER);
}
/***********檢測密碼************/
bit check_buf(uchar *buf1,uchar *buf2)
{
uchar i;
for(i=0;i<6;i++)
{
if(buf1[ i]!=buf2[ i])
return 1;
}
return 0;
}
/***********主程序************/
void main()
{
lcd1602_init();
i2c_init();
read_buf((uchar *)&password,AT,sizeof(PASSWORD));
if(password.flag==PWY)
{
while(1)
{
write_string(0x80,"input password: ");
write_string(0x80+0x40," ");
input_password(buf);
/*if(!check_buf(buf,password.codes))
break;
write_string(0x80,"Password Error! ");
write_string(0x80+0x40," ");*/
while(keyscan()==-1);
}
}
while(1)
{
write_string(0x80, "Hello, welcome! ");
write_string(0x80+0x40, "Please set code");
while (keyscan()!= SET);
write_string(0x80, "New password: ");
write_string(0x80+0x40, " ");
input_password(buf);
write_string(0x80, "Input again: ");
write_string(0x80+0x40, " ");
input_password(password.codes);
if (!check_buf(buf, password.codes))
{
password.flag = PWY;
if (!write_buf((uchar *)&password, AT, sizeof(PASSWORD)))
{
write_string(0x80, "Password ");
write_string(0x80+0x40, "Successfully set");
while (keyscan()==-1);
continue;
}
}
write_string(0x80, "Password ");
write_string(0x80+0x40, "set failed ");
while(keyscan()==-1);
}
}
void delay2(uint cnt)//cnt是計數器(counter)
{
while(cnt--);
}
void delay1() //微秒級延時函數,大概4~5微秒
{;;}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/***********EEPROM(24C02)存儲器************/
void start() //開始信號
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void stop() //停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void respons()//應答
{
uchar i;
scl=1; //高電平期間讀取信號
while((sda==1)&&(i<250))i++;//同時滿足SDA等于1和i小于250兩個條件的時候i=i+1,即i自動加1.否則跳出循環
scl=0;
delay1();
}
void i2c_init()
{
sda=1;
delay1();
scl=1;
delay1();
}
void write_byte(uchar dat)
{
uchar i,temp2;
temp2=dat;
for(i=0;i<8;i++)
{
temp2=temp2<<1;
scl=0;
delay1();
sda=CY; //PSW中的最高位
delay1();
scl=1;
delay1();
}
scl=0;
delay1();
sda=1;
delay1();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
delay1();
}
return k;
}
bit write_add(uchar address,uchar dat)
{
start();
write_byte(0xa0);//控制字節
respons();
write_byte(address); //地址
respons();
write_byte(dat); //數據
respons();
stop();
return 0;
}
uchar read_add(uchar address)
{
uchar dat;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
dat=read_byte();
stop();
return 0;
}
uchar write_buf(uchar *buf,uchar address,uchar length)
//*buf--代寫數據 ,address--eeprom地址,length--數據長度
{
while(length--)
{
if(write_add(address++,*buf++))
return 1;
}
return 0;
}
uchar read_buf(uchar *buf,uchar address,uchar length)
//*buf--代寫數據 ,address--eeprom地址,length--數據長度
{
while(length--)
{
if(read_add(address++))
buf++;
return 1;
}
return 0;
}
/********鍵盤掃描*********/
uchar keyscan()
{
uchar temp;
uchar num=-1;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=-1;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(num>=0)
buzzer();
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=4;break;
case 0xdd:num=5;break;
case 0xbd:num=6;break;
case 0x7d:num=-1;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(num>=0)
buzzer();
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=7;break;
case 0xdb:num=8;break;
case 0xbb:num=9;break;
case 0x7b:num=-1;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(num>=0)
buzzer();
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=0;break;
case 0xd7:num=SET;break;
case 0xb7:num=ENTER;break;
case 0x77:num=-1;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(num>=0)
buzzer();
}
}
return num;
}
/***********LCD1602液晶寫指令************/
write_com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
/***********LCD1602液晶寫數據************/
write_data(uchar date)
{
rs=1;
rw=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
/***********LCD1602液晶初始化************/
void lcd1602_init()
{
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void write_string(uchar add_start,uchar *p)
{
write_com(add_start);
while(*p!='\0') // '\0'就是空操作符
{
write_data(*p++);//字符串沒結束,繼續指向下一個地址
}
}
作者:
zhaukl
時間:
2015-4-4 22:34
仿真圖有不?
作者:
zutter
時間:
2017-6-7 11:38
仿真圖就很強了
作者:
宋小果
時間:
2018-9-4 09:35
LCD1602和LCD12864有什么區別嗎
作者:
hhhhhh11
時間:
2018-9-10 17:51
請問這個是獨立按鍵使用的嗎?
作者:
toby2006
時間:
2019-2-15 11:57
仿真圖
作者:
962543988
時間:
2019-2-26 11:36
請問有數碼管顯示的嗎
作者:
34歲老學生
時間:
2020-2-9 21:24
學習了
作者:
34歲老學生
時間:
2020-2-13 08:32
又看了好幾遍,不懂指針
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩手机在线看片
|
成人久久久
|
国产va
|
欧美 日韩 在线播放
|
国产欧美一级
|
日韩和的一区二在线
|
91精品久久久久久久久中文字幕
|
天堂色区
|
色免费视频
|
日韩在线观看视频一区
|
国产伦精品一区二区三区精品视频
|
国产精品国产三级国产aⅴ无密码
|
久久99精品久久久
|
日韩视频专区
|
毛片一区
|
成人亚洲性情网站www在线观看
|
黄色一级特级片
|
av天天干
|
91在线视频精品
|
亚洲精品日本
|
男女免费视频网站
|
欧美日本韩国一区二区三区
|
久久99网
|
亚洲精品福利视频
|
影视一区
|
91看片在线
|
中文在线一区
|
午夜国产
|
天天干天天插
|
亚洲精品视频在线看
|
午夜在线影院
|
国产真实精品久久二三区
|
特黄毛片
|
99久久免费精品视频
|
国产精品1区2区
|
91亚洲国产
|
国产精品激情在线
|
成人精品一区二区三区
|
中文字幕亚洲免费
|
国产精品99免费视频
|
亚洲综合精品
|