|
电脑串口有问题,仿真。
以前驱动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_L 0x10
//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
//READ G,D RAM rs=1 rw=1
/********************
READ :rs=0 rw=1,en=1
WRITE CMD:rs=0 rw=0,en:1->0
READ DATA: 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,就完蛋了。这是怎么回事?
求大神来帮忙瞅瞅程序哈,多谢。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|