ILI93xx屏幕座標系及掃描方式配置(LCD學習筆記1)

前言

  1. 博文基於STM32F103ZET6,MDK和3.5.0標準庫開發
  2. 如有不足之處,多指教

屏幕座標系(呵呵,我自己給取的名字)

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
R50h~R53h:水平垂直RAM地址位置;用來設定整個屏幕上的顯示區域;
R50h(HSA[7:0]):水平起始地址寄存器;
R51h(HEA[7:0]):水平結束地址寄存器;
R52h(VSA[7:0]):垂直起始地址寄存器;
R53h(VEA[7:0]):垂直結束地址寄存器;

座標系參數: 從上面的圖片中和英文中可以瞭解,LCD屏幕上的每個像素點所對應GRAM顯存單元是不能改變的,LCD屏幕默認爲以人們習慣的豎屏方式的模板,以左上角點爲座標系原點,有方向爲水平方向,下方向爲垂直方向;如下圖:
在這裏插入圖片描述
特點:

  1. 每個像素點對應的座標是確定的,不會隨豎屏/橫屏模式的改變而改變,也不會隨屏幕像素點掃描方式的改變而改變;
  2. 在程序的開始需要對以上四個寄存器進行配置,一般情況下都是全屏使用;當然後期如果需要更改顯示區域大小,那就必須修改這四個寄存器的值了;比如開窗函數就是用來配置這四個寄存器;

8種掃描方式

8中掃描方式
在這裏插入圖片描述
配置用的寄存器
在這裏插入圖片描述
AM: GRAM更新方向控制位;可以理解爲可以決定我們平時說的橫屏還是豎屏;
0:地址水平更新掃描;(橫屏模式)
1:地址垂直更新掃描;(豎屏模式)
當屏幕上所要打開的窗口被R50h~R53h寄存器配置結束後,GRAM範圍根據I/D[1:0]和AM的配置更新掃描;
I/D: 地址計數器自增自減控制位;

值得注意的是: 上面截圖中的掃描圖片水平方向比垂直方向要寬,這很容易讓人產生誤解;

部分代碼例程

/*lcd.h*/
/*屏幕掃描方向配置*/
typedef enum 
{
/*豎屏模式*/
	L2R_U2D = 0, //從左到右,從上到下
	L2R_D2U = 1, //從左到右,從下到上
	R2L_U2D = 2, //從右到左,從上到下
	R2L_D2U = 3, //從右到左,從下到上
/*橫屏模式*/
	U2D_L2R = 4, //從上到下,從左到右
	U2D_R2L = 5, //從上到下,從右到左
	D2U_L2R = 6, //從下到上,從左到右
	D2U_R2L = 7, //從下到上,從右到左	 
}LCD_Scan_Direction;

/*lcd.c*/
//開窗(LCD全屏)
	LCD_WR_REG_Data(Horizontal_Address_Start_Position,0x0000);
	LCD_WR_REG_Data(Horizontal_Address_End_Position,0x00EF);
  	LCD_WR_REG_Data(Vertical_Address_Start_Position,0x0000);
	LCD_WR_REG_Data(Vertical_Address_End_Position,0x013F);

/*設置屏幕掃描方向*/
void LCD_Scan_Dir_Config(uint8_t Scan_Direction)
{
	uint16_t Reg_Value;
	switch(Scan_Direction)
		{
			case L2R_U2D://從左到右,從上到下
				Reg_Value|=(1<<5)|(1<<4)|(0<<3); 
				break;
			case L2R_D2U://從左到右,從下到上
				Reg_Value|=(0<<5)|(1<<4)|(0<<3); 
				break;
			case R2L_U2D://從右到左,從上到下
				Reg_Value|=(1<<5)|(0<<4)|(0<<3);
				break;
			case R2L_D2U://從右到左,從下到上
				Reg_Value|=(0<<5)|(0<<4)|(0<<3); 
				break;	 
			case U2D_L2R://從上到下,從左到右
				Reg_Value|=(1<<5)|(1<<4)|(1<<3); 
				break;
			case U2D_R2L://從上到下,從右到左
				Reg_Value|=(1<<5)|(0<<4)|(1<<3); 
				break;
			case D2U_L2R://從下到上,從左到右
				Reg_Value|=(0<<5)|(1<<4)|(1<<3); 
				break;
			case D2U_R2L://從下到上,從右到左
				Reg_Value|=(0<<5)|(0<<4)|(1<<3); 
				break;	 
		}

			Reg_Value |= 1<<12; 			//Entry_Mode寄存器中的AM和I/D[1:0]共同控制掃描方向
			LCD_WR_REG_Data(Entry_Mode,Reg_Value);	//寫入ILI93xx寄存器;
		
}

注意: 每一種掃描方式的起始座標都不同,這個一點在轉換掃描方式的時候一定要注意,如果不注意會引起屏幕邊緣顯示錯行或者缺失;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章