今天,給大家分享的是自己弄著玩的一個矩陣鍵盤控制控制舵機模擬一個智能門鎖的功能。
用到的硬件:
開發(fā)板我用的是原子哥的精英板(殺雞用宰牛刀了)。
矩陣鍵盤(寶上十幾塊買的):
外加一個舵機和一個0.96的oled顯示屏。
矩陣鍵盤:有VCC,GND,SCL,SDO四條線,這個矩陣鍵盤的驅(qū)動原理和i2c類似,
從SDO發(fā)送一個100微秒的高電平為讀取信號,讀取數(shù)據(jù)的流程為:
? ? 1.SDO設(shè)置為輸出模式
? ? 2.SDO拉高
? ? 3.延時100微秒
? ? 4.SDO拉低
? ? 5.SDO設(shè)置為輸入模式
接下來就會接收一個16位的數(shù)據(jù),上代碼:
u16 TOUCHKEY_READ(void)
{
u8 i;
u16 re_val=0;
SDO_OUT();//設(shè)置sdo為輸出
SD0_Set(1);//sdo拉高
delay_us(100);
SD0_Set(0);//sd0拉低
SDO_IN();//設(shè)置sdo為輸入
for(i=0;i<16;i++)
{
SCL_Set(1);//拉高scl
delay_us(200);
SCL_Set(0);//拉低scl
if(Read_SDO)//讀SDO是否為高
{
re_val |=(1<<i);//為真就把1向左移i位與re_val做或運算
}
}
delay_ms(2);
return re_val;
}
這是我配置的.h文件配合上面一起看
#define SCL_Set(EN) (EN)? GPIO_SetBits(GPIOB,GPIO_Pin_6):GPIO_ResetBits(GPIOB,GPIO_Pin_6)//問號表達式 EN值位真就執(zhí)行前面 為假相反
#define SD0_Set(EN) (EN)? GPIO_SetBits(GPIOB,GPIO_Pin_7):GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define Read_SDO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)//讀取輸入的數(shù)據(jù)
//IO 方向設(shè)置
#define SDO_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDO_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
然后就是數(shù)據(jù)的處理,我自己寫的數(shù)據(jù)處理老是有點小毛病,是在網(wǎng)上找的:
u8 Get_KeyNum(void)
{
u8 key_num;
NowKeyNum=TOUCHKEY_READ();
if((NowKeyNum & 0x0001)&& !(PreKeyNum & 0x0001))
{
key_num='1';
}
if((NowKeyNum & 0x0002)&& !(PreKeyNum & 0x0002))
{
key_num='2';
}
if((NowKeyNum & 0x0004)&& !(PreKeyNum & 0x0004))
{
key_num='3';
}
if((NowKeyNum & 0x0008)&& !(PreKeyNum & 0x0008))
{
key_num='A';
}
if((NowKeyNum & 0x0010)&& !(PreKeyNum & 0x0010))
{
key_num='4';
}
if((NowKeyNum & 0x0020)&& !(PreKeyNum & 0x0020))
{
key_num='5';
}
if((NowKeyNum & 0x0040)&& !(PreKeyNum & 0x0040))
{
key_num='6';
}
if((NowKeyNum & 0x0080)&& !(PreKeyNum & 0x0080))
{
key_num='B';
}
if((NowKeyNum & 0x0100)&& !(PreKeyNum & 0x0100))
{
key_num='7';
}
if((NowKeyNum & 0x0200)&& !(PreKeyNum & 0x0200))
{
key_num='8';
}
if((NowKeyNum & 0x0400)&& !(PreKeyNum & 0x0400))
{
key_num='9';
}
if((NowKeyNum & 0x0800)&& !(PreKeyNum & 0x0800))
{
key_num='C';
}
if((NowKeyNum & 0x1000)&& !(PreKeyNum & 0x1000))
{
key_num='*';
}
if((NowKeyNum & 0x2000)&& !(PreKeyNum & 0x2000))
{
key_num='0';
}
if((NowKeyNum & 0x4000)&& !(PreKeyNum & 0x4000))
{
key_num='#';
}
if((NowKeyNum & 0x8000)&& !(PreKeyNum & 0x8000))
{
key_num='D';
}
PreKeyNum=NowKeyNum;
return key_num;
}
舵機的驅(qū)動我之前也有介紹過這里就不介紹了,需要的可以看一下。http://t.csdn.cn/NQsqk
這是判斷密碼是否正確函數(shù)以及oled顯示內(nèi)容函數(shù):
char configpw[10]="1010#";//密碼
void Judgement(void)
{
int n=0;
for(;1;n++)
{
if(password[n]==configpw[n])
{
if(password[n]=='#'&&configpw[n]=='#')
{
Open_Lock();
break;//密碼輸入成功
}
}
else
{
Password_Mistake();
break;//密碼輸入錯誤
}
}
i=0;//i清除標志位
}
void Open_Lock(void)//密碼正確執(zhí)行效果
{
OLED_Clear(0); //顯示屏顯示
OLED_ShowCHinese(26,4,4);//密
OLED_ShowCHinese(46,4,5);//碼
OLED_ShowCHinese(66,4,6);//正
OLED_ShowCHinese(86,4,7);//確
SG90_set();//舵機驅(qū)動函數(shù)
}
void Password_Mistake()//密碼錯誤執(zhí)行效果
{
//顯示屏顯示函數(shù)
OLED_Clear(0);
OLED_ShowCHinese(26,4,4);//密
OLED_ShowCHinese(46,4,5);//碼
OLED_ShowCHinese(66,4,8);//錯
OLED_ShowCHinese(86,4,9);//誤
}
最后就是主函數(shù)? (我這里的#include "include.h" 是定義了一個include.h里面包含了其他所有的.h文件)
#include "include.h"
char password[10];
int i=0,I;
int main(void)
{
char mun='D';
char MUN;
Init();
OLED_Clear(0);
OLED_ShowCHinese(26,0,0);//王
OLED_ShowCHinese(46,0,1);//某
OLED_ShowCHinese(66,0,2);//科
OLED_ShowCHinese(86,0,3);//技
while(1)
{
delay_ms(50);
MUN=Get_KeyNum();//獲取矩陣鍵盤的數(shù)據(jù)
if(mun!=MUN)//密碼的不重復(fù) 其作用是不讓一直進入執(zhí)行
{
mun=Get_KeyNum();//獲取矩陣鍵盤的數(shù)據(jù)
password[i++]=mun;
BEEP_OPEN;//輸入成功 蜂鳴器驅(qū)動
delay_ms(100);
BEEP_CLOSE;
if(password[i-1]=='#')//'#'為結(jié)束
{
Judgement();//判斷密碼是否正確
}//'#'為結(jié)束,在這里進入函數(shù)判斷密碼是否正確
else
{
OLED_ShowChar(i*20,6,password[i-1],16);//oled顯示輸入數(shù)字 ’#‘(結(jié)束符)不顯示
}
}
}
}
至于為什么num初始化為’D‘呢 ?
我測試多次發(fā)現(xiàn)一上電過后不經(jīng)過任何操作讀取到的初始值就是’D‘至于是什么原因沒找到,所以就將就它初始化一個D,就不會一上電就執(zhí)行if里面的代碼。
VID_20220826_222036
能力有限 不喜勿噴 ——來自喜歡分享的小王文章來源:http://www.zghlxwxcb.cn/news/detail-498093.html
鏈接:https://pan.baidu.com/s/15GbKBrs46HZy5kSqT55iQQ?pwd=6hzi?
提取碼:6hzi文章來源地址http://www.zghlxwxcb.cn/news/detail-498093.html
到了這里,關(guān)于矩陣鍵盤之門鎖小項目(stm32f103zet6)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!