?主函數(shù)部分,其中的LCD1602.h的頭文件是在嗶哩嗶哩江科大自化協(xié)的博主的視頻資料
#include <REGX51.H>
#include"LCD1602.h"
void Delay(int time)
unsigned char test(void);
unsigned char keynumber;
//int keynumber;
void main(void)
{
keynumber = 0;
LCD_Init();
LCD_ShowString(1,1,"Hello,World!");
while(1)
{
keynumber = test();//獲取按下的按鍵數(shù)字
if(keynumber)
{
LCD_ShowNum(2,1,keynumber,2);
}
}
}
void Delay(int time) //延時函數(shù)(單位 毫秒)1 秒 = 1 毫秒
{
unsigned char i, j;
time = 2;//偷懶,就不需要一個一個的將20改為2了
i = 2;
j = 199;
while(time--)
{
do
{
while (--j);
} while (--i);
}
}
unsigned char test(void)
{
//while(1)
{
unsigned char Keynumber;
Keynumber = 0;
P0 = 0xFF;
P0_4 = 0;//第一列置0
//檢測行
if(P0_0 == 0)
{
Delay(1);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(1);//再次消抖
Keynumber = 1;
}
//return Keynumber;
if(P0_1 == 0)
{
Delay(1);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(1);//再次消抖
Keynumber = 5;
}
if(P0_2 == 0)
{
Delay(1);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(1);//再次消抖
Keynumber = 9;
}
if(P0_3 == 0)
{
Delay(1);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(1);//再次消抖
Keynumber = 13;
}
//第一列檢測完成
//檢測第二列
P0 = 0xFF;
P0_5 = 0;//第二列置0
//檢測行
if(P0_0 == 0)
{
Delay(1);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(1);//再次消抖
Keynumber = 2;
}
if(P0_1 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 6;
}
if(P0_2 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 10;
}
if(P0_3 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 14;
}
//第二列檢測完成
//檢測第三列
P0 = 0xFF;
P0_6 = 0;//第三列置0
//檢測行
if(P0_0 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 3;
}
if(P0_1 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 7;
}
if(P0_2 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 11;
}
if(P0_3 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 15;
}
//第三列檢測完成
//檢測第四列
P0 = 0xFF;
P0_7 = 0;//第四列置0
//檢測行
if(P0_0 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 4;
}
if(P0_1 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 8;
}
if(P0_2 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 12;
}
if(P0_3 == 0)
{
Delay(20);//消抖
while(P0_0 == 0)//檢測按鍵是否還是按下狀態(tài)
{
}//松手后跳出
Delay(20);//再次消抖
Keynumber = 16;
}
return Keynumber;
}
}
總結(jié):
? ? 首先是我學(xué)習(xí)時遇到的問題:
在我一開始運行的時候出現(xiàn)的問題就是,一開始在給主函數(shù)的keynumber賦值的時候,等號的左值是叫做Matrixkey的函數(shù),當(dāng)我按下1按鍵時顯示屏顯示01,但是當(dāng)我按下其他按鍵時,顯示屏沒有任何反應(yīng),一開始我也不明白是哪里錯了,然后我重新創(chuàng)建了一個新的函數(shù)test,目的是將Matrixkey函數(shù)分成小部分,即按照一個按鍵的一個按鍵的逐一搬運到test函數(shù),搬運第一個按鍵的時候就直接燒錄,然后測試是哪一部分出的問題,我先搬運的是1和2,都沒問題,于是我直接搬運了一整行,發(fā)現(xiàn)仍然沒問題,直到我開始搬運第二行,有問題了,就是按下第一個,然后很快的就按下第二行的某個按鍵的時候,第二個數(shù)字沒有馬上顯示,而是間隔了一段相對長的時間,當(dāng)時想的是沒出錯就行,于是就繼續(xù)做cv的工作,全部搬運完開始運行時,出現(xiàn)第二個問題,亂碼,我當(dāng)時想到的是延時的問題,于是就把延時的次數(shù)改成了time = 2,因此我的主函數(shù)雖然還是20,但是因為我偷懶,還是直接在Delay的內(nèi)部給time賦值為2,然后問題就解決了,所以大概率是因為,按下第一個按鍵,再按下第二個按鍵后,第一個按鍵顯示還沒結(jié)束,就顯示了第二個
? ? 其次是我后面通過矩陣掃面明白的一個問題:
就是為什么這里在掃描時是將全部io口置1,然后在將要掃描的行置0,而不是前者置0后者置1,當(dāng)然兩種方法在做簡單的程序的時候都是可行的,但是第一種更準(zhǔn)確,51單片機(jī)的io口是雙向輸出輸入的模式,采用的是若上拉輸出(當(dāng)輸出的是高電平時,能夠輸出的電流很小,很容易被別的強(qiáng)下拉拉低),假設(shè)下列情況:
?
情況一:
將所有io口置0,然后將要檢測行置1,若按下按鍵1,有可能被置1的行會被拉低為0,所有的io口又變?yōu)榱?,那就檢測不到了,這是我個人的看法
情況二:文章來源:http://www.zghlxwxcb.cn/news/detail-513820.html
將所有io口置1,然后將要檢測行置0,若按下按鍵1,也不易改變輸出電平,檢測更為準(zhǔn)確文章來源地址http://www.zghlxwxcb.cn/news/detail-513820.html
到了這里,關(guān)于矩陣鍵盤控制LCD1602顯示屏顯示數(shù)字的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!