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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的密碼鎖程序-1602液晶顯示

  [復制鏈接]
跳轉到指定樓層
樓主


一共分為好幾個文件
#include "delay.h"文件:
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延時1mS
     DelayUs2x(245);
     DelayUs2x(245);
}
}



#include "eeprom.h"文件:
#include "delay.h"
void Start(void) //I2開始
{
    SDA=1;
    SCL=1;
    NOP4();
    SDA=0;
    NOP4();
    SCL=0;
}
void Stop(void)     //I2C停止
{
    SDA=0;
    SCL=0;
    NOP4();
    SCL=1;
    NOP4();
    SDA=1;
}
void RACK(void)      //讀取應答
{
    SDA=1;
    NOP4();
    SCL=1;
    NOP4();
    SCL=0;
}
void NO_ACK(void)       //發送非應答信號
{
    SDA=1;
    SCL=1;
    NOP4();
    SCL=0;
    SDA=0;
}
void Write_A_Byte(uchar b)      //寫一個字節數據
{
    uchar i;
    for(i=0;i<8;i++)
    {
       b<<=1;
       SDA=CY;     //CY進位程序狀態字寄存器
       _nop_();
       SCL=1;
       NOP4();
       SCL=0;
    }
    RACK();
}
void Write_IIC(uchar addr,uchar dat)   //向指寫地地址寫數據
{
    Start();
    Write_A_Byte(0xa0);
    Write_A_Byte(addr);
    Write_A_Byte(dat);
    Stop();
    DelayMs(10);
}
uchar Read_A_Byte(void)        //讀取一個字節
{
    uchar i,b;
    for(i=0;i<8;i++)
    {
       SCL=1;
       b<<=1;
       b|=SDA;
       SCL=0;
    }
    return b;
}
uchar Read_Current(void)   //從當前地址取數據
{
    uchar d;
    Start();
    Write_A_Byte(0xa1);
    d=Read_A_Byte();
    NO_ACK();
    Stop();
    return d;
}
uchar Random_Read(uchar addr)      //從任意地址讀取數據
{
    Start();
    Write_A_Byte(0xa0);
    Write_A_Byte(addr);
    Stop();
    return Read_Current();
}
#include "key.h"
unsigned char key_scan()
{
    unsigned char temp,keyno;

    P1=0x0f;
    DelayMs(1);
    temp=P1^0x0f;
    switch(temp)                    //縱行
       {
           case1:keyno=1/*1*/;break; //第一縱行  
           case2:keyno=2/*2*/;break; //第二縱行
           case4:keyno=3/*3*/;break; //第三縱行
           case8:keyno=4/*3*/;break; //第四縱行  
       }
    P1=0xf0;
    DelayMs(1);
    temp=P1>>4^0x0f;
    switch(temp)
       {                            //橫行
           case 1:keyno+=0  /*A*/;break;//第一行橫行
           case 2:keyno+=4  /*B*/;break;//第一行橫行
           case 4:keyno+=8  /*C*/;break;//第一行橫行
           case 8:keyno+=12  /*D*/;break;//第一行橫行   
       }
       P1=0x0f;
       return keyno;
}   





#include"LCD.H"文件
void write_com(unsigned char com) //寫命令
{
    RS_CLR;
    RW_CLR;
    P0=com;
    DelayMs(5);
    EN_SET;
    DelayMs(5);
    EN_CLR;
}
void write_data(unsigned char date)    //寫一個字符
{
    RS_SET;
    RW_CLR;
    P0=date;
    DelayMs(5);
    EN_SET;
    DelayMs(5);
    EN_CLR;
}
void init()          //初始化
{
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
}
/*------------------------------------------------
              寫入字符串函數
------------------------------------------------*/
void LCD_Write_String(unsignedchar x,unsigned char y,unsigned char *s)
{     
if (y == 0)
    {     
     write_com(0x80 + x);     
    }
else
    {     
    write_com(0xC0+ x);     
    }        
while (*s)
    {     
write_data( *s);     
s ++;     
    }
}
/*------------------------------------------------
              寫入字符函數
------------------------------------------------*/
void LCD_Write_Char(unsigned charx,unsigned char y,unsigned char Data)
{     
if (y == 0)
    {     
    write_com(0x80+ x);     
    }   
else
    {     
    write_com(0xC0+ x);     
    }        
write_data(Data);  
}



