微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > nios控制12864调试不成功,求帮助!

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

时间:10-02 整理:3721RD 点击:
//================================================================================
//Function:LCD显示
//================================================================================
#include
#include
#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, 0write   
        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, 0write              
    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, 0write     
    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;
}

在   lcd_write_string(2,2,"dfasdgg"); 后面加一个死循环 while(1)
小编调试不成功的现象是什么?可以检测各个输出引脚是否满足液晶屏的时序

要给出具体不成功的现象才能分析的

之前调试成功的代码,现在拷进去再跑的时候,就什么都不显示,诧异诧异,想撞墙,想破脑袋都知道怎么回事

就是什么都不显示,之前调试成功了,今天重试的时候,重新把代码拷进去,就怎么也不行了,愁死个人。大神解答。

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

网站地图

Top