这个问题有人知道吗?
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include<intrins.h>
#include<string.h>
/**********************************************************/
//系统宏定义
/**********************************************************/
#define uchar unsigned char
#define unint unsigned int
#define Delay4us() {_nop_();_nop_();_nop_();}
/*********************************************************/
//系统变量定义
/*********************************************************/
uchar Pre_KeyNo=16,KeyNo=16;
uchar code Title_Text[]="Your Password; ";
uchar DSY_BUFFER[10]="";
uchar UserPassword[10]="";
uchar minute,second,count;
bit WARN;
/********************************************************/
//单片机控制引脚定义
/********************************************************/
sbit RS=P0^0; //016L的数据/命令控制口
sbit RW=P0^1; //016L的读写控制端
sbit E=P0^2; //016L的使能控制端
sbit BEEP=P3^7; //蜂鸣器控制引脚
sbit LED_OPEN=P2^7; //开锁亮灯控制引脚
sbit SDA=P3^3; //AT24C04数据引脚
sbit SCK=P3^2; //AT24C04时钟引脚
/********************************************************/
//延时函数_MS级
/********************************************************/
void DelayMS (uint i)
{
uchar i;
while(i--) for(i=0;i<120;i++);
}
/********************************************************/
//AT24c04驱动程序
/********************************************************/
//AT24c04开始子程序
void Start()
{
SDA=1;
SCK=1;
Delay4us();
SDA=0;
Delay4us();
SCK=0;
}
//AT24c04停止子程序
void Stop()
{
SDA=0;
SCK=1;
Delay4us();
SDA=1;
Delay4us();
SCK=0;
}
//AT24c04初始化程序
void IIC_24C04_Init()
{
SCK=0;
Stop();
}
//AT24c04应答子程序
void ACK()
{
SDA=0;
SCK=1;
Delay4us();
SCK=0;
SDA=1;
}
//AT24c04无应答子程序
void NO_ACK()
{
SDA=1;
SCK=1;
Delay4us();
SCK=0;
SDA=0;
}
//AT24c04读一个字节子程序
uchar RecByte()
{
uchar i,rd;
rd=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCK=1;
rd<<=1;
rd=SDA;
Delay4us();
SCK=0;
Delay4us();
}
SCK=0;
Delay4us();
return rd;
}
//AT24c04写一个字节子程序
uchar SendByte(uchar wd)
{
uchar i;
bit ack0;
for(i=0;i<8;i++)
{
SDA=(bit)(wd&0x80);
_nop_();
_nop_();
SCK=1;
Delay4us();
SCK=0;
wd<<=1;
}
Delay4us();
SDA=1;
SCK=1;
Delay4us();
ack0=!SDA;
SCK=0;
Delay4us();
return ack0;
}
//AT24c04写字符串子程序
uchar SendString(uchar Slave,uchar Subaddr,uchar*Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave))return 0;
if(!SendByte(Subaddr)) return 0;
for(i=0;i<N;i++)
{
if(!sendbyte(Buffer[i])) return 0;
}
Stop();
return 1;
}
//AT24c04读字符串子程序
uchar RecString(uchar Slave,uchar Subaddr,uchar*Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave))return 0;
if(!SendByte(Subaddr)) return 0;
Start();
if(!SendByte(Slave+1)) return 0;
for(i=0;i<N-1;i++)
{
Buffer[i]=RecByte();
ACK();
}
Buffer[N-1]=RecByte();
NO_ACK();
Stop();
return 1;
}
/*******************************************************/
//键盘扫描程序
/*******************************************************/
//扫描键盘,用于输入,修改密码的用户操作
uchar Keys_Scan()
{
uchar Temp,KeyNo=0;
P1=0xf0;
DelayMS(1);
Temp=P1>>4^0x0f;
switch(Temp)
{
case 1:KeyNo=0;break;
case 2:KeyNo=1;break;
case 4:KeyNo=2;break;
case 8:KeyNo=3;break;
}
P1=0x0f;
DelayMS(1);
Temp=P1^0x0f;
switch(Temp)
{
case 1:KeyNo+=12;break;
case 2:KeyNo+=8;break;
case 4:KeyNo+=4;break;
case 8:KeyNo+=0;break;
}
return KeyNo;
}
/************************************************/
//LCD016L驱动程序
/************************************************/
//LCD读状态子程序
uchar Read_LCD_State()
{
uchar state;
RS=0;
RW=1;
E=1;
DelayMS(1);
state=P0;
E=0;
DelayMS(1); //读状态
return state;
}
//LCD忙等待子程序
void LCD_Busy_Wait()
{
while(Read_LCD_State()&0x80)==0x80);
DelayMS(5);
}
//LCD写数据子程序
void Write_LCD_Data(uchar dat)
{
LCD_Busy_Wait(); //LCD忙等待
RS=1;
RW=0;
E=0;
P0=dat;
E=1;
DelayMS(1);
E=0; //写入数据
}
//LCD写命令子程序
void Write_LCD_Command(uchar cmd)
{
LCD_Busy_Wait(); //LCD忙等待
RS=0;
RW=0;
E=0;
P0=cmd;
E=1;
DelayMS(1);
E=0; //写入命令
}
//LCD初始化子程序
void LCD_Init()
{
Write_LCD_Command(0x38); DelayMS(1);
Write_LCD_Command(0x01); DelayMS(1);
Write_LCD_Command(0x06); DelayMS(1);
Write_LCD_Command(0x0c); DelayMS(1);
}
//LCD坐标子程序
void Set_LCD_Pos(uchar p)
{
Write_LCD_Command(0x80);
}
//LCD显示字符串子程序
void Display_String(uchar*s,uchar p)
{
uchar i=0;
Set_LCD_Pos(p); //定显示坐标
while(s[i]!='\0') //判断结束字符
{
Write_LCD_Data(s[i]); //显示
i++;
DelayMS(1); //延时
}
}
/*****************************************************/
//蜂鸣器子程序
/*****************************************************/
void Beep()
{
uchar i;
for(i=0;=<2;i++)
{
DelayMS(100);//延时
BEEP=~BEEP; //蜂鸣器间隔响
}
BEEP=1; //关蜂鸣器
}
/***************************************************/
//清楚密码子程序
/***************************************************/
void Clear_Password()
{
UserPassword[0]='\0';
DSY_BUFFER[0]='\0';
}
/*****************************************************/
//系统初始化子程序
/*****************************************************/
void System_Init()
{
TMOD=0X01; //T0设置为8位自动重装模式
TH0=(65536-5000)/256;
TL0=(65536-5000)%256; //装初值,定时50ms
ET0=1; //开定时器0中断
EA=1; //开总中断
EX0=1; //开外部中断0
IT0=1; //下降沿触发
DelayMS(10);
LCD_Init(); //初始化LCD
IIC_24C04_Init(); //初始化24C04
Display_String(Title_Text,0x00);//在第1行显示标题
}
/*****************************************************/
//主程序
/*****************************************************/
void main()
{
uchar i=0;
uchar IIC_Password[10];
uchar IS_Valid_User=0; //定义变量
System_Init(); //系统初始化
RecString(0xa0,0,IIC_Password.6); //从EEROM中读取密码
IIC_Password[6]='\0';
while(1)
{
P1=0xF0;
if(P1!=0xF0)KeyNo=Keys_Scan(); //扫描键盘获取序号KeyNo
switch(KeyNo)
{
case 0: case 1:case 2:case 3:case 4:
case 5:case 6:case 7:case 8:case 9:
if(i<=5) //密码限制在6位以内
{
if(i=0)Display_String(" ",0x40); //如果i为0则执行一次清屏
UserPassword[i]=KeyNo+'0';
UserPassword[i+1]='\0'; //读取键盘输入的密码
DSY_BUFFER[i]='*';
DSY_BUFFER[I+1]='\0':
Display_String(DSY_BUFFER,0x40); //显示输入的*号
i++; //密码计数器加1
}
break;
case 10; //按A键开锁
if(strcmp(UserPassword,IIC_Password)==0)
{
LED_OPEN=0; //电亮LED
Clear_Password();
Display_String("Unlock OK! ",0x40); //输入密码正确,开锁
IS_Valid_User=1;
WARN=0;
}
else
{
LED_OPEN=1; //关闭LED
Clear_Passwodr();
Display_String("ERROR! ",0x40); //输入密码错误
IS_Valid_User=0;
WARN=1;
}
i=0;
break;
case 11; //按B键上锁
LED_OPEN=1;
Clear_Password();
Display_String(Title_Text,0x00);
Display_Steing(" ",0x40); //清屏
i=0;
IS_Valid_User=0;
break;
case 12; //按C键设置新密码
if(!IS_Valid_User)Display_String("No rights!",0x40);
else
{
i=0;
Display_String("New Password: ".0x00);
Display_String(" ",0x40); //如果是合法用户则提示输入新密码
}
break;
case 13; //按D键保存新密码
if(!IS_Valid_User)Display_String("No rights!",0x40);
else
{
SendString(0xa0,0,UserPassword,6); //相EEROM写入修改的密码
RwcString(0xa0,0,ⅡC_Password,6)
IIC_Password[6]="\0"; //重新读入刚写的密码
i=0;
Display_String(Title_Text,0x00);
Display_String("Password Saved!",0x40); //修改密码成功
}
break;
case 14;//按E键消除所有输入
i=0;
Clear_Password();//清楚密码
Display_String(" ",0x40); //清屏
}
Beep();
DelayMS(100);
P1=0xF0;
while(P1=0xF0); //如果有键未释放则等待
while(P1=0xF0); //如果没有再次按下按键则等待
{
if(WARN==1)
BEEP=0;
else
BEEP=1;
}
}
}
这个问题出在哪里?
#include<intrins.h>
#include<string.h>
/**********************************************************/
//系统宏定义
/**********************************************************/
#define uchar unsigned char
#define unint unsigned int
#define Delay4us() {_nop_();_nop_();_nop_();}
/*********************************************************/
//系统变量定义
/*********************************************************/
uchar Pre_KeyNo=16,KeyNo=16;
uchar code Title_Text[]="Your Password; ";
uchar DSY_BUFFER[10]="";
uchar UserPassword[10]="";
uchar minute,second,count;
bit WARN;
/********************************************************/
//单片机控制引脚定义
/********************************************************/
sbit RS=P0^0; //016L的数据/命令控制口
sbit RW=P0^1; //016L的读写控制端
sbit E=P0^2; //016L的使能控制端
sbit BEEP=P3^7; //蜂鸣器控制引脚
sbit LED_OPEN=P2^7; //开锁亮灯控制引脚
sbit SDA=P3^3; //AT24C04数据引脚
sbit SCK=P3^2; //AT24C04时钟引脚
/********************************************************/
//延时函数_MS级
/********************************************************/
void DelayMS (uint i)
{
uchar i;
while(i--) for(i=0;i<120;i++);
}
/********************************************************/
//AT24c04驱动程序
/********************************************************/
//AT24c04开始子程序
void Start()
{
SDA=1;
SCK=1;
Delay4us();
SDA=0;
Delay4us();
SCK=0;
}
//AT24c04停止子程序
void Stop()
{
SDA=0;
SCK=1;
Delay4us();
SDA=1;
Delay4us();
SCK=0;
}
//AT24c04初始化程序
void IIC_24C04_Init()
{
SCK=0;
Stop();
}
//AT24c04应答子程序
void ACK()
{
SDA=0;
SCK=1;
Delay4us();
SCK=0;
SDA=1;
}
//AT24c04无应答子程序
void NO_ACK()
{
SDA=1;
SCK=1;
Delay4us();
SCK=0;
SDA=0;
}
//AT24c04读一个字节子程序
uchar RecByte()
{
uchar i,rd;
rd=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCK=1;
rd<<=1;
rd=SDA;
Delay4us();
SCK=0;
Delay4us();
}
SCK=0;
Delay4us();
return rd;
}
//AT24c04写一个字节子程序
uchar SendByte(uchar wd)
{
uchar i;
bit ack0;
for(i=0;i<8;i++)
{
SDA=(bit)(wd&0x80);
_nop_();
_nop_();
SCK=1;
Delay4us();
SCK=0;
wd<<=1;
}
Delay4us();
SDA=1;
SCK=1;
Delay4us();
ack0=!SDA;
SCK=0;
Delay4us();
return ack0;
}
//AT24c04写字符串子程序
uchar SendString(uchar Slave,uchar Subaddr,uchar*Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave))return 0;
if(!SendByte(Subaddr)) return 0;
for(i=0;i<N;i++)
{
if(!sendbyte(Buffer[i])) return 0;
}
Stop();
return 1;
}
//AT24c04读字符串子程序
uchar RecString(uchar Slave,uchar Subaddr,uchar*Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave))return 0;
if(!SendByte(Subaddr)) return 0;
Start();
if(!SendByte(Slave+1)) return 0;
for(i=0;i<N-1;i++)
{
Buffer[i]=RecByte();
ACK();
}
Buffer[N-1]=RecByte();
NO_ACK();
Stop();
return 1;
}
/*******************************************************/
//键盘扫描程序
/*******************************************************/
//扫描键盘,用于输入,修改密码的用户操作
uchar Keys_Scan()
{
uchar Temp,KeyNo=0;
P1=0xf0;
DelayMS(1);
Temp=P1>>4^0x0f;
switch(Temp)
{
case 1:KeyNo=0;break;
case 2:KeyNo=1;break;
case 4:KeyNo=2;break;
case 8:KeyNo=3;break;
}
P1=0x0f;
DelayMS(1);
Temp=P1^0x0f;
switch(Temp)
{
case 1:KeyNo+=12;break;
case 2:KeyNo+=8;break;
case 4:KeyNo+=4;break;
case 8:KeyNo+=0;break;
}
return KeyNo;
}
/************************************************/
//LCD016L驱动程序
/************************************************/
//LCD读状态子程序
uchar Read_LCD_State()
{
uchar state;
RS=0;
RW=1;
E=1;
DelayMS(1);
state=P0;
E=0;
DelayMS(1); //读状态
return state;
}
//LCD忙等待子程序
void LCD_Busy_Wait()
{
while(Read_LCD_State()&0x80)==0x80);
DelayMS(5);
}
//LCD写数据子程序
void Write_LCD_Data(uchar dat)
{
LCD_Busy_Wait(); //LCD忙等待
RS=1;
RW=0;
E=0;
P0=dat;
E=1;
DelayMS(1);
E=0; //写入数据
}
//LCD写命令子程序
void Write_LCD_Command(uchar cmd)
{
LCD_Busy_Wait(); //LCD忙等待
RS=0;
RW=0;
E=0;
P0=cmd;
E=1;
DelayMS(1);
E=0; //写入命令
}
//LCD初始化子程序
void LCD_Init()
{
Write_LCD_Command(0x38); DelayMS(1);
Write_LCD_Command(0x01); DelayMS(1);
Write_LCD_Command(0x06); DelayMS(1);
Write_LCD_Command(0x0c); DelayMS(1);
}
//LCD坐标子程序
void Set_LCD_Pos(uchar p)
{
Write_LCD_Command(0x80);
}
//LCD显示字符串子程序
void Display_String(uchar*s,uchar p)
{
uchar i=0;
Set_LCD_Pos(p); //定显示坐标
while(s[i]!='\0') //判断结束字符
{
Write_LCD_Data(s[i]); //显示
i++;
DelayMS(1); //延时
}
}
/*****************************************************/
//蜂鸣器子程序
/*****************************************************/
void Beep()
{
uchar i;
for(i=0;=<2;i++)
{
DelayMS(100);//延时
BEEP=~BEEP; //蜂鸣器间隔响
}
BEEP=1; //关蜂鸣器
}
/***************************************************/
//清楚密码子程序
/***************************************************/
void Clear_Password()
{
UserPassword[0]='\0';
DSY_BUFFER[0]='\0';
}
/*****************************************************/
//系统初始化子程序
/*****************************************************/
void System_Init()
{
TMOD=0X01; //T0设置为8位自动重装模式
TH0=(65536-5000)/256;
TL0=(65536-5000)%256; //装初值,定时50ms
ET0=1; //开定时器0中断
EA=1; //开总中断
EX0=1; //开外部中断0
IT0=1; //下降沿触发
DelayMS(10);
LCD_Init(); //初始化LCD
IIC_24C04_Init(); //初始化24C04
Display_String(Title_Text,0x00);//在第1行显示标题
}
/*****************************************************/
//主程序
/*****************************************************/
void main()
{
uchar i=0;
uchar IIC_Password[10];
uchar IS_Valid_User=0; //定义变量
System_Init(); //系统初始化
RecString(0xa0,0,IIC_Password.6); //从EEROM中读取密码
IIC_Password[6]='\0';
while(1)
{
P1=0xF0;
if(P1!=0xF0)KeyNo=Keys_Scan(); //扫描键盘获取序号KeyNo
switch(KeyNo)
{
case 0: case 1:case 2:case 3:case 4:
case 5:case 6:case 7:case 8:case 9:
if(i<=5) //密码限制在6位以内
{
if(i=0)Display_String(" ",0x40); //如果i为0则执行一次清屏
UserPassword[i]=KeyNo+'0';
UserPassword[i+1]='\0'; //读取键盘输入的密码
DSY_BUFFER[i]='*';
DSY_BUFFER[I+1]='\0':
Display_String(DSY_BUFFER,0x40); //显示输入的*号
i++; //密码计数器加1
}
break;
case 10; //按A键开锁
if(strcmp(UserPassword,IIC_Password)==0)
{
LED_OPEN=0; //电亮LED
Clear_Password();
Display_String("Unlock OK! ",0x40); //输入密码正确,开锁
IS_Valid_User=1;
WARN=0;
}
else
{
LED_OPEN=1; //关闭LED
Clear_Passwodr();
Display_String("ERROR! ",0x40); //输入密码错误
IS_Valid_User=0;
WARN=1;
}
i=0;
break;
case 11; //按B键上锁
LED_OPEN=1;
Clear_Password();
Display_String(Title_Text,0x00);
Display_Steing(" ",0x40); //清屏
i=0;
IS_Valid_User=0;
break;
case 12; //按C键设置新密码
if(!IS_Valid_User)Display_String("No rights!",0x40);
else
{
i=0;
Display_String("New Password: ".0x00);
Display_String(" ",0x40); //如果是合法用户则提示输入新密码
}
break;
case 13; //按D键保存新密码
if(!IS_Valid_User)Display_String("No rights!",0x40);
else
{
SendString(0xa0,0,UserPassword,6); //相EEROM写入修改的密码
RwcString(0xa0,0,ⅡC_Password,6)
IIC_Password[6]="\0"; //重新读入刚写的密码
i=0;
Display_String(Title_Text,0x00);
Display_String("Password Saved!",0x40); //修改密码成功
}
break;
case 14;//按E键消除所有输入
i=0;
Clear_Password();//清楚密码
Display_String(" ",0x40); //清屏
}
Beep();
DelayMS(100);
P1=0xF0;
while(P1=0xF0); //如果有键未释放则等待
while(P1=0xF0); //如果没有再次按下按键则等待
{
if(WARN==1)
BEEP=0;
else
BEEP=1;
}
}
}
这个问题出在哪里?
我是新手,各位大神帮下忙吧
形参变量i和局部变量i相同了啊,把其中一个改为不同就好了!