欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
用30個按鍵來控制5個電平輸出,單片機程序哪里出錯了?
[打印本頁]
作者:
xyz1973
時間:
2019-3-13 16:13
標題:
用30個按鍵來控制5個電平輸出,單片機程序哪里出錯了?
各位大神:我用30個按鍵來控制5個電平輸出,每個按鍵對應一個電平,1號鍵對應0xfe,2號鍵對應0xfd,以此類推,按鍵按下后恢復按鍵延時10ms輸出全部為高電平,現在出現第一次按鍵總是輸0xfe,按其他按鍵總是會把前面按過按鍵的信息帶上,要第二次才輸出正確。請哪位大神幫我看看程序如下
單片機源程序:
#include <reg52.h>
#define uchar unsigned char
uchar code tab[]={0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,
0xee,0xed,0xec,0xeb,0xea,0xfe9,0xe8,0xe7,
0xe6,0xe5,0xe4,0xeb3,0xe2,0xe1,0xeff};//輸出二進制庫
//輸出為11110 11101 到00001
uchar temp,num,n1;
void display();
keyscan();
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
keyscan() //矩陣鍵盤掃描程序
{
P1=0xfe;
if(P2!=0xff)
{
delay(10);
if(P2!=0xff)
{
temp=P2;
switch(temp)
{
case 0x7f : num=31;break;
case 0xbf : num=30;break;
case 0xdf : num=29;break;
case 0xef : num=28;break;
case 0xf7 : num=27;break;
case 0xfb : num=26;break;
case 0xfd : num=25;break;
case 0xfe : num=24;break;
}
while(temp!=0xff)
{
temp=P2;
display();
}
}
}
delay(10);
P1=0xfd;
if(P2!=0xff)
{
delay(10);
if(P2!=0xff)
{
temp=P2;
switch(temp)
{
case 0x7f : num=23;break;
case 0xbf : num=22;break;
case 0xdf : num=21;break;
case 0xef : num=20;break;
case 0xf7 : num=19;break;
case 0xfb : num=18;break;
case 0xfd : num=17;break;
case 0xfe : num=16;break;
}
while(temp!=0xff)
{
temp=P2;
display();
}
}
}
delay(10);
P1=0xfb;
if(P2!=0xff)
{
delay(10);
if(P2!=0xff)
{
temp=P2;
switch(temp)
{
case 0x7f : num=15;break;
case 0xbf : num=14;break;
case 0xdf : num=13;break;
case 0xef : num=12;break;
case 0xf7 : num=11;break;
case 0xfb : num=10;break;
case 0xfd : num=9;break;
case 0xfe : num=8;break;
}
while(temp!=0xff)
{
temp=P2;
display();
}
}
}
delay(10);
P1=0xf7;
if(P2!=0xff)
{
delay(10);
if(P2!=0xff)
{
temp=P2;
switch(temp)
{
case 0x7f : num=7;break;
case 0xbf : num=6;break;
case 0xdf : num=5;break;
case 0xef : num=4;break;
case 0xf7 : num=3;break;
case 0xfb : num=2;break;
case 0xfd : num=1;break;
case 0xfe : num=0;break;
}
while(temp!=0xff)
{
temp=P2;
display();
}
}
}
delay(10);
return num;
}
void display()
{
{
P0=tab[n1];
}
}
void main()
{
while(1)
{
n1=num;
P0=0xff;//使輸出全部為高電平
keyscan();
}
}
test.rar
(77.03 KB, 下載次數: 7)
2019-3-13 16:12 上傳
點擊文件名下載附件
作者:
7358655
時間:
2019-3-13 20:11
消隱,如果端口有鎖存清鎖存。
作者:
xyz1973
時間:
2019-3-14 09:54
7358655 發表于 2019-3-13 20:11
消隱,如果端口有鎖存清鎖存。
謝謝,修改試試
作者:
geyobing
時間:
2019-3-14 13:41
變換查詢口線前,置P2 = 0xFF ,這樣再查才能消除之前的
作者:
wulin
時間:
2019-3-14 13:51
本帖最后由 wulin 于 2019-3-15 07:38 編輯
你的顯示程序和數組寫的都有問題,4*8矩陣鍵盤掃描程序也繁瑣,不是很清楚你的用途,
給你改了一下,不影響P1高4位另做他用,直接用P0短暫顯示鍵值1~32,經仿真無誤。你可
以按需自行修改。
無標題.jpg
(302.97 KB, 下載次數: 30)
下載附件
2019-3-14 13:50 上傳
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*
uchar code tab[]={0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,
0xee,0xed,0xec,0xeb,0xea,0xfe9,0xe8,0xe7,
0xe6,0xe5,0xe4,0xeb3,0xe2,0xe1,0xeff};//輸出二進制庫
//輸出為11110 11101 到00001
*/
uint temp=0;//計數變量
uchar key=0xff;//鍵值變量
bit key_yes=0;//
//void display();
//void keyscan();
/*
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}*/
void keyscan() //4*8矩陣鍵盤掃描程序
{
static bit sign=0; //按鍵自鎖標志
static uint count=0; //消抖計數變量
uint num,num1;
P1|=0x0f;//保持P1高4位不變,操作低4位1111
P1&=0xf0;//保持P1高4位不變,操作低4位0000
P2=0xff;//P2全高
num=(P1&0x00)<<8|P2;
if(num!=0x00ff)//判斷有鍵按下
{
if((++count>=250)&&(sign==0))//消抖與判斷自鎖
{
sign=1; //按鍵自鎖標志置1
P1|=0x0f; //保持P1高4位不變,操作低4位1111
P2=0x00; //P2全低
num1=(P1&0x0f)<<8|P2;
num|=num1;
switch(num)
{
case 0x0efe: key= 1; break;
case 0x0efd: key= 2; break;
case 0x0efb: key= 3; break;
case 0x0ef7: key= 4; break;
case 0x0eef: key= 5; break;
case 0x0edf: key= 6; break;
case 0x0ebf: key= 7; break;
case 0x0e7f: key= 8; break;
case 0x0dfe: key= 9; break;
case 0x0dfd: key=10; break;
case 0x0dfb: key=11; break;
case 0x0df7: key=12; break;
case 0x0def: key=13; break;
case 0x0ddf: key=14; break;
case 0x0dbf: key=15; break;
case 0x0d7f: key=16; break;
case 0x0bfe: key=17; break;
case 0x0bfd: key=18; break;
case 0x0bfb: key=19; break;
case 0x0bf7: key=20; break;
case 0x0bef: key=21; break;
case 0x0bdf: key=22; break;
case 0x0bbf: key=23; break;
case 0x0b7f: key=24; break;
case 0x07fe: key=25; break;
case 0x07fd: key=26; break;
case 0x07fb: key=27; break;
case 0x07f7: key=28; break;
case 0x07ef: key=29; break;
case 0x07df: key=30; break;
case 0x07bf: key=31; break;
case 0x077f: key=32; break;
}
key_yes=1;
}
}
else //鍵抬起
{
sign=0; //按鍵自鎖標志清0
count=0; //消抖計數清0
}
}
/*
void display()
{
{
P0=tab[n1];
}
}
*/
void main()
{
while(1)
{
keyscan();
if(key_yes==1)
{
P0=key;//讀鍵值P0顯示
temp++;
if(temp>=10000)//延時時間可調
{
temp=0;
key_yes=0;
P0=0xff;
}
}
}
}
復制代碼
作者:
xyz1973
時間:
2019-3-14 21:03
感謝wulin,你的程序我稍作修改,已滿足我的學習要求,我剛剛開始學習單片機,好多程序需要學習,你的這段程序還要消化一些時間。謝謝
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1