参考了很多其他atmega16+lcd1602,但是自己还是调不出来,请...
本帖最后由 gdutzl 于 2012-10-13 19:11 编辑硬件连接PORTC是lcd1602的数据口,PORTA的PA7 PA6 PA5分别是lcd1602的RS RW EN ,使用atmega16内部1mhz
调了很久为什么还是不行?显示如图#include <iom16v.h>
#include <macros.h>
#define RS 7
#define RW 6
#define EN 5
#define RS_CLR PORTA&=~(1 << RS)
#define RS_SET PORTA|= (1 << RS)
#define RW_CLR PORTA&=~(1 << RW)
#define RW_SET PORTA|= (1 << RW)
#define EN_CLR PORTA&=~(1 << EN)
#define EN_SET PORTA|= (1 << EN)
typedef unsigned char uchar;
typedef unsigned int uint;
void delayus(uint us)
{
uint i;
for(i=0;i<us;i++);
}
void delayms(uint ms)
{
uint i,m;
for(i=0;i<ms;i++)
for(m=160;m>0;m--);
}
void LCD_Write_Com(uchar com)//写指令
{
RS_CLR;
RW_CLR;
EN_SET;
PORTC=com;
delayus(20);
EN_CLR;
}
void LCD_Write_Data(uchar data)//写数据
{
RS_SET;
RW_CLR;
EN_SET;
PORTC=data;
delayus(20);
EN_CLR;
}
void LCD_clear(void)//清屏
{
LCD_Write_Com(0x01);
delayms(5);
}
void LCD_Write_String(uchar x,uchar y,uchar *s)//写字符串
{
if(y == 0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xc0+x);
}
while (*s)
{
LCD_Write_Data(*s);
s++;
}
}
void LCD_Init(void)//lcd1602初始化
{
DDRC = 0xFF; /*I/O口方向设置*/
DDRA |= (1 << RS) | (1 << RW) | (1 << EN);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
delayms(5);
LCD_Write_Com(0x0c);
}
void port_init(void)//端口初始化
{
DDRA=0XFF;
PORTA=0XFF;
DDRC=0XFF;
PORTC=0XFF;
}
void main(void)
{
port_init();
LCD_Init();
delayms(500);
LCD_clear();
while(1)
{
LCD_Write_String(1,1,"abcdefgh");
delayms(500);
}
} 自己一个人搞了两个晚上,什么东东都搞不出来,觉得自己很垃圾,求助各位大神 硬件连接PORTA是lcd1602的数据口,
27.void LCD_Write_Com(uchar com)//写指令
28.{
29.RS_CLR;
30.RW_CLR;
31.EN_SET;
32.PORTC=com;------------------------///////////////////xxxxxxxxxxxxxxxxxx
33.delayus(20);
34.EN_CLR;
35.}
36.void LCD_Write_Data(uchar data)//写数据
37.{
38.RS_SET;
39.RW_CLR;
40.EN_SET;
41.PORTC=data;-----------------------------------////////////xxxxxxxxxxxxxxx
42.delayus(20);
43.EN_CLR;
44.}
主楼你是来考验大伙眼力的? 调一下那个滑动变阻器!!!!! yklstudent 发表于 2012-10-13 16:35 static/image/common/back.gif
硬件连接PORTA是lcd1602的数据口,
27.void LCD_Write_Com(uchar com)//写指令
不是,主要是不知道程序哪里出错? sco518 发表于 2012-10-13 16:56 static/image/common/back.gif
调一下那个滑动变阻器!!!!!
调过了,图片上的效果是我调到最尽头,对比度最高的
不能调到最高的哥= =。。。调到最高就全亮了。。。一般就是2.2K左右的电阻就够了
我晕,LZ学过51没啊,竟然调到最亮。。。 估计是VLCD太高 sco518 发表于 2012-10-13 17:02 static/image/common/back.gif
不能调到最高的哥= =。。。调到最高就全亮了。。。一般就是2.2K左右的电阻就够了
...
但是在滑动电阻器,我掉了一圈,也是没有显示字符? RUANJI 发表于 2012-10-13 17:14 static/image/common/back.gif
我晕,LZ学过51没啊,竟然调到最亮。。。
学过了,用51驱动这个 lcd1602是可以的,但换成atmega16,就搞了很久都不行。用proteus仿真是可以,但是网上说那个不靠谱,要实物实现才行。 调节那个对比度,只是1602的那两行黑格的颜色变化深浅 把jtag功能关了试试。 熔丝位 JTAG仿真功能去掉。 ghbyes 发表于 2012-10-13 18:19 static/image/common/back.gif
把jtag功能关了试试。
初学avr,请问怎么关了jtag?
先搞清楚硬件电路有没有问题 自己先说的PORTA作为数据口用
但是程序中却用的PORTC口
你这里搞的什么玩意就值得怀疑了 yklstudent 发表于 2012-10-13 18:57 static/image/common/back.gif
先搞清楚硬件电路有没有问题 自己先说的PORTA作为数据口用
但是程序中却用的PORTC口
你这里搞的什么玩意就 ...
不好意思我打错了,两个调换一下。硬件电路没有问题,在51可以显示 非常感谢sco518网友的提示,我把数据口PORTC换成PORTB,显示出来了,这个jtag对PORTC正常输入输出有影响的吗?jtag是不是仿真用的 gdutzl 发表于 2012-10-13 18:34 static/image/common/back.gif
初学avr,请问怎么关了jtag?
熔丝位配置的。。
gdutzl 发表于 2012-10-13 19:39 static/image/common/back.gif
非常感谢sco518网友的提示,我把数据口PORTC换成PORTB,显示出来了,这个jtag对PORTC正常输入输出有影响的 ...
嗯,以前驱动一个19264的显示屏,也是折腾了二三天,后来换端口好了,才知道要关了这个仿真配置(像都是默认打开的),关了这个配置,端口换回来就行了! ghbyes 发表于 2012-10-13 22:50 static/image/common/back.gif
熔丝位配置的。。
初学者是不是不建议配置熔丝位,容易锁死芯片 gdutzl 发表于 2012-10-14 14:22 static/image/common/back.gif
初学者是不是不建议配置熔丝位,容易锁死芯片
主要是时钟源的选择,这个我觉得还是要会的。。。其他的就不要改了。。。 我感觉是熔丝位的配置有问题。 point110 发表于 2012-10-14 23:02 static/image/common/back.gif
我感觉是熔丝位的配置有问题。
熔丝位我没动过,怕锁了 ghbyes 发表于 2012-10-14 21:21 static/image/common/back.gif
主要是时钟源的选择,这个我觉得还是要会的。。。其他的就不要改了。。。 ...
默认MHZ的内部晶振能不能满足一般的应用?我想逐渐深入后在试试配置熔丝位
页:
[1]