** 1602A液晶屏驱动程序** 晶 振 频 率:11.0592M*****************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5//定义接口sbit LCM_RW=P3^6sbit LCM_RS=P3^7#define LCM_Data P1//数据接口 void LCM_WriteData(uchar WDLCM)void LCM_WriteCommand(uchar WCLCM,BuysC)uchar LCM_ReadData(void)uchar LCM_ReadStatus(void)void LCM_Init(void)void DisplayOneChar(uchar X, uchar Y, uchar DData)void DisplayListChar(uchar X, uchar Y, uchar code *DData)void Delay5Ms(void)void Delay400Ms(void)uchar code uctech[] = {"1602A"}uchar code net[] = {"www.52c51.com"}void main(void){Delay400Ms()//启动等待,等LCM讲入工作状态LCM_Init()//LCM初始化Delay5Ms()//延时片刻(可不要) DisplayListChar(6, 1, uctech)DisplayListChar(0, 0, net)LCM_ReadData()//测试用句无意义LCM_Data=255while(1)} /****************************1602A写数据
函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)/*函数
功能:1602A写数据/*输入
参数:要写入的数据/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteData(uchar WDLCM){LCM_ReadStatus()//检测忙LCM_Data = WDLCMLCM_RS = 1LCM_RW = 0LCM_E = 0//若晶振速度太高可以在这后加小的延时LCM_E = 0//延盯正时LCM_E = 1} /****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数迟则昌功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus()//根据需要检测忙码扒LCM_Data = WCLCMLCM_RS = 0LCM_RW = 0LCM_E = 0LCM_E = 0LCM_E = 1} /****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无/*输出参数:1602A返回的数据/*调用模块:/**********************************************************************/ uchar LCM_ReadData(void){LCM_RS = 1LCM_RW = 1LCM_E = 0LCM_E = 0LCM_E = 1return(LCM_Data)} /****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/**********************************************************************/ uchar LCM_ReadStatus(void){LCM_Data = 0xFFLCM_RS = 0LCM_RW = 1LCM_E = 0LCM_E = 0LCM_E = 1while (LCM_Data &0x80)//检测忙信号return(LCM_Data)} /****************************1602A初始化函数**************************//*函数原型:void LCM_Init(void)/*函数功能:1602A初始化/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_Init(void){LCM_Data = 0LCM_WriteCommand(0x38,0)//三次显示模式设置,不检测忙信号Delay5Ms()LCM_WriteCommand(0x38,0)Delay5Ms()LCM_WriteCommand(0x38,0)Delay5Ms()LCM_WriteCommand(0x38,1)//显示模式设置,开始要求每次检测忙信号LCM_WriteCommand(0x08,1)//关闭显示LCM_WriteCommand(0x01,1)//显示清屏LCM_WriteCommand(0x06,1)// 显示光标移动设置LCM_WriteCommand(0x0C,1)// 显示开及光标设置} /******************1602A按指定位置显示一个字符函数**********************//*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示的字符/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1X &= 0xF//限制X不能大于15,Y不能大于1if (Y) X |= 0x40//当要显示第二行时地址码+0x40X |= 0x80// 算出指令码LCM_WriteCommand(X, 0)//这里不检测忙信号,发送地址码LCM_WriteData(DData)} /*******************1602A按指定位置显示一串字符函数*********************//*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示字符串的首地址/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLengthListLength = 0Y &= 0x1X &= 0xF//限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20)//若到达字串尾则退出{if (X <= 0xF)//X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength])//显示单个字符ListLength++X++}}} /********************5ms延时函数************************//*函数原型:void Delay5Ms(void)/*函数功能:5ms延时/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void Delay5Ms(void){unsigned int TempCyc = 5552while(TempCyc--)} /********************400ms延时延时函数************************//*函数原型:void Delay400Ms(void)/*函数功能:400ms延时延时/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void Delay400Ms(void){uchar TempCycA = 5unsigned int TempCycBwhile(TempCycA--){TempCycB=7269while(TempCycB--)}}楼主可以参考这个程序,只要稍微修改一下端口或参考一些函数即可,希望对您有用,有什么问题的话可以问我~~
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit E=P2^7 //1602使能引脚
sbit RW=P2^6 //1602读写引脚
sbit RS=P2^5 //1602数据/命令选择引脚
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。拆厅
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j
for(i=0i<=100i++)
for(j=0j<=20j++)
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(uchar del)
{
P0 = del
RS = 0
RW = 0
E = 0
delay()
E = 1
delay()
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入旅宏隐1602的绝御数据
* 输出 : 无
***********************************************************************/
void write(uchar del)
{
P0 = del
RS = 1
RW = 0
E = 0
delay()
E = 1
delay()
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x01)
enable(0x38)
enable(0x0c)
enable(0x06)
enable(0xd0)
}
/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a
if(hang == 1) a = 0x80
if(hang == 2) a = 0xc0
a = a + lie - 1
enable(a)
write(sign)
}
/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a
if(hang == 1) a = 0x80
if(hang == 2) a = 0xc0
a = a + lie - 1
enable(a)
while(1)
{
if(*p == '\0') break
write(*p)
p++
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uchar i = 48
L1602_init()
L1602_char(1,5,'b')
L1602_string(1,1," 0123456789 ")
L1602_string(2,1," ABCDEDGHIJ ")
while(1)
}
评论列表(0条)