STM32LCD--HALライブラリに基づく(強調表示を選択しますか?強調表示の操作方法を理解するための1つの記事)


序文

相关说明:

開発ボード:CT117E-M4(STM32G431RBブルーブリッジカップ埋め込み競技ボード)
開発環境:CubeMX + Keil5
6回目から12回目の州大会では、ハイライト表示が4回、つまり6回目、7回目、9回目、10回目、11回目で検査されました。また、12回目のセッションでは検査が行われず、今年の検査の可能性はまだ比較的高いです。


说明:

1.LCDの座標

このLCDの座標を読み取る方法は?下の図に示すように、マイクロコントローラーを時計回りに90度回転させます。右下隅が原点、Y軸の正の方向が上、X軸の正の方向が左です。
ここに画像の説明を挿入

この座標はどのように決定されますか?

(少し時間がかかります。気にしない場合は、この部分をスキップできます...)

X軸

強調表示されたコード行などのコードから分析しました。実装されている関数は、0行目にスペース文字列を表示することです。
ここに画像の説明を挿入F12をクリックして関数の内部を確認し、強調表示されたコードに注意して、F12を続行します。
ここに画像の説明を挿入
F12に進みます。
ここに画像の説明を挿入ここで、上の図で渡される最初のパラメーターは線(線)であり、下のXpos(X軸座標)になります。つまり、線が変わるとX座標も変わり、X座標が行の表示
ここに画像の説明を挿入X軸の正の方向はどのように決定されますか?関数を呼び出すときにLine0〜Line9を使用します。
ここに画像の説明を挿入Line0までマウスをクリックし、F12を押します。Line0からLine9に向かって、値が24ずつ増加していることがわかります。これは、X軸座標の正の方向が左にあり、文字の高さが24であることを意味します。
ここに画像の説明を挿入

Y軸

または、このコード行、F12を入力します。
ここに画像の説明を挿入その中に変数refcolumnがあります。上の写真によると、この変数がパラメーターとして渡され、最終的にYpos(Y軸座標)になることがわかります。ptrは文字列ポインタであり、ループするたびにptrは1ずつ増加します(次の文字を指す)ので、ライン表示機能は実際には左から右に1文字ずつ表示します(LCDはそれ自体に面します)。Y座標制御列の表示を決定できます
ここに画像の説明を挿入
Y軸の正の方向はどのように決定されますか?refcolumnの値の変化を見て、左から右に表示すると、refcolumnは毎回16ずつ減少するため、Y-の正の方向は次のように結論付けられます。軸は上向きで、各文字の幅は16です。
ここに画像の説明を挿入

2.ハイライトタイプ

(以下の垂直方向と水平方向は、LCDが正面を向いている場合です。)強調表示には、主に2つ
ここに画像の説明を挿入
のタイプがあります。1。水平選択強調表示(時間などの同じ行のデータ) 2。垂直選択強調表示(データ別の行で)

この2種類のハイライトは、座標に応じて操作されます。垂直方向にハイライトを選択するとX座標が変更され、水平方向にハイライトを選択するとY座標が変更されます。各文字の高さは24、幅は16、および上から下へのX座標増分(Line0〜Line9)、左から右へのY座標の減少(320〜0)。

3.いくつかの実際の質問の分析

その中で、6番目と9番目の試験は水平選択のハイライトです。
ここに画像の説明を挿入ここに画像の説明を挿入
7番目と10番目の試験は、垂直選択のハイライトです。

ここに画像の説明を挿入ここに画像の説明を挿入

4.選択したデータを強調表示する方法

上の写真からわかるように、データ切り替えの選択はキーによって制御されるため、最初にキーの押下を検出するキースキャン機能があり、次にキーの押下を検出した後に現在の座標値を変更します(垂直:変更X座標、横方向:Y座標を変更)、現在の座標値に従って選択したデータを強調表示し(強調表示を選択)、前のデータを復元(表示を復元)、選択した強調表示、および復元表示は両方ともLCD更新操作です。

LCDアップデート表示4つのステップに分けることができます

元の色構成が白地に青の場合。

LCD_SetBackColor(White);//原色为白底蓝字
LCD_SetTextColor(Blue);

1.
を変更します。つまり、次にLCDに表示されるコンテンツの背景色とフォント色を変更します。ここで強調表示されている色は、白の背景の青から青の背景の白への色の反転のみです。

/* 颜色高亮 */
LCD_SetBackColor(Blue);//颜色翻转(高亮)
LCD_SetTextColor(White);

2.選択した
データを再表示する色を変更した後、選択したデータを再表示して、選択した強調表示を実現します。

3.色の復元色の
復元とは、LCDディスプレイの色を元の背景色とフォントの色に戻すことです。

/* 颜色恢复 */
LCD_SetBackColor(White);//原色为白底蓝字
LCD_SetTextColor(Blue);

4.前のデータ
を再表示する選択したデータを変更した後、前のデータの色を復元する必要があります。
特殊なケース:垂直方向の選択が強調表示されると、最初の行が強調表示された後、それが復元される最後の行になります。水平方向の選択が強調表示されると、最初のデータが強調表示された後、復元される最後のデータが表示されます。

5、コード分析

上記の4つのポイントを組み合わせて、強調表示されたコードを垂直方向に選択するなど、コードを詳細に分析しましょう(7番目のセッション)

