文章目錄
前言
一、工具準(zhǔn)備
工具一:51單片機(jī)
工具二:LCD1602液晶顯示屏
工具三:Keil軟件
二、開始操作
1.LCD1602的程序調(diào)試
2.矩陣鍵盤的程序調(diào)試
3.密碼鎖程序設(shè)計(jì)
總結(jié)
前言
51單片機(jī)是一種8位的可編程控制元件,廣泛應(yīng)用于各種工業(yè)生產(chǎn)、家電中。51單片機(jī)的廠家有很多,如Inter(英特爾)、Atmel(艾特梅爾)等公司,本次實(shí)驗(yàn)所使用的是宏晶公司的STC89C52RC型號的單片機(jī),此公司的其它型號單片機(jī)還有STC90C51、STC11系列、STC15系列、STC8系列等。??
LCD1602液晶顯示器是廣泛使用的一種字符型液晶顯示模塊。它是由字符型液晶顯示屏(LCD)、控制驅(qū)動主電路HD44780及其擴(kuò)展驅(qū)動電路HD44100,以及少量電阻、電容元件和結(jié)構(gòu)件等裝配在PCB板上而組成。更多詳細(xì)介紹在此不多言,請移步百度百科:LCD1602詳情
一、工具準(zhǔn)備
工具一:51單片機(jī)
我使用的是 STC89C52型號的,其它類型的單片機(jī)都行,但是要注意其引腳的分布、I/O口類型,還有在燒錄程序時(shí)注意更改單片機(jī)的型號。
工具二:LCD1602液晶顯示屏
?購買單片機(jī)時(shí),這個(gè)模塊應(yīng)該是贈送的,也可以單買。這里提一下LCD1602的控制指令,后面顯示屏的初始化、寫/讀操作等需要用到。
LCD1602控制指令?
?常用的指令碼有:
?? 0x38:設(shè)置16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
?? 0x0C:設(shè)置開顯示,不顯示光標(biāo)
?? 0x06:寫一個(gè)字符后地址指針加1
?? 0x01:顯示清0,數(shù)據(jù)指針清0
?? 0x80:LCD第一行的起始地址
?? 0x80+0x40:LCD第二行的起始地址
工具三:Keil軟件
?Keil是一款專業(yè)實(shí)用的c語言軟件開發(fā)系統(tǒng),提供編譯器、編譯器、安裝包和調(diào)試跟蹤等功能。我使用的是Keil5,文末有網(wǎng)盤鏈接,也可以去官網(wǎng)下載:Keil5軟件
二、開始操作
1.LCD1602的程序調(diào)試
?調(diào)試前先找到單片機(jī)開發(fā)板的原理圖,查看顯示屏的引腳。
由于調(diào)試的代碼過長,所以放入網(wǎng)盤里了,有需要的可參考。這里面的幾個(gè)調(diào)試函數(shù)說明一下:
ShowChar(); |
顯示一個(gè)字符 |
ShowString( ); |
顯示字符串 |
ShowNum( ); |
顯示十進(jìn)制數(shù)字 |
ShowSignedNum( ); |
顯示有符號十進(jìn)制數(shù)字 |
ShowHexNum( ); |
顯示十六進(jìn)制數(shù)字 |
ShowBinNum( ); |
顯示二進(jìn)制數(shù)字 |
調(diào)試完后可以驗(yàn)證一下程序,調(diào)試中LED和數(shù)碼管可能會亂閃,這是由于引腳沖突造成的。
2.矩陣鍵盤的程序調(diào)試
我們先來了解一下矩陣鍵盤的接線原理。
為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如51單片機(jī)的4X4的矩陣鍵盤,用8個(gè)引腳控制16個(gè)開關(guān)按鍵。這樣連接后可采用逐行或逐列的“掃描”方式,就可以讀出任何位置按鍵的狀態(tài)。?
例如,如果我們將引腳P1.3置為0(低電位),其他引腳置為1(高電位),當(dāng)按下按鍵S1時(shí),引腳P1.7就會變?yōu)?(低電位);反之亦然,如果P1.6引腳變?yōu)榱?,那么我們就知道按鍵S5被按下了。又由于51的I/O口屬于“弱提強(qiáng)拉”型,故這樣的電位設(shè)置是可靠的。
?了解矩陣鍵盤的工作原理后,使用編程來實(shí)現(xiàn),代碼如下:
#include <reg51.h>
#include "Delay.h"
/*引腳配置*/
sbit FirLine = P1^3;
sbit ScoLine = P1^2;
sbit ThrLine = P1^1;
sbit ForLine = P1^0;
sbit FirRow = P1^7;
sbit ScoRow = P1^6;
sbit ThrRow = P1^5;
sbit ForRow = P1^4;
/**
* @brief 矩陣鍵盤按鍵碼讀取
* @param 無
* @retval KeyNum 按下按鍵的鍵碼值
如果按下不松手,不會跳出此函數(shù)
*/
unsigned char MatrixKey()
{
unsigned char KeyNum = 0;
/*按列掃描矩陣鍵盤*/
P1 = 0xFF;
FirLine = 0;
if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 1;}
if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 5;}
if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 9;}
if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 13;}
P1 = 0xFF;
ScoLine = 0;
if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 2;}
if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 6;}
if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 10;}
if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 14;}
P1 = 0xFF;
ThrLine = 0;
if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 3;}
if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 7;}
if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 11;}
if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 15;}
P1 = 0xFF;
ForLine = 0;
if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 4;}
if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 8;}
if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 12;}
if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 16;}
return KeyNum;
}
?其中的延時(shí)函數(shù)Delay()為:
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
3.密碼鎖程序設(shè)計(jì)
完成LCD1602液晶顯示屏和矩陣鍵盤的調(diào)試之后,就可以將這兩個(gè)模塊合在一起開發(fā)新的內(nèi)容了,密碼鎖只是其中的一個(gè)小應(yīng)用而已,你還可以使用這兩個(gè)工具做更多好玩的內(nèi)容,做一個(gè)簡易的計(jì)算器?做一個(gè)實(shí)時(shí)日歷放在實(shí)驗(yàn)室?還可以用來顯示其他模塊的數(shù)據(jù),比如測距儀、測溫儀等。
話不多說,言歸正傳,進(jìn)入咱們的主題。
按鍵功能描述:?
有效按鍵范圍:S1~S12
S10~S9:對應(yīng)數(shù)字1~9
S11:刪除當(dāng)前輸入的數(shù)字,并向前移一位
S12:確認(rèn)鍵
#include <string.h>
#include <regx51.h>
#include "LCD1602.h"
#include "MatrixKey.h"
#include "Delay.h"
unsigned char KeyNum = 0;
unsigned char password[] = {5,2,0,1,3,1,4}; //正確密碼
void main()
{
unsigned int i = 1, j = 0, sigl = 0;
unsigned int In_password[6] = {0};
Outset:
init_lcd(); //LCD初始化
ShowString(1,1,"PassWord");
while(1)
{
KeyNum = MatrixKey();
while(KeyNum && i <= 6)
{
if(KeyNum > 10) goto Other_Operation;
else
{
In_password[i-1] = KeyNum % 10;
ShowNum(2,i,In_password[i-1],1);
}
i++;
KeyNum = 0;
}
Other_Operation:
/*每按下一次11鍵,刪除最后一個(gè)數(shù)字*/
if(KeyNum == 11)
{
ShowNum(2,i-1,0);
In_password[i-2] = 0;
i--;
}
/*按下確認(rèn)鍵12,并且輸入滿6個(gè)數(shù)字,判斷輸入密碼正確性*/
else if(KeyNum == 12)
{
for(j = 0; j < 6; j++)
{
if(In_password[i] == password[i]) sigl = 0;
else
{
sigl = 1; break;
}
}
if(sigl == 1)
{
ShowString(2,1,"error!");
i = 1;goto Outset;
}
else ShowString(2,1,"congratualtion");
}
}
}
?密碼正確效果圖:
總結(jié)
單片機(jī)的學(xué)習(xí)是枯燥的,也是深動有趣的,愿每一位未來的嵌入工程師們都能步步攀登,學(xué)有所成!文章來源:http://www.zghlxwxcb.cn/news/detail-408542.html
更新網(wǎng)盤鏈接:鏈接:https://pan.baidu.com/s/1z1799sJuVa56NPQCYWHjAA?
提取碼:kq3o文章來源地址http://www.zghlxwxcb.cn/news/detail-408542.html
到了這里,關(guān)于使用51單片機(jī)的矩陣鍵盤和LCD1602做一個(gè)密碼鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!