看板 Programming
作者 標題 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 四隻 而判斷完後的內容就只是在作進位個十百千四個位數進位的事情 好像就沒有別的動作了
回列表(←)
分享