主文件
#include <REGX52.H>
#include <intrins.h>
#include "lcd.h"
#include "key.h"
#include "delay.h"
#include "eeprom.h"
void int0(void);
unsigned char password[6]/*={0x01,0x01,0x01,0x01,0x01,0x01}*/;
unsigned char password1[6];
unsigned char code aa[]="Password   ";
unsigned char code gg[]="New";
unsigned char code bb[]="ERROR  ";
unsigned char code cc[]="OK      ";
unsigned char code dd[]="       ";
unsigned char code ee[]="Next   ";
unsigned char code ff[]="success ";
unsigned char keydata;
main()
{
    unsigned char i,j,k,l,m,n,o,a1;
    /*for(i=0;i<6;i++)
    {
    Write_IIC(i,password[ i]);
    }*/
    init();//LCD初始化
    int0();
    P3_6=0;
    P3_7=0;
    P1=0x0f;
    LCD_Write_String(0,0,aa);
    LCD_Write_String(1,1,dd);
    write_com(0xc0+1);
    while(1)
    {
start: LCD_Write_String(0,0,aa);
       LCD_Write_String(1,1,dd);
       write_com(0xc0+1);

       while(1)
       {
           if((0<keydata)&&(4>keydata)||(4<keydata)&&(8>keydata)||(8<keydata)&&(12>keydata)||keydata==14)
                  //在0-9之間的數字通過
           {   
              password=keydata;//鍵盤值進行保存
              keydata=0;        //把鍵盤值置其它值,不被其它利用,以一樣
              i++;
              write_data('*');  //在LCD上顯示*這字符代表輸入了一個密碼      
              if(i==6)          //這里限制了六位密碼
              {
                  i=0;
                  goto panduan;
              }

           }
           if(keydata==33)      //確定進入密碼比較
           {
              keydata=0;
panduan:      i=0;
              for(j=0;j<6;j++)
              {
                  l+=password[j];
                  k+=Random_Read(j);
              }
              if(l!=k)      //密碼不同進行處理
              {
                  l=0;
                  k=0;
                  LCD_Write_String(0,0,bb);
                  DelayMs(1000);
                  a1+=1;
                  if(a1==2){while(1)P3_7=1;P3_6=0;}//兩次錯誤發出報警
                  goto start;               //第二次輸入密碼
              }
              if(l==k)   //密碼對了,進入運行狀態,這里綠燈代表該狀態
              {
                   l=0;
                   k=0;
                   a1=0;
                   P3_6=1;
                   P3_7=0;
                   LCD_Write_String(0,0,cc);
                   LCD_Write_String(1,1,dd);
                   if(o==1)
                   {
                    o=0;
                    LCD_Write_String(0,0,gg);
                    LCD_Write_String(4,0,aa);
                    LCD_Write_String(1,1,dd);
                    write_com(0xc0+1);
                    goto text2;
                   }
                   goto yingxing;        //跳到下面函數中,yingxing里
              }
           }

       }
yingxing:while(1)
       {
           if(keydata==4)    //鎖定功能
           {
              P3_6=0;
              goto start;
           }
           if(keydata==15)      //修改密碼
           {   
              o++;
              if(o==1) goto start;
text2:        keydata=0;
              while(1)
              {
                  if((0<keydata)&&(4>keydata)||(4<keydata)&&(8>keydata)||(8<keydata)&&(12>keydata)||keydata==14)
                         //上面表達式0-9之間的數字通過
                  {   
                     password[m]=keydata;  //讀取鍵盤值
                     keydata=0;
                     m++;
                     write_data('*');         
                     if(m==6)           //到密碼輸入到六位的時候進行判斷是否再輸入,或者判斷前后兩次密碼是否一致
                     {
                         m=0;
                         n++;
                         if(n==2)goto panduan1;  //輸入第二次的時候進行前后兩次密碼進判斷
                         for(i=0;i<6;i++)      //儲存前一次密碼
                         {
                            password1=password[ i];
                         }
                         LCD_Write_String(1,1,dd);
                         LCD_Write_String(0,0,ee);
                         DelayMs(1000);
                         LCD_Write_String(0,0,aa);
                         write_com(0xc0+1);  
                     }   

                   }
                  if(keydata==13)     //重新輸入改密
                   {
text:                 m=0;
                     n=0;
                     LCD_Write_String(1,1,dd);
                     write_com(0xc0+1);

                   }
                  if(keydata==33)    //退出不改密碼
                  {
out:                 m=0;
                     n=0;
                     o=0;
                     LCD_Write_String(0,0,cc);
                     LCD_Write_String(1,1,dd);
                     goto yingxing;
                  }
                  if(keydata==33)
                  {
                     keydata=0;
panduan1:            for(j=0;j<6;j++)//第一次與第二次密碼比較
                     {
                         l+=password[j];
                         k+=password1[j];
                     }
                     if(l!=k)      //第一次與第二次密碼輸入錯誤
                     {
                         l=0;
                         k=0;
                         LCD_Write_String(0,0,bb);
                         DelayMs(1000);
                         LCD_Write_String(0,0,aa);
                         goto text;
                     }
                      else
                     {
                         for(i=0;i<6;i++)
                         {
                            Write_IIC(i,password[ i]);
                         }
                           LCD_Write_String(0,0,ff);
                           DelayMs(1000);
                           goto out;   
                     }

                  }

              }
           }   
       }   
    }      
}
void int0(void)
{
    EA=1;
    EX0=1;
    IT0=1;
}
void ISR_INT0(void) interrupt 0
{
    keydata=key_scan();      
}

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

