新手仿真LCD不显示字这是为什么

2019-07-18 10:15发布

#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 Settime ;  // 定义无符号 整形 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;        //开串口中断
    }                                               

}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
z573509357
1楼-- · 2019-07-19 06:43
把 0X40改成0X80 把0X80改为0XC0试试
z573509357
2楼-- · 2019-07-19 12:12
   由上图可知第二行第一个字符的地址是40H,但是却不能是直接写入40H来表示可将光标定位在第二行第一个字符的位置,这是因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B即(40H+10000000B(80H)=11000000B(C0H)。
909318264
3楼-- · 2019-07-19 14:57
判忙函数不要注释掉,而且要在读取状态之前延时5毫秒
武力戡乱
4楼-- · 2019-07-19 15:43
外加上拉电阻!
s512479198
5楼-- · 2019-07-19 18:29
 精彩回答 2  元偷偷看……
z573509357
6楼-- · 2019-07-19 19:30
LCD接的有问题

一周热门 更多>