1602液晶.docx

上传人:b****8 文档编号:30489331 上传时间:2023-08-15 格式:DOCX 页数:18 大小:19.88KB
下载 相关 举报
1602液晶.docx_第1页
第1页 / 共18页
1602液晶.docx_第2页
第2页 / 共18页
1602液晶.docx_第3页
第3页 / 共18页
1602液晶.docx_第4页
第4页 / 共18页
1602液晶.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

1602液晶.docx

《1602液晶.docx》由会员分享,可在线阅读,更多相关《1602液晶.docx(18页珍藏版)》请在冰豆网上搜索。

1602液晶.docx

1602液晶

GCC(AtmanAVR)的1602液晶驱动,C++

个人觉得用C++的话代码组织的比较容易,不过内存消耗好像比C要大些.

这是主函数:

#include "1602LCDTEST.h"

#include "1602.h"

Lcd1602 Lcd;

int main(void)

{

Lcd.Puts("");

asm("sleep");

}

够简洁吧,

这是头文件:

#include 

#ifndef _1602_H_1341661

#define _1602_H_1341661

typedef unsigned char uint8;

typedef unsigned int uint16;

typedef unsigned long uint32;

typedef struct

{

uint8 rw :

 1;

uint8 rs :

 1;

uint8 en :

 1;

} lcd_port;

#define lcd_data PORTA

#define lcd_data_ddr DDRA

#define lcd_port_ddr DDRD

#define lcd_rs ((lcd_port*)&PORTD)->rs

#define lcd_rw ((lcd_port*)&PORTD)->rw

#define lcd_en ((lcd_port*)&PORTD)->en

class LcdBase

{

protected:

void WriteCmd(uint8 cmd);

void WriteData(uint8 data);

};

class Lcd1602 :

 LcdBase

{

public:

Lcd1602(void);

void Clear(void);

void PutChar(uint8 data);

void Puts(const char* data);

void GotoXY(uint8 x, uint8 y);

};

#endif

这是代码的实现:

#include "1602.h"

#include 

#define nop asm("nop")

void LcdBase:

:

WriteCmd(uint8 cmd)

{

lcd_data = cmd;

nop;

lcd_rs = 0;

nop;

lcd_rw = 0;

nop;

lcd_en = 0;

delay(1, 8000);

lcd_en = 1;

}

void LcdBase:

:

WriteData(uint8 data)

{

lcd_data = data;

nop;

lcd_rs = 1;

nop;

lcd_rw = 0;

nop;

lcd_en = 0;

delay(1, 8000);

lcd_en = 1;

}

Lcd1602:

:

Lcd1602(void)

{

uint8 i = 0;

lcd_data_ddr = 0xFF;

lcd_port_ddr = 0xFF;

for (i = 0; i < 3; i++)

{

WriteCmd(0x38);

delay(5, 8000);

}

Clear();

WriteCmd(0x0C);

}

void Lcd1602:

:

PutChar(uint8 data)

{

WriteData(data - '!

' + 0x21);

}

void Lcd1602:

:

Clear(void)

{

WriteCmd(0x01);

delay(5, 8000);

}

void Lcd1602:

:

Puts(const char* data)

{

uint8 i = 0;

while (data[i] !

= '\0')

WriteData(data[i++]);

}

void Lcd1602:

:

GotoXY(uint8 x, uint8 y)

{

y &= 0x1;

x &= 0xF; 

if (y) x |= 0x40; 

x |= 0x80;

WriteCmd(x); 

}

 

配置:

 ATMega16L @3.3V @7.3728MHz

 1602B LCD @5.0V @6 lines

 Compiler:

 WinAVR 20060125

我自己搭的万用板,1602用5V供电,M16用3.3V供电。

为了使LCD尽快投入运转,同时也因为懒惰 ... 便参考了网站上很多的1602的帖子,包括网站收集帖,程序下载后稍加修改,编译通过,下载到M16中,总是没有反应。

在这个过程中,我确信我的1602硬件是没有问题的,因为我手头上有个以前用51做的时间温度计(1602+18B20),放到上面都能正常显示。

整个过程中,感觉不管是网站收集的精华帖,还是普通帖子里面的1602程序,冗长繁杂 ... 比如我在一个帖子中,看到的一个1602的初始化函数,居然用了10几行代码!

我在51中,不过也就4句而已啊 ...

后来,遇到了下面的程序,简明扼要,一次成功。

当然,这也是从论坛中COPY的,我做了一些修改:

#include 

#define LCD_EN_PORT    PORTC

#define LCD_RW_PORT    PORTC

#define LCD_RS_PORT    PORTC

#define LCD_DATA_PORT  PORTA

#define LCD_DATA_DDR   DDRA

#define LCD_DATA_PIN   PINA

//LCD的 r/w 脚直接接 GND

#define LCD_EN         0x80   //portd7        out

#define LCD_RS         0x40   //portc6        out

#define LCD_DATA       0xF0   //porta 4/5/6/7   out

/*--------------------------------------------------------------------------------------------------

Public function prototypes

--------------------------------------------------------------------------------------------------*/

void LCD_init         (void);

void LCD_en_write     (void);

void LCD_write_char   (unsigned command,unsigned data);

void LCD_set_xy       (unsigned char x, unsigned char y);

void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);

