程序源代码:
//************************************************************************************************************************************
//库调用.宏类型定义.位定义//
//************************************************************************************************************************************
#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++;
}
}
}
}
//***************************************************************************
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』