1602仿真出现问题,忙信号检测不对,咋整。
电脑串口有问题,仿真。以前驱动1602是用delay()来替代busy信号检测的。
现在是直接检测忙信号。可是明明有检测到不忙了,Y的还是无法正确显示。
先贴程序。
#include <intrins.h>
#include "STC89C52.H"
#include "GLOBAL.H"
/***********************************************/
#define LCD1602_DATA P0
sbit LCD1602_BUSY =LCD1602_DATA^7;
sbit LCD1602_RS =P2^0;
sbit LCD1602_RW =P2^1;
sbit LCD1602_EN =P2^2;
/********************** REG CMD *****************/
//rs=0,rw=0
#define REG_CMD_CLR 0x01
#define REG_CMD_HOME 0x10
/* MODE SET,BIT1 0:After Write,cursor left shift;BIT0 0 lcd not move,1 lcd right shift */
/* right,not move */
#define REG_CMD_MODE 0x06
/* Display BIT2: on/off lcd,BIT1 :have cursor or not,BIT0:cursor twinkle or not */
//not have cursor
#define REG_CMD_DP_1 0x0D
//have cursor,twinkle
#define REG_CMD_DP_2 0x0F
//have cursor,not twinkle
#define REG_CMD_DP_3 0x0E
/*cursor move or all lcd move */
//cursor left move
#define REG_CMD_MOVE_L0x10
//cursor right move
#define REG_CMD_MOVE_R 0x14
//All left move
#define REG_CMD_MOVE_AL 0x18
//All right move
#define REG_CMD_MOVE_AR 0x1C
/* 8bit,2 row,5*8 */
#define REG_CMD_FUN 0x38
/*G RAM ,D RAM 0x40|(0x00-0x3F)*/
//BUSY REG rs=0,rw=1 BIT7-1,busy
//WRITE G,D RAM rs=1 rw=0
//READG,D RAM rs=1 rw=1
/********************
READ :rs=0 rw=1,en=1
WRITE CMD:rs=0 rw=0,en:1->0
READDATA: rs=1 rw=1 en=1
WRITE DATA: rs=1 rw=0 en:1->0
********************/
#define CMD_WRITE_CMD 0
#define CMD_WRITE_DATA 1
/***********************************************/
void LCD1602_CheckBusy()
{
LCD1602_EN=1;
LCD1602_RS=0;
LCD1602_RW=1;
while(LCD1602_BUSY);
LCD1602_EN=0;
}
void LCD1602_Write(bit ucCmdType,BYTE ucData)
{
LCD1602_CheckBusy();
LCD1602_EN=0;
LCD1602_RS=ucCmdType;
LCD1602_RW=0;
LCD1602_DATA =ucData;
LCD1602_EN=1;
LCD1602_EN=0;
}
void LCD1602_Init()
{
LCD1602_EN=0;
LCD1602_Write(CMD_WRITE_CMD,REG_CMD_FUN);
LCD1602_Write(CMD_WRITE_CMD,REG_CMD_DP_2);
LCD1602_Write(CMD_WRITE_CMD,REG_CMD_CLR);
}
void LCD1602_CheckRange(BYTE* ucRow,BYTE* ucCol)
{
if(*ucRow>2)
{
*ucRow =2;
}
if(*ucRow <1)
{
*ucRow =1;
}
if(*ucCol>16)
{
*ucCol =16;
}
if(*ucCol<1)
{
*ucCol =1;
}
}
/* Row:1-2,Col:1-16*/
void LCD1602_CursorMove(BYTE ucRow,BYTE ucCol)
{
LCD1602_CheckRange(&ucRow,&ucCol);
if(ucRow ==1)
{
LCD1602_Write(CMD_WRITE_CMD,0x80|(ucCol-1));
}
else
{
LCD1602_Write(CMD_WRITE_CMD,0xC0|(ucCol-1));
}
}
void main()
{
LCD1602_Init();
LCD1602_CursorMove(2,13);
while(1);
}
//proteus仿真时,虽然有检测忙信号,但是仿真还弹出警告,说还是忙。
然后我的光标移动函数,在第一行移动没问题。如果行参数填2,就完蛋了。这是怎么回事?
求大神来帮忙瞅瞅程序哈,多谢。 1111111111111111111 void LCD1602READBusy(void)
{
LCD1602_RS = 0;
LCD1602_RW = 1;
LCD1602_En = 1;
LCD1602_En = 0;
if((LCD1602_PORT & 0x80) == 1){
LCD1602dELAY(5);
while((LCD1602_PORT | 0x00) == 0);
}
}
HeP028 发表于 2014-1-17 23:07
问题已经解决,多谢。
是检测忙信号的问题,发现找的例子有点问题。自己改了下就好了。忙信号检测就是个坑。
仿真下调试过代码如下:
void LCD1602_CheckBusy()
{
LCD1602_DATA=0xFF;//IO口设置为输入
do
{
LCD1602_EN=0;//
LCD1602_RS=0;//
LCD1602_RW=1;//
SomeNop();//delay 2us
LCD1602_EN=1;//读状态
}while(LCD1602_BUSY);
LCD1602_EN=0;
}
页:
[1]