#include <reg52.h> //包含头文件 reg52 可以直接用这文件中已经定义好的内容
#include "LCD1602.H"//包含头文件 LCD1602 可以直接用这文件中已经定义好的内容
#include"string.h"//包含头文件 string 可以直接用这文件中已经定义好的内容
#include<stdio.h>//包含头文件 stdio 可以直接用这文件中已经定义好的内容
#define uchar unsigned char 宏定义 使C代码更简洁
#define uint unsigned int 宏定义 使C代码更简洁
#define ulong unsigned long宏定义 使C代码更简洁
/*****端口定义************/
/*端口定义就是
单片机的初始设置让C代码可以进行编写*/
#define P_key P1
sbit beep=P3^7;//蜂鸣器引脚
sbit led=P3^4; //P3.4口定义成led
unsigned char num=0,Firstflag=0,SetPassflag; // 密码计数 ,第一次输入密码标志 ,设定密码标志 ,设置时间
unsigned int Set
time ; // 定义无符号 整形 SetTime
unsigned char Rxtemp[10],word[7]={" "},PasW[7]; //密码默认是123456
unsigned char Rxnum=0;//串口接收计数数据
char dat[4]; //定义字符型数组dat长度为4
char data TimeNum[]=" ";//定义字符型数组TimeNum
char idata Test1[]=" ",Test2[]=" ";//定义字符型数组Test1,Test2
uchar KeyValue;// 定义无字符型 KeyValue
void Disply(void); //显示
uchar GetKey(void);//返回键盘值0--16
void ScanKey(void);//键盘扫描处理
void InputPassword(uint Word);//输入密码
void delayNms(uint z);//延时
void InitTimer0(void);//定时器0初始化
void SetPassword(uint Word);//设置密码
void delay2s(void);//延时
void InitUART(void);
void RxBuffer_Strcmp(void);
/*****主函数************/
/*主函数就是整个程序运行的入口*/
void main()
{
uchar i;//定义无符号字符型 i
InitTimer0(); //初始化定时器
lcd1602_init(); //初始化显示屏
InitUART(); //初始化串口9600
sprintf(Test1,"Pls In Password");//the first line
lcd1602_showStr(0,0,Test1);//屏幕显示字符串
sprintf(TimeNum," Key Is Lock! ");//the first line
lcd1602_showStr(0,1,TimeNum);//屏幕显示字符串
num=0; //初始化密码设定位移
Rxnum=0;//初始化接收计数
SetPassflag=0;
SetTime=0;
for(i=0;i<6;i++) //循环6次按键
PasW[i]=i+0x30;
while(1)
{
ScanKey(); //扫描按键
RxBuffer_Strcmp(); //串口接收蓝牙端数据
}
}
/*************串口初始化9600*****/
/*串口如果需要工作就需要一些特定的条件下面便是一些条件*/
void InitUART(void) //串口初始化
{
TMOD = 0x20; //控制寄存器初始化
SCON = 0x50;//控制寄存器初始化
TH1 = 0xFD;//高八位初始化 高低结合共16位代表多久执行一次
TL1 = TH1;//第八位初始化
PCON = 0x00;//功率控制寄存器初始化
EA = 1;//允许中断
ES = 1;//中断允许位
TR1 = 1;//开启定时器1
}
/*************发送单字节数据******************/
/*发送单字节数据就是将数据一个字节一个字节的发送给寄存器*/
void SendOneByte(unsigned char c)
{
SBUF = c; //写数据
while(!TI);//TI取反
TI = 0;//TI赋为0
}
/*******************发送字符串数据*******************/
/*同上*/
void SendStr(unsigned char *s)
{
while(*s)
{
SendOneByte(*s);//发送S的直
s++;//S地址加1
}
}
void RxBuffer_Strcmp(void) //接收蓝牙数据进行开锁比较
/*蓝牙模块,让蓝牙功能可以执行*/
{
if(Rxnum>=6)//如果 Rxnum大于等于六
{
Rxtemp[6]=' ';//retemp7为空 意思就是最大输入6个数,再输入都无效
sprintf(Test1," Key Status: ");//the first line
lcd1602_showStr(0,0,Test1);//屏幕显示
if(strcmp(PasW,Rxtemp)==0) //比较输入的数和你的密码
{
lcd1602_showStr(0,1," ");//屏幕显示Key Is UnLock!
lcd1602_showStr(0,1," Key Is UnLock! ");//the first line
SendStr(" Password Is Right
");
Firstflag=0;//初始化继续工作
num=0;
SetPassflag=1;//可以进入密码设置阶段
led=0; //灯亮
beep=1; //蜂鸣器不响
}
else
{
lcd1602_showStr(0,1," ");//屏幕显示Key Is Lock
lcd1602_showStr(0,1," Key Is Lock! ");//the first line
SendStr(" Password Is Wrong
");
Firstflag=0;//初始化继续工作
num=0;
SetPassflag=0;//密码错误,不能设置
led=01; //灯不亮
beep=0; //蜂鸣器响
delay2s();//延迟
beep=1;
}
Rxnum=0;
}
}
/*************延时2s*****************/
void delay2s(void) //延时
{
unsigned char a,b,c;//定义无符号字符型 a,b,c
for(c=23;c>0;c--)//空循环 用来延时
for(b=216;b>0;b--)
for(a=184;a>0;a--);
}
/************定时器0初始化***************/
/*同上*/
void InitTimer0(void)
{
TMOD = 0x01;//控制寄存器初始化
TH0 = 0x0DC;//高八位初始化
TL0 = 0x00;//低八位初始化
EA = 1;//允许中断
ET0 = 1;//定时器0的中断允许开关
TR0 = 1;//开启定时器T0
}
/************定时器0中断10ms一次***************/
/*同上*/
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0DC;//高八位重置
TL0 = 0x00;//高八位重置
P_key=0xfe;
if(SetPassflag)
if((P_key&0x10)!=0x10) //按键按下
{
SetTime++;
if(SetTime>500)//持续5s按住
{
lcd1602_showStr(0,0,"Set New Password ");//the first line
lcd1602_showStr(0,1," ");
SetTime=0;
Firstflag=1;//不进入初始化密码跟进,进入密码设定
}
}
else
{
SetTime=0; //数据清零。
}
}
/*****延时************/
void delayNms(uint z)
{
uint x;
for( ;z>0;z--)
for(x=124;x>0;x--)
;
}
/*****输入密码************/
void InputPassword(uint Word)//输入密码
{
if(!Firstflag)
{
sprintf(Test1,"Pls In Password");//the first line
lcd1602_showStr(0,0,Test1);
lcd1602_showStr(0,1," ");
Firstflag=1;//标明可以正常输入密码
SetPassflag=0;
}
if(Firstflag) //&&!SetPassflag
{
lcd1602_showChar(num,1,'*') ;
word[num]=Word+0x30;
}
if(Firstflag&&SetPassflag)
{
lcd1602_showChar(num,1,'*') ;
PasW[num]=Word+0x30;
}
led=1;//灯不亮
}
/*****设置密码************/
void SetPassword(uint Word)//设置密码
{
}
/***********显示************/
void Disply( )
{
}
/***********返回键盘值0--16************/
/*意思就是返回你按下的键然后会有返回值用来判断密码是否正确,把这些键赋予意义*/
uchar GetKey()
{
P_key=0xfe;
if((P_key&0x80)!=0x80) return 0x03;
if((P_key&0x40)!=0x40) return 0x07;
if((P_key&0x20)!=0x20) return 0x0b;
if((P_key&0x10)!=0x10) return 0x0f;
P_key=0xfd;
if((P_key&0x80)!=0x80) return 0x02;
if((P_key&0x40)!=0x40) return 0x06;
if((P_key&0x20)!=0x20) return 0x0a;
if((P_key&0x10)!=0x10) return 0x0e;
P_key=0xfb;
if((P_key&0x80)!=0x80) return 0x01;
if((P_key&0x40)!=0x40) return 0x05;
if((P_key&0x20)!=0x20) return 0x09;
if((P_key&0x10)!=0x10) return 0x0d;
P_key=0xf7;
if((P_key&0x80)!=0x80) return 0x00;
if((P_key&0x40)!=0x40) return 0x04;
if((P_key&0x20)!=0x20) return 0x08;
if((P_key&0x10)!=0x10) return 0x0c;
return 0xff;
}
/***********键盘扫描处理************/
/*你所按的键传送到单片然后进行对密码锁的操作*/
/*上面是给按键定义让他能够使用,这里是对按键进行操作*/
void ScanKey()
{
unsigned char i;
if(KeyValue==GetKey()) return;
delayNms(2); //防抖
if(KeyValue==GetKey()) return;
KeyValue=GetKey(); //按键得到数
if(num<6)
{
switch(KeyValue)
{
case 0x00: //按键0
{
InputPassword(0);
num++;
break;
}
case 0x01: //按键1
{
InputPassword(1);
num++;
break;
}
case 0x02: //按键2
{
InputPassword(0x02);
num++;
break;
}
case 0x03: //按键3
{
InputPassword(0x03);
num++;
break;
}
case 0x05: //按键4
{
InputPassword(0x04);
num++;
break;
}
case 0x06: //按键5
{
InputPassword(0x05);
num++;
break;
}
case 0x07: //按键6
{
InputPassword(0x06);
num++;
break;
}
case 0x09: //按键7
{
InputPassword(0x07);
num++;
break;
}
case 0x0a: //按键8
{
InputPassword(0X08);
num++;
break;
}
case 0x0b: //按键9
{
InputPassword(0X09);
num++;
break;
}
case 0x0e: //按键0
{
InputPassword(0);
num++;
break;
}
default: break;
}
}
switch(KeyValue)
{
case 0x0d: //按键删除键
{
if(num)
num--;
lcd1602_showChar(num,1,' ') ;
word[num]=' ';
break;
}
case 0x0f://按键确认
{
if(Firstflag&&!SetPassflag) //说明输入密码而不是设置密码
{
sprintf(Test1," Key Status: ");//the first line
lcd1602_showStr(0,0,Test1); //屏幕显示
lcd1602_showStr(0,1," "); //屏幕显示
if(strcmp(word,PasW)==0)
{
lcd1602_showStr(0,1," Key Is UnLock! ");//the first line
Firstflag=0;//初始化继续工作
num=0;
SetPassflag=1;//可以进入密码设置阶段
beep=1;//蜂鸣器不响
led=0;//灯亮
}
else
{
lcd1602_showStr(0,1," Key Is Lock! ");//the first line
Firstflag=0;//初始化继续工作
num=0;
SetPassflag=0;//密码错误,不能设置
beep=0;//蜂鸣器响
led=1;//灯不亮
delay2s();
beep=1;//蜂鸣器不响
}
}
if(SetPassflag&&Firstflag) //说明输入密码而不是设置密码
{
sprintf(Test1,"Password Status: ");//the first line
lcd1602_showStr(0,0,Test1); //屏幕显示
lcd1602_showStr(0,1,"Password Is New"); //屏幕显示
SetPassflag=0; //不能再继续设定密码
Firstflag=0;//继续开锁
num=0; //初始化继续工作
}
break;
}
default: break;
}
}
/******************串口中断函数*********************/
/*同上*/
void UARTInterrupt(void) interrupt 4 //中断4
{
if(RI)
{
ES=0; //关串口中断
Rxtemp[Rxnum++]=SBUF;
RI = 0;
ES=1; //开串口中断
}
}
void lcd1602_init(void)
{
lcd1602_writeCmd(0x38); // 0x38 设置16*2显示,5*7点阵,8位数据接口
lcd1602_delay(10);
lcd1602_writeCmd(0x08); //0x08 关显示
lcd1602_delay(5);
lcd1602_writeCmd(0x01); // 清屏
lcd1602_delay(5);
lcd1602_writeCmd(0x06);//0x06 显示光标移动设置
lcd1602_delay(5);
lcd1602_writeCmd(0x0c);//0x0c 显示开及光标设置
lcd1602_delay(5);
}
改成
void lcd1602_init(void)
{
lcd1602_writeCmd(0x38); // 0x38 设置16*2显示,5*7点阵,8位数据接口
lcd1602_delay(10);
lcd1602_writeCmd(0x08); //0x08 关显示
lcd1602_delay(5);
lcd1602_writeCmd(0x0c);//0x0c 显示开及光标设置
lcd1602_delay(5);
lcd1602_writeCmd(0x06);//0x06 显示光标移动设置
lcd1602_delay(5);
lcd1602_writeCmd(0x01); // 清屏
}
一周热门 更多>