哇!!我这个智能家居密码锁出现了什么问题,代码没错,但仿真图运行不了什么。

哇!!我这个智能家居密码锁出现了什么问题,代码没错,但仿真图运行不了什么。帮我看看,就是点击开始按钮过后那个显示屏没有东西显示,我现在不太清楚是哪里发生的问题

img

img

img

img

img

img

img

img

img

img

img

img

img

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Key_Port P1 //定义键盘的接口

//***************************************
sbit E=P2^7; //1602使能引脚
sbit RW=P2^5; //1602读写引脚
sbit RS=P2^6; //1602数据/命令选择引脚
#define LCD_DATA P0

uchar position = 0;//要显示的位置
uchar temp_Password_table[6]={0};//存储密码
uchar Password_table[6]={1,2,3,4,5,6};//存储密码
bit Close_flag=0;//
bit Right_password=0;
bit change_password_flag=0;//修改密码标志位

uchar key_num;//定义按键值
uchar song_num=0;
uchar play_step=0; //播放音乐的步骤
uchar play_song_step=0;
bit Rest_flag=0;
uint Press_flag=0;
uint circle=0;
//步进电机转动
void SETP_MOTOR_Run()
{
//8拍编码
uchar code FFW[8]={0x08,0x09,0x01,0x03,0x02,0x06,0x04,0x0c};
static uint i=0,j=0;
if(circle==0)//停止
{
i=0;
}
else
{
if(++i>10) //延时
{
i=0;
P3=~FFW[j];
if(++j>7)
{j=0;}
circle--;
}

}
}
/********************************************************************

  • 名称 : Delay_1ms()
  • 功能 : 延时子程序,延时时间为 1ms * x
  • 输入 : x (延时一毫秒的个数)
  • 输出 : 无
  • **********************************************************************/
    void Delay_1ms(uint i)//1ms延时
    {
    uchar x,j;
    for(j=0;j<i;j++)
    for(x=0;x<=148;x++);
    }

/********************************************************************

  • 名称 : delay()
  • 功能 : 延时,延时时间大概为5US。
  • 输入 : 无
  • 输出 : 无
  • **********************************************************************/

void delay1602()
{
nop();
nop();
nop();
nop();
nop();
}
/********************************************************************

  • 名称 : bit Busy(void)
  • 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
  • 输入 : 输入的命令值
  • 输出 : 无
  • **********************************************************************/
    bit Busy(void)
    {
    bit busy_flag = 0;
    RS = 0;
    RW = 1;
    E = 1;
    delay1602();
    busy_flag = (bit)(LCD_DATA & 0x80);
    E = 0;
    return busy_flag;
    }
    /********************************************************************
  • 名称 : wcmd(uchar del)
  • 功能 : 1602命令函数
  • 输入 : 输入的命令值
  • 输出 : 无
  • **********************************************************************/
    void wcmd(uchar del)
    {
    while(Busy());
    RS = 0;
    RW = 0;
    E = 0;
    delay1602();
    LCD_DATA = del;
    delay1602();
    E = 1;
    delay1602();
    E = 0;
    }

/********************************************************************

  • 名称 : wdata(uchar del)
  • 功能 : 1602写数据函数
  • 输入 : 需要写入1602的数据
  • 输出 : 无
  • **********************************************************************/

void wdata(uchar del)
{
while(Busy());
RS = 1;
RW = 0;
E = 0;
delay1602();
LCD_DATA = del;
delay1602();
E = 1;
delay1602();
E = 0;
}

/********************************************************************

  • 名称 : L1602_init()
  • 功能 : 1602初始化,请参考1602的资料
  • 输入 : 无
  • 输出 : 无
  • **********************************************************************/
    void L1602_init(void)
    {
    wcmd(0x38);
    Delay_1ms(5);
    wcmd(0x38);
    Delay_1ms(5);
    wcmd(0x38);
    Delay_1ms(5);
    wcmd(0x38);
    wcmd(0x08);
    wcmd(0x0c);
    wcmd(0x04);
    wcmd(0x01);
    }

//************************************
//定时器初始化
//初始化为1MS定时器
//************************************
void Time1_init()
{
TMOD |= 0x10; //使用模式1,16位定时器
TH1 = (65536-1000)/256; //定时器装入初始值1ms
TL1 = (65536-1000)%256;
EA = 1; //总中断
ET1 = 1;//定时器1初始化
TR1 = 1;

}
/********************************************************************

  • 名称 : L1602_char(uchar hang,uchar lie,char sign)
  • 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
    L1602_char(1,5,'b')
  • 输入 : 行,列,需要输入1602的数据
  • 输出 : 无
  • **********************************************************************/
    void L1602_char(uchar hang,uchar lie,char sign)
    {
    uchar a;
    if(hang == 1) a = 0x80;
    if(hang == 2) a = 0xc0;
    a = a + lie - 1;
    wcmd(a);
    wdata(sign);
    }

