nios控制12864调试不成功,求帮助!!!

2019-07-16 01:06发布

//================================================================================
//Function:LCD显示
//================================================================================
#include <stdio.h>
#include <unistd.h>

#include "system.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"

//================================================================================
void lcd_busy()//=============RS=0,R/W=1
{
    unsigned char busy_flag=0xff;
   
    while((busy_flag)&0x80)
    {     
        
        IOWR_ALTERA_AVALON_PIO_DATA( LCD_RS_BASE,0 );//rs:  1......写数据;0......写命令
        IOWR_ALTERA_AVALON_PIO_DATA( LCD_RW_BASE,1 );//rw:  1......read, 0.......write   
        IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,0 );//en=0,en先拉低     
        usleep(100);
        
        IOWR_ALTERA_AVALON_PIO_DIRECTION( LCD_DATA_BASE,0 );//设置为输入口      
        
        IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,1 );//en=0,en再拉高        
        
        busy_flag=IORD_ALTERA_AVALON_PIO_DATA( LCD_DATA_BASE );//读取忙碌标志位
        usleep(2000);
        
        IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,0 );//en=0         
    }
   
    IOWR_ALTERA_AVALON_PIO_DIRECTION( LCD_DATA_BASE,1 );//恢复为输出口
}
//===========================  LCD写命令(RS=0,RW=0)  ============================//
void lcd_write_command( unsigned char command )
{
    lcd_busy();
    usleep(1000);
    IOWR_ALTERA_AVALON_PIO_DIRECTION( LCD_DATA_BASE,1 );//设置为输出口
    usleep(100);
   
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_RS_BASE,0 );//rs:  1......写数据;0......写命令
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_RW_BASE,0 );//rw:  1......read, 0.......write              
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,0 );//en=0,en先拉低
    usleep(100);
   
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,1 );//en=1,再拉高
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_DATA_BASE,command );//写命令
    usleep(2000);

    IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,0 );//写完命令再拉低en
}
//===========================  LCD写数据(RS=1,RW=0)  ============================//
void lcd_write_data( char data )
{
    lcd_busy();
    usleep(1000);
    IOWR_ALTERA_AVALON_PIO_DIRECTION( LCD_DATA_BASE,1 );//设置为输出口
    usleep(100);
        
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_RS_BASE,1 );//rs:  1......写数据;0......写命令
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_RW_BASE,0 );//rw:  1......read, 0.......write     
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,0 );//en=0,en先拉低
    usleep(100);
      
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,1 );//en=1,再拉高   
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_DATA_BASE,data );//写数据   
    usleep(2000);
   
    IOWR_ALTERA_AVALON_PIO_DATA( LCD_EN_BASE,0 );//写完数据再拉低en
}
//==================================================================================
//=================================  LCD初始化  =================================//

void init_lcd()
{
    usleep(80000);//80ms
    IOWR_ALTERA_AVALON_PIO_DATA(LCD_PSB_BASE,1);//并行模式
    usleep(100);
   
    lcd_write_command(0x30);//初始化
    usleep(5000);
   
    lcd_write_command(0x30);
    usleep(1500);
   
    lcd_write_command(0x0C);//显示设定:整体显示,游标关
    usleep(1000);
   
    lcd_write_command(0x01);//清屏
    usleep(20000);//20ms
   
    lcd_write_command(0x06);//整屏不移动,点设定,地址指针加1?(手册:画面整体不移动,游标左移,DDRAM 地址计数器(AC)减 1)
    usleep(1000);
   
}
//==========================================================================
void lcd_select_xy( unsigned char x,unsigned char y)
{
    unsigned char pos;
   
    switch(x)
    {
        case 1 : pos=0x80+y-1;break;
        case 2 : pos=0x90+y-1;break;
        case 3 : pos=0x88+y-1;break;
        case 4 : pos=0x98+y-1;break;
        
        default: pos=0x80+y-1;break;
    }
    lcd_write_command( pos );
}
//=======================================================================
void lcd_write_string( unsigned char x,unsigned char y,char *str )
{
    lcd_select_xy(x,y);
   
    while(*str)
    {
        lcd_write_data(*str);
        str++;
    }
}

//=======================================================================
int main()
{
    init_lcd();
    usleep(10000);//10ms
   
    lcd_write_string(1,2,"faggdg");
    lcd_write_string(2,2,"dfasdgg");
   
   
    return 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。