您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机ATMEGA16 驱动1602 LCD程序 正文
ATMEGA16 驱动1602 LCD程序

ATMEGA16 驱动1602 LCD程序

点击数:7800 次   录入时间:03-04 11:33:32   整理:http://www.55dianzi.com   AVR单片机
   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.4              //请修改LCD与 单片机 的连接IO口
#define RS_DDRn    DDRB.4 

#define RW        PORTB.5 
#define RW_DDRn    DDRB.5      

#define E         PORTB.2
#define E_DDRn     DDRB.2  

#define DB4       PORTC.4
#define DB4_DDRn   DDRC.4  

#define DB5       PORTC.5
#define DB5_DDRn   DDRC.5

#define DB6       PORTC.6
#define DB6_DDRn   DDRC.6 

#define DB7       PORTC.7 
#define DB7_DDRn   DDRC.7
#define DB7_PINn   PINC.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)                //以十六进制显示一个字节变量

上一页  [1] [2] [3]  下一页


本文关键字:程序  AVR单片机单片机-工控设备 - AVR单片机