串口通信时LCD12864一直闪怎么回事?

2019-07-15 14:08发布

本帖最后由 WC546879 于 2016-5-3 01:01 编辑

#include <reg52.h>
#include <intrins.h>
#include<string.h>
#include<delay.h>
#include<LCD12864.h>
#include<usart.h>
#include<eeprom.h>

#define uchar unsigned char
#define uint  unsigned int

unsigned char num,i,j,k,m,n,w,u,p,d,out;
unsigned char code fingerprint_bidui[8]={0xf5,0x0c,0x00,0x00,0x00,0x00,0x0c,0xf5};
unsigned char passwordtemp0[8];                 
unsigned char passwordtemp[8];        
unsigned char password[8];
unsigned char read[8];
bit Flag;

main()
{         lcd_init();         //初始化液晶屏
        delayMS(10);        //延时用于稳定,可以去掉
        
     EA=1;
     ES=1;
     IT0=0;
         EX0=1;         
          TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;                        
     TH1 = 0xFd;
     TL1 = 0xFd;
     TR1 = 1;

while (1)         //主循环
  {
    lcd_string(1,0,"请输入密码",10);
    u=Byte_read(0x2010);
        for(w=0;w<u;w++)
        {         
        password[w]=Byte_read(0x2000+w);         
        lcd_pos(0,w);
          lcd_wdat(password[w]+48);           
        }

for(d=0;d<8;d++)
{
         out=fingerprint_bidui[d];
        lcd_pos(3,d);
          lcd_wdat(out+0x30);
         send(out);

}
}
}

/**********LCD12864.c**************/
#include <reg52.h>
#include <intrins.h>
#include<key.h>
#include<delay.h>
        
#define uchar unsigned char
#define uint  unsigned int
/*TS12864A-3 端口定义*/
#define in  P1
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P2^0;            //寄存器选择输入
sbit LCD_RW  =  P2^1;            //液晶读/写控制
sbit LCD_EN  =  P2^2;            //液晶使能控制
sbit LCD_PSB =  P2^3;            //串/并方式控制



#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};


void  dataconv();
void lcd_pos(uchar X,uchar Y);  //确定显示位置

/*******************************************************************/
/*                                                                 */
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{

    LCD_PSB = 1;         //并口方式

    lcd_wcmd(0x34);      //扩充指令操作
    delayMS(5);
    lcd_wcmd(0x30);      //基本指令操作
    delayMS(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delayMS(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delayMS(5);
}

/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar Y,uchar X)
{                          
   uchar  pos;
   if (Y==0)
     {Y=0x80;}
   else if (Y==1)
     {Y=0x90;}
   else if (Y==2)
     {Y=0x88;}
   else if (Y==3)
     {Y=0x98;}
   pos = Y+X ;  
   lcd_wcmd(pos);     //显示地址
}

/***********USART.C**************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义接收 字符
uchar Buffer;
uchar outdata;
uchar indata;

//串口初始化函数
void   URAtinit( )
{
TMOD=0x20;
SCON=0x50;
PCON = 0x00;
TR1=1;
TH1=0xfd;
TL1=0xfd;
}



/**************************************
  名称:send
  功能:发送一个字节
  输入参数:待发送的字节
  输出参数:无
*************************************/
void send(uchar outdata)
{

SBUF=out;  //发送
while(!TI);          //等待TI=1(即发送结束)
TI=0;                  //TI置0,等待下一次发送

}

/**************************************
  名称:receive
  功能:接收一个字节
  输入参数:无
  输出参数:接收的字节
*************************************/
uchar receive()
{
uchar indata;
while(RI==0);  //等待RI=1(即接收结束)
indata=SBUF;  //接收
RI=0;         //RI置0,等待下一次接收
return indata;   //返回收到的数据
}



大概就这样,本来LCD可以正常显示一些信息,就是main里的那句send(out)加上后就开始猛闪,放到其他位置就LCD不显示了



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。