LCD1602的使用
首先LCD1602是外接在開發板上的液晶屏外設,如圖所示:

我們主要使用它來代替動態數碼管進行顯示,因此使用的原理我們可以先略過,而控制它可以使用b站up主提供的驅動程序,即我們只需調用第三方庫即可實現對LCD1602的控制了。
(b站對應視頻鏈接:https://www.bilibili.com/video/BV1Mb411e7re,可以在視頻下方找到對應的驅動程序資源)
up主提供的驅動程序包括以下的接口:
在使用LCD進行顯示之前我們需要先使用LCD_Init()
進行初始化,然后如上圖所示,我們可以使用LCD來顯示字符、字符串、數字的二進制顯示、十六進制顯示等等。
因此我們先打印一下遲來的“Hello World”。
int main() {
LCD_Init();
LCD_ShowString(1,1,"Hello World");
while (1);
}
運行結果:

矩陣鍵盤的使用
矩陣鍵盤相關電路圖

按鍵檢測掃描
在默認沒有按鍵按下的情況下P1的7個引腳都會是高電平,這樣假設P1[3...0]=0b1110,即使P1^0
置為0,此時S4,S8,S12,S16的右邊一端的電位都會變成0,此時若我們單擊S4按鈕,則S4所連接的另一端P1^7
的電位也會變為0,此時即可判斷S4按鈕被按下了。因此我們的掃描過程可以描述如下:
for lowPart in [0111, 1011, 1101, 1110]:
P1的低四位 = lowPart
for i=1 to 4:
if P1的第i位(從左到右數)為 0:
此時即可判斷是某按鍵按下,進行相應的操作
因此代碼實現為:
u8 MatrixKey() {
u8 keyNum = 0;
u8 i,j;
u8 highCheck;
for(j=0;j<4;j++) {
P1 = 0xff;
// 設置P1的低4位
P1 &= ~(0x08>>j);
highCheck = 0x80; //1000 0000
for(i=0;i<4;i++) {
// 檢查高4位有沒有0,若有則說明按鍵按下
if ((highCheck & P1) ==0) {
deley(1000);
while ((highCheck & P1) ==0);
deley(1000);
keyNum = i*4+j+1;
}
highCheck>>=1;
}
}
return keyNum;
}
這樣當我們按動某個按鍵時就會返回對應的按鍵編號了。
制作密碼輸入器
#define BACKSPACE 15
#define REINPUT 16
int main() {
char passWord[20];
u8 i=0;
LCD_Init();
passWord[0] = '\0';
LCD_ShowString(1,1,passWord);
while (1) {
u8 res = MatrixKey();
if (res!=0) {
if (res == REINPUT) {
// 若為按鍵16則代表清空並重新輸入
LCD_Init();
passWord[0] = '\0';
i=0;
}
else if(res == BACKSPACE) {
// 若為按鍵15則代表刪除最后一個字符,即退格
LCD_ShowString(1,i," ");
i--;
passWord[i] = '\0';
}
else {
// 其余情況則添加一個字符並顯示出來
passWord[i++]=res+'0';
passWord[i] = '\0';
LCD_ShowString(1,1,passWord);
}
}
}
}
運行效果: