打印
[AVR单片机]

AVR ATMEGA16写 1602液晶问题

[复制链接]
5984|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用C口的0,1,2 做1602液晶的RS,RW,E端;D口做数据传送段。
按照1602 时序写,可是没有显示,请指教。
-------------AVR STUDIO  GCC 编写-------------------------------
#include <avr/io.h>
#include <avr/delay.h>
#include <stdio.h>
#include  <avr/pgmspace.h>//须增加的头文件,定义长数据
#define uint unsigned int
#define uchar unsigned char
  const prog_uchar   s[] = "I love AVR";
//#pragma data:code


//const  uchar  s[] = "I like AVR";
// 1602接到 atmega16的端子RS==PC0, RW=PC1,E=PC2
//数据段为D口

void LCD_Com_Write(uchar comm)
{

PORTC&=~(_BV(0));//命令和写 RS


PORTC&=~ (_BV(1));//命令和写RW


PORTD=comm;


PORTC|=_BV(2);//使能有效 E

_delay_ms(1);

PORTC&=~_BV(2);//使能关闭

_delay_ms(1);
}

void LCD_Data_Write(uchar data)
{

PORTC|= _BV(0) ;//数据


PORTC&=~_BV(1);//写

PORTD=data;



PORTC|=_BV(2);//使能有效

_delay_ms(1);



PORTC&=~_BV(2);//使能关闭

_delay_ms(1);
}

void LCD_Init()
{

LCD_Com_Write(0x38);//设置显示模式

_delay_ms(5);


LCD_Com_Write(0x01);//显示清屏

_delay_ms(5);

LCD_Com_Write(0x0F);//光标和背景设置

_delay_ms(5);

LCD_Com_Write(0x06);//光标设置,和数据地址增减

_delay_ms(5);

}

int main(void)

{

uchar i;

DDRC|=_BV(0) |_BV(1)|_BV(2)  ;//定义选通部分输出

PORTC&=~_BV(2);//使能初始低电平

DDRD=0XFF;


LCD_Init();
//
_delay_ms(5);


LCD_Com_Write(0x80+0);//设置数据地址,从头显示

_delay_ms(5);


for(i=0;i<10;i++)//显示字符在第一行

{

LCD_Data_Write(s[i]);

_delay_ms(5);

}




}

1602-no show.jpg (141.23 KB )

1602-no show.jpg

atmega 16 proteus setup.jpg (78.79 KB )

atmega 16  proteus setup.jpg

相关帖子

沙发
selfstudy|  楼主 | 2011-7-15 17:43 | 只看该作者
本帖最后由 selfstudy 于 2011-7-15 17:45 编辑

是不是 显示的字符定义不对??

1602 write serial.jpg (43.67 KB )

1602 write serial.jpg

使用特权

评论回复
板凳
selfstudy|  楼主 | 2011-7-15 17:56 | 只看该作者
期盼得到指教。

使用特权

评论回复
地板
selfstudy|  楼主 | 2011-7-15 21:19 | 只看该作者
没有人上线。。

使用特权

评论回复
5
joyme| | 2011-7-20 11:08 | 只看该作者
这个驱动可以直接用,ATMEGA16我测试过

TestLCD_1.rar

1.35 KB

使用特权

评论回复
6
lixiaoxu2meng| | 2011-7-20 13:01 | 只看该作者
调试通过的

图.jpg (1.65 MB )

图.jpg

使用特权

评论回复
评论
凌凌7 2018-6-24 11:01 回复TA
你好 可以把这个显示时间的程序发给我吗 
7
lixiaoxu2meng| | 2011-7-20 13:02 | 只看该作者
编译器 ICC

使用特权

评论回复
8
lixiaoxu2meng| | 2011-7-20 13:02 | 只看该作者
工程包

LCD.rar

19 KB

使用特权

评论回复
9
selfstudy|  楼主 | 2011-7-20 13:16 | 只看该作者
5# joyme 非常感谢!另外:你有 spi的库文件没有,我想做 spi dac 仿真。

