搜索
bottom↓
回复: 3

1602仿真出现问题,忙信号检测不对,咋整。

[复制链接]

出0入0汤圆

发表于 2014-1-17 11:47:15 | 显示全部楼层 |阅读模式
电脑串口有问题,仿真。
以前驱动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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-1-17 17:56:41 | 显示全部楼层
1111111111111111111

出0入0汤圆

发表于 2014-1-17 23:07:35 | 显示全部楼层
  1. void         LCD1602READBusy(void)
  2. {
  3.                 LCD1602_RS = 0;       
  4.                 LCD1602_RW = 1;
  5.                 LCD1602_En = 1;
  6.                 LCD1602_En = 0;
  7.                 if((LCD1602_PORT & 0x80) == 1){
  8.                                 LCD1602dELAY(5);
  9.                                 while((LCD1602_PORT | 0x00) == 0);
  10.                         }       
  11. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-1-18 09:25:25 | 显示全部楼层

问题已经解决,多谢。
是检测忙信号的问题,发现找的例子有点问题。自己改了下就好了。忙信号检测就是个坑。
仿真下调试过代码如下:
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;               
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 04:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表