首页>>论坛 >>技术社区 >>STM32社区ST MCU技术论坛 >>STM32
|
我要发帖  | 我要投票  | 我要回复  | 收藏
1

STM32的关于LCD例程的一些疑惑

STM32的关于LCD例程的一些疑惑
 

* Description        : This file includes the LCD driver for AM-240320L8TNQW00H
*                     (LCD_ILI9320) Liquid Crystal Display Module of STM3210E-EVAL
*                      board.
//////////////////////////////////////////////////////////////////////////////////////
/* Private typedef -----------------------------------------------------------*/
typedef struct
{
  vu16 LCD_REG;
  vu16 LCD_RAM;
} LCD_TypeDef;

/* LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 is used as ship select signal */
#define LCD_BASE    ((u32)(0x60000000 | 0x0C000000))
#define LCD         ((LCD_TypeDef *) LCD_BASE)
////////////////////////////////////////////////////////////////////////////////////////
 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
  /* Write 16-bit Index, then Write Reg */
  LCD->LCD_REG = LCD_Reg;
  /* Write 16-bit Reg */
  LCD->LCD_RAM = LCD_RegValue;
}
/////////////////////////////////////////////////////////////////////////////////////////
u16 LCD_ReadReg(u8 LCD_Reg)
{
  /* Write 16-bit Index (then Read Reg) */
  LCD->LCD_REG = LCD_Reg;
  /* Read 16-bit Reg */
  return (LCD->LCD_RAM);
}
/////////////////////////////////////////////////////////////////////////////////////////
void LCD_WriteRAM_Prepare(void)
{
  LCD->LCD_REG = R34;
}
/////////////////////////////////////////////////////////////////////////////////////////
void LCD_WriteRAM(u16 RGB_Code)
{
  /* Write 16-bit GRAM Reg */
  LCD->LCD_RAM = RGB_Code;
}

 这是例程里lcd.c里的一下底层函数的实现。在结构体里的定义:LCD_REG变量地址:0x6c000000;
LCD_RAM变量地址:0x6c000001,STM32的FSMC的地址引脚A0接LCD_ILI9320的RS(L:访问reg;H:访问ram) ,
通过给LCD_REG变量或LCD_RAM变量写数据来实现访问reg和ram,是这样理解的吗?
那么为什么在写LCD_ILI9320的寄存器时,函数 LCD_WriteReg(,)里对reg写操作:LCD->LCD_REG = LCD_Reg;先发送reg的编号,
再 LCD->LCD_RAM = LCD_RegValue; 为什么是对LCD_RAM赋值来实现发送reg需要修改的数据啊?不懂。
还有 LCD_ReadReg(u8 LCD_Reg)的读操作,
也不大明白,怎么实现的啊?

对LCD_ILI932里的reg,ram读写操作时,要给/WR(写入),/RD(读入) 信号的,在用FSMC模块时,程序里没涉及到这些读写信号啊?
高手指点下在下啊?FSMC控制LCD_ILI9320是个什么过程啊?小弟不胜感激!

之前发的那个帖子标题太长了,不方便回复,回复时,要把标题删短,所以再重发了,斑竹原谅偶啊…………

 
相关主题
回复 链接 收藏
 
RE:STM32的关于LCD例程的一些疑惑
 
这是microblaze控制12864的程序

#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xbasic_types.h"
#include "xstatus.h"
#include "xgpio.h"
#define CHANNEL 1

XGpio Lcd_Data,Lcd_Ctr;
Xuint8 table[]="timthorpe";
unsigned char number[]="0123456789";
/*******************************************************************/
/*延时time us*/
void delay(Xuint16 time)
{
Xuint16 i,j;
for(i=0;i
for(j=0;j<26;j++);
}
void delay_ms(Xuint16 time)
{
Xuint16 i,j;
for(i=0;i
for(j=0;j<3785;j++);
}
/*短延时time */
void delay_s(time)
{ Xuint8 i;
for(i=0;i
}
/*******************************************************************/
/*液?2864进行操作的一系列子函数 没什么可说的 按照时序图写褪橇?
/*******************************************************************/

Xint8 lcd_busy()
{
Xuint16 nTimeOut=0;

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);

XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);

XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);
delay(3);

XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0xffffffff);
while((XGpio_DiscreteRead(&Lcd_Data,CHANNEL)&0x80));

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
delay(1);

