1602 LCD到底怎么接- -!
kangyuhelf22009/04/27电子技术 IP:广东
学习AVR单片机.购入AVR ATmega16核心板一块 +USB下载线+ 1602A LCD
使用ATmega16内部晶振.做时钟.输出到1602A LCD.
找了无数例程.发现都没有接口原理图.- -!
顺便问下破93..貌似您学的是51吧?
来自:电子信息 / 电子技术
25
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
kangyuhelf2 作者
15年9个月前 IP:未同步
95089
引用第4楼microsoft于2009-04-27 18:26发表的  :
接并口就好

呃..
我的意思是ATmega16核心板与1602A LCD的连接..
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95202
上图好了  - -! DSC07602.jpg
DSC07605.jpg
DSC07601.jpg
DSC07603.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95211
长长的源码。还是不会插脚怎么 接






下面表格是16*2 LCD液晶与单片机的硬件接法:
1    VSS    接地
2    VCC    接电源,+5V
3    VO    反视度调整,接地吧
4    RS    寄存器选择,1-资料、0-指令
5    R/W    读写选择,1-读、0-写,如果LCD函数没有用到这个IO口的话就把它接地
6    E    信号使能,E由 1 -> 0 的下降沿时,LCD对RS和DATA进行取样和执行操作
7    DATA-DB0    悬空
8    DATA-DB1    悬空
9    DATA-DB2    悬空
10    DATA-DB3    悬空
11    DATA-DB4    接单片机IO口
12    DATA-DB5    接单片机IO口
13    DATA-DB6    接单片机IO口
14    DATA-DB7    接单片机IO口
// 04:lcd_init()            //LCD初始化函数
// 05:lcd_dictate(byte)     //写指令的函数
// 07:lcd_gotoxy(x,y)       //列行定位函数
// 06:lcd_putchar(byte)     //以ASCII方式显示一个字节变量
// 08:lcd_hex(byte)         //以十六进制显示一个字节变量
// 09:lcd_byte(byte)        //以十进制显示一个字节变量
// 10:lcd_putsf(地址, 个数) //显示FLASH里面的字符串
#include <mega16.h>
#include <delay.h>
#include <1602lcd.h>
unsigned char byte;  
unsigned char flash string[]="M8V20";
void main(void)
{  
  
  lcd_init();                         //1602LCD初始化函数  
  lcd_dictate(1);                     //LCD清屏指令是1
  while (1)
        {  
          byte++;
          lcd_gotoxy(4,0);             //光标定位到第4列第0行          
          lcd_byte(byte);              //以十进制的方式显示一个字符变量  
          lcd_putchar('=');            //显示 = 字符
          lcd_putchar(48);             //显示数字0 ,数字0的ASCII值是48
          lcd_putchar('x');            //显示 x 字符
          lcd_hex(byte);               //以十六进制的方式显示一个字符变量            
          lcd_gotoxy(2,1);             //定位到第2列第1行          
          lcd_putsf(string,5);         //显示FLASH里面的字符串  
          lcd_putsf("-AVRDIY",7);      //显示FLASH里面的字符串
          delay_ms(500);
        }
}
/*下面是<1602LCD.h>文件内容
在使用LCD之前先了解一下4位数据线传输的原理
1:LCD在E由 1->0 时对RS和DB4-DB7进行取样和执行操作
2:RS=0 时表示"准备"写指令,RS=1 时表示"准备"写显示的数据
3:不管是指令数据还是显示数据,数据位都是8位,由于LCD用的是4个数据线,所以在传输时先传输数据的高4位(Msb),然后再传输数据的低4位(Lsb)
比如说我们要写一个指令,指令是0b11001000 ( 高4位是1100,低4位是1000 )  
那么就要这样:
先传输高4位  |  接着传输低4位
   E=1 ;     |    E=1 ;
   RS=0 ;    |    RS=0 ;
   DB7=1;    |    DB7=1;
   DB6=1;    |    DB6=0;
   DB5=0;    |    DB5=0;
   DB4=0;    |    DB4=0;
   E=0;      |    E=0;
这样,我们就完成了写一个指令了,相反,写显示数据时就是把RS=1就可以了
对LCD的写操作只有写指令和写显示数据两种,所以,一个"写指令函数"和一个"写显示数据函数"就可以满足全部要求
*/  
#ifndef _1602lcd_INCLUDED_             //如果原来没有宏定义本名字就...
#define _1602lcd_INCLUDED_             //定义一下,防止多次被头文件包含
#include <delay.h>                     //本例使用7线连接(也可以使用6线,但是没有读"忙"功能,不推荐)
#define RS        PORTB.0              //请修改LCD与单片机的连接IO口
#define RS_DDRn    DDRB.0  
#define RW        PORTB.1  
#define RW_DDRn    DDRB.1      
#define E         PORTB.2
#define E_DDRn     DDRB.2  
#define DB4       PORTB.4
#define DB4_DDRn   DDRB.4  
#define DB5       PORTB.5
#define DB5_DDRn   DDRB.5
#define DB6       PORTB.6
#define DB6_DDRn   DDRB.6  
#define DB7       PORTB.7  
#define DB7_DDRn   DDRB.7
#define DB7_PINn   PINB.7  
//======================================================================================
//写LCD
//datas是数据,高4位有效,rs决定datas是显示还是指令,read_lcd决定是否需要读取忙标志BF
void lcd_h(unsigned char datas,unsigned char rs,unsigned char read_lcd)
{  
  RS_DDRn =1;                         //RS/RW/E设置为输出
  RW_DDRn =1;
  E_DDRn  =1;  
  if(read_lcd)                        //如果需要读LCD忙标志就...
    {        
      DB4_DDRn=0;                     //先把4个数据口设置为输入
      DB5_DDRn=0;
      DB6_DDRn=0;
      DB7_DDRn=0;
      RS=0;  
      RW=1;                           //读BF
      E=1;
      E=1;                            //相同的操作相当于等待几个时钟周期
      E=1;
      while(DB7_PINn);                //等待,直到DB7=0  
    }
  RS=rs;                              //写指令或者数据
  RW=0;                               //写  
  DB4_DDRn=1;
  DB5_DDRn=1;
  DB6_DDRn=1;
  DB7_DDRn=1;  
  E=1;    
  if(datas&128) DB7=1; else DB7=0;
  if(datas&64)  DB6=1; else DB6=0;
  if(datas&32)  DB5=1; else DB5=0;
  if(datas&16)  DB4=1; else DB4=0;
  E=0;                                //LCD在E下降沿时对RS与DB4-DB7进行取样
}  
//==================================================================================
void lcd_dictate(unsigned char data)  //写指令函数
{  
  lcd_h(data,0,1);                    //输出高4位  
  lcd_h(data*16,0,1);                 //输出低4位
}  
//===================================================================================
void lcd_putchar(unsigned char data)  //写显示函数
{  
  lcd_h(data,1,1);                    //输出高4位  
  lcd_h(data*16,1,1);                 //输出低4位
}  
//====================================================================================
//初始化函数
void lcd_init(void)
{    
  delay_ms(20);
  lcd_h(48,0,0); delay_ms(6);         //这3条是初始化语句
  lcd_h(48,0,0); delay_ms(5);  
  lcd_h(48,0,0);              
  lcd_h(32,0,1);                      //使能4位数据线
  lcd_dictate(40);                    //显示参数设定
  lcd_dictate(12);                    //显示参数设定
}  
  
