LCD右移和左移错误
我制作了一个带有HD44780控制器的LCD库,从数据表中我读到代码0x18将使整个显示器向左移动一个位置,但当我这样做时,显示器消失了。 我还读到0x1C将整个显示器向右移动一个位置,但当我这样做时,整个显示器向左移动 我的代码:LCD右移和左移错误,c,avr,atmega,lcd,hd44780,C,Avr,Atmega,Lcd,Hd44780,我制作了一个带有HD44780控制器的LCD库,从数据表中我读到代码0x18将使整个显示器向左移动一个位置,但当我这样做时,显示器消失了。 我还读到0x1C将整个显示器向右移动一个位置,但当我这样做时,整个显示器向左移动 我的代码: /* * main.c * * Created: 11/14/2013 7:54:02 PM * Author: A R M T */ #include <avr/io.h> #define F_CPU 1000000UL #de
/*
* main.c
*
* Created: 11/14/2013 7:54:02 PM
* Author: A R M T
*/
#include <avr/io.h>
#define F_CPU 1000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#define LCD_DPRT PORTA //LCD DATA PORT
#define LCD_DDDR DDRA //LCD DATA DDR
#define LCD_DPIN PINA //LCD DATA PIN
#define LCD_CPRT PORTB //LCD COMMANDS PORT
#define LCD_CDDR DDRB //LCD COMMANDS DDR
#define LCD_CPIN PINB //LCD COMMANDS PIN
#define LCD_RS 0 //LCD RS
#define LCD_RW 1 //LCD RW
#define LCD_EN 2 //LCD EN
//*************************************************************
void delay_us(unsigned int d);
void lcdCommand(unsigned char cmnd);
void lcdData(unsigned char data);
void lcd_init(void);
void lcd_gotoxy(unsigned char x, unsigned char y);
void lcd_print(char *str);
//*************************************************************
void delay_us(unsigned int d)
{
_delay_us(d);
}
//*************************************************************
void lcdCommand(unsigned char cmnd)
{
LCD_DPRT = cmnd; //send cmnd to data port
LCD_CPRT &= ~(1<<LCD_RS); //RS = 0 for command
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 for write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 for H-to-l pulse
delay_us(1); //Wait to make enable wide
LCD_CPRT &= ~(1<<LCD_EN); //EN = 1 for H-to-l pulse
delay_us(100); //Wait to make enable wide
}
//*************************************************************
void lcdData(unsigned char data)
{
LCD_DPRT = data; //send data to data port
LCD_CPRT |= (1<<LCD_RS); //RS = 1 for data
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 for write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 for H-to-L pulse
delay_us(1); //wait to make enable wide
LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 for H-to-L pulse
delay_us(100); //wait to make enable wide
}
//*************************************************************
void lcd_init(void)
{
LCD_DDDR = 0xFF;
LCD_CDDR = 0xFF;
LCD_CPRT &= ~(1<<LCD_EN); //LCD_EN = 0
delay_us(15000); //wait for init
lcdCommand(0x38); //init. LCD 2 line, 5 * 7 matrix
lcdCommand(0x0E); //display on, cursor on
lcdCommand(0x01); //clear LCD
delay_us(2000); //wait
lcdCommand(0x06); //shift cursor right
}
//*************************************************************
void lcd_gotoxy(unsigned char x, unsigned char y)
{
unsigned char firstCharAdr[] = {0x80, 0xC0, 0x94, 0xD4};
lcdCommand(firstCharAdr[y-1] + x - 1);
delay_us(100);
}
//*************************************************************
void lcd_print(char *str)
{
unsigned char i = 0;
while (str[i] != 0)
{
lcdData(str[i]);
i++;
}
}
//*************************************************************
int main(void)
{
lcd_init();
lcd_gotoxy(1,1);
lcd_print("Armia");
lcd_gotoxy(1,2);
lcd_print("Wagdy");
_delay_ms(1000 / 2);
lcdCommand(0x18); // Shift the entire display one position to the left
while(1);
return 0;
}
/*
*main.c
*
*创建时间:2013年11月14日下午7:54:02
*作者:A R M T
*/
#包括
#定义F_CPU 1000000UL
#定义延迟向后兼容__
#包括
#定义LCD\u数据端口//LCD数据端口
#定义LCD\u DDDR DDRA//LCD数据DDR
#定义LCD_DPIN引脚A//LCD数据引脚
#定义LCD\u CPRT端口b//LCD命令端口
#定义LCD\u CDDR DDRB//LCD命令DDR
#定义LCD_CPIN PINB//LCD命令PIN
#定义LCD\u RS 0//LCD RS
#定义LCD_RW 1//LCD RW
#定义LCD_EN 2//LCD EN
//*************************************************************
无效延迟(无符号整数d);
无效LCDCOMAND(未签名字符cmnd);
无效lcdData(无符号字符数据);
void lcd_init(void);
void lcd_gotoxy(无符号字符x,无符号字符y);
无效lcd_打印(字符*str);
//*************************************************************
无效延迟(无符号整数d)
{
_延迟(d);
}
//*************************************************************
无效LCDCOMAND(未签名字符cmnd)
{
LCD_DPRT=cmnd;//将cmnd发送到数据端口
LCD_CPRT&=~(1我在proteus 7.10版中试用了你的代码,左移可以正常工作
请注意,您使用的是带有可变参数的_delay_us函数,这不是正确的方法,它会给出错误的延迟并生成大的十六进制文件,因为它会强制包含浮点库
注:
为了使这些函数按预期工作,必须启用编译器优化,并且延迟时间必须为
在编译时为已知常量的表达式。如果
如果不满足要求,则导致的延迟将更长(并且
基本上不可预测),以及不使用
浮点计算将经历严重的代码膨胀
链接到应用程序的浮点库例程
将代码替换为多次调用延迟的循环
while (d--)
{
_delay_ms(1);
}
从数据表(我在这里找到了一个:www.sparkfun.com/datasheets/LCD/HD44780.pdf)中,以二进制形式移动光标或屏幕的命令是0001YZ00.Y=1以移动显示,Z=1以向右移动,Z=0以向左移动。因此,是的,0x1C应向右移动,0x18应向左移动……但出现的是(单词消失,而不是向左移动一个位置)我理解;但是我没有看到您的代码中有任何错误会导致它发生。lcd_command()函数必须正常工作,因为您在lcd_init()和lcd_gotoxy()中使用它……main中的_delay_ms()是否正常工作?在lcd代码中使用_delay_us()…除此之外,我没有任何猜测。这可能是一个模拟器模型错误,例如,如果他们没有像应该的那样将显示行包装为40。单向移动会将显示地址设置为-1,在实际设备中包装为39。这是什么模拟器?