#include<reg51.h>
uchar key_scan(); //按鍵掃描子程序
void delay10ms(); //延時程序
uchar key_free(); //等待按鍵釋放程序
void key_deal();
sysem_initial(); //初始化程序
void main()
{
sysem_initial();
while(1)
{
key_scan();
uchar key_free();
key_deal();
}
}
void sysem_initial()
{
PCON=0x00;
SCON=0x18; //選擇串列工作方式0
ES=0; //禁止串列口中斷
}
uchar key_scan()
{
unsigned char key,Rankcode;
int i,j;
SBUF=0x00; //使掃描鍵盤的74LS164輸出為00H,所有列線低電平
while(TI!=1); //串列輸出完否
TI=0; //清零
P1=0x03; //所有行線為高電平
if(P1&0x03!=1) //如果有鍵按下
{
delay10ms();
for(i=0;i<8;i++)
{
if(P1&0x03!=1) //確實有鍵按下
{
Rankcode=0xFE; //掃描第一列
SBUF=Rankcode; //輸出列值
while(TI!=1);
TI=0;
if(P1&0x03==0x01) //如果第一行有鍵閉合
{
j=0;
}
else if(P1&0x03==0x02) //如果第二行有鍵閉合
{
j=1;
}
key=j*8+i;
}
if(j==0||j==1) //掃描按鍵
break; //退出
Rankcode=(Rankcode<<1)|0x01; //否則,開始掃描下一列
}
}
return(key); //返回鍵值
}
uchar key_free()
{
key=key_scan();
SBUF=0x00;
P1=0x03;
while(TI!=1);
TI=0;
while(P1&0x03!=0x03); //如果仍有鍵按下,等待按鍵釋放
return(key);
}
void delay10ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<120;j++);//你的問題出在這里{}之間需要;,可以不要直接加;
}
//還有你上面所有等待的while() 後面都需要;這才是空等待,否則是帶後面的語句指令一起執行
❷ 單片機調試的時候出錯了 求大神
就這個程序而言,就純在這幾個錯誤,只要是有錯誤就無法編譯成功
錯誤一、按鍵檢測函數內,賦值語句被你寫成判斷語句了,如下圖這里
解決辦法是,將temp的變數聲明語句移到函數外,使其成為全局變數
錯誤三、既然程序的前端有各個函數的定義部分,那就要吧主函數放在最上端,不需要經常修改的函數放在最下端,雖然這不是強制性的,但這是一個良好的編程習慣
先改正以上錯誤吧!
❸ 51單片機 計算器程序 不能成功 按鍵按下沒反應 附上程序 看哪裡錯誤
看不太懂,不過發現好象按鍵掃描程序有誤
象 P1=0xf0; 你的目的可能是讓高4 位作為輸出,低4 位作嫌拿為輸入
按鍵按下時,高4 位的1傳到低4 位上,芹鍵搭這樣是不行的
對於51單片機,由於是弱上拉,只有0將1拉低,1不可能將0填高
就是說讓 P1=0xf0,讀取P1,低4 位永遠亮段是0
if(P1==0xf1) if (P1==0xf2).......等條件永遠不具備