/*************************************Copyright (c)******************************
**--------------文件信息------------------------------------------------------------------
**文 件 名: Combination lock.c
**创 建 人:
**最后修改日期: 2007年4月20日
**描 述: 电子密码锁源程序
**编 译 环 境 : Keil uVision3 V8.08a
**--------------历史版本信息--------------------------------------------------------------
** 创建人: 陈伟
** 版 本: v1.0
** 日 期: 2007年4月19日
** 描 述: 原始版本
**
**----------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订--------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**----------------------------------------------------------------------------------------
******************************************************************************************/
#include <REG51.H>
#include <STRING.H>
#define TURE 1
#define FALSE 0
#define AvailableTime_M 0
#define AvailableTime_S 30
#define MaxErrorTimes 3
typedef struct //按键消息结构体
{
unsigned char handle; //功能索引
unsigned char assignments; //键值
unsigned char time; //键按下的时间
} K_MSG;
/******************************************
** 端口定义
******************************************/
sbit LCD_E = P2^7;
sbit LCD_RW = P2^5;
sbit LCD_RS = P2^6;
sbit TLED = P2^3;
sbit BELL = P2^2;
sbit LOUT = P2^4;
sfr LCD_DOUT = 0x80;
sfr key_interface = 0x90;
/******************************************
** 全局变量
******************************************/
K_MSG kmsg;
bit kTimingFlag,DisplayUpdatFlag,ExpendTiming,PWTimingFlag,TimeOutFlag,UpdataFlag,LoutTimingFlag;
unsigned char T0_IRQ_Times,ShowPage;
volatile unsigned char BellTimes;
unsigned char ErrorTimes,ExpendTime_M,ExpendTime_S,PWDigit,LoutTime;
unsigned char DisplayBuff[33],PassWord[16],TempArray[16];
/******************************************
** 外部涵数声明
******************************************/
extern bit Write_One_Byte(unsigned char addr,unsigned char thedata);
//extern bit Write_A_Page(unsigned char *buffer,unsigned char addr);
extern unsigned char Read_One_Byte(unsigned char addr);
//extern bit Read_N_Bytes(unsigned char *buffer,unsigned char n,unsigned char addr);
/*******************************************************************************
** 函数名称: delay
** 功能描述: 延时子程序
**
** 输 入: time-延时量
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
void delay(unsigned char times)
{
while(times--);
}
/*******************************************************************************
** 函数名称: ReadLCDCR
** 功能描述: 读LCD命令寄存器
**
** 输 入: 无
**
** 输 出: (unsigned char) 读到的数据
**
** 全局变量: 无
** 调用模块: delay
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
unsigned char ReadLCDCR(void)
{
unsigned char byte;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
delay(4);
byte = LCD_DOUT;
LCD_E = 0;
return(byte);
}
/*******************************************************************************
** 函数名称: WriteLCDCR
** 功能描述: 写LCD命令寄存器
**
** 输 入: (unsigned char) 将要写进寄存器的数据
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: delay
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
void WriteLCDCR(unsigned char thedata)
{
LCD_DOUT = thedata;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
delay(4);
LCD_E=0;
}
/*******************************************************************************
** 函数名称: WriteLCDDR
** 功能描述: 写LCD数据寄存器
**
** 输 入: (unsigned char) 将要写进寄存器的数据
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: delay
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
void WriteLCDDR(unsigned char thedata)
{
LCD_DOUT = thedata;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
delay(4);
LCD_E = 0;
}
/*******************************************************************************
** 函数名称: Test_LCDBF
** 功能描述: 检测LCD忙标志
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: ReadLCDCR
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
void Test_LCDBF(void)
{
unsigned char temp;
do
{
temp = ReadLCDCR();
}
while(temp & 0x80);
}
/*******************************************************************************
** 函数名称: LCDInit
** 功能描述: LCD初始化
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: WriteLCDCR
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
void LCDInit(void)
{
unsigned int i;
WriteLCDCR(0x38);
for(i=0x1fff;i>0;i--);
Test_LCDBF();
WriteLCDCR(0x38);
Test_LCDBF();
WriteLCDCR(0x06);
Test_LCDBF();
WriteLCDCR(0x0f);
Test_LCDBF();
WriteLCDCR(0x01);
Test_LCDBF();
}
/*******************************************************************************
** 函数名称: LCDDisplay
** 功能描述: LCD上显示字符串
**
** 输 入: *string(指向字符串地址),position(显示位置)
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: WriteLCDCR,WriteLCDDR,Test_LCDBF
**
** 作 者: 陈伟
** 日 期: 2007年4月19日
**-------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------
*********************************************************************************/
void LCDDisplay(unsigned char *string,unsigned char position)
{
WriteLCDCR(position);
Test_LCDBF();
while(*string != '#')
{
if(position == 0x90)
{
WriteLCDCR(0xC0);
Test_LCDBF();
}
if(*string == '\0')
*string = ' ';
WriteLCDDR(*string++);
Test_LCDBF();
position++;
}
}
/*******************************************************************************
** 函数名称: keyscan
** 功能描述: 矩阵按键扫描
**
** 输 入: 无
**
** 输