1602液晶.docx
- 文档编号:30489331
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:18
- 大小:19.88KB
1602液晶.docx
《1602液晶.docx》由会员分享,可在线阅读,更多相关《1602液晶.docx(18页珍藏版)》请在冰豆网上搜索。
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_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1602 液晶
![提示](https://static.bdocx.com/images/bang_tan.gif)