Ⅰ 注釋一下 單片機程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //8個數碼管的位選擇信號表
uchar code display[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; //1-8的共陰字碼表
sbit wei=P3^7; //P3.7用於控制哪位顯示
sbit rest=P2^7; //P2.7用於復位
void delay(uint z) //延時函數,入口參數Z.具體延時於晶振頻率有關
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
main() //主函數
{
uchar i,temp;
P0=0xff; //P0口全部拉高,置1
delay(10); //延時delay(10)MS
wei=1; //P3.7置1
while(1) //循環掃描P1口按鍵狀態
{
temp=0xfe; //temp存掃描碼
for(i=0;i<8;i++) //循環8次,即掃描8個按鍵
{
if(P1==temp) //如果P1口讀入的狀態等於當前掃描碼
{
delay(10); //延時去抖
if(P1==temp) //再讀P1口比較
{
while(1) //確定按鍵有效,進入循環體
{
if(rest==0) //如果P2.7==0
{
delay(10); //延時去抖
if(rest==0) //確定P2.7腳按鍵按下
{
P0=0xff; //P0口拉高
P3=0; //P3口送0 ,即熄滅所有LED數碼管
while(rest==0); //如果P2.7的按鍵一直按下,則等待
break; //如果P2.7按鍵彈開,則跳出循環體,重新掃描按鍵
}
}
else //如果P2.7==1,即復位鍵沒有按下
{
P0=table[i]; //P0口送出P1口按鍵對應位的位控號
P3=display[i]; //P3口送對應的段碼值,形成顯示
}
}
}
}
temp=(temp<<1)|0x01; //temp左環移,掃描下一按鍵
}
}
}
該程序實現的功能大概是:將P1口按鍵的狀態顯示到對應位的LED管上,比如按下第2個鍵,會在第2個數碼管上顯示2同時按下多個鍵也一樣,按下哪幾個就對應顯示哪幾個鍵的值.按下復位按鍵後,所有數碼管
熄滅.
希望我猜得對,忽忽
Ⅱ 52單片機,取位邏輯運算,下面兩種寫法,為什麼P1最終值不同
當然不一樣,P1=state[sta]; 是直接賦值給 P1;
而 temp|=state[sta]; 則是先 temp「或" state[sta] ,結果就有可能不等於 state[sta] 了;