顯示廣告
隱藏 ✕
看板 Programming
作者 nk258416 (nk258416)
標題 Keil C求救
時間 2015年01月10日 Sat. PM 01:22:24


小弟目前高三
正面臨著專題做不出來的窘境
想請教版上的各位大大幫忙解惑
專題內容是存錢筒
可是在接收硬幣訊號的程式上出了問題
我們是用89S51控制
程式碼如下:
sbit P3_0 =P3^0;
	
	
/*定義P3接腳*/
sbit P3_1 =P3^1;
	
	
/*定義紅外線接腳*/
sbit P3_2 =P3^2;
	
	
/*定義P3接腳*/
sbit P3_3 =P3^3;
	
	
/*定義紅外線接腳*/
sbit P3_4 =P3^4;
	
	
/*定義P3接腳*/
sbit P3_5 =P3^5;
	
	
/*定義紅外線接腳*/
sbit P3_6 =P3^6;
	
	
/*定義P3接腳*/
sbit P3_7 =P3^7;
	
	
/*定義紅外線接腳*/

if(P3_0==1)
	
{
	
ch==0x01;
	
}
	
if(P3_1==1)
	
{
	
ch==0x02;
	
}
	
if(P3_2==1)
	
{
	
ch==0x04;
	
}
	
if(P3_3==1)
	
{
	
ch==0x08;
	
}
	
if(P3_4==1)
	
{
	
ch==0x10;
	
}
	
if(P3_5==1)
	
{
	
ch==0x20;
	
}
	
if(P3_6==1)
	
{
	
ch==0x40;
	
}
	
if(P3_7==1)
	
{
	
ch==0x80;
	
}
	
switch(ch)
	
