|
发表于 2011-1-26 21:14:13
|
显示全部楼层
借楼主的宝地,顺便把其他几个文件也贴上来,供和我一样的菜鸟们参考。
//LCD1602.H
#ifndef __LCD1602_H
#define __LCD1602_H
#include<reg52.h>
#include<Delay.h> /* 延时函数 */
#undef LCD_Data_Port /*消除重复定义*/
#define LCD_Data_Port P0 /* 向LCD输出数据的I/O口为P0口,需要根据硬件设置 */
/************ 位变量定义(需结合实际硬件电路,调整)*********/
/* 注意:下面的LCD引脚和硬件设计相关 2010.12.7 */
sbit E= P2^7; /* 1602使能引脚 */
sbit RW=P2^6; /* 1602读写引脚 */
sbit RS=P2^5; /* 1602数据/命令选择引脚 */
/* 8个5*8自定义汉字字符 */
unsigned char code ChineseData[]=
{ 0x1f,0x02,0x04,0x1f,0x04,0x04,0x14,0x08,/* 代码 0x00*/
0x04,0x1f,0x04,0x0e,0x04,0x1f,0x04,0x04,/* 代码 0x01*/
0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00,/* 代码 0x02*/
0x0A,0x17,0x10,0x15,0x15,0x15,0x12,0x17,/* 代码 0x03*/
0x04,0x04,0x1F,0x15,0x15,0x1F,0x04,0x04,/* 代码 0x04*/
0x08,0x1F,0x0E,0x15,0x04,0x1F,0x04,0x15,/* 代码 0x05*/
0x1F,0x0D,0x0D,0x1E,0x0D,0x0E,0x0D,0x16,/* 代码 0x06*/
0x1F,0x11,0x1F,0x00,0x1F,0x04,0x03,0x1F,/* 代码 0x07*/
};
/************ 函数声明 2011.1.24************/
extern void WriteCmdTo1602(unsigned char cmd); /* 1602命令函数,可供其他函数调用 */
void WriteDataTo1602(unsigned char ShuJu); /* 1602写数据函数,只用于本库函数*/
extern void WriteCharTo1602(unsigned char row,unsigned char column,char ZiFu); /* 在指定位置写字符,可供其他函数调用 */
extern void WriteStrTo1602(unsigned char row,unsigned char column,unsigned char *p); /* 向1602写字符串,可供其他函数调用 */
void WriteCGRAM(void); /* 向1602写入8个自建的字符库,只用于本库函数 */
extern void Initiate1602(void); /* 1602初始化,可供其他函数调用 */
/* LCD1602模块的标准处理函数群2010.12.7*/
/****************************************
* 名称 : WriteCmdTo1602(unsigned char cmd)
* 功能 : 1602写命令函数
* 输入 : 输入的命令值
* 输出 : 无
****************************************/
void WriteCmdTo1602(unsigned char cmd)
{ LCD_Data_Port = cmd;
RS = 0; /* 指令 */
RW = 0; /* 写 */
E = 0; /* 关LCD1602 */
DelayNus(100);
E = 1; /* 开LCD1602 */
DelayNus(100);
}
/***************************************
* 名称 : WriteDataTo1602(unsigned char ShuJu)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
****************************************/
void WriteDataTo1602(unsigned char ShuJu)
{ LCD_Data_Port = ShuJu;
RS = 1; /* 数据 */
RW = 0; /* 写 */
E = 0; /* 关LCD1602 */
DelayNus(100);
E = 1; /* 开LCD1602 */
DelayNus(100);
}
/***************************************
* 名称 : WriteCharTo1602(unsigned char row,unsigned char column,char ZiFu)
* 功能 : 在指定位置写字符.eg: WriteCharTo1602(1,2,'Z'); 在第1行第2个字符处显示"Z"
* 输入 : 行,列,需要输入1602的字符数据
* 输出 : 无
****************************************/
void WriteCharTo1602(unsigned char row,unsigned char column,char ZiFu)
{ unsigned char A;
if((column>0)&(column<=16)) /* 不能超出1602的显示范围 */
{ if(row <= 1) A = 0x80; /* 第一行 */
else A = 0xC0; /* 第二行 */
A += column - 1;
WriteCmdTo1602(A);
WriteDataTo1602(ZiFu);
}
}
/***************************************
* 名称 : WriteStrTo1602(unsigned char row,unsigned char column,unsigned char *p)
* 功能 : 向1602写字符串.eg:WriteStrTo1602(1,2,"ZWM"); 在第1行第2个字符开始显示"ZWM"
* 输入 : 行,列,需要输入1602的字符串数据
* 输出 : 无
****************************************/
void WriteStrTo1602(unsigned char row,unsigned char column,unsigned char *p)
{ unsigned char A;
if((column>0)&(column<=16)) /* 不能超出1602的显示范围 */
{ if(row <= 1) A = 0x80; /* 第一行 */
else A = 0xC0; /* 第二行 */
A += column - 1;
WriteCmdTo1602(A);
while(*p != '\0')
{ WriteDataTo1602(*p);
p++;
}
}
}
/***************************************
* 名称 : WriteCGRAM()
* 功能 : 向1602的CGRAM里写入8个自定义5*8汉字字符、图形点阵
* 输入 : 无
* 输出 : 无
****************************************/
void WriteCGRAM(void)
{ unsigned char i,j;
for(i=0x00;i<0x08;i++)
{ WriteCmdTo1602(0x40+i*8);/*8个自定义字符地址0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78*/
for(j=0x00;j<0x08;j++) { WriteDataTo1602(ChineseData[i*8+j]); }/*写入汉字字符的数据*/
}
}
/************************************
* 名称 : Initiate1602()
* 功能 : 1602初始化
* 输入 : 无
* 输出 : 无
*************************************/
void Initiate1602(void)
{ /* 常规的初始化过程 */
WriteCmdTo1602(0x01);/* 清屏 */
WriteCmdTo1602(0x38);/* 八位数据,分两行显示,字符点阵5*7,1/16占空比 */
WriteCmdTo1602(0x38);
WriteCmdTo1602(0x38);
WriteCmdTo1602(0x08);/* 关闭显示 */
WriteCmdTo1602(0x01);/* 清屏 */
WriteCmdTo1602(0x06);/* 光标移动设置,读/写一个字符后地址指针加1 &光标加1 */
WriteCmdTo1602(0x0c);/* 开显示,不显示光标,不闪烁 */
WriteCGRAM(); /* 写入8个自定义汉字 */
}
#endif /* __LCD1602_H */
//Delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include <intrins.h> //使用了其中的_nop_ ()函数
/* 函数声明 *///对这些常用的延时函数加extern 声明,可供其它文件调用2011.1.24
extern void Delay1us(void);
extern void Delay1ms(void);
extern void DelayNms(unsigned int n);/* 延时n(ms)子程序 */
extern void DelayNus(unsigned int n);
/* 函数定义 */
/***********************************************************************/
void Delay1us(void) //1us延时函数
{ _nop_ (); //XTL=12MHz时候1NOP=1us
}
/***********************************************************************/
void DelayNus(unsigned int n) //N us延时函数
{ unsigned int i=0;
for (i=0;i<n;i++) { Delay1us(); }
}
/***********************************************************************/
void Delay1ms(void) //1ms延时函数
{ unsigned int i;
for (i=0;i<250;i++){ ; }
}
/***********************************************************************/
void DelayNms(unsigned int n) //N ms延时函数
{ unsigned int i=0;
for (i=0;i<n;i++) { Delay1ms(); };
}
/***********************************************************************/
#endif /*__DELAY_H*/ |
|