微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 这个问题有人知道吗?

这个问题有人知道吗?

时间: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;
     }
  }
}
这个问题出在哪里?


我是新手,各位大神帮下忙吧

形参变量i和局部变量i相同了啊,把其中一个改为不同就好了!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top