久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6019|回復: 8
打印 上一主題 下一主題
收起左側

基于51單片機密碼鎖程序,C語言(匯編寫不出)

[復制鏈接]
跳轉到指定樓層
樓主
ID:71922 發表于 2015-1-10 02:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
軟件部分(程序清單):
#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++);//字符串沒結束,繼續指向下一個地址
}  
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:76140 發表于 2015-4-4 22:34 | 只看該作者
仿真圖有不?
回復

使用道具 舉報

板凳
ID:208740 發表于 2017-6-7 11:38 | 只看該作者
仿真圖就很強了
回復

使用道具 舉報

地板
ID:393296 發表于 2018-9-4 09:35 | 只看該作者
LCD1602和LCD12864有什么區別嗎
回復

使用道具 舉報

5#
ID:395557 發表于 2018-9-10 17:51 | 只看該作者
請問這個是獨立按鍵使用的嗎?
回復

使用道具 舉報

6#
ID:476644 發表于 2019-2-15 11:57 | 只看該作者
仿真圖
回復

使用道具 舉報

7#
ID:397287 發表于 2019-2-26 11:36 | 只看該作者
請問有數碼管顯示的嗎
回復

使用道具 舉報

8#
ID:690948 發表于 2020-2-9 21:24 來自觸屏版 | 只看該作者
學習了
回復

使用道具 舉報

9#
ID:690948 發表于 2020-2-13 08:32 來自觸屏版 | 只看該作者
又看了好幾遍,不懂指針
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品电影在线观看 | 中文字幕第一页在线 | 日韩国产欧美 | 国产成人综合在线 | 最新国产视频 | 超碰在线97国产 | 国产在线观看一区二区 | 日韩高清国产一区在线 | 一区二区三区日韩 | 99亚洲综合 | 日操操夜操操 | 欧美日韩成人一区二区 | 色吧久久 | 成人乱人乱一区二区三区软件 | 99re在线视频观看 | 97人澡人人添人人爽欧美 | 国产色黄 | www一级片| 国产精品一区二区在线免费观看 | 91av在线影院 | www国产成人免费观看视频 | 国产在线精品一区二区 | 日本精品一区二区在线观看 | 免费簧片视频 | 亚洲精品二区 | 99自拍视频 | 91久久久久久久 | 欧美一区二区三区精品 | 精品亚洲第一 | 国产一区欧美 | 在线免费观看欧美 | 丝袜美腿一区二区三区 | 成人免费视频网站在线观看 | 午夜免费网站 | 久久99精品久久久久久国产越南 | 久久久噜噜噜www成人网 | 中文字幕在线二区 | 亚洲午夜精品一区二区三区 | 91欧美激情一区二区三区成人 | 欧美女优在线观看 | 美女视频h |