{
	
case 0x02:
	
	
	
/*0000 0010*/
	
	
if(P3_1==1)
	
	
	
 
	
	
	
   
	
/*有投幣訊號時*/
	
	
{
	
	
	
delayms(200);
	
	
	
while(P3_1==1);
	
	
	
	
	
 
	
/*等待訊號結束*/
	
	
	
delayms(100);  /*延時*/
	
	
	
money[3]++;
	
	
	
	
	
	
/*金額個位數加1*/
	
	
	
 
	
if (money[3]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
 
	
{
	
	
	
 
	
money[3]=0;
	
	
	
 
	
money[2]++;
	
	
	
 
	
	
/*金額十位數加1*/
	
	
	
 
	
	
if(money[2]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
	
	
{
	
	
	
	
	
money[2]=0;
	
	
	
 
	
	
money[1]++;
	
	
	
 
	
/*金額百位數加1*/
	
	
	
	
	
	
if(money[1]>9)
	
	
/*大於9時*/
	
	
	
	
	
	
{
	
	
	
	
	
	
money[1]=0;
	
	
	
	
	
	
money[0]++;
	
	
 
	
/*金額百位數加1*/
	
	
	
	
	
	
	
if(money[0]>9)
	
	
/*大於9時*/
	
	
	
	
	
	
	
{
	
	
	
	
	
	
 
	
money[0]=9;
	
	
/*金額=9999*/
	
	
	
	
	
	
 
	
money[1]=9;
	
	
	
	
	
	
 
	
money[2]=9;
	
	
	
	
	
	
 
	
money[3]=9;
	
	
	
	
	
	
	
}
	
	
	
	
	
	
}
	
	
	
	
	
}
	
	
	
	
}
	
	
WriteLCDcmd(0xC8);        
	
	
	
/*設定LCD座標*/
     
	
	
WriteLCDdata(money[0]+0x30);  
	
	
/*顯示金額千位數*/
       
	
	
WriteLCDdata(money[1]+0x30);
	
	
/*顯示金額百位數*/
	
	
WriteLCDdata(money[2]+0x30);
	
 
	
/*顯示金額十位數*/
       
	
	
WriteLCDdata(money[3]+0x30);
	
 
	
/*顯示金額個位數*/
	
	
for(i=0;i<4;i++)
       
	
	
write_93c66(i,money[i]);
	
   
	
	
/*金額存入93C66*/
	
	
}
	
break;
	
case 0x08:
	
	
	
/*0000 1000*/
	
	
if(P3_3==1)
	
	
{
	
	
	
delayms(150);
	
	
	
while(P3_3==1);
	
	
	
	
	
 
	
/*等待訊號結束*/
	
	
	
delayms(100);  /*延時*/
	
	
	
money[3]+=5;
	
	
	
	
	
	
/*金額個位數加1*/
	
	
	
 
	
if (money[3]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
 
	
{
	
 
	
	
 
	
money[3]=(money[3]+5)%10;
	
	
	
 
	
money[2]++;
	
	
	
 
	
	
/*金額十位數加1*/
	
	
	
 
	
	
if(money[2]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
	
	
{
	
	
	
	
	
money[2]=0;
	
	
	
 
	
	
money[1]++;
	
	
	
 
	
/*金額百位數加1*/
	
	
	
	
	
	
if(money[2]>9)
	
	
/*大於9時*/
	
	
	
	
	
	
{
	
	
	
	
	
	
money[1]=0;
	
	
	
 
	
	
	
money[0]++;
	
	
 
	
/*金額百位數加1*/
	
	
	
	
	
	
	
if(money[0]>9)
	
	
/*大於9時*/
	
	
	
	
	
	
	
{
	
	
	
	
	
	
 
	
money[0]=9;
	
	
/*金額=9999*/
	
	
	
	
	
	
 
	
money[1]=9;
	
	
	
	
	
	
 
	
money[2]=9;
	
	
	
	
	
	
 
	
money[3]=9;
	
	
	
	
	
	
	
}
	
	
	
	
	
	
}
	
	
	
	
	
}
	
	
	
	
}
	
	
WriteLCDcmd(0xC8);        
	
	
	
/*設定LCD座標*/
       
	
	
WriteLCDdata(money[0]+0x30);  
	
	
/*顯示金額千位數*/
       
	
	
WriteLCDdata(money[1]+0x30);
	
	
/*顯示金額百位數*/
	
	
WriteLCDdata(money[2]+0x30);
	
 
	
/*顯示金額十位數*/
       
	
	
WriteLCDdata(money[3]+0x30);
	
 
	
/*顯示金額個位數*/
	
	
for(i=0;i<4;i++)
       
	
	
write_93c66(i,money[i]);
	
   
	
	
/*金額存入93C66*/
	
	
}
	
break;
	
case 0x20:
	
	
	
/*0010 0000*/
	
	
if(P3_5==1)
	
	
{
	
	
	
delayms(100);
	
	
	
while(P3_5==1);
	
	
	
	
	
 
	
/*等待訊號結束*/
	
	
	
delayms(100);  /*延時*/
	
	
	
money[2]++;
	
	
	
	
	
	
/*金額個位數加1*/
	
	
	
	
if (money[2]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
	
{
	
	
	
	
money[2]=0;
	
	
	
	
money[1]++;
	
	
	
 
	
	
/*金額十位數加1*/
	
	
	
	
	
if(money[1]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
	
	
{
	
	
	
	
	
money[1]=0;
	
	
	
 
	
	
money[0]++;
	
	
	
 
	
/*金額百位數加1*/
	
	
	
	
	
	
if(money[0]>9)
	
	
/*大於9時*/
	
	
	
	
	
	
{
	
	
	
	
	
 
	
money[0]=9;
	
	
/*金額=9999*/
	
	
	
	
	
 
	
money[1]=9;
	
	
	
	
	
 
	
money[2]=9;
	
	
	
	
	
 
	
money[3]=9;
	
	
	
	
	
	
}
	
	
	
	
	
}
	
	
	
	
}
	
	
WriteLCDcmd(0xC8);        
	
	
	
/*設定LCD座標*/
 
	
	
WriteLCDdata(money[0]+0x30);  
	
	
/*顯示金額千位數*/
 
	
	
WriteLCDdata(money[1]+0x30);
	
	
/*顯示金額百位數*/
	
	
WriteLCDdata(money[2]+0x30);
	
 
	
/*顯示金額十位數*/
       
	
	
WriteLCDdata(money[3]+0x30);
	
 
	
/*顯示金額個位數*/
	
	
for(i=0;i<4;i++)
       
	
write_93c66(i,money[i]);
	
   
	
	
/*金額存入93C66*/
	
	
}
	
break;
	
case 0x80:
	
	
	
/*1000 0000*/
	
	
if(P3_7==1)
	
	
{
	
	
	
delayms(50);
	
	
	
while(P3_7==1);
	
	
	
	
	
 
	
/*等待訊號結束*/
	
	
	
delayms(100);  /*延時*/
	
	
	
money[2]+=5;
	
	
	
	
	
	
/*金額個位數加1*/
	
	
	
 
	
if (money[2]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
 
	
{
	
	
	
 
	
money[2]=(money[2]+5)%10;
	
	
	
 
	
money[1]++;
	
	
	
 
	
	
/*金額十位數加1*/
	
	
	
	
 
	
if(money[1]>9)
	
	
	
	
/*大於9時,進位*/
	
	
	
	
	
{
	
	
	
	
	
money[1]=0;
	
	
	
 
	
	
money[0]++;
	
	
	
 
	
/*金額百位數加1*/
	
	
	
	
	
if(money[0]>9)
	
	
/*大於9時*/
	
	
	
	
	
	
{
	
	
	
	
	
 
	
money[0]=9;
	
	
/*金額=9999*/
	
	
	
	
	
 
	
money[1]=9;
	
	
	
	
	
 
	
money[2]=9;
	
	
	
	
	
 
	
money[3]=9;
	
	
	
	
	
	
}
	
	
	
	
	
	
	
	
	

	
	
	
	
	
}
	
	
	
	
}
	
	
WriteLCDcmd(0xC8);        
	
	
/*設定LCD座標*/
       
	
	
WriteLCDdata(money[0]+0x30);  
	
	
/*顯示金額千位數*/
       
	
	
WriteLCDdata(money[1]+0x30);
	
	
/*顯示金額百位數*/
	
	
WriteLCDdata(money[2]+0x30);
	
 
	
/*顯示金額十位數*/
       
	
	
WriteLCDdata(money[3]+0x30);
	
 
	
/*顯示金額個位數*/
	
	
for(i=0;i<4;i++)
       
	
	
write_93c66(i,money[i]);
	
   
	
	
/*金額存入93C66*/
	
	
}
	
break;
	
default:
	
	
ch&0x00;
	
break;
	
}

老師建議是以switch case的方式來做
而我也嘗試過
但在設定接收訊號的部分還是不太了解
想以16進制的方式作為他判斷的依據
可是在對於腳位設定的部分就卡住了
一直找不到方法突破
於是想來請教版上的各位大大們
希望可以幫忙一下
裡面還有加上了93C66來記憶資料跟LCM來做顯示

--
※ 作者: nk258416 時間: 2015-01-10 13:22:24
※ 看板: Programming 文章推薦值: 0 目前人氣: 0 累積人氣: 579 
分享網址: 複製 已複製
1樓 時間: 2015-04-07 01:32:11 (台灣)
  04-07 01:32 TW
其實不太懂你想問的問題 以上面程式來看只能看出 妳用IF判斷完後又用了switch 又判斷一次 其實要這樣做的話直接在 IF判斷後直接做動作就可以了..本魯沒寫過51系列的晶片只是單純從語法下去看的話,妳腳位感覺上只用了 3-1 ,3-3,3-5,3-7 四隻 而判斷完後的內容就只是在作進位個十百千四個位數進位的事情 好像就沒有別的動作了
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續