搜索
bottom↓
回复: 4

使用PICC自带的LCD4线驱动,怎么都调不出来!

[复制链接]

出0入0汤圆

发表于 2010-7-15 10:53:26 | 显示全部楼层 |阅读模式
4线驱动,直接就用PICC自带的驱动,可是怎么都不显示,但是光标可以在指定的位置闪烁,所以写命令函数是好的,只是写不了字符,我是在proteus上仿真看结果。我反复搞了很久了,还是不出现字符!!!

/*RA2      LCD-RS
  RA3      LCD-EN
  PORTB0-3      LCD-DATA 4-7
*/



#include        <pic.h>

#define uchar unsigned char
#define uint unsigned int

static bit LCD_RS        @ ((unsigned)&PORTA*8+2);        // Register select
static bit LCD_EN        @ ((unsigned)&PORTA*8+3);        // Enable

#define        LCD_STROBE        (LCD_EN = 1);DelayMs(1);(LCD_EN=0)


void DelayMs(uint x)
{
        uint y,z;
        for(y=x;y>0;y--)
                for(z=110;z>0;z--);
}
void DelayUs(uint x)
{
        uint y,z;
        for(y=x;y>0;y--)
                for(z=5;z>0;z--);
}
/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
        LCD_EN=0;
        PORTB = (PORTB & 0xF0) |  (c >> 4);
        LCD_STROBE;
        PORTB = (PORTB & 0xF0) |  (c & 0x0F);
        LCD_STROBE;
        DelayUs(40);
}

/*
*         Clear and home the LCD
*/

void
lcd_clear(void)
{
        LCD_RS = 0;
        lcd_write(0x1);
        DelayMs(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
        LCD_RS = 1;        // write characters
        while(*s)
        {
                lcd_write(*s++);
                DelayMs(1);
        }
}

/* write one character to the LCD */

void
lcd_putch(uchar c)
{
        LCD_RS = 1;        // write characters
        LCD_EN=0;
        PORTB = (PORTB & 0xF0) |  (c >> 4);
        LCD_STROBE;
        PORTB = (PORTB & 0xF0) |  (c & 0x0F);
        LCD_STROBE;
        DelayUs(40);
}


/*
* Go to the specified position
*/

void
lcd_goto(unsigned char pos)
{
        LCD_RS = 0;
        lcd_write(0x80+pos);
}
       
/* initialise the LCD - put into 4 bit mode */

void
lcd_init(void)
{
        LCD_RS = 0;        // write control bytes
        DelayMs(15);        // power on delay
        PORTB = 0x3;        // attention!
        LCD_STROBE;
        DelayMs(5);
        LCD_STROBE;
        DelayUs(100);
        LCD_STROBE;
        DelayMs(5);
        PORTB = 0x2;        // set 4 bit mode
        LCD_STROBE;
        DelayUs(40);
        lcd_write(0x28);        // 4 bit mode, 1/16 duty, 5x8 font
//        lcd_write(0x08);        // display off
        lcd_write(0x0f);        // display on, blink curson on
        lcd_write(0x06);        // entry mode
}
void portinit()
{
        PORTA=0;
        PORTB=0;
        TRISA=0;
        TRISB=0;
}

void main()
{
        portinit();
        lcd_init();
        lcd_clear();
        DelayMs(5);
        lcd_goto(1);
        lcd_puts("hello");
        while(1);
}

帮我看一下吧,怎么回事啊?

出0入0汤圆

 楼主| 发表于 2010-7-15 13:29:47 | 显示全部楼层
我在仿真过程中发现,RA2即LCD——RS这个脚怎么一直都是低电平?
可是在程序里不是有LCD——RS=1 这句话吗?
为什么在实际运行时显示为低电平呢?

在main()里最后一个函数lcd_putch(),在里面不是有LCD_RS=1吗?后面一直都没有LCD——RS这个脚的操作,应该一直就是高电平才对啊?为什么在仿真看到的是低电平了呢?我怀疑就是这里的问题,可是究竟是什么原因呢?
把我搞晕了。。。。。。

出0入0汤圆

 楼主| 发表于 2010-7-15 15:09:05 | 显示全部楼层
是不是仿真不太好啊?
在坛子里下了一个驱动,第一次仿真可以正常显示,第二次开始,死都不显示了。。。
有遇到我这种情况的朋友没有啊,这是怎么回事呢?。。。。

出0入0汤圆

 楼主| 发表于 2010-7-15 15:37:31 | 显示全部楼层
为什么RA口好像不作为LCD——EN 和LCD——RS会仿真不出来,而RC口则能仿真出来呢?
有没有朋友遇到这种情况啊?
是因为RA口初始化有什么技巧吗?
我用的是PICC这个编译器。。。。。。。

出0入0汤圆

 楼主| 发表于 2010-7-15 17:13:05 | 显示全部楼层
我靠!PORTA设成正常的I/O口,原来还要设置ADCON1才行!
晕!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 23:34

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

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