// xil_printf("the value of result is %x\r\n",result);

}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(Xuint8 cmd)
{
lcd_busy();
// delay_ms(20);


//delay(1);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
//delay(1);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);
//delay(1);

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
//delay(1);
// XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,cmd);

delay_ms(5);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);


delay_ms(5);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
delay(1);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);
// delay(1);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
//delay(1);

xil_printf("command %x\r\n",cmd);

}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(Xuint8 dat)
{
lcd_busy();
/* delay_ms(20);


//delay(1);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
//delay(100);
//delay(1);
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);

delay(5);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);
delay(5);
// XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
// delay(1);
//XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);
// delay(1);
//XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
// delay(1);
xil_printf("data %x\r\n",dat);
delay_ms(1);*/

// delay_ms(20);


//delay(1);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x1);
//delay(1);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x2);
//delay(1);

XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
//delay(1);
// XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
XGpio_DiscreteWrite(&Lcd_Data,CHANNEL,dat);

delay_ms(5);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x4);


delay_ms(5);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x4);
delay(1);
XGpio_DiscreteSet(&Lcd_Ctr,CHANNEL,0x2);
// delay(1);
XGpio_DiscreteClear(&Lcd_Ctr,CHANNEL,0x1);
//delay(1);

xil_printf("data %x\r\n",dat);
}
/******************************************************************
设置在液晶中显疚?
********************************************************************/
void lcd_pos(Xuint8 x,Xuint8 y)
{
Xuint8 pos;
if (x==0)
{x=0x80;}
else if (x==1)
{x=0x90;}
else if (x==2)
{x=0x88;}
else if (x==3)
{x=0x98;}
pos = x+y;
lcd_wcmd(pos); //显示地址

}
/*******************************************************************
在液晶中输出一串字?
********************************************************************
*/
void print_string(Xuint8 x,Xuint8 y,Xuint8 * str)
{
Xuint8 lcd_temp;
lcd_pos(x,y);
lcd_temp=*str;
while(lcd_temp != '\0')
{
lcd_wdat(lcd_temp);
lcd_temp=*(++str);

}
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{ delay_ms(50);
lcd_wcmd(0x30); //基本指令
delay(1500);
lcd_wcmd(0x30); //基本指令操作
delay(400);

lcd_wcmd(0x0F); //显示开,关?
delay(1500);
lcd_wcmd(0x01); //清除LCD的允灸谌?
delay_ms(15);







xil_printf("lcd initialization done!\n\r");
}

//********************************************上述为对液晶的操作
int main(void){
Xuint8 result;

xil_printf("now begin\r\n");
XGpio_Initialize(&Lcd_Data,XPAR_LCD_DATA_DEVICE_ID);
XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
//XGpio_SetDataDirection(&Lcd_Data,CHANNEL,0x0);
XGpio_Initialize(&Lcd_Ctr,XPAR_LCD_CTR_DEVICE_ID);
XGpio_SetDataDirection(&Lcd_Ctr,CHANNEL,0x0);

lcd_init();

lcd_pos(1,3);
lcd_wdat(0x35);
/*delay_ms(10000);
lcd_wcmd(0x87);
lcd_wdat(0x2F);

delay_ms(10000);
print_string(2,0,number);
delay_ms(10000);
lcd_wcmd(0x01);*/
while(1);

return 0;


}


 
回复 链接 收藏
 
回复:STM32的关于LCD例程的一些疑惑
 

我也想问这个问题,我没看出来,如果我改了LCD连线,该怎么改程序?

 
回复 链接 收藏
 
我要发帖  | 我要投票  | 我要回复  | 收藏
1