單片機矩陣鍵盤線性反轉法( if 版 和 switch 版)
這種方法據我所知是全網首發 有類似但不一樣 我這版較好理解
歡迎學友們一起探討
51和52是一樣的 這裡用的52
數碼管是用的共陰極CC
------------------if版---------------------
需要多佔用一個埠存儲變數
#include "reg52.h"
char x[]={
0xfc,0x60,0xda,0xf2,
0x66,0xb6,0xbe,0xe0,
0xfe,0xf6,
};//段選
char z[]={0x7f,0xbf};//位選
void ys()//延時函數
{
char i;
for(i=0;i<20;i++);
}
void xx(char s)//顯示函數
{
char s1,s2;
s1=s/10;
s2=s%10;
if(s1!=0)
{
P2=z[0];
P1=x[s1];
ys();
}
P2=z[1];
P1=x[s2];
ys();
}
void main()
{
char w;
while(1)
{
P3=0xf0;
if(P3!=0xf0)
{
P0=P3;//這為什麼需要存儲到埠上 存到變數上卻不行(大霧)
P3=0x0f;
w=P3;
if(P0==0xe0 && w==0x0e)xx(1);
if(P0==0xd0 && w==0x0e)xx(2);
if(P0==0xb0 && w==0x0e)xx(3);
if(P0==0x70 && w==0x0e)xx(4);//第一行
if(P0==0xe0 && w==0x0d)xx(5);
if(P0==0xd0 && w==0x0d)xx(6);
if(P0==0xb0 && w==0x0d)xx(7);
if(P0==0x70 && w==0x0d)xx(8);//第二行
if(P0==0xe0 && w==0x0b)xx(9);
if(P0==0xd0 && w==0x0b)xx(10);
if(P0==0xb0 && w==0x0b)xx(11);
if(P0==0x70 && w==0x0b)xx(12);//第三行
if(P0==0xe0 && w==0x07)xx(13);
if(P0==0xd0 && w==0x07)xx(14);
if(P0==0xb0 && w==0x07)xx(15);
if(P0==0x70 && w==0x07)xx(16);//第四行
}
else xx(0);//歸零
}
}
--------------------swatch版-----------------------
不需要多佔用埠存儲
#include "reg52.h"
char x[]={
0xfc,0x60,0xda,0xf2,
0x66,0xb6,0xbe,0xe0,
0xfe,0xf6,
};//段選
char z[]={0x7f,0xbf};//位選
void ys()//延時函數
{
char i;
for(i=0;i<20;i++);
}
void xx(int s)//顯示函數
{
char s1,s2;
s1=s/10;
s2=s%10;
if(s1!=0)
{
P2=z[0];
P1=x[s1];
ys();
}
P2=z[1];
P1=x[s2];
ys();
}
void main()
{
char q,w,e;
while(1)
{
P3=0xf0;
if(P3!=0xf0)
{
e=P3;
P3=0x0f;
w=P3;
q=e+w;//把行值和列值合併
}
switch(q)
{
case 0xee:xx(1);break;
case 0xde:xx(2);break;
case 0xbe:xx(3);break;
case 0x7e:xx(4);break;
case 0xed:xx(5);break;
case 0xdd:xx(6);break;
case 0xbd:xx(7);break;
case 0x7d:xx(8);break;
case 0xeb:xx(9);break;
case 0xdb:xx(10);break;
case 0xbb:xx(11);break;
case 0x7b:xx(12);break;
case 0xe7:xx(13);break;
case 0xd7:xx(14);break;
case 0xb7:xx(15);break;
case 0x77:xx(16);break;
default :xx(0);
}
}
}
推薦閱讀:
※軟體工程結構2----代碼層級
※學習單片機的過程
※ARM和單片機的區別
※電腦還能這麼小?指甲蓋大小的電腦也能控制機器人!
※學習單片機的幾個誤區