szq_qian@eyou.c 该用户已被删除
|
大家好,问一下,有谁用过带T6963C控制器的液晶屏阿,我在nios下,用J2端和液晶相连,用io口模拟液晶需要的时序,但是,怎么都没有显示。能否给点指点?关于连线,我用的是up3板子J2的4脚为wr 5脚为rd,6脚为c/d.lcd的ce直接接地。剩下的管脚给了8根数据线。
下面是程序,大家给指正一下阿。
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_timestamp.h"
#include
#include
#include
#include
#define us 10000
void init() //initialize the lcd pio before use it
{
IOWR(LED_PIO_BASE, 0, 1);
usleep(1000000);
IOWR(LED_PIO_BASE, 0, 0); //测试led的灯亮不亮。
IOWR(LCD_WR_BASE, 0, 1);
IOWR(LCD_CD_BASE, 0, 1);
IOWR(LCD_RD_BASE, 0, 1);
//IOWR(LCD_DATA_BASE, 0, 0xff);
}
int read_state(void) // read state
{
int state =0;
IOWR(LCD_CD_BASE, 0, 1);
// IOWR(LCD_RD_BASE, 0, 1);
IOWR(LCD_WR_BASE, 0, 1);
IOWR(LCD_RD_BASE, 0, 0);
asm(" nop ");
asm(" nop ");
asm(" nop ");
//usleep(1);
state = IORD(LCD_DATA_BASE,0);
IOWR(LCD_RD_BASE,0,1);
usleep(1);
return (state);
}
void check_state() //检查状态字的第0、1位是否为1,为1的时候才能写
{
while ((read_state()&0x03)!=3)
;
}
void check_state_auto_wr()//检查自动写状态是否满足,第3位为1的时候可以写
{
while ((read_state()&0x80)!=8)
;
}
void lcd_wr_cmd(int writedata) //写命令
{
check_state();
IOWR(LCD_RD_BASE, 0, 1);
IOWR(LCD_WR_BASE, 0, 1);
IOWR(LCD_CD_BASE, 0, 1);
IOWR(LCD_DATA_BASE, 0, writedata);
IOWR(LCD_WR_BASE, 0, 0);
usleep(2);
IOWR(LCD_WR_BASE, 0, 1);
IOWR(LCD_CD_BASE, 0, 1);
usleep(us);
}
void lcd_wr_data(int writedata)//写数据
{
check_state();
IOWR(LCD_RD_BASE, 0, 1);
IOWR(LCD_CD_BASE, 0, 0);
//usleep(1);
IOWR(LCD_DATA_BASE, 0, writedata);
IOWR(LCD_WR_BASE, 0, 0);
usleep(2);
IOWR(LCD_WR_BASE, 0, 1);
// usleep(1);
IOWR(LCD_CD_BASE, 0, 1);
usleep(us);
}
void lcd_wr_data_auto(int writedata)//自动写数据
{
check_state_auto_wr();
//IOWR(LCD_RD_BASE, 0, 1);
IOWR(LCD_CD_BASE, 0, 0);
//usleep(1);
IOWR(LCD_DATA_BASE, 0, writedata);
IOWR(LCD_WR_BASE, 0, 0);
usleep(us);
IOWR(LCD_WR_BASE, 0, 1);
// usleep(1);
asm("nop");
IOWR(LCD_CD_BASE, 0, 1);
usleep(us);
}
void clear()
{
long i;
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_cmd(0x24);//地址指针
lcd_wr_cmd(0xb0);//自动写打开
for (i=0;i<65535;i++)
{
lcd_wr_data_auto(0xf0);
}
lcd_wr_cmd(0xb2);//自动写关闭
}
void lcd_display() //
{ long i;
init();
clear();
lcd_wr_cmd(0x88);// display modle.graphic and using cgram
lcd_wr_data(0x00);//graphic first address
lcd_wr_data(0x00);
lcd_wr_cmd(0x42);
lcd_wr_data(0x20);//width of the graphic
lcd_wr_data(0x00);
lcd_wr_cmd(0x43);
lcd_wr_cmd(0x98); //graphic display enable
/*lcd_wr_data(0x00);//course of the address
lcd_wr_data(0x1c);
lcd_wr_cmd(0x24);*/
lcd_wr_cmd(0xb0);//auto write
for (i=0;i<30720;i++)
{
lcd_wr_data_auto(0x00);//可以写00或0f测试。
}
lcd_wr_cmd(0xb2);//自动写关闭
}
void main(void)
{
lcd_display();
}
先谢谢了
[此贴子已经被作者于2005-8-10 22:27:22编辑过] |
|