//======================================================================================
//列/行定位函数,最开头的地址是0列0行
void lcd_gotoxy(unsigned char x, unsigned char y)  //列/行定位函数
{      
  if(x<=19 && y<=3)                    //防止输入的数据不正确
    {                                
      if(y==0) lcd_dictate(x+128);     //第0行的地址是从128开始
      if(y==1) lcd_dictate(x+192);     //第1行......
      if(y==2) lcd_dictate(x+148);
      if(y==3) lcd_dictate(x+212);
    }
}      
//=====================================================================================
void lcd_hex(unsigned char byte_data)                 //以十六进制的方式显示一个字符变量
{
  unsigned char temp_data;  
  
  temp_data=byte_data>>4;                             //求高4位
  if(temp_data<10) temp_data+=48; else temp_data+=55; //转化为ASCII值
  lcd_putchar(temp_data);                             //显示
  
  temp_data=byte_data&15;                             //求低4位
  if(temp_data<10) temp_data+=48; else temp_data+=55; //转化为ASCII值
  lcd_putchar(temp_data);                             //显示
}  
//=====================================================================================
void lcd_byte(unsigned char byte_data)                //以十进制的方式显示一个字符变量
{
  unsigned char temp_data;  
  
  temp_data=byte_data/100;                            //求百位数
  lcd_putchar(temp_data+48);                          //转化为ASCII值再显示
  
  temp_data=byte_data/10%10;                          //求十位数
  lcd_putchar(temp_data+48);                          //转化为ASCII值再显示
  
  temp_data=byte_data%10;                             //求个位数
  lcd_putchar(temp_data+48);                          //转化为ASCII再再显示
}  
//=====================================================================================
void lcd_putsf(flash unsigned char *string , unsigned char n) //显示FLASH里面的字符串
{        
  unsigned char i=0;
  while(i<n)
       {  
         lcd_putchar( string[ i ] ) ;                 //顺序显示字符
         i++;                          
       }
}  
//=====================================================================================
#endif//
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95212
这个是四线接法。貌似单片机的I/O口接的位置是由程序决定的?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95214
另外不知道还需不需要添加DS1302
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95237
顶起
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95288
引用第16楼小光Telnet于2009-04-28 11:10发表的  :
我记得在51里就用一个上拉电阻包 + 8跟电线 就足够了  哪有那么多麻烦。。。

貌似AVR和51不同..AVR只输出高低电平..- -!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95322
引用第18楼qwernet于2009-04-28 12:11发表的  :
6根线即可:4根数据D4-D7,1根EN,1根R/S。如果需要读LCD状态,则再加一根区分读和写。

小俊俊.有没有人气比较好的AVR论坛呢?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95324
不明白.能画个电路么
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kangyuhelf2作者
15年9个月前 IP:未同步
95526
thanks.!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
kangyuhelf2
学者 笔友
文章
438
回复
4094
学术分
7
2008/08/03注册,3年9个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}