×
单片机 > 单片机程序设计 > 详情

单片机数字密码锁

发布时间:2021-10-21 发布时间:
|

程序源代码:

//************************************************************************************************************************************

//库调用.宏类型定义.位定义//

//************************************************************************************************************************************

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ushort unsigned short


#define GPIO_KEY P1 //矩阵键盘烧扫描端口

sbit RS = P2^2; //液晶显示器控制端口

sbit RW = P2^3;

sbit E = P3^7;

sbit shuchu=P2^0; //继电器控制端口

sbit beep=P2^1; //报警器端口

sbit DoorBell=P3^6; //门铃端口

sbit SCL = P2^6; //AT24C04的时钟

sbit SDA = P2^7; //AT24C04的数据


uchar idata upxs[16]={"Password:"}; //上排存放数组

uchar idata dwxs[16]={""}; //下排存放数组

uint idata tempword[6]={0}; //临时密码数组

uint idata password[6]={1,1,1,1,1,1};//初始密码

uint idata now=0; //数组伪指针

uint idata key=0; //密钥

uint idata keyboard=0; //键盘锁定标志

uint idata key1=0; //用于密码修改

uint idata KeyValue=16; //用来存放读取到的键值

uint idata warn=0; //错误累计

uint idata time=0; //用于定时

uint idata time1=0; //用于定时

uint idata time2=0; //用于定时

uint idata moshi=0; //定时器内部模式

uchar idata BUF[8]; //掉电数据缓存区

uchar idata TESTDATA[8]={0}; //掉电新密码存储

uint idata menu=0; //menu用于密码修改

uint idata tempword1[8]={0}; //用于密码修改

//*********************************************************************************************************************************

//函数声明//

//*********************************************************************************************************************************

void delete(void);

//*********************************************************************************************************************************

/*模块名称:液晶驱动显示模块*/

/*模块功能:驱动LCD1602的显示,并时时显示按键值*/

//*********************************************************************************************************************************

void delay(uint dell)//毫秒延时//

{

uchar x;

for(dell;dell>0;dell--)

for(x=110;x>0;x--);

}

void wr_com(uchar temp)//写指令//

{

RS=0;

RW=0;

P0=temp;

E=1;

E=0;

}

void wr_data(uchar num)//写数据//

{

RS=1;

RW=0;

P0=num;

E=1;

E=0;

}

void disp_lcd(uchar addr,char *templ)//显示函数//

{

uchar i;

wr_com(addr);

delay(50);

for(i=0;i<16;i++)

{

wr_data(templ[i]);

delay(50);

}

}

void lcd_init()//初始化液晶//

{

wr_com(0x30);

delay(50);

wr_com(0x38);

delay(50);

wr_com(0x01);

delay(50);

wr_com(0x06);

delay(50);

wr_com(0x0c);

delay(50);

}

void lcdxianshi(void)//液晶总显示//

{

disp_lcd(0x80,upxs);

disp_lcd(0xc0,dwxs);

}

//*********************************************************************************************************************************

/*模块名称:矩阵键盘扫描模块*/

/*模块功能:时时扫描按键值*/

//*********************************************************************************************************************************

void Delay10ms(void)//延时函数//

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

void KeyDown(void)//键盘检测函数//

{

char a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f) //读取按键是否按下

{

Delay10ms(); //延时10ms进行消抖

if(GPIO_KEY!=0x0f) //再次检测键盘是否按下

{

//扫描列

GPIO_KEY=0X0F;

switch(GPIO_KEY)

{

case(0X07): KeyValue=0;break;

case(0X0b): KeyValue=1;break;

case(0X0d): KeyValue=2;break;

case(0X0e): KeyValue=3;break;

}

//扫描行

GPIO_KEY=0XF0;

switch(GPIO_KEY)

{

case(0X70): KeyValue=KeyValue;break;

case(0Xb0): KeyValue=KeyValue+4;break;

case(0Xd0): KeyValue=KeyValue+8;break;

case(0Xe0): KeyValue=KeyValue+12;break;

}

while((a<10)&&(GPIO_KEY!=0xf0))//按键松手检测

{

Delay10ms();

a++;

}

}

}

}

//***************************************************************************

[1] [2] [3] [4] [5] [6]
单片机数字密码锁

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计