/********************************************************************

  • 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
  • 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    L1602_string(1,5,"ab cd ef;")
  • 输入 : 行,列,需要输入1602的数据
  • 输出 : 无
  • **********************************************************************/
    void L1602_string(uchar hang,uchar lie,uchar *p)
    {
    uchar a,b=0;
    if(hang == 1) a = 0x80;
    if(hang == 2) a = 0xc0;
    a = a + lie - 1;
    while(1)
    {
    wcmd(a++);
    if((*p == '\0')||(b==16)) break;
    b++;
    wdata(*p);
    p++;
    }
    }

//****************************************************
//矩阵按键扫描
//按键按下则返回按键值不按就返回0xff
//*****************************************************
uchar Key_scan()
{
static uchar key_down;
uchar key_num=0xff,tem,i;
uchar keynum_tab[16]={0xd7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb,0x7e,0x7d,0x7b,0x77,0xb7,0xe7};//表格数据是根据按键值和个按键的定义的出来的,不支持组合键
// 0 1 2 3 4 5 6 7 8 9 A B C D # *
Key_Port = 0xf0;
if(Key_Port != 0xf0)//说明有按键按下
{

if(key_down==0)    //
{
  
  tem = Key_Port;
  Key_Port = (tem|0x0f);
  key_num = Key_Port;
  key_down=1;     
  
  for(i=0;i<16;i++)
  {
    if(keynum_tab[i]==key_num)
      break;        
  }
  return i;
  
}
else
  return 0xff;                     

}
else
{
key_down = 0;
return 0xff;
}
}

uchar xiugaimima=0;

/主程序:/
void main()
{
uchar i;
//系统初始化
L1602_init(); //初始化1602
Time1_init(); //定时器初始化
L1602_string(1,1,"Password:"); //显示字符串
L1602_string(2,1,"Status: LOCK!"); //显示字符串
while (1)
{
key_num = Key_scan(); //获取按键值
if( key_num <10)//数据按键按下
{
if((Right_password==0)||(change_password_flag==1))//没有输入郭密码或者修改密码的时候才能输入
{
if(change_password_flag==1) //修改密码
{
if(!position)L1602_string(2,1," ");
}
else
{
if(!position)L1602_string(1,10," ");
}

    temp_Password_table[position++] = key_num; //显示按键值
    if(position>5) 
      position=6;
    if(change_password_flag==1)  //修改密码
    {
      L1602_char(2,position+5,key_num+'0');
    }
    else
    {
      L1602_char(1,position+10,key_num+'0');
    }
    for(i=position;i<6;i++)    
    {
      temp_Password_table[i]=0;
    }
  }
  
}
else//功能按键
{
  switch(key_num)
  {
  case 10: //修改密码
    if(Right_password)
    {
      position=0;
      change_password_flag=1;
      L1602_string(1,1,"Enter password:  ");    //显示字符串
      L1602_string(2,1,"                   ");
    }
    
    break;
  case 11://取消修改密码
    if(Right_password)
    {
      change_password_flag=0;
      L1602_string(1,1,"Password:      ");    //显示字符串
      position=0;
      L1602_string(2,1,"Status: OPEN!");    //显示字符串
    }
    break;
  case 12://确认修改密码
    if(change_password_flag==1)
    {     
      for(i=0;i<6;i++)
      {
        Password_table[i]=temp_Password_table[i];
      }
      change_password_flag=0;
      position=0;
      L1602_string(2,1,"      Done!       ");    //显示字符串
      //L1602_string(2,1,"            ");    //显示字符串
    }
    break;
  case 13://确定开锁
    if((change_password_flag==0)&&(Right_password==0)) //正常模式
    {
      for(i=0;i<6;i++)
      {
        if(temp_Password_table[i]!=Password_table[i])
          break;
      }
      if(i<6)       //说明输入的密码错误
      { 
        Right_password=0;
        position=0;
        L1602_string(1,10,"ERROR!      ");
      }
      else         //密码输入正确
      {
        circle=80;//让点击转2圈
        Right_password=1;
        for(i=0;i<6;i++)            
        {temp_Password_table[i]=0;}
        L1602_string(2,9," OPEN!      ");
      }
    }
    
    break;
  case 14: //清零
    if((change_password_flag==1)||(Right_password==0)) //正常模式
    {
      position=0;
      for(i=0;i<6;i++)
      {temp_Password_table[i]=0;}
      L1602_string(1,10,"      ");
    }
    break;
  case 15://关锁
    Right_password=0;//清除变量
    position=0;
    change_password_flag=0; 
    for(i=0;i<6;i++)   //清除输入
    {temp_Password_table[i]=0;}
    L1602_string(1,1,"Password:        ");    //显示字符串
    L1602_string(2,1,"Status: LOCK!");    //显示字符串
    break;
  default:
    break;
  }
}

}
}

//****************************************************
//60ms定时器中断服务函数为计时器使用
//****************************************************
void time1(void)interrupt 3
{
SETP_MOTOR_Run(); //驱动步进电机
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
}

代码源码,

好就不搞这个了,分模块一点点找原因吧,祝你好运