微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 毕业设计,lpc2124仿真时遇到1602不显示

毕业设计,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);//显示开及光标设置显示器开、光标开、闪烁开  
}


没人回啊 自己ding一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top