ARM7---LCD1602---液晶显示驱动

//config.h

//1602液晶显示器配置文件

#ifndef __CONFIG_H
#define __CONFIG_H

#include <LPC21xx.H>

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

typedef  unsigned char uint8;
typedef  signed    char    int8;
typedef  unsigned  short  uint16;
typedef  signed  short  int16;
typedef  unsigned  int  uint32;
typedef  signed  int   int32;
typedef  float  fp32;
typedef  double  fp64 ;


#define Fosc		11059200

#define Fcclk		(Fosc*4)

#define Fcco		(Fcclk*4)

#define Fpclk		(Fcclk/4)*1


#endif


//Text1.c

/*******************************************************
*	  功能:LCD1602液晶显示驱动
*	  File: Text1.c
********************************************************/


#include "config.h"


#define RS 	(1<<8)
#define RW	(1<<9)
#define E	(1<<10)
#define BUSY  (1<<7)

#define FIRSTLINE	0x80
#define SECONDLINE	0xc0

unsigned  char  str1[]="Hello  Lpc1602";
unsigned  char  str2[]="2012 I'm coming";

void DelayMs(unsigned char ms);
void CheckBusy();
void WriteCommand(unsigned char command);
void WriteData(unsigned char data);
void  Set_XY(unsigned char x,unsigned char y);
void DisplayChar(unsigned char x,unsigned char y,unsigned char data);
void DisplayString(unsigned  char x,unsigned  char y,unsigned  char *str);
void InitLcd();	


//主函数入口
int main()
{
	 PINSEL0 &= 0xfffff800;//低11位为IO功能
	 IO0DIR = 0x7ff;//为输出功能
	 IO0CLR = 0x7ff;//清零

	 //初始化LCD1602
	 InitLcd();
		
	 //显示数据
	 DisplayString(0,0,str1);
	 DisplayString(1,0,str2);

	 while(1);

	 //return 0;
}

/*******************************************************
*	  功能:长软件延时,时间为ms
********************************************************/
void DelayMs(unsigned char ms)
{
	unsigned int i;
	for(;ms>0;ms--)
		for(i=0;i<50000;i++);
} 

/*******************************************************
*	  功能:检查LCD是否忙碌,忙碌等待,不忙了返回
********************************************************/
void CheckBusy()
{
	IO0DIR = 0x700;//0-7输入,8-10输出	,读状态

	while(1)
	{
		//读状态,RS=L,RW=H,E=H
		IO0CLR = RS;
		IO0SET = RW;
		IO0SET = E;
		
		if(!(IO0PIN & BUSY))	  //如果不忙了,返回
		{
			break;
		}
		IO0CLR = E;//如果忙了,清空E标志,继续等待	
	}
	IO0DIR = 0x7ff;//IO口全部恢复为输出	
}

/*******************************************************
*	  功能:写命令(指令)函数
********************************************************/
void WriteCommand(unsigned char command)
{	
	CheckBusy(); //检查是否BUSY	,忙碌一直在此等待

	//写指令,RS=L,RW=L,然后D0~D7=指令码,E=高脉冲发送命令
	IO0CLR = RS;
	IO0CLR = RW;
	
	IO0CLR = 0xff;//清空端口
	IO0SET = command;

	IO0SET = E;//发送数据
	
	IO0CLR = E;//恢复,以便继续使用
}


/*******************************************************
*	  功能:写数据函数
*			显示数据之前要先设定显示位置
********************************************************/
void WriteData(unsigned char data)
{	
	CheckBusy(); //检查是否BUSY	,忙碌一直在此等待

	//写指令,RS=H,RW=L,然后D0~D7=指令码,E=高脉冲发送命令
	IO0SET = RS;
	IO0CLR = RW;
	
	IO0CLR = 0xff;//清空端口
	IO0SET = data;

	IO0SET = E;//发送数据
	
	IO0CLR = E;//恢复,以便继续使用
}

/*******************************************************
*	  功能:设置显示位置
*			坐标自动加1
********************************************************/
void  Set_XY(unsigned char x,unsigned char y)
{
	switch(x)
	{
		case 0:
			y+=FIRSTLINE;
			break;
		case 1:
			y+=SECONDLINE;
			break;
	}
	WriteCommand(y);	//显示坐标更新 设置数据指针
}

/*******************************************************
*	  功能:在指定位置显示单个字符
********************************************************/
void DisplayChar(unsigned char x,unsigned char y,unsigned char data)
{
	Set_XY(x,y);
	WriteData(data);
}

/*******************************************************
*	  功能:在指定位置显示字符串
********************************************************/
void DisplayString(unsigned  char x,unsigned  char y,unsigned  char *str)	
{
	Set_XY(x,y);
	while(*str)
	{
		WriteData(*str);
		str++;
	}
}

/*******************************************************
*	  功能:初始化LCD1602函数
********************************************************/
void InitLcd()
{
	//写命令
	WriteCommand(0x01);//显示清屏,数据指针、所有显示清零
	WriteCommand(0x38);//设置16*2显示,5*7点阵,8位数据接口
	WriteCommand(0x0f);//显示开及光标设置显示器开、光标开、闪烁开
}

//图片



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值