色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>單片機(jī)>51單片機(jī)的鍵盤檢測(cè)原理

51單片機(jī)的鍵盤檢測(cè)原理

2021-11-10 | pdf | 未知 | 次下載 | 5積分

資料介紹

一、獨(dú)立鍵盤檢測(cè)
1、按鍵的檢測(cè)原理
單片機(jī)的I/O口既可以作為輸出也可以作為輸入使用,檢測(cè)按鍵時(shí)用的是輸入功能。把按鍵的一端接地,另一端與單片機(jī)的某個(gè)I/O口相連,開始時(shí)先給該I/O口賦一個(gè)高電平,然后讓單片機(jī)不斷地檢測(cè)該I/O口是否變成了低電平,當(dāng)按鍵閉合時(shí),相當(dāng)于該I/O口通過(guò)按鍵與地相連,變成低電平,程序一旦檢測(cè)到I/O口變?yōu)榈碗娖骄驼f(shuō)明按鍵被按下,然后執(zhí)行相應(yīng)的指令。
2、實(shí)驗(yàn)板原理圖
獨(dú)立按鍵S2,S3,S4,S5分別連接單片機(jī)的P3^4,5,6,7。

3、去抖動(dòng)操作
由于使用的是彈性小按鍵,就是一個(gè)機(jī)械觸點(diǎn)的器件。在按下時(shí)會(huì)有微觀上的機(jī)械抖動(dòng),反應(yīng)到電平就是高,低,高,低,抖動(dòng)的長(zhǎng)短與機(jī)械特性有關(guān),一般在5~10ms。所以在檢測(cè)鍵盤是否按下時(shí)要加上去抖動(dòng)操作。

4、用數(shù)碼管的前三位實(shí)現(xiàn)000~999的循環(huán)計(jì)時(shí),按下S2時(shí)停止,再次按下開始;按下S3時(shí)數(shù)值加1,按下S4時(shí)數(shù)值減1;按下S5時(shí)數(shù)值清零。

#include 
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
int num=0;
char num1=0;
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}
void keyscan()//鍵盤掃描函數(shù)
{
	if(key1==0)
	{
		delayms(10);
		if(key1==0)
		{
			TR0=~TR0;//啟動(dòng)或關(guān)閉定時(shí)器
		}
		while(!key1);
	}
	if(key2==0)
	{
		delayms(10);//去抖動(dòng)操作,如果不加會(huì)出現(xiàn)num的值加了好多個(gè),因?yàn)檠h(huán)檢測(cè)速度非常快
		if(key2==0)
		{
			num++;
			if(num==1000)
				num=0;
		}
		while(!key2);//等待按鍵釋放,因?yàn)槿藶槭謩?dòng)按下的過(guò)程的時(shí)間比單片機(jī)檢測(cè)的時(shí)間長(zhǎng)很多,
	}//如果不加也會(huì)出現(xiàn)num的值加了很多次的現(xiàn)象
	if(key3==0)
	{
		delayms(10);
		if(key3==0)
		{
			num--;
			if(num==-1)
				num=999;
		}
		while(!key3);
	}
	if(key4==0)
	{
		delayms(10);
		if(key4==0)
		{
			num=0;
		}
		while(!key4);
	}
}
void display(uchar ge,uchar shi,uchar bai)
{
	dula=1;
	P0=table[bai];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;//打開第一個(gè)數(shù)碼
	wela=0;
	delayms(1);
	wela=1;//關(guān)閉數(shù)碼管,不然快速顯示時(shí)數(shù)碼管數(shù)字之外的二極管有微弱的亮度
	P0=0xff;
	wela=0;

	dula=1;
	P0=table[shi];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delayms(1);
	wela=1;
	P0=0xff;
	wela=0;

	dula=1;
	P0=table[ge];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;
	delayms(1);
	wela=1;
	P0=0xff;
	wela=0;
}
void main()
{
	dula=0;
	wela=0;//數(shù)碼管初始化,開始時(shí)關(guān)閉所有數(shù)碼管
	TMOD=0x01;
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	EA=1;
	ET0=1;
	TR0=1;
	while(1)
	{
		keyscan();//一直在while循環(huán)里檢測(cè)鍵盤是否被按下
		display(num%10,num/10%10,num/100);
	}
}
void timer0() interrupt 1
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num1++;
	if(num1==20)//1s
	{
		num1=0;
		num++;
		if(num==1000)
			num=0;
	}
}

總結(jié):獨(dú)立鍵盤主要注意兩點(diǎn)(1)按下時(shí)的去抖動(dòng)延時(shí)delayms函數(shù),大概10ms;(2)松手時(shí)的按鍵釋放檢測(cè)while(!key);等待按鍵釋放。
二、矩陣鍵盤檢測(cè)
1、矩陣鍵盤連接圖
結(jié)合上面的原理圖,實(shí)驗(yàn)板上的4乘4的矩陣分別接單片機(jī)的P3^0到7口。行線和列線是線與的關(guān)系即0&1=0,只要兩根線有一根為0則整根線為低電平。獨(dú)立鍵盤和單片機(jī)連接時(shí)每個(gè)鍵盤都占有一個(gè)I/O口,當(dāng)鍵盤數(shù)量較多時(shí)單片機(jī)的I/O口就不夠用了,就引入了矩陣鍵盤。試驗(yàn)板上是16個(gè)按鍵的4乘4矩陣鍵盤即4行4列,每行每個(gè)按鍵的一端連接在一起構(gòu)成行線,每列每個(gè)按鍵的另一端連接在一起構(gòu)成列線,這樣就是4行4列的8根線,就連接到單片機(jī)的8個(gè)I/O口。

2、矩陣鍵盤的檢測(cè)原理
獨(dú)立鍵盤的一端固定為低電平,檢測(cè)時(shí)比較方便。矩陣鍵盤兩端都連接單片機(jī)的I/O口,就需要人為的通過(guò)單片機(jī)送出低電平。檢測(cè)的時(shí)候,先送一行為低電平,其余幾行為高電平,這就確定了哪一行,然后立即輪流檢測(cè)一次各列是否有低電平,如果檢測(cè)到某一列為低電平就確定了哪一列。用同樣的方法輪流送各行一次低電平,再輪流檢測(cè)一次各列是否變?yōu)榈碗娖剑@樣就可以檢測(cè)完所有的按鍵。(也可以將列線置低電平,掃描行線是否有低電平)
3、按下16個(gè)矩陣鍵盤依次在數(shù)碼管上顯示1-16的平方。如按下第一個(gè)顯示1,第二個(gè)顯示4,第三個(gè)顯示9…

#include 
sbit dula=P2^6;
sbit wela=P2^7;
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}
void display(int num)//將每個(gè)按鍵要顯示的數(shù)傳遞給形參
{
	dula=1;
	P0=table[num/100];//百位
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;
	wela=0;
	delayms(1);
	wela=1;
	P0=0xff;
	wela=0;

	dula=1;
	P0=table[num/10%10];//十位
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delayms(1);
	wela=1;
	P0=0xff;
	wela=0;
	
	dula=1;
	P0=table[num%10];//個(gè)位
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;
	delayms(1);
	wela=1;
	P0=0xff;
	wela=0;
}
void keyscan()
{
	uchar temp;
	int key;
	P3=0xfe;//將第一行置為0
	temp=P3;
	temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之后肯定不是f0,說(shuō)明被按下
	if(temp!=0xf0)
	{
		delayms(10);//去抖動(dòng)
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P3;//將P3口重新賦值給temp,因?yàn)橹暗膖emp是相與之后的結(jié)果
			switch(temp)
			{
				case 0xee:key=1;break;
				case 0xde:key=2*2;break;
				case 0xbe:key=3*3;break;
				case 0x7e:key=4*4;break;
			}
		}
		while(temp!=0xf0)//檢測(cè)按鍵是否釋放
		{
			temp=P3;
			temp=temp&0xf0;//比獨(dú)立按鍵麻煩一點(diǎn),就是要一直檢測(cè)P3口
		}
		display(key);//顯示按鍵要顯示的值
	}

	P3=0xfd;//第二行
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delayms(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P3;
			switch(temp)
			{
				case 0xed:key=5*5;break;
				case 0xdd:key=6*6;break;
				case 0xbd:key=7*7;break;
				case 0x7d:key=8*8;break;
			}
		}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
		display(key);
	}

	P3=0xfb;//第三行
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delayms(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P3;
			switch(temp)
			{
				case 0xeb:key=9*9;break;
				case 0xdb:key=10*10;break;
				case 0xbb:key=11*11;break;
				case 0x7b:key=12*12;break;
			}
		}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
		display(key);
	}

	P3=0xf7;//第四行
	temp=P3;
	temp=temp&0xf0;
	if(temp!=0xf0)
	{
		delayms(10);
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P3;
			switch(temp)
			{
				case 0xe7:key=13*13;break;
				case 0xd7:key=14*14;break;
				case 0xb7:key=15*15;break;
				case 0x77:key=16*16;break;
			}
		}
		while(temp!=0xf0)
		{
			temp=P3;
			temp=temp&0xf0;
		}
	}
	display(key);
}

void main()
{
	dula=0;
	wela=0;
	while(1)
	{
		keyscan();//在大循環(huán)里一直檢測(cè)按鍵
	}
}

在按下第四行第四列的按鍵后顯示256

矩陣鍵盤關(guān)鍵的代碼在于分別將每行置0然后檢測(cè)每一列,去抖動(dòng)之后,在檢測(cè)按鍵是否釋放要一直讀取P3口

	P3=0xfe;//將第一行置為0
	temp=P3;
	temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之后肯定不是f0,說(shuō)明被按下
	if(temp!=0xf0)
	{
		delayms(10);//去抖動(dòng)
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0)
		{
			temp=P3;//將P3口重新賦值給temp,因?yàn)橹暗膖emp是相與之后的結(jié)果
			switch(temp)
			{
				case 0xee:key=1;break;
				case 0xde:key=2*2;break;
				case 0xbe:key=3*3;break;
				case 0x7e:key=4*4;break;
			}
		}
		while(temp!=0xf0)//檢測(cè)按鍵是否釋放
		{
			temp=P3;
			temp=temp&0xf0;//比獨(dú)立按鍵麻煩一點(diǎn),就是要一直檢測(cè)P3口
		}
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1TC358743XBG評(píng)估板參考手冊(cè)
  2. 1.36 MB  |  330次下載  |  免費(fèi)
  3. 2開關(guān)電源基礎(chǔ)知識(shí)
  4. 5.73 MB  |  6次下載  |  免費(fèi)
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計(jì)
  8. 0.60 MB  |  3次下載  |  免費(fèi)
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費(fèi)
  11. 651單片機(jī)窗簾控制器仿真程序
  12. 1.93 MB  |  2次下載  |  免費(fèi)
  13. 751單片機(jī)大棚環(huán)境控制器仿真程序
  14. 1.10 MB  |  2次下載  |  免費(fèi)
  15. 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191185次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
主站蜘蛛池模板: 动漫H片在线观看播放免费| 星空无限传媒视频在线观看视频| 日本一卡二卡三卡四卡无卡免费播放 | 强奸美女老师| 一本到2v不卡区| 国产成人精品免费视频软件 | 亚洲一区精品在线| 高傲教师麻麻被同学调教123| 久亚洲AV无码专区A片| 亚洲 天堂 国产在线播放| 超碰免费视频部落格| 久久伊人在| 亚洲三级在线视频| 国产精品久久久久AV麻豆| 欧美videos人牛交| 伊人久久亚洲精品一区| 国产精品自在自线亚洲| 日本一本2017国产| 99re久久这里只有精品| 久久久久亚洲| 亚洲免费国产| 国产精品人妻无码久久久蜜桃| 青青草伊人网| 51精品国产AV无码久久久| 黄页免费观看| 性夜影院爽黄A爽免费动漫| 成人在线视频免费看| 暖暖高清视频免费| 66美女人体| 久久九九日本韩国精品| 亚洲日本国产综合高清| 国产亚洲999精品AA片在线爽| 色综合久久久久久| 超碰caoporon最新视频| 欧美zzzoooxxx| 999久久久无码国产精蜜柚| 久久精品一卡二卡三卡四卡视频版 | JAVASCRIPTJAVA水多多| 伦 乱真实故事| 最近免费中文字幕MV在线视频3| 久久91精品国产91|