求avr atmega16 lcd1602显示程序

我这边有原理图,想请高手帮忙写一段lcd1602的程序测试下板子焊的怎么样,显示内容随意。
不知道为什么只有背光没有显示内容……
可以百度Hi我
是用8位数据口的……

于单片机的速度来说是偏慢的。
举个简单的例子,把一桶油通过漏斗向一个瓶子里倒,倒油的速度,即流量必须维持在一定范围之内,倒得太快油会从漏斗顶部溢出来,这样就浪费掉了。我们通过眼睛可以判断并使油面保持在顶面以下,以漏斗的额定流量来倒油,这样效率最高。
而对于单片机来说,1602好比那个瓶子漏斗,写入1602中要显示的数据好比油,如果以单片机的高运行速度向1602写数据就很可能造成上面所说的溢出,比如连续写入abc,结果只显示出了a,这是因为1602的显示芯片每次都要花时间来处理输入的ascii码数据,并把它显示出来。而我们却不容易主动地去控制写入数据的速度,所以1602使用忙信号就有必要了,每次单片机只有检测到忙信号为0,即不忙时,才向1602发数据。比如要显示abc,则这样操作,写a---判忙---写b---判忙---写c---判忙。这样就不会出错了。
这几年推出的lcd,像手机的屏响应速度就比较快,而1602这个古董我用示波器测过,大约40us左右的忙处理时间,而很多速度快的单片机的指令周期都是ns级的。也就是说单片机相当一段时间都在‘等’LCD。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void busy(void)
{ uchar temp=0x80; //初始化temp最高位为1,使得能够进入下面
//的while循环
P0=0xff;(P0就是8个数据口)
rs=0; //设置命令操作
rw=1; //设置读操作
en=1; //使能
delay(100);(这是设的延时函数,不用解释)
while(temp & 0x80) //判忙,一旦表达式为假,即temp最高位为0,
//则表示1602不忙,跳出while.
//把p0的的高位读入temp,延时
en=0; //关闭使能信号
}

每次读写操作都要调用这个busy函数
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-19
是马老师书的例子,我试过,管用,用的是CVAVR开发环境,运行后在第一行显示its demo_6_8.c,第二行显示Hello world! this is a lCd display demo.
注意接线:用的是mega16 ,将lcd的PB7,pb6,pb5,pb4接到avr 的pc7,pc6,pc5,pc4引脚上。

程序如下:/*********************************************
File name : demo_6_8.c
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include <mega16.h>
#include <delay.h>

#asm
.equ __lcd_port=0x15 ; PORTC数据寄存器地址
#endasm
/* [LCD]
1 GND- 9 GND
2 +5V- 10 VCC
3 VLC- LCD HEADER Vo
4 RS - 1 PC0 (M16)
5 RD - 2 PC1 (M16)
6 EN - 3 PC2 (M16)
11 D4 - 5 PC4 (M16)
12 D5 - 6 PC5 (M16)
13 D6 - 7 PC6 (M16)
14 D7 - 8 PC7 (M16) */
#include <lcd.h>
flash unsigned char dis_str[]="Hello World! This is a LCD display demo.";
void main(void)
{
unsigned char flash *str;
str = dis_str;
lcd_init(16); // initialize the LCD for 2 lines & 16 columns
while(1)
{
lcd_clear(); // clere the LCD
lcd_putsf("It's demo_6_8.c"); // display the message
lcd_gotoxy(0,1); // go on the second LCD line
lcd_putsf(str); // display the message
if (*str++ == 0) str = dis_str;
delay_ms(500);
}
}

参考资料:引用马潮老师课本

第2个回答  2011-04-20
你有没有给它供电,如果没有当然就没啦,检查一下吧

AVR Atmega16的 LCD1602显示程序,要求自己测试过的能够成功完成显示...
void LCD_write_data(unsigned char data) { RS_1;RW_0;PORTB = data;EN_1;delay_us(200);EN_0;} \/*显示屏清空显示*\/ void LCD_clear(void) { LCD_write_com(0x01);delay_ms(5);} \/*显示屏字符串写入函数*\/ void LCD_write_str(unsigned char x,unsigned char y,unsigned char *...

proteus 7.5 原件库
正常的7.5版本肯定有这两个器件,你是不是安装了一个阉割版本了?另:proteus中是没有LCD1602这个器件的,库中的名字是LM016L。

相似回答