void delay_nus        (unsigned int n);

void delay_nms        (unsigned int n);

void LCD_init(void)       //液晶初始化

{

 delay_nms(15);

 

 DDRA |= LCD_DATA;   // 数据为输出

 DDRC |= LCD_RS | LCD_EN;  //置位RS.EN

 

 LCD_write_char(0x28,0);  //4位显示

 LCD_write_char(0x0c,0);  //显示开

 LCD_write_char(0x01,0);  //清屏

 

 delay_nms(60);

}

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)

{

 LCD_set_xy( X, Y ); //写地址

   

 while (*s) {

    LCD_write_char( 0, *s );

s ++;

 }

}

  

void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数

{

 unsigned char address;

 

 if (y == 0)

address = 0x80 + x;

 else 

address = 0xc0 + x;

 LCD_write_char(address, 0 );

}

void LCD_en_write(void)  //液晶使能

{

  LCD_EN_PORT |= LCD_EN;

  delay_nus

(1);

  LCD_EN_PORT &= ~LCD_EN;

}

void LCD_write_char(unsigned command,unsigned data) // 写数据

{

 unsigned command_temp,data_temp;

 

 command_temp = command;

 data_temp = data;

 delay_nus(16);

 

 if(command == 0) {

LCD_RS_PORT |= LCD_RS;  //RS=1

LCD_DATA_PORT &= 0X0f;

LCD_DATA_PORT |= data_temp & 0xf0;  //写高四位

LCD_en_write();

data_temp = data_temp << 4;  

LCD_DATA_PORT &= 0X0f;

LCD_DATA_PORT |= data_temp & 0xF0;   //写低四位

LCD_en_write();

 }

 else {

LCD_RS_PORT &= ~LCD_RS;   //RS=0

LCD_DATA_PORT &= 0X0f;

LCD_DATA_PORT |= command_temp & 0xF0; //写高四位

LCD_en_write();

command_temp = command_temp << 4;

LCD_DATA_PORT &= 0x0F;

LCD_DATA_PORT |= command_temp & 0xF0;  //写低四位

LCD_en_write();

  }

}

int main(void)