使用道具 舉報

沙發
ID:68208 發表于 2014-11-1 09:47 | 只看該作者
漂亮,非常有用啊
回復

使用道具 舉報

板凳
ID:133 發表于 2014-11-4 22:26 | 只看該作者
非常好的設計  太棒了 樓主能上傳一下 完整的程序嗎?工程文件 最好有設計文檔
回復

使用道具 舉報

地板
ID:73743 發表于 2015-2-19 21:39 | 只看該作者
好貼!頂起!
回復

使用道具 舉報

5#
ID:76268 發表于 2015-4-6 20:16 | 只看該作者
非常有用啊
回復

使用道具 舉報

6#
ID:74335 發表于 2015-5-9 12:41 | 只看該作者
謝謝分享
回復

使用道具 舉報

7#
ID:79329 發表于 2015-5-10 09:33 | 只看該作者
謝謝分享
回復

使用道具 舉報

8#
ID:86944 發表于 2015-7-27 22:41 | 只看該作者
創建目標 '目標 1'
編譯 1602.c ...
C51 COMPILER V8.06 - SN: K1JWC-DMUHPZ
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2007
C51 FATAL-ERROR -
  ACTION:  PREPROCESSING INPUT FILE
  ERROR:   
C51 TERMINATED.
目標未產生
keil3 編譯出錯是什么原因?
回復

使用道具 舉報

9#
ID:98832 發表于 2015-12-10 15:20 | 只看該作者
Rebuild target 'Target 1'
compiling main.c...
C51 FATAL-ERROR -
  ACTION:  PARSING SOURCE-FILE
  ERROR:    PREPROCESSOR: MACROS TOO NESTED
C51 TERMINATED.
Target not created
嵌套過多怎么解決啊
回復

使用道具 舉報

10#
ID:113246 發表于 2016-5-12 13:53 | 只看該作者
為甚么 運行之后 是這樣的,感覺程序不對  main.c(31): warning C318: can't open file 'delay.h' MAIN.C(34): error C202: 'SDA': undefined identifier MAIN.C(35): error C202: 'SCL': undefined identifier main.c(119): warning C318: can't open file 'key.h' main.c(152): warning C318: can't open file 'LCD.H' main.c(220): warning C318: can't open file 'lcd.h' main.c(221): warning C318: can't open file 'key.h' main.c(222): warning C318: can't open file 'delay.h' main.c(223): warning C318: can't open file 'eeprom.h' Target not created
回復

使用道具 舉報

11#
ID:150513 發表于 2016-11-28 22:37 | 只看該作者
怎么修改成24C02掉電存儲的
回復

使用道具 舉報

12#
ID:157011 發表于 2016-12-22 23:04 | 只看該作者
有完整的程序嗎
回復

使用道具 舉報

13#
ID:157091 發表于 2016-12-23 11:07 來自手機 | 只看該作者
好復雜啊
回復

使用道具 舉報

14#
ID:185661 發表于 2017-4-24 20:35 | 只看該作者
nice,學習一下
回復

使用道具 舉報

15#
ID:163950 發表于 2017-5-12 09:48 | 只看該作者
七秒鐘的記憶 發表于 2016-5-12 13:53
為甚么 運行之后 是這樣的,感覺程序不對  main.c(31): warning C318: can't open file 'delay.h' MAIN.C(3 ...

我也遇到和你一樣的問題,解決了嗎?
回復

使用道具 舉報

16#
ID:241466 發表于 2017-10-21 23:26 | 只看該作者
2404.bin的文件在哪里?它里面的數據是怎么樣的?
回復

使用道具 舉報

17#
ID:66287 發表于 2018-2-9 19:33 | 只看該作者
好貼,寫的很棒!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久 | 久草新在线 | 亚洲免费视频在线观看 | 特级毛片爽www免费版 | 日本污视频 | 北条麻妃一区二区三区在线观看 | 国产久| 日韩欧美国产精品一区二区三区 | 97日日碰人人模人人澡分享吧 | 国产精品久久久久久久午夜 | 91麻豆精品国产91久久久久久 | 日本超碰 | 视频一区二区在线观看 | 精品日韩一区二区三区av动图 | 99久久99| 中文字幕视频在线观看 | 精品国产一区二区在线 | 亚洲精品久久久蜜桃 | 成人黄色a | 久久青视频 | www视频在线观看 | 在线看av网址 | 69视频在线播放 | 亚洲激情在线观看 | 在线黄色网 | 日韩欧美三区 | 在线视频 欧美日韩 | 黄色网址大全在线观看 | 国产精品一区二区在线 | 韩国欧洲一级毛片 | 看黄在线 | 91免费看片 | 一级毛片成人免费看a | 久久精品二区 | 国产一区二区三区四区 | 在线欧美视频 | 中文字幕乱码一区二区三区 | 少妇一级淫片免费播放 | 欧美成人a | 亚洲中午字幕 | 日本理论片好看理论片 |