找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14201|回复: 22
打印 上一主题 下一主题
收起左侧

单片机密码锁源程序(带详细注释)+元件清单+实物制作

  [复制链接]
跳转到指定楼层
楼主
密码锁的实物图如下:


电子密码锁元件清单
1) 9*15万用板
2) 17个小按键
3) 1602液晶
4)         16p插针
5) 16p单排母座
6) 光敏电阻
7) 104可调电阻
8) 2.2k电阻*2
9) 1k电阻
10) 10k电阻*4
11)  1.5k电阻
12) 103排阻
13) 9012*2
14) 9013
15) 接线端子3p
16) 有源蜂鸣器
17) 40脚座
18) stc89c51单片机
19) 10uf电容
20) 30pf电容*2
21) 自锁开关
22) 8脚座
23) 24c02芯片
24) 12m晶振
25) Led(5MM红色)
26) 继电器
27) DC电源接口
28) 导线若干
29) 焊锡若干
usb电源线(电池盒+DC插头)

用继电器输出可以带动任意负载

单片机源程序如下:
  1. //包含头文件
  2. #include <REG51.h>
  3. #include<intrins.h>
  4. //宏定义
  5. #define LCM_Data  P0                  //将P0口定义为LCM_Data
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. //1602的控制脚
  9. sbit lcd1602_rs=P2^7;
  10. sbit lcd1602_rw=P2^6;
  11. sbit lcd1602_en=P2^5;

  12. sbit Scl=P3^4;                        //24C02串行时钟
  13. sbit Sda=P3^5;                        //24C02串行数据

  14. sbit ALAM = P2^3;                //报警        
  15. sbit KEY = P3^6;                //开锁

  16. bit  pass=0;                        //密码正确标志
  17. bit  ReInputEn=0;                //重置输入允许标志        
  18. bit  s3_keydown=0;                //3秒按键标志位
  19. bit  key_disable=0;                //锁定键盘标志

  20. unsigned char countt0,second;        //t0中断计数器,秒计数器

  21. void Delay5Ms(void);                //声明延时函数

  22. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                 //控盘扫描控制表
  23. //液晶显示数据数组
  24. unsigned char code start_line[]        = {"password:       "};
  25. unsigned char code name[]                  = {"===Coded Lock==="};        //显示名称
  26. unsigned char code Correct[]         = {"     correct    "};                //输入正确
  27. unsigned char code Error[]           = {"      error     "};          //输入错误
  28. unsigned char code codepass[]        = {"      pass      "};
  29. unsigned char code LockOpen[]        = {"      open      "};                //OPEN
  30. unsigned char code SetNew[]         = {"SetNewWordEnable"};
  31. unsigned char code Input[]           = {"input:          "};                //INPUT
  32. unsigned char code ResetOK[]         = {"ResetPasswordOK "};
  33. unsigned char code initword[]        = {"Init password..."};
  34. unsigned char code Er_try[]                = {"error,try again!"};
  35. unsigned char code again[]                = {"input again     "};

  36. unsigned char InputData[6];                                                                        //输入密码暂存区
  37. unsigned char CurrentPassword[6]={1,3,1,4,2,0};                         //管理员密码(只可在程序中修改)
  38. unsigned char TempPassword[6];
  39. unsigned char N=0;                                //密码输入位数记数
  40. unsigned char ErrorCont;                        //错误次数计数
  41. unsigned char CorrectCont;                        //正确输入计数
  42. unsigned char ReInputCont;                         //重新输入计数
  43. unsigned char code initpassword[6]={0,0,0,0,0,0};                        //输入管理员密码后将密码初始为000000


  44. //=====================5ms延时==============================
  45. void Delay5Ms(void)
  46. {
  47.         unsigned int TempCyc = 5552;
  48.         while(TempCyc--);
  49. }

  50. //===================400ms延时==============================
  51. void Delay400Ms(void)
  52. {
  53. unsigned char TempCycA = 5;
  54. unsigned int TempCycB;
  55. while(TempCycA--)
  56. {
  57.   TempCycB=7269;
  58.   while(TempCycB--);
  59. }
  60. }

  61. //=============================================================================================
  62. //================================24C02========================================================
  63. //=============================================================================================

  64. void mDelay(uint t) //延时
  65. {
  66.         uchar i;
  67.            while(t--)
  68.            {
  69.                    for(i=0;i<125;i++)
  70.                    {;}
  71.            }
  72. }
  73.    

  74. void Nop(void)                  //空操作
  75. {
  76.          _nop_();                  //仅作延时用一条语句大约1us
  77.          _nop_();
  78.          _nop_();
  79.          _nop_();
  80. }

  81. /*****24c02程序参照24c02时序图*****/
  82. /*起始条件*/

  83. void Start(void)
  84. {
  85.          Sda=1;
  86.          Scl=1;
  87.          Nop();
  88.          Sda=0;
  89.          Nop();
  90. }


  91. /*停止条件*/
  92. void Stop(void)
  93. {
  94.          Sda=0;
  95.          Scl=1;
  96.          Nop();
  97.          Sda=1;
  98.          Nop();
  99. }

  100. /*应答位*/
  101. void Ack(void)
  102. {
  103.         Sda=0;
  104.         Nop();
  105.         Scl=1;
  106.         Nop();
  107.         Scl=0;
  108. }

  109. /*反向应答位*/
  110. void NoAck(void)
  111. {
  112.          Sda=1;
  113.          Nop();
  114.          Scl=1;
  115.          Nop();
  116.          Scl=0;
  117. }

  118. /*发送数据子程序,Data为要求发送的数据*/
  119. void Send(uchar Data)
  120. {
  121.            uchar BitCounter=8;
  122.            uchar temp;
  123.            do
  124.            {
  125.                    temp=Data;                                           //将待发送数据暂存temp
  126.                    Scl=0;
  127.                    Nop();
  128.                    if((temp&0x80)==0x80)                   //将读到的数据&0x80
  129.                    Sda=1;
  130.                    else
  131.                    Sda=0;
  132.                    Scl=1;
  133.                    temp=Data<<1;                                   //数据左移
  134.                    Data=temp;                                           //数据左移后重新赋值Data
  135.                    BitCounter--;                                   //该变量减到0时,数据也就传送完成了
  136.            }
  137.            while(BitCounter);                                   //判断是否传送完成
  138.            Scl=0;
  139. }

  140. /*读一字节的数据,并返回该字节值*/
  141. uchar Read(void)
  142. {
  143.     uchar temp=0;
  144.         uchar temp1=0;
  145.         uchar BitCounter=8;
  146.         Sda=1;
  147.         do
  148.         {
  149.                 Scl=0;
  150.                 Nop();
  151.                 Scl=1;
  152.                 Nop();
  153.                 if(Sda)                                   //数据位是否为1
  154.                         temp=temp|0x01;           //为1 temp的最低位为1(|0x01,就是将最低位变为1)
  155.                 else                                   //如果为0
  156.                         temp=temp&0xfe;           //temp最低位为0(&0xfe(11111110)最低位就是0)
  157.                 if(BitCounter-1)           //BitCounter减1后是否为真
  158.                 {
  159.                         temp1=temp<<1;           //temp左移
  160.                         temp=temp1;
  161.                 }
  162.                 BitCounter--;                   //BitCounter减到0时,数据就接收完了
  163.         }
  164.         while(BitCounter);                   //判断是否接收完成
  165.         return(temp);
  166. }

  167. void WrToROM(uchar Data[],uchar Address,uchar Num)
  168. {
  169.   uchar i;
  170.   uchar *PData;
  171.   PData=Data;
  172.   for(i=0;i<Num;i++)
  173.   {
  174.   Start();
  175.   Send(0xa0);
  176.   Ack();
  177.   Send(Address+i);
  178.   Ack();
  179.   Send(*(PData+i));
  180.   Ack();
  181.   Stop();
  182.   mDelay(20);
  183.   }
  184. }

  185. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  186. {
  187.   uchar i;
  188.   uchar *PData;
  189.   PData=Data;
  190.   for(i=0;i<Num;i++)
  191.   {
  192.   Start();
  193.   Send(0xa0);
  194.   Ack();
  195.   Send(Address+i);
  196.   Ack();
  197.   Start();
  198.   Send(0xa1);
  199.   Ack();
  200.   *(PData+i)=Read();
  201.   Scl=0;
  202.   NoAck();
  203.   Stop();
  204.   }
  205. }


  206. //==================================================================================================
  207. //=======================================LCD1602====================================================
  208. //==================================================================================================

  209. #define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
  210. #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)


  211. //----------------延时函数,后面经常调用----------------------
  212. void delay(uint xms)//延时函数,有参函数
  213. {
  214.         uint x,y;
  215.         for(x=xms;x>0;x--)
  216.          for(y=110;y>0;y--);
  217. }

  218. //--------------------------写指令---------------------------
  219. void write_1602com(uchar com)//****液晶写入指令函数****
  220. {
  221.         lcd1602_rs=0;//数据/指令选择置为指令
  222.         lcd1602_rw=0; //读写选择置为写
  223.         P0=com;//送入数据
  224.         delay(1);
  225.         lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
  226.         delay(1);
  227.         lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
  228. }

  229. //-------------------------写数据-----------------------------
  230. void write_1602dat(uchar dat)//***液晶写入数据函数****
  231. {
  232.         lcd1602_rs=1;//数据/指令选择置为数据
  233.         lcd1602_rw=0; //读写选择置为写
  234.         P0=dat;//送入数据
  235.         delay(1);
  236.         lcd1602_en=1; //en置高电平,为制造下降沿做准备
  237.         delay(1);
  238.         lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
  239. }

  240. //-------------------------初始化-------------------------
  241. void lcd_init(void)
  242. {
  243.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  244.         write_1602com(0x0c);//开显示不显示光标
  245.         write_1602com(0x06);//整屏不移动,光标自动右移
  246.         write_1602com(0x01);//清显示
  247. }
  248. //========================================================================================
  249. //=========================================================================================
  250. //==============将按键值编码为数值=========================
  251. unsigned char coding(unsigned char m)         
  252. {
  253.         unsigned char k;
  254.         switch(m)
  255.         {
  256.                 case (0x11): k=1;break;
  257.                 case (0x21): k=2;break;
  258.                 case (0x41): k=3;break;
  259.                 case (0x81): k='A';break;
  260.                 case (0x12): k=4;break;
  261.                 case (0x22): k=5;break;
  262.                 case (0x42): k=6;break;
  263.                 case (0x82): k='B';break;
  264.                 case (0x14): k=7;break;
  265.                 case (0x24): k=8;break;
  266.                 case (0x44): k=9;break;
  267.                 case (0x84): k='C';break;
  268.                 case (0x18): k='*';break;
  269.                 case (0x28): k=0;break;
  270.                 case (0x48): k='#';break;
  271.                 case (0x88): k='D';break;
  272.         }
  273.         return(k);
  274. }
  275. //=====================按键检测并返回按键值===============================
  276. unsigned char keynum(void)
  277. {
  278.          unsigned char row,col,i;
  279.          P1=0xf0;
  280.          if((P1&0xf0)!=0xf0)
  281.          {
  282.                    Delay5Ms();
  283.         Delay5Ms();
  284.                    if((P1&0xf0)!=0xf0)
  285.                 {
  286.                     row=P1^0xf0;          //确定行线
  287.                         i=0;
  288.                         P1=a[i];                  //精确定位
  289.                         while(i<4)
  290.                         {
  291.                                  if((P1&0xf0)!=0xf0)
  292.                                   {
  293.                                            col=~(P1&0xff);          //确定列线
  294.                                            break;            //已定位后提前退出   
  295.                                   }
  296.                                 else
  297.                                   {
  298.                                            i++;
  299.                                            P1=a[i];
  300.                                   }
  301.                         }
  302.                 }
  303.                 else
  304.                 {
  305.                         return 0;
  306.                 }
  307.                 while((P1&0xf0)!=0xf0);
  308.                 return (row|col);                         //行线与列线组合后返回
  309.          }
  310.          else return 0;                                 //无键按下时返回0
  311. }
  312. //=======================一声提示音,表示有效输入========================
  313. void OneAlam(void)
  314. {
  315.         ALAM=0;
  316.         Delay5Ms();
  317.     ALAM=1;
  318. }
  319. //========================二声提示音,表示操作成功========================
  320. void TwoAlam(void)
  321. {
  322.         ALAM=0;
  323.         Delay5Ms();
  324.     ALAM=1;
  325.     Delay5Ms();
  326.         ALAM=0;
  327.         Delay5Ms();
  328.     ALAM=1;
  329. }
  330. //========================三声提示音,表示错误========================
  331. void ThreeAlam(void)
  332. {
  333.         ALAM=0;
  334.         Delay5Ms();
  335.     ALAM=1;
  336.     Delay5Ms();
  337.         ALAM=0;
  338.         Delay5Ms();
  339.     ALAM=1;
  340.     Delay5Ms();
  341.         ALAM=0;
  342.         Delay5Ms();
  343.     ALAM=1;
  344. }
  345. //=======================显示提示输入=========================
  346. void DisplayChar(void)
  347. {
  348.         unsigned char i;
  349.         if(pass==1)
  350.         {
  351.                 //DisplayListChar(0,1,LockOpen);
  352.                 write_1602com(er);                                   //在二行开始显示
  353.                 for(i=0;i<16;i++)
  354.                 {
  355.                         write_1602dat(LockOpen[i]);           //显示open 开锁成功
  356.                 }
  357.         }
  358.         else
  359.         {
  360.                 if(N==0)
  361.                 {
  362.                         //DisplayListChar(0,1,Error);
  363.                         write_1602com(er);
  364.                         for(i=0;i<16;i++)
  365.                         {
  366.                                 write_1602dat(Error[i]);        //显示错误
  367.                         }
  368.                 }
  369.                 else
  370.                 {
  371.                         //DisplayListChar(0,1,start_line);        
  372.                         write_1602com(er);
  373.                         for(i=0;i<16;i++)
  374.                         {
  375.                                 write_1602dat(start_line[i]);//显示开始输入        
  376.                         }
  377.                 }
  378.         }
  379. }

  380. //========================重置密码==================================================
  381. //==================================================================================
  382. void ResetPassword(void)
  383. {
  384.         unsigned char i;        
  385.         unsigned char j;
  386.         if(pass==0)
  387.         {
  388.                 pass=0;                           
  389.                 DisplayChar();           //显示错误
  390.                 ThreeAlam();           //没开锁时按下重置密码报警3声
  391.         }
  392.         else                                   //开锁状态下才能进行密码重置程序
  393.         {
  394.             if(ReInputEn==1)   //开锁状态下,ReInputEn置1,重置密码允许
  395.                 {
  396.                         if(N==6)           //输入6位密码
  397.                         {
  398.                                 ReInputCont++;                        //密码次数计数        
  399.                                 if(ReInputCont==2)                //输入两次密码
  400.                                 {
  401.                                         for(i=0;i<6;)
  402.                                         {
  403.                                                 if(TempPassword[i]==InputData[i])        //将两次输入的新密码作对比
  404.                                                         i++;
  405.                                                 else                                                                //如果两次的密码不同
  406.                                                 {
  407.                                                         //DisplayListChar(0,1,Error);
  408.                                                         write_1602com(er);
  409.                                                         for(j=0;j<16;j++)
  410.                                                         {
  411.                                                                 write_1602dat(Error[j]);        //显示错误Error
  412.                                                         }
  413.                                                         ThreeAlam();                        //错误提示        
  414.                                                         pass=0;                                        //关锁
  415.                                                         ReInputEn=0;                        //关闭重置功能,
  416.                                                         ReInputCont=0;
  417.                                                         DisplayChar();
  418.                                                         break;
  419.                                                 }
  420.                                         }
  421.                                         if(i==6)
  422.                                         {
  423.                                                 //DisplayListChar(0,1,ResetOK);
  424.                                                 write_1602com(er);
  425.                                                 for(j=0;j<16;j++)
  426.                                                 {
  427.                                                         write_1602dat(ResetOK[j]);          //密码修改成功,显示
  428.                                                 }

  429.                                                 TwoAlam();                                //操作成功提示
  430.                                                  WrToROM(TempPassword,0,6);                //将新密码写入24C02存储
  431.                                                 ReInputEn=0;
  432.                                         }
  433.                                         ReInputCont=0;
  434.                                         CorrectCont=0;
  435.                                 }
  436.                                 else                                          //输入一次密码时
  437.                                 {
  438.                                         OneAlam();
  439.                                         //DisplayListChar(0, 1, again);                 //显示再次输入一次
  440.                                         write_1602com(er);
  441.                                         for(j=0;j<16;j++)
  442.                                         {
  443.                                                 write_1602dat(again[j]);                        //显示再输入一次
  444.                                         }                                       
  445.                                         for(i=0;i<6;i++)
  446.                                         {
  447.                                                 TempPassword[i]=InputData[i];                //将第一次输入的数据暂存起来                                                
  448.                                         }
  449.                                 }

  450.                         N=0;                                                //输入数据位数计数器清零
  451.                    }
  452.             }
  453.         }
  454. }
  455. //=======================输入密码错误超过三过,报警并锁死键盘======================
  456. void Alam_KeyUnable(void)
  457. {
  458.         P1=0x00;
  459.         {
  460.                 ALAM=~ALAM;                                 //蜂鸣器一直闪烁鸣响
  461.                 Delay5Ms();
  462.         }
  463. }
  464. //=======================取消所有操作============================================
  465. void Cancel(void)
  466. {        
  467.         unsigned char i;
  468.         unsigned char j;
  469.         //DisplayListChar(0, 1, start_line);
  470.         write_1602com(er);
  471.         for(j=0;j<16;j++)
  472.         {
  473.                 write_1602dat(start_line[j]);          //显示开机输入密码界面
  474.         }
  475.         TwoAlam();                                //提示音
  476.         for(i=0;i<6;i++)
  477.         {
  478.                 InputData[i]=0;                //将输入密码清零
  479.         }
  480.         KEY=1;                                        //关闭锁
  481.         ALAM=1;                                        //报警关
  482.         pass=0;                                        //密码正确标志清零
  483.         ReInputEn=0;                        //重置输入充许标志清零
  484.         ErrorCont=0;                        //密码错误输入次数清零
  485.         CorrectCont=0;                        //密码正确输入次数清零
  486.         ReInputCont=0;                        //重置密码输入次数清零
  487.         s3_keydown=0;
  488.         key_disable=0;                        //锁定键盘标志清零
  489.         N=0;                                        //输入位数计数器清零
  490. }

  491. //==========================确认键,并通过相应标志位执行相应功能===============================
  492. void Ensure(void)
  493. {        
  494.         unsigned char i,j;
  495.         RdFromROM(CurrentPassword,0,6);                                         //从24C02里读出存储密码
  496.     if(N==6)
  497.         {
  498.             if(ReInputEn==0)                                                        //重置密码功能未开启
  499.                 {
  500.                         for(i=0;i<6;)
  501.                            {                                       
  502.                                 if(CurrentPassword[i]==InputData[i])        //判断输入密码和24c02中的密码是否相同
  503.                                 {
  504.                                         i++;                                                                //相同一位 i就+1
  505.                                 }
  506.                                 else                                                                         //如果有密码不同
  507.                                 {                                                                                
  508.                                         ErrorCont++;                                                //错误次数++
  509.                                         if(ErrorCont==3)                        //错误输入计数达三次时,报警并锁定键盘
  510.                                         {
  511.                                                 write_1602com(er);
  512.                                                 for(i=0;i<16;i++)
  513.                                                 {
  514.                                                         write_1602dat(Error[i]);        
  515.                                                 }
  516.                                                 do
  517.                                                 Alam_KeyUnable();
  518.                                                 while(1);
  519.                                         }
  520.                                         else                                         //错误次数小于3次时,锁死键盘3秒,然后重新可以输入
  521.                                         {
  522.                                                 TR0=1;                                //开启定时
  523.                                                 key_disable=1;                        //锁定键盘
  524.                                                 pass=0;                                        //pass位清零
  525.                                                 break;                                        //跳出
  526.                                         }
  527.                                 }
  528.                         }

  529.                         if(i==6)                                         //密码输入对时
  530.                         {
  531.                                 CorrectCont++;                                        //输入正确变量++
  532.                                 if(CorrectCont==1)                                //正确输入计数,当只有一次正确输入时,开锁
  533.                                 {
  534.                                         //DisplayListChar(0,1,LockOpen);
  535.                                         write_1602com(er);
  536.                                         for(j=0;j<16;j++)
  537.                                         {
  538.                                                 write_1602dat(LockOpen[j]);                  //显示open开锁画面
  539.                                         }
  540.                                         TwoAlam();                        //操作成功提示音
  541.                                         KEY=0;                                                                                        //开锁
  542.                                         pass=1;                                                                                        //置正确标志位
  543.                                         TR0=1;                                                                                        //开启定时
  544.                                         for(j=0;j<6;j++)                                                                //将输入清除
  545.                                         {
  546.                                                 InputData[i]=0;                                                                //开锁后将输入位清零
  547.                                         }
  548.                                 }        
  549.                                 else                                                                                                //当两次正确输入时,开启重置密码功能
  550.                                 {
  551.                                         //DisplayListChar(0,1,SetNew);
  552.                                         write_1602com(er);
  553.                                         for(j=0;j<16;j++)
  554.                                         {
  555.                                                 write_1602dat(SetNew[j]);                                        //显示重置密码界面
  556.                                         }
  557.                                         TwoAlam();                                                                            //操作成功提示
  558.                                         ReInputEn=1;                                                                        //允许重置密码输入
  559.                                         CorrectCont=0;                                                                        //正确计数器清零
  560.                                 }
  561.                           }
  562.         
  563.                         else                        //=========================当第一次使用或忘记密码时可以用131420对其密码初始化============
  564.                         {
  565.                                 if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
  566.                                    {
  567.                                         WrToROM(initpassword,0,6);                                 //强制将初始密码写入24C02存储
  568.                                         //DisplayListChar(0,1,initword);                        //显示初始化密码
  569.                                         write_1602com(er);
  570.                                         for(j=0;j<16;j++)
  571.                                         {
  572.                                                 write_1602dat(initword[j]);                                //显示初始化密码
  573.                                         }
  574.                                         TwoAlam();                                                                        //成功提示音
  575.                                         Delay400Ms();                                                                //延时400ms
  576.                                         TwoAlam();                                                                        //成功提示音
  577.                                         N=0;                                                                                //输入位数计数器清零
  578.                                 }
  579.                                 else                                                                                        //密码输入错误
  580.                                 {
  581.                                         //DisplayListChar(0,1,Error);
  582.                                         write_1602com(er);
  583.                                         for(j=0;j<16;j++)
  584.                                         {
  585.                                                 write_1602dat(Error[j]);                                 //显示错误信息
  586.                                         }
  587.                                          ThreeAlam();                                                                                //错误提示音
  588.                                         pass=0;        
  589.                                 }
  590.                         }
  591.                 }

  592.                 else                                                                                        //当已经开启重置密码功能时,而按下开锁键,
  593.                 {
  594.                         //DisplayListChar(0,1,Er_try);
  595.                         write_1602com(er);
  596.                         for(j=0;j<16;j++)
  597.                         {
  598.                                 write_1602dat(Er_try[j]);                          //错误,请重新输入
  599.                         }
  600.                         ThreeAlam();                                                          //错误提示音
  601.                 }
  602.         }

  603.         else                                   //密码没有输入到6位时,按下确认键时
  604.         {
  605.                 //DisplayListChar(0,1,Error);
  606.                 write_1602com(er);
  607.                 for(j=0;j<16;j++)
  608.                 {
  609.                         write_1602dat(Error[j]);                 //显示错误
  610.                 }

  611.                  ThreeAlam();                                                                                //错误提示音
  612.                 pass=0;        
  613.         }
  614.         
  615.         N=0;                                                                                                        //将输入数据计数器清零,为下一次输入作准备
  616. }


  617. //==============================主函数===============================
  618. void main(void)
  619. {
  620.          unsigned char KEY,NUM;
  621.         unsigned char i,j;
  622.          P1=0xFF;                                    //P1口复位
  623.         TMOD=0x11;                                   //定义工作方式
  624.          TL0=0xB0;
  625.          TH0=0x3C;                                   //定时器赋初值
  626.          EA=1;                                           //打开中断总开关
  627.          ET0=1;                                           //打开中断允许开关
  628.          TR0=0;                                           //打开定时器开关
  629.          Delay400Ms();         //启动等待,等LCM讲入工作状态
  630.          lcd_init();         //LCD初始化
  631.         write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
  632.         for(i=0;i<16;i++)
  633.         {
  634.                 write_1602dat(name[i]);//向液晶屏写开机画面
  635.         }
  636.         write_1602com(er);
  637.         for(i=0;i<16;i++)
  638.         {
  639.                 write_1602dat(start_line[i]);//写输入密码等待界面
  640.         }
  641.         write_1602com(er+9);        //设置光标位置
  642.         write_1602com(0x0f);        //设置光标为闪烁
  643.          Delay5Ms(); //延时片刻(可不要)

  644.          N=0;                                                                                                                //初始化数据输入位数
  645.          while(1)                 //进入循环
  646.          {
  647.                 if(key_disable==1)                                                //锁定键盘标志为1时
  648.                         Alam_KeyUnable();                                        //报警键盘锁
  649.                 else
  650.                         ALAM=1;                                                                //关报警

  651.                 KEY=keynum();                                                        //读按键的位置码
  652.                 if(KEY!=0)                                                                //当有按键按下时
  653.                 {        
  654.                         if(key_disable==1)                                        //锁定键盘标志为1时
  655.                         {
  656.                                 second=0;                                                //秒清零
  657.                         }
  658.                         else                                                                //没有锁定键盘时
  659.                         {
  660.                                 NUM=coding(KEY);                                //根据按键的位置将其编码,编码值赋值给NUM
  661.                                 {
  662.                                         switch(NUM)                                        //判断按键值
  663.                                         {
  664.                                                 case ('A'):         ;                                         break;
  665.                                                 case ('B'):                ;                                     break;
  666.                                                 case ('C'):
  667.                                                                         write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
  668.                                                                         for(i=0;i<16;i++)
  669.                                                                         {
  670.                                                                                 write_1602dat(name[i]);//向液晶屏写开机画面
  671.                                                                         }
  672.                                                                         if(N>=1) N--;        OneAlam();                                                                //按键提示音                                                
  673.                                                                         //DisplayOneChar(6+N,1,'*');
  674.                                                                         for(j=N;j<16;j++)
  675.                                                                         {
  676.                                                                                 write_1602com(er+6+j);
  677.                                                                                 write_1602dat(' ');
  678. ……………………

  679. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51-密码锁程序 注释.zip (143.94 KB, 下载次数: 195)
原理图.pdf (46.31 KB, 下载次数: 139)



评分

参与人数 2黑币 +10 收起 理由
Amazing云山 + 5 赞一个!
linziol + 5 好文!但附件和在一起好吗,大量黑币耗不起.

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:272269 发表于 2018-2-14 19:17 | 只看该作者
赞一个
回复

使用道具 举报

板凳
ID:285271 发表于 2018-2-24 22:00 来自手机 | 只看该作者
厉害!谢谢楼主无私分享,先学习学习
回复

使用道具 举报

地板
ID:273434 发表于 2018-2-25 21:04 | 只看该作者
感谢你的付出
回复

使用道具 举报

5#
ID:285586 发表于 2018-2-27 14:02 | 只看该作者
谢谢楼主 程序码回去慢慢看了
回复

使用道具 举报

6#
ID:295217 发表于 2018-3-22 21:31 | 只看该作者
感谢楼主分享 正好拿来参考
回复

使用道具 举报

7#
ID:157662 发表于 2018-3-22 22:50 | 只看该作者
抄    袭的
回复

使用道具 举报

8#
ID:194729 发表于 2018-3-27 19:12 | 只看该作者
好文章,大家一块学习
回复

使用道具 举报

9#
ID:115740 发表于 2018-12-8 22:48 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
ID:449404 发表于 2018-12-18 22:51 | 只看该作者
新手到来,观摩学习~
回复

使用道具 举报

11#
ID:416161 发表于 2018-12-21 15:27 | 只看该作者
做的不错,最近在做毕业设计,参考一下
回复

使用道具 举报

12#
ID:448073 发表于 2018-12-24 13:50 | 只看该作者
赞一个
回复

使用道具 举报

13#
ID:453467 发表于 2018-12-24 15:10 | 只看该作者
unsigned char coding(unsigned char m) 函数里的case忘了写default
回复

使用道具 举报

14#
ID:459121 发表于 2018-12-31 19:38 | 只看该作者
楼主可以解释一下按键扫描那一块程序吗?我研究了很久,就是不懂它怎么扫描的?特别是P1=a[i]这一块
回复

使用道具 举报

15#
ID:331970 发表于 2019-1-17 19:22 | 只看该作者
谢楼主分享 正好拿来参考
回复

使用道具 举报

16#
ID:219496 发表于 2019-3-19 11:47 | 只看该作者
谢谢楼主,下来看看
回复

使用道具 举报

17#
ID:496733 发表于 2019-5-2 12:57 | 只看该作者
正在寻找的资源。
回复

使用道具 举报

18#
ID:559170 发表于 2019-6-10 17:22 | 只看该作者
楼主好赞
回复

使用道具 举报

19#
ID:305983 发表于 2019-8-2 10:33 | 只看该作者
挺好的 很实用
回复

使用道具 举报

20#
ID:381390 发表于 2019-9-17 13:29 | 只看该作者
谢谢楼主无私分享
回复

使用道具 举报

21#
ID:725066 发表于 2020-4-8 20:10 | 只看该作者
谢谢楼主的分享
回复

使用道具 举报

22#
ID:732070 发表于 2020-4-20 11:09 | 只看该作者
很棒很棒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表