gdutzl 发表于 2012-10-13 15:31:21

参考了很多其他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);
       
}
}

gdutzl 发表于 2012-10-13 16:04:44

自己一个人搞了两个晚上,什么东东都搞不出来,觉得自己很垃圾,求助各位大神

yklstudent 发表于 2012-10-13 16:35:07

硬件连接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.}

主楼你是来考验大伙眼力的?

sco518 发表于 2012-10-13 16:56:44

调一下那个滑动变阻器!!!!!

gdutzl 发表于 2012-10-13 16:57:57

yklstudent 发表于 2012-10-13 16:35 static/image/common/back.gif
硬件连接PORTA是lcd1602的数据口,
27.void LCD_Write_Com(uchar com)//写指令



不是,主要是不知道程序哪里出错?

gdutzl 发表于 2012-10-13 16:59:30

sco518 发表于 2012-10-13 16:56 static/image/common/back.gif
调一下那个滑动变阻器!!!!!

调过了,图片上的效果是我调到最尽头,对比度最高的

sco518 发表于 2012-10-13 17:02:01

不能调到最高的哥= =。。。调到最高就全亮了。。。一般就是2.2K左右的电阻就够了

RUANJI 发表于 2012-10-13 17:14:31

我晕,LZ学过51没啊,竟然调到最亮。。。

zsulrq 发表于 2012-10-13 17:24:53

估计是VLCD太高

gdutzl 发表于 2012-10-13 17:53:20

sco518 发表于 2012-10-13 17:02 static/image/common/back.gif
不能调到最高的哥= =。。。调到最高就全亮了。。。一般就是2.2K左右的电阻就够了
...

但是在滑动电阻器,我掉了一圈,也是没有显示字符?

gdutzl 发表于 2012-10-13 17:58:20

RUANJI 发表于 2012-10-13 17:14 static/image/common/back.gif
我晕,LZ学过51没啊,竟然调到最亮。。。

学过了,用51驱动这个 lcd1602是可以的,但换成atmega16,就搞了很久都不行。用proteus仿真是可以,但是网上说那个不靠谱,要实物实现才行。

gdutzl 发表于 2012-10-13 17:59:49

调节那个对比度,只是1602的那两行黑格的颜色变化深浅

ghbyes 发表于 2012-10-13 18:19:29

把jtag功能关了试试。

sco518 发表于 2012-10-13 18:33:34

熔丝位   JTAG仿真功能去掉。

gdutzl 发表于 2012-10-13 18:34:03

ghbyes 发表于 2012-10-13 18:19 static/image/common/back.gif
把jtag功能关了试试。

初学avr,请问怎么关了jtag?

yklstudent 发表于 2012-10-13 18:57:11

先搞清楚硬件电路有没有问题 自己先说的PORTA作为数据口用
但是程序中却用的PORTC口
你这里搞的什么玩意就值得怀疑了

gdutzl 发表于 2012-10-13 19:11:11

yklstudent 发表于 2012-10-13 18:57 static/image/common/back.gif
先搞清楚硬件电路有没有问题 自己先说的PORTA作为数据口用
但是程序中却用的PORTC口
你这里搞的什么玩意就 ...

不好意思我打错了,两个调换一下。硬件电路没有问题,在51可以显示

gdutzl 发表于 2012-10-13 19:39:22

非常感谢sco518网友的提示,我把数据口PORTC换成PORTB,显示出来了,这个jtag对PORTC正常输入输出有影响的吗?jtag是不是仿真用的

ghbyes 发表于 2012-10-13 22:50:39

gdutzl 发表于 2012-10-13 18:34 static/image/common/back.gif
初学avr,请问怎么关了jtag?

熔丝位配置的。。

worldly_guest 发表于 2012-10-14 10:56:10

gdutzl 发表于 2012-10-13 19:39 static/image/common/back.gif
非常感谢sco518网友的提示,我把数据口PORTC换成PORTB,显示出来了,这个jtag对PORTC正常输入输出有影响的 ...

嗯,以前驱动一个19264的显示屏,也是折腾了二三天,后来换端口好了,才知道要关了这个仿真配置(像都是默认打开的),关了这个配置,端口换回来就行了!

gdutzl 发表于 2012-10-14 14:22:04

ghbyes 发表于 2012-10-13 22:50 static/image/common/back.gif
熔丝位配置的。。

初学者是不是不建议配置熔丝位,容易锁死芯片

ghbyes 发表于 2012-10-14 21:21:03

gdutzl 发表于 2012-10-14 14:22 static/image/common/back.gif
初学者是不是不建议配置熔丝位,容易锁死芯片

主要是时钟源的选择,这个我觉得还是要会的。。。其他的就不要改了。。。

point110 发表于 2012-10-14 23:02:45

我感觉是熔丝位的配置有问题。

gdutzl 发表于 2012-10-14 23:33:16

point110 发表于 2012-10-14 23:02 static/image/common/back.gif
我感觉是熔丝位的配置有问题。

熔丝位我没动过,怕锁了

gdutzl 发表于 2012-10-14 23:34:51

ghbyes 发表于 2012-10-14 21:21 static/image/common/back.gif
主要是时钟源的选择,这个我觉得还是要会的。。。其他的就不要改了。。。 ...

默认MHZ的内部晶振能不能满足一般的应用?我想逐渐深入后在试试配置熔丝位
页: [1]
查看完整版本: 参考了很多其他atmega16+lcd1602,但是自己还是调不出来,请...