{

 LCD_init();

 

 LCD_write_string(0,0,"Hello,AVR WORLD!

!

!

");

 LCD_write_string(0,1,"hitro@");

 while

(1);

 

}

   /*-----------------------------------------------------------------------

延时函数

系统时钟:

8M

-----------------------------------------------------------------------*/

void delay_1us(void)                 //1us延时函数

  {

   asm("nop");

  }

void delay_nus(unsigned int n)       //N us延时函数

  {

   unsigned int i=0;

   for (i=0;i

   delay_1us();

  }

  

void delay_1ms(void)                 //1ms延时函数

  {

   unsigned int i;

   for (i=0;i<1356;i++);

  }

  

void delay_nms(unsigned int n)       //N ms延时函数

  {

   unsigned int i=0;

   for (i=0;i

   delay_1ms();

  }

 

个功能强大的1602LCD四位数据线驱动程序

驱动程序

#include 

#include 

#include "LCD_1602.h"

void delay_nms(unsigned int n);

void delay_nus(unsigned int n);

unsigned char lcd_data[32];//32字节显存,记录LCD上显示的数据

unsigned char data[32];//32字节缓存,保存将要写入LCD的数据

unsigned char add;//显存地址标号

unsigned char new=32;//显存标号 

unsigned int num=0;

/**********************************************************

TC1602B LCD DISPLAY

建立时间:

2005年12月12号

修改日期:

2005年12月12号

LCD_write函数功能:

当command=0时,向LCD写入数据,否则向LCD写

                   入命令

LCD第一行显示寄存器地址:

0X80-0X8F

LCD第二行显示寄存器地址:

0XC0-0XCF

**********************************************************/

void LCD_init(void)

  { 

     LCD_EN_DDR|=LCD_EN;//设定该引脚方向为输出

 LCD_RS_DDR|=LCD_RS;//设定该引脚方向为输出

 LCD_D4_DDR|=LCD_D4;//设定数据口为输出 

 LCD_D5_DDR|=LCD_D5;//设定数据口为输出  

 LCD_D6_DDR|=LCD_D6;//设定数据口为输出  

 LCD_D7_DDR|=LCD_D7;//设定数据口为输出

 

  LCD_EN_PORT&=~LCD_EN;//EN设为低电平

  LCD_RS_PORT&=~LCD_RS;//RS设为低电平

  LCD_D4_PORT&=~LCD_D4;//数据口置低电平

  LCD_D5_PORT&=~LCD_D5;//数据口置低电平

  LCD_D6_PORT&=~LCD_D6;//数据口置低电平

  LCD_D7_PORT&=~LCD_D7;//数据口置低电平

  

    LCD_write_char(0,0x33);      //4bit test

delay_nms(25);

LCD_write_char(0,0x32);

delay_nms(15);

LCD_write_char(0,0x28);

delay_nms(15);

    LCD_write_char(0,0x0C);      //显示开

delay_nms(15);

    LCD_write_char(0,0x01);      //显示清屏

delay_nms(15);

    LCD_write_char(0,0x06);      //显示光标移动设置

LCD_clear();

delay_nms(10);

LCD_init_CGRAM(); 

  }

/*-----------------------------------------------------------------------

LCD_write_char    :

 写一个字节到LCD的函数

编写日期             :

2005-12-12 

最后修改日期      :

2005-12-12 

-----------------------------------------------------------------------*/

void LCD_write_char(unsigned command,unsigned data)

  { 

    if (command == 0)

   LCD_RS_PORT &= ~LCD_RS;   //RS=0  写地址

else

    LCD_RS_PORT |= LCD_RS;    //RS=1 写数据

    LCD_write_DATA_PORT(data);//写高4位

    LCD_write_DATA_PORT(data<<4);//写低4位

delay_nus(250);

num++;//统计向LCD发送的字节数

  }

/*-----------------------------------------------------------------------

LCD_write_DATA_PORT :

 写数据到LCD数据口函数

输入参数data   :

要写入的数据(仅高4位)

编写日期          :

2005-12-12

最后修改日期   :

2005-12-12 

-----------------------------------------------------------------------*/

void LCD_write_DATA_PORT(unsigned char data)

{   

    if((data>>4)%2)

  LCD_D4_PORT |=LCD_D4;

else

  LCD_D4_PORT &=~LCD_D4;

if((data>>5)%2)

  LCD_D5_PORT |=LCD_D5;

else

  LCD_D5_PORT &=~LCD_D5;

  

if((data>>6)%2)

  LCD_D6_PORT |=LCD_D6;

else

  LCD_D6_PORT &=~LCD_D6;

  

if((data>>7)%2)

  LCD_D7_PORT |=LCD_D7;

else

  LCD_D7_PORT &=~LCD_D7;

  

  LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD

  delay_nus(25);

      LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD

  delay_nus(25);

}

/*-----------------------------------------------------------------------

LCD_clear    :

 清除屏幕的函数

输入参数      :

编写日期      :

2005/10/18

       说明      :

lcd_data[]也会被清0

-----------------------------------------------------------------------*/

void LCD_clear(void)

  {  

     unsigned char i;

     LCD_write_char(0,0x01);//显示清屏

 for(i=0;i<32;i++)

   {

      lcd_data[i]=0;

   }

   delay_nus(500);

  }

/*-----------------------------------------------------------------------

LCD_check   :

 统计发送数据到LCD次数的函数

输入参数      :

x,y 显示结果的座标

编写日期      :

2005/10/18

       说明      :

如果每秒调用一次,就是统计每秒的次数

-----------------------------------------------------------------------*/ 

void LCD_check(unsigned char x,unsigned char y) //检测每秒钟写LCD

                                                                      //次数的函数

  {  

    unsigned char  i;

unsigned char  lcd[2]={0};

add=y*16+x;//设置起始座标

        lcd[0]=num/10+48;

lcd[1]=num%10+48;

num=0;  

   for (i=0;i<2;i++) 

      {

              if(lcd_data[add]==lcd[i]){}

  else

     {data[add]=lcd[i];}

          add++;

      }

LCD_updata;

  }

/*-----------------------------------------------------------------------

LCD_write_string  :

 英文字符串显示函数

输入参数:

*s       :

英文字符串指针;

                 X、Y    :

 显示字符串的位置

 e          :

 把从最后一个字符到x=e之间的内容删除

编写日期          :

2005/10/18

-----------------------------------------------------------------------*/

void LCD_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1