const uint8_t line_step=24*2;  //数据间的间隔为两行,line_now加line_step即为下一数据对应的坐标
const uint8_t line_beg=Line4;  //起始行为第四行
const uint8_t line_end=Line8;  //末尾行为第八行
uint8_t line_now=line_beg;	   //当前行对应坐标

void Line_change()//LCD更新显示
{
    
    
	char str1[30];//用于存储当前行显示数据
	char str2[30];//用于存储上一行显示数据
	switch(line_now)//用switch判断当前是哪一行数据
	{
    
    
		case line_beg+0*line_step: //当前行坐标(X坐标)为第一数据坐标
			sprintf(str1,"  Threshold 1:%dcm  ",Threshold_1);//当前行
			sprintf(str2,"  Threshold 3:%dcm  ",Threshold_3);//上一行
			break;
		
		case line_beg+1*line_step: //当前行坐标为第二数据坐标
			sprintf(str1,"  Threshold 2:%dcm  ",Threshold_2);
			sprintf(str2,"  Threshold 1:%dcm  ",Threshold_1);
			break;

		case line_beg+2*line_step: //当前行坐标为第三数据坐标
			sprintf(str1,"  Threshold 3:%dcm  ",Threshold_3);
			sprintf(str2,"  Threshold 2:%dcm  ",Threshold_2);
			break;
	}
	
	/*高亮显示*/
	LCD_SetBackColor(White);//颜色反转
	LCD_SetTextColor(Black);
	LCD_DisplayStringLine(line_now,(unsigned char*)str1);//当前行高亮
	
	/*恢复显示*/
	LCD_SetBackColor(Black);//颜色换回来
	LCD_SetTextColor(White);
	if(line_now==line_beg)//第一行的上一行为最后一行
		LCD_DisplayStringLine(line_end,(unsigned char*)str2);//上一行恢复
	else
		LCD_DisplayStringLine(line_now-line_step,(unsigned char*)str2);	
}

水平方向に選択されたハイライトコード(6番目)LCD_DisplayChar
関数は、水平方向の選択と強調表示に使用されます(行の一部の列の表示のみを更新します)。この関数を呼び出すと、対応する文字が渡された座標に表示されます。関数の最初のパラメーターはX座標(行番号)、2番目のパラメーターはY座標3番目のパラメーターは表示される文字のASCIIコードであるため、数値を表示する場合は、数値に基づいて+48にする必要があります。つまり、数値に対応するASCIIコードです。

const uint16_t Ypos_end=8*16;	//初始Y坐标 对应时间第一位数据
const uint16_t Ypos_beg=14*16;	//末尾Y坐标 对应时间最后一位数据
const uint8_t Ypos_step=16;		//每个字符间Y坐标差值		
uint16_t Ypos_now=14*16;		//当前Y坐标 初始为第一位数据

const uint8_t hour=Ypos_beg-0*Ypos_step;//小时十位对应Y坐标 数据间间隔三个单位长度 如10:20:00 数字1和数字2的Y坐标差值为16*3
const uint8_t min=Ypos_beg-3*Ypos_step;	//分钟十位对应Y坐标 注意是减
const uint8_t sec=Ypos_beg-6*Ypos_step;	//秒十位对应Y坐标

void Sel_change(uint16_t Ypos)//切换选择 参数为当前Y坐标
{
    
    
	char dex1;//当前数据在数组中的下标 小时--0  分钟--1  秒--2
	char dex2;//上一数据在数组中的下标
	switch(Ypos)//用switch判断当前Y坐标值
	{
    
    
		case hour://当前Y坐标值为小时对应的Y坐标值
			dex1=0; //当前数据下标为0 下同
			dex2=2;//上一数据下标为2
			break;
		
		case min://当前Y坐标值为分钟对应的Y坐标值
			dex1=1; 
			dex2=0;
			break;
		
		case sec://当前Y坐标值为秒对应的Y坐标值
			dex1=2; 
			dex2=1;
			break;
	}
	
	/*选中高亮*/
	LCD_SetBackColor(Blue);//颜色反转
	LCD_SetTextColor(White);
	LCD_DisplayChar(Line6,Ypos-0*Ypos_step,T[dex1]/10+48);//这里要注意函数第一个参数为X坐标(行号),第二个参数为Y坐标,第三个参数为要显示字符的ASCII码,所以要显示数字的话就得在数字的基础上+48,即为该数字对应的ASCII码
	LCD_DisplayChar(Line6,Ypos-1*Ypos_step,T[dex1]%10+48);//T[dex1]存储的是小时的数据,T[dex1]/10就是小时的十位,T[dex1]%10就是小时的个位,再将两个数字显示在相邻的列,下同。
	
	/*恢复显示*/
	LCD_SetBackColor(White);//颜色改回来
	LCD_SetTextColor(Blue);
	if(Ypos==Ypos_beg)//如果当前为小时 则上一个数据为秒
	{
    
    
		LCD_DisplayChar(Line6,Ypos-6*Ypos_step,T[dex2]/10+48);
		LCD_DisplayChar(Line6,Ypos-7*Ypos_step,T[dex2]%10+48);
	}
	else
	{
    
    
		LCD_DisplayChar(Line6,Ypos+3*Ypos_step,T[dex2]/10+48);
		LCD_DisplayChar(Line6,Ypos+2*Ypos_step,T[dex2]%10+48);
	}
}


要約する

以上がすべての内容ですので、誤りがございましたら、批判・訂正をお願いします。

おすすめ

転載: blog.csdn.net/Octopus1633/article/details/124013392