這個本身是在頭一個案例的基礎上的拓展,就是增加輸入輸出的同時掃描顯示。但是由於技術原因,翻車了,具體也不知道問題出在哪裡,個人感覺沒有太大問題,但是在仿真軟體中一塌糊塗。就算是這樣,大家也看看吧,看看我得故障時出在了哪裡?
首先我繪製了一個電路圖。
左側是五個開關,自鎖的,這樣可以保持信號。右側是指示燈,12是第一個房間,34是第二個房間,56是第三個房間,78是第四個房間,910是第五個房間,考慮到一個房間可以有兩個床位,所以一個房間設置了兩個開關,因為掃描周期的問題,所以採用了自鎖開關,這樣也不用設置復位函數了。原本設置的一個復位按鍵,也沒有用上。
邏輯是這樣的,假設第一個房間的第一個床位按下了開關,當單片機的一房間接地導通時,就會讀取到P1.0是低電位,於是系統就會把此時的鍵值保存下來,然後跟函數對比,對比中,發現一致的,就執行相應的程序,並把輸出發送到P2埠,P2埠執行行掃描,把結果呈現出來。因為不同的房間掃描時間不一樣,所以不同房間的接地和開關不會相互影響,在輸出時一二房間是一行,三四房間是一行,五房間單獨,所以輸出上也分開設置。掃描時間設置為8ms一個周期,加上運行時間,一個周期在10ms以內。
以下是代碼。我是找不到什麼原因了,學的也不是很好,大家可以看看。問題在哪裡?可以直接複製到軟體中跑一下。
#include
sbit Fuwei=P1^7;
void keys();
void delay(unsigned int t);
void main()
{
P1=0xff;
P2=0xff;
while(Fuwei)
{
P1=0xfb;//1111 1011第一房
if(P1!=0xfb)
{
keys();
}
P1=0xf7;//1111 0111第二房
if(P1!=0xf7)
{
keys();
}
P1=0xef;//1110 1111第三房
if(P1!=0xef)
{
keys();
}
P1=0xdf;//1101 1111第四房
if(P1!=0xdf)
{
keys();
}
P1=0xbf;//1011 1111第五房
if(P1!=0xbf)
{
keys();
}
}
}
void keys()
{
unsigned char m,n,j,m1,n1;
unsigned char k=10;
switch(P1)
{
case 0xfb: m=0x0e;
case 0xfa: m=0x1e;break;//1111 1010
case 0xf9: m=0x2e;break;//1111 1001
case 0xf8: m=0x3e;break;//1111 1000
case 0xf7: m1=0x0e;
case 0xf6: m1=0x4e;break;//1111 0110
case 0xf5: m1=0x8e;break;//1111 0101
case 0xf4: m1=0xce;break;//1111 0100
case 0xef: n=0x0d;
case 0xee: n=0x1d;break;//1110 1110
case 0xed: n=0x2d;break;//1110 1101
case 0xec: n=0x3d;break;//1110 1100
case 0xdf: n1=0x0d;
case 0xde: n1=0x4d;break;//1101 1110
case 0xdd: n1=0x8d;break;//1101 1101
case 0xdc: n1=0xcd;break;//1101 1100
case 0xbf: j=0x0b;
case 0xbe: j=0x1b;break;//1011 1110
case 0xbd: j=0x2b;break;//1011 1101
case 0xbc: j=0x3b;break;//1011 1100
}
k=10;
while(k--)
{
P2=m|m1;
delay(2);
P2=n|n1;
delay(2);
P2=j;
delay(2);
}
}
void delay(unsigned int t)
{
unsigned char i;
while(t--)
{
for(i=0;i<150;i++);< span="">
}
}
我用debug測試了,感覺沒有問題,響應也符合預期,但是在仿真中無法正常顯示,總是閃爍或者顯示與預期不一致。曾經出現過類似問題,當時我們也用實際的部件測試了,是仿真軟體的問題,但是這次,由於所有元件被家人收起來了,所以就無法實際驗證了。
這是打開一個開關的效果,截屏是一個燈亮,其實是三四個燈都在閃爍。
這是兩個開關打開,實際觀看的效果是好多都在閃。
這是開的三個開關,這次截屏就顯得比較真實了,就是閃爍。
很隨機,不知道誰該亮。頭蒙,家裡小娃娃也是不好照顧鴨。
這個案例算是失敗了。大家就當看個思路吧。