記事ディレクトリ
序文
相关说明:
開発ボード: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);
}
}
要約する
以上がすべての内容ですので、誤りがございましたら、批判・訂正をお願いします。