//================================================================================
//Func
tion: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;
}
在 lcd_write_string(2,2,"dfasdgg"); 后面加一个死循环 while(1)
楼主调试不成功的现象是什么?可以检测各个输出引脚是否满足液晶屏的时序
一周热门 更多>