单片机源程序如下:
- #include <reg52.h>
- #include "include.h"
- #include <intrins.h>
- #include <lcd12864.h>
- #include "key.h"
- //#include "ds1302.h"
- #include "stdio.h"
- #define uchar unsigned char
- #define uint unsigned int
- void dingshi();
- void delay(uint t)
- {
- uchar a;
- while(--t)
- for(a=0;a<120;a++);
- }
- void dingshi()
- {
- uchar z;
- TMOD=0x00;
- TR1=1;
- TH1=0x63;
- TL1=0x18;
- for(z=0;z<160; )
- {
- if(TF1==1)
- {
- z++;
- TF1=0;
- TH1=0x63;
- TL1=0x18;
- }
- }
- }
- uint srmm[16];
- sbit jdq1=P3^4;
- code uchar uctech[] ={"欢迎使用小智障"};
- code uchar net[] = {"请输入密码:"};
- code uchar mmcw[] ={"密码有错误"};
- code uchar qcs[] = {"请重试"};
- code uchar mmzq[] = {"密码对了"};
- code uchar hyhj[] = {"欢迎回家"};
- code uchar sysj[] = {"剩余时间"};
- code uint mm[8]={3,1,3,6,3,6,7,2};
- //uchar disTime[7]; //保存时间数据的数组
- //uchar code timeRAdd[] = {READ_YEAR,READ_MON,READ_DAY,READ_WEEK,READ_HOUR,READ_MINUTE,READ_SECOND};
- //uchar code timeWAdd[] = {WRITE_YEAR,WRITE_MON,WRITE_DAY,WRITE_WEEK,WRITE_HOUR,WRITE_MINUTE,WRITE_SECOND};
- void main()
- {
- uchar b,c,cw=0,cun,m,key_num=0,k=0,x,djs;
- uchar i = 0;
- uchar tempArr[2]="12";
- jdq1=1;
- //// Write1302(0x80,0x00);
- // Write1302(0x90,0x5c); //禁止充电
- // Write1302(0x8e,0x80); //写保护控制字,禁止写
- // Delay400Ms(); //启动等待,等LCD讲入工作状态-
- LCDInit(); //LCM初始化
- uuu:
- LCDClear();
- DisplayListChar(0,1,uctech); //显示字库中的中文数字
- DisplayListChar(0,2,net); //显示字库中的中文数字
- // //设置时间
- // disTime[0]=19;
- // disTime[1]=3;
- // disTime[2]=19;
- // disTime[3]=2; //星期
- // disTime[4]=8;
- // disTime[5]=39;
- //
- // Write1302(WRITE_PROTECT,0X00);
- // for(i = 0;i < 7;i ++) {
- // Write1302(timeWAdd[i],disTime[i] / 10 * 16 + disTime[i] % 10);
- // }
- // Write1302(WRITE_PROTECT,0X80);
- while(1)
- {
-
- // //读取时间
- // for(i = 0;i < 7;i ++) {
- // disTime[i] = Read1302(timeRAdd[i]);
- // DisplayOneChar(0,4,disTime[i]/10+0x30);
- // }
- // //显示时间
- // for(i = 0;i < 7;i ++) {
- // tempArr[0] = disTime[i] / 10 + 0x30;
- // DisplayOneChar(0,4,tempArr[0]);
- // tempArr[1] = disTime[i] % 10 + 0x30;
- // if(i > 2) {
- // if(i == 3) {
- // DisplayListChar(0,4,tempArr);
- //// Display(2,0,6,disWeek + 6 * (disTime[i] - 1));
- // }else {
- //// Display(2,3 + 2 * (i - 4),2,tempArr);
- // }
- // }else {
- //// Display(1,2 + 2 * i,2,tempArr);
- // }
- // }
- if((cun=Keyboard())!=16)
- {
-
- // cun=Keyboard();
- // if(Keyboard()==14){m=m-1;}
- // if(Keyboard()==15)
- if(cun==14){m=m-1;}//退格
- if(cun==15) //确定
- {
- oo:
- k=1; //按下确认
- m=0;
- LCDClear();
- break;
- }
- while(KEY!=0x0f);
- delay(5);
- //DisplayOneChar(m,3,cun+0x30);//显示密码
- DisplayOneChar(m,3,0x2A);//显示星号
- switch(m)
- {
- case 0: {srmm[0] = cun; break;}
- case 1: {srmm[1] = cun; break;}
- case 2: {srmm[2] = cun; break;}
- case 3: {srmm[3] = cun; break;}
- case 4: {srmm[4] = cun; break;}
- case 5: {srmm[5] = cun; break;}
- case 6: {srmm[6] = cun; break;}
- case 7: {srmm[7] = cun; break;}
- }
- if(cun<10)m++;
- if(m==8)
- {
- // k=1; //确认返回
- // m=0;
- // LCDClear();
- // break;
- goto oo;
- }
- }
-
- }
- while(k==1)
- {
-
- for(b=0;b<8;)
- {
- TI=0;
- if(srmm[b]==mm[b])
- {
- b++;
- TI=0;
- }
- else{ c=8;break;}
- }
- if(c==8)
- {
-
- LCDClear();
- DisplayListChar(1,2,mmcw); //显示字库中的中文数字
- DisplayListChar(2,3,qcs); //显示字库中的中文数字、
- delay(100);
- LCDClear();
- k=0;
- c=0;
- if(cw<2)
- {
- cw++;
- goto uuu;
- }
- else
- {
- DisplayListChar(1,2,mmcw); //显示字库中的中文数字
- Delay400Ms();
- Delay400Ms();
- LCDClear();
- djs=60;
- for(x=60;x>=0;x--)
- {
- DisplayListChar(2,0,sysj);
- DisplayOneChar(4,2,djs%10+0x30); //显示字库中的中文数字
- DisplayOneChar(3,2,djs/10+0x30);
- dingshi();
-
- djs--;
- if(x==0) goto uuu;
- }
- }
- }
- else
- {
- LCDClear();
- DisplayListChar(2,2,mmzq); //显示字库中的中文数字
- DisplayListChar(2,3,hyhj); //显示字库中的中文数字
- //delay(1000);
- //LCDClear();
- jdq1=0; //开门
- delay(3000);
- jdq1=1;
- LCDClear();
- k=0;
- srmm[0] ='6';
- cw=0;
- goto uuu;
- }
- }
- }
复制代码
- /*------- --4X4键盘 ---------
- L1,L2,L3,L4,R1,R2,R3,R4分别接P2.0-7
- 键盘编码如下所示:
- 0 , 1, 2, 3
- 4 , 5, 6, 7
- 8 , 9,10,11
- 12,13,14,15
- unsigned char Keyboard(void);为键盘扫描函数,
- 在主函数文件声明后即可调用,返回键盘值0-15,
- 无按键按下时,返回16。
- ------------------------------*/
- #include <reg52.h>
- #include "key.h"
- #include "include.h"
- //------函数声明---------------------------
- //void Keyboard(void);
- //-----引脚定义--------------------------------
- //#define KEY P0
- //-------------------------------------------
- void delay_key(unsigned int t)
- {
- while(t--);
- }
- //-------------------------------------------
- uchar Keyboard(void)
- {unsigned char x,y,z=0;
- unsigned int jz=16;
- KEY=0xf0; //低四位置低,即行接低
- if(KEY!=0xf0) //是否有按键按下
- {
- delay_key(10); //去抖
- if(KEY!=0xf0)//确实有按键按下
- {
- x=KEY; //读取按键所在的行
- KEY=0x0f; //高四位置低,即列接低
- y=KEY; //读取按键所在的列
- z=x|y; //按键的坐标为行+列
- // while(KEY!=0x0f); //等待按键抬起
- }
- }
- switch(z)
- { //while(KEY!=0x0f);
- case 0xee:{jz=1;break;} //按键值显示为0
- case 0xde:{jz=2;break;} //按键值显示为1
- case 0xbe:{jz=3;break;}
- case 0x7e:{jz=14;break;}
- case 0xed:{jz=4;break;}
- case 0xdd:{jz=5;break;}
- case 0xbd:{jz=6;break;}
- case 0x7d:{jz=7;break;}
- case 0xeb:{jz=7;break;}
- case 0xdb:{jz=8;break;}
- case 0xbb:{jz=9;break;}
- case 0x7b:{jz=10;break;}
- case 0xe7:{jz=0;break;}
- case 0xd7:{jz=14;break;}
- case 0xb7:{jz=15;break;}
- case 0x77:{jz=15;break;}
- default: jz=16; break; // 没有按键按下,返回16
- }
- // while(KEY==0x0f);
- return jz;
- }
复制代码
所有资料51hei提供下载:
电子密码锁.zip
(69.88 KB, 下载次数: 29)
|