毕业设计,lpc2124仿真时遇到1602不显示
时间:10-02
整理:3721RD
点击:
#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);//显示开及光标设置显示器开、光标开、闪烁开
}
#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);//显示开及光标设置显示器开、光标开、闪烁开
}
没人回啊 自己ding一下
arm7 相关文章: