![]() |
發(fā)布時間: 2017-7-24 23:55
正文摘要:矩陣鍵盤和獨立鍵盤共用單片機P3口時,分別給其寫程序是否會互相干擾? 想實現(xiàn)獨立鍵盤對數(shù)碼管進行位選 矩陣鍵盤進行段選應(yīng)該怎么寫程序呢? 以及怎樣才能實現(xiàn)像輸入計算器時那種數(shù)碼管的動態(tài)顯示方式 ... |
先檢測獨立的,然后檢測矩陣的,挺簡單的還是。 |
lgz1860 發(fā)表于 2020-3-27 09:58 解決問題了,十分感謝這個兄弟,確實是好多年前的問題了,但是在網(wǎng)上也沒找到解決辦法。 |
思路:利用中斷 掃描矩陣鍵盤,矩陣鍵盤每次掃描完,又把P2 口賦高電平,主程序檢測獨立鍵盤,兩者互不干擾。 利用我的程序需要將 P0 口接 六位共陰極液晶顯示, P1口接流水燈。 不知道發(fā)圖片,可以肯定的是能夠?qū)崿F(xiàn),我的程序100% 仿真成功。 |
#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula= P3^6;//段選,液晶的每一個引腳 sbit wela= P3^7;//位選,液晶的公共端 sbit s1=P2^4; sbit s2=P2^5; sbit s3=P2^6; sbit s4=P2^7; sbit d1=P1^0; sbit d2=P1^1; sbit d3=P1^2; sbit d4=P1^3; uint temp,z; uchar num=0; void delay(z); void duli (); void display(num); scanjuzheng (); uchar code led[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0x00}; void init() { TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; P0=0xfe; wela=1; wela=0; P2=0xff; num=16; P0=0x00; dula=1; dula=0; } //主程序 void main () { init(); while(1) { duli(); } } //獨立按鍵子程序 void duli () { if(s1==0) { delay(5); if(s1==0) { d1=0; } while(s1==0); delay(5); while(s1==0); } else { d1=1; } if(s2==0) { delay(5); if(s2==0) { d2=0; } while(s2==0); delay(5); while(s2==0); } else { d2=1; } if(s3==0) { delay(5); if(s3==0) { d3=0; } while(s3==0); delay(5); while(s3==0); } else { d3=1; } if(s4==0) { delay(5); if(s4==0) { d4=0; } while(s4==0); delay(5); while(s4==0); } else { d4=1; } } //延時子程序 void delay(z)// 延時1ms定時器 { uint a,b; for(a=z;a>0;a--) for(b=123;b>0;b--); } void display(num) { P0=led[num]; dula=1; dula=0; delay(5); } //矩陣鍵盤子程序 scanjuzheng () { //0123 掃描 if(P2==0xff) { temp=0xfe; P2=temp; if((P2&temp)!=0xfe) { delay(5); if((P2&temp)!=0xfe) { switch(P2&temp) { case 0xee: (num=0); break; case 0xde: (num=1); break; case 0xbe: (num=2); break; case 0x7e: (num=3); break; } } } //4567 掃描 temp=0xfd; P2=temp; if((P2&temp)!=0xfd) { delay(5); if((P2&temp)!=0xfd) { switch(P2&temp) { case 0xed: (num=4); break; case 0xdd: (num=5); break; case 0xbd: (num=6); break; case 0x7d: (num=7); break; } } } //89AB 掃描 temp=0xfb; P2=temp; if((P2&temp)!=0xfb) { delay(5); if((P2&temp)!=0xfb) { switch(P2&temp) { case 0xeb: (num=8); break; case 0xdb: (num=9); break; case 0xbb: (num=10); break; case 0x7b: (num=11); break; } } } //CDEF 掃描 temp=0xf7; P2=temp; if((P2&temp)!=0xf7) { delay(5); if((P2&temp)!=0xf7) { switch(P2&temp) { case 0xe7: (num=12); break; case 0xd7: (num=13); break; case 0xb7: (num=14); break; case 0x77: (num=15); break; } } } temp=0xff; P2=temp; return num; } } void timer0() interrupt 1 //中斷程序 t0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(P2==0xff) //用于判斷獨立鍵盤 沒有按下 { display(scanjuzheng()); } } |
雖然這是多年前的問題了,但我百度確未解決問題,苦惱一晚上,借鑒了他人的思路。利用中斷解決了這個問題。 |
應(yīng)該很容易。因為它們的檢測原理是不一樣的。獨立按鍵,是直接與低電平連接,按下鍵后,I/O口電平被拉低。 矩陣鍵盤,是通過分別對I/O口賦值,進行掃描,得到是哪個按鍵被按下。 所以,不用擔心它們會干擾,不然也不會那樣設(shè)計電路了。 當然,如果你同時按下了獨立按鍵和矩陣鍵盤的鍵,是會有問題的,你會同時按下嗎? |
Powered by 單片機教程網(wǎng)