使用特权

评论回复
10
selfstudy|  楼主 | 2011-7-20 13:16 | 只看该作者
9# selfstudy
非常感谢!! 有SPI  dac 库文件吗?

使用特权

评论回复
11
selfstudy|  楼主 | 2011-7-20 13:18 | 只看该作者
我的错误在与:

//以下设置的次序错了, 前后次序更好即可。我估计是仿真库文件的原因,实物是可以通过的。
LCD_Com_Write(0x0F);//光标和背景设置

_delay_ms(5);

LCD_Com_Write(0x06);//光标设置,和数据地址增减

使用特权

评论回复
12
lixiaoxu2meng| | 2011-7-20 13:23 | 只看该作者
我这有一个 SPI 但是基于 ATmega8 的

图.jpg (1.13 MB )

图.jpg

SPI.rar

11.82 KB

使用特权

评论回复
13
lixiaoxu2meng| | 2011-7-20 13:23 | 只看该作者
你可以参考一下

使用特权

评论回复
14
selfstudy|  楼主 | 2011-7-20 15:15 | 只看该作者
6# lixiaoxu2meng 函数写的很好。正在想如何将 16位数字转为字符在1602显示,你都做了。

使用特权

评论回复
15
selfstudy|  楼主 | 2011-7-20 15:16 | 只看该作者
9# selfstudy 之前还未注意lcd可以仅用4位数字写;你的函数封装值得我学习!!
LCD_write_command(0x28);
这个命令是什么?

使用特权

评论回复
16
selfstudy|  楼主 | 2011-7-20 15:18 | 只看该作者
12# lixiaoxu2meng
谢谢!学习。

因为我的proteus中的spi 库文件 仿真时显示没有该文件的mdf文件,你能否将 其中的 dac 芯片库文件给我。或者放在一个dsn文件中可以。

使用特权

评论回复
17
selfstudy|  楼主 | 2011-7-20 15:19 | 只看该作者
8# lixiaoxu2meng 之前还未注意lcd可以仅用4位数字写;你的函数封装值得我学习!!
LCD_write_command(0x28);
这个命令是什么?

使用特权

评论回复
18
selfstudy|  楼主 | 2011-7-20 15:22 | 只看该作者
5# joyme 非常好!!很多功能正打算用。学习。。

使用特权

评论回复
19
lixiaoxu2meng| | 2011-7-20 15:36 | 只看该作者
17# selfstudy

2代表四位总线 8 代表开显示  这个命令 在1602的数据手册上可以查到

使用特权

评论回复
20
selfstudy|  楼主 | 2011-7-21 10:41 | 只看该作者
本帖最后由 selfstudy 于 2011-7-21 10:45 编辑

我将 十进制转换为 字符型,仿真时 proteus提示 超出内存范围
代码如下。

//清空字符串
void clearstr(uchar *p,uchar n)
{
    uchar i;
    for(i=0;i<n;i++)
    {
        *(p+i)=0;
                 
         
    }
}

//转换的AD数
//n为几位数
uchar num_to_str(int num,uchar *p,uchar n)
{
        uchar i=0;
        uchar yushu=0;
         clearstr(p,n);//清空
        do
        {
                yushu=(uchar)(num %10);//取余数,则第一次取到了个位数
                *(p+i)=  yushu  ;//字符串赋值
         
                num=num/10;//去掉个位数
                i++;
         
        } while (num != 0);
        return i;//返回位数
}
//LCD显示数字
//n位数
void LCD_Show_num(uchar x, uchar y,uchar *p,uchar n)
{
        uchar i;

for (i=n;i>0;i--)//从高位显示
        {
                LCD_Char_Write(x+n-i,y,(*p+48));
                p++;
        }


=======================main()
i=num_to_str(173,adc,3);
   LCD_Show_num(0,0,adc,i);
}

LCD1602 ERROR.jpg (204.74 KB )

LCD1602 ERROR.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

84

帖子

2

粉丝