|
使用LM3S9B96的EPI驱动LCD(SSD1298)
接法如下:
(原文件名:LCD.JPG)
本意是RS用手动的方式
EPI配置如下:
void epi_port_init(void)
{
/*使能EPI接口*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);
/*使能各个使用的IO口*/
//SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
//SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
/*设置IO口功能*/
GPIOPinConfigure(GPIO_PH3_EPI0S0);
GPIOPinConfigure(GPIO_PH2_EPI0S1);
GPIOPinConfigure(GPIO_PC4_EPI0S2);
GPIOPinConfigure(GPIO_PC5_EPI0S3);
GPIOPinConfigure(GPIO_PC6_EPI0S4);
GPIOPinConfigure(GPIO_PC7_EPI0S5);
GPIOPinConfigure(GPIO_PH0_EPI0S6);
GPIOPinConfigure(GPIO_PH1_EPI0S7);
GPIOPinConfigure(GPIO_PE0_EPI0S8);
GPIOPinConfigure(GPIO_PE1_EPI0S9);
GPIOPinConfigure(GPIO_PH4_EPI0S10);
GPIOPinConfigure(GPIO_PH5_EPI0S11);
GPIOPinConfigure(GPIO_PF4_EPI0S12);
GPIOPinConfigure(GPIO_PG0_EPI0S13);
GPIOPinConfigure(GPIO_PG1_EPI0S14);
GPIOPinConfigure(GPIO_PF5_EPI0S15);
GPIOPinConfigure(GPIO_PJ4_EPI0S28);
GPIOPinConfigure(GPIO_PJ5_EPI0S29);
GPIOPinConfigure(GPIO_PJ6_EPI0S30);
GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS);
GPIOPinTypeEPI(GPIO_PORTE_BASE, EPI_PORTE_PINS);
GPIOPinTypeEPI(GPIO_PORTF_BASE, EPI_PORTF_PINS);
GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS);
GPIOPinTypeEPI(GPIO_PORTH_BASE, EPI_PORTH_PINS);
GPIOPinTypeEPI(GPIO_PORTJ_BASE, EPI_PORTJ_PINS);
EPIDividerSet(EPI0_BASE, 6);
EPIModeSet(EPI0_BASE, EPI_MODE_HB16);
EPIConfigHB16Set(EPI0_BASE,EPI_HB16_MODE_ADDEMUX | EPI_HB16_RDWAIT_0 | EPI_HB16_WRWAIT_0 | EPI_HB16_CSCFG_CS,0);
EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_SIZE_256B | EPI_ADDR_PER_BASE_A);
RS_LOW();
}
这是LCD初始化:
void lcd_init(void)
{
epi_port_init();
DeviceCode = read_reg(0x0000);
if (DeviceCode == 0x8999)
{
// power supply setting
// set R07h at 0021h (GON=1,DTE=0,D[1:0]=01)
write_reg(0x07,0x0021);
// set R00h at 0001h (OSCEN=1)
write_reg(0x00,0x0001);
// set R07h at 0023h (GON=1,DTE=0,D[1:0]=11)
write_reg(0x07,0x0023);
// set R10h at 0000h (Exit sleep mode)
write_reg(0x10,0x0000);
// Wait 30ms
delay(3000);
// set R07h at 0033h (GON=1,DTE=1,D[1:0]=11)
write_reg(0x07,0x0033);
// Entry mode setting (R11h)
// R11H Entry mode
// vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
// 0 1 1 0 0 0 0 0 0 1 1 1 * 0 0 0
write_reg(0x11,0x6070);
// LCD driver AC setting (R02h)
write_reg(0x02,0x0600);
// power control 1
// DCT3 DCT2 DCT1 DCT0 BT2 BT1 BT0 0 DC3 DC2 DC1 DC0 AP2 AP1 AP0 0
// 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0
// DCT[3:0] fosc/4 BT[2:0] DC{3:0] fosc/4
write_reg(0x03,0x0804);//0xA8A4
write_reg(0x0C,0x0000);//
write_reg(0x0D,0x080C);//
// power control 4
// 0 0 VCOMG VDV4 VDV3 VDV2 VDV1 VDV0 0 0 0 0 0 0 0 0
// 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0
write_reg(0x0E,0x2900);
write_reg(0x1E,0x00B8);
write_reg(0x01,0x2B3F);//驱动输出控制320*240 0x6B3F
write_reg(0x10,0x0000);
write_reg(0x05,0x0000);
write_reg(0x06,0x0000);
write_reg(0x16,0xEF1C);
write_reg(0x17,0x0003);
write_reg(0x07,0x0233);//0x0233
write_reg(0x0B,0x0000|(3<<6));
write_reg(0x0F,0x0000);//扫描开始地址
write_reg(0x41,0x0000);
write_reg(0x42,0x0000);
write_reg(0x48,0x0000);
write_reg(0x49,0x013F);
write_reg(0x4A,0x0000);
write_reg(0x4B,0x0000);
write_reg(0x44,0xEF00);
write_reg(0x45,0x0000);
write_reg(0x46,0x013F);
write_reg(0x30,0x0707);
write_reg(0x31,0x0204);
write_reg(0x32,0x0204);
write_reg(0x33,0x0502);
write_reg(0x34,0x0507);
write_reg(0x35,0x0204);
write_reg(0x36,0x0204);
write_reg(0x37,0x0502);
write_reg(0x3A,0x0302);
write_reg(0x3B,0x0302);
write_reg(0x23,0x0000);
write_reg(0x24,0x0000);
write_reg(0x25,0x8000); // 65hz
write_reg(0x4f,0); // 行首址0
write_reg(0x4e,0); // 列首址0
}
else
{
printf("LCD model is not recognized,DeviceCode = 0x%x!\r\n",DeviceCode);
return;
}
//数据总线测试,用于测试硬件连接是否正常.
lcd_data_bus_test();
lcd_clear(Red);
}
其他相关代码:
void write_cmd(unsigned short cmd)
{
RS_LOW();
LCD_ADDR = cmd;
}
unsigned short read_data(void)
{
unsigned short temp;
RS_HIGH();
temp = LCD_ADDR;
RS_LOW();
return temp;
}
void write_data(unsigned short data_code )
{
RS_HIGH();
LCD_ADDR = data_code;
RS_LOW();
}
void write_reg(unsigned char reg_addr,unsigned short reg_val)
{
write_cmd(reg_addr);
write_data(reg_val);
}
unsigned short read_reg(unsigned char reg_addr)
{
unsigned short val=0;
write_cmd(reg_addr);
val = read_data();
return (val);
}
void lcd_SetCursor(unsigned int x,unsigned int y)
{
// write_reg(32,x); /* 0-239 */
// write_reg(33,y); /* 0-319 */
write_reg(0x004e,x); /* 0-239 */
write_reg(0x004f,y); /* 0-319 */
}
/* 读取指定地址的GRAM */
static unsigned short lcd_read_gram(unsigned int x,unsigned int y)
{
unsigned short temp;
lcd_SetCursor(x,y);
rw_data_prepare();
/* dummy read */
temp = read_data();
temp = read_data();
return temp;
}
static void lcd_data_bus_test(void)
{
unsigned short temp1;
unsigned short temp2;
// /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
// write_reg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) );
/* wirte */
lcd_SetCursor(0,0);
rw_data_prepare();
write_data(0x5555);
lcd_SetCursor(1,0);
rw_data_prepare();
write_data(0xAAAA);
/* read */
lcd_SetCursor(0,0);
temp1 = lcd_read_gram(0,0);
temp2 = lcd_read_gram(1,0);
if( (temp1 == 0x5555) && (temp2 == 0xAAAA) )
{
printf(" data bus test pass!\r\n");
}
else
{
printf(" data bus test error: %04X %04X\r\n",temp1,temp2);
}
}
void lcd_clear(unsigned short Color)
{
unsigned int index=0;
lcd_SetCursor(0,0);
rw_data_prepare(); /* Prepare to write GRAM */
for (index=0; index<(LCD_WIDTH*LCD_HEIGHT); index++)
{
write_data(Color);
}
}
读取LCD DeviceCode没有问题,但是总线测试就不过了,不知道为何啊
很奇怪的是,不但读设备代码没有问题,执行LCD Clear的时候能把屏幕刷成指定的颜色,但是写RAM再读就不对 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|