|
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);
}
帮我看一下吧,怎么回事啊? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|