欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
數碼管只顯示四位0,而且按鍵無反應,應該是單片機程序邏輯上的問題
[打印本頁]
作者:
skcxks
時間:
2019-5-29 23:53
標題:
數碼管只顯示四位0,而且按鍵無反應,應該是單片機程序邏輯上的問題
下面是原程序
#include"math.h"
#include "reg51.h"
#define uchar unsigned char
uchar key_temp,key=0,i,j,k,t=0;
uchar a=0,b=0,c=0,d=0;
unsigned long qian,hou;
uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
static unsigned char state_key=0;
static unsigned char state_dis=0;
void keyscan()
{
switch(state_key)
{
case 0:
key_temp=(P1&0x0f);
if(key_temp!=0x0f)
t=0;
state_key=1;
break;
case 1:
if(t>=10)
{
if(key_temp==(P1&0x0f))
{
if(P1^0==0)
key=1;
if(P1^1==0)
key=2;
if(P1^2==0)
key=3;
if(P1^3==0)
key=4;
}
state_key=2;
}
else
state_key=0;
break;
case 2:
if(key_temp==(P1&0x0f))
{
state_key=0;
break;
}
key=0;//default:break;
}
}
void keyaction()
{
switch(key)
{
case 1:break;
case 2:i=0;
i++;
if(i>9)
break;
case 3:j=0;
if(j<=3)
j++;
switch(j)
{
case 0:P3=0xfe;i++;break;
case 1:P3=0xfd;i++;break;
case 2:P3=0xfb;i++;break;
case 3:P3=0xf7;i++;break;
}
break;
case 4: k=0;
k++;
if(k==1)
hou=hou+qian;
qian=0;
if(k==2)
hou=hou+qian;
qian=0;
k=0;
break;
}
}
void display()
{
switch(j)
{
case 0:P2=table[a];break;
case 1:P2=table[b][b];break;
case 2:P2=table[c];break;
case 3:P2=table[d];break;
}
}
void display0()
{
switch(state_dis)
{
case 0:a=i;b=0;c=0;d=0;break;
case 1:b=i;c=0;d=0;break;
case 2:c=i;d=0;break;
case 3:d=i;break;
}
display();
}
void time0init()
{
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
EA=1;
ET0=1;
TR0=1;
}
void time0()interrupt 1
{
TH0=-50000/256;
TL0=-50000%256;
t++;
if(state_dis<=3)
state_dis++;
else
state_dis=0;
}
void main()
{
time0init();
while(1)
{
keyscan();
keyaction();
display0();
switch(j)
{
case 0:qian=a;break;
case 1:qian=a+b*10;break;
case 2:qian=a+b*10+c*100;break;
case 3:qian=a+b*10+c*100+d*1000;break;
}
a=0;
b=0;
c=0;
d=0;
}
}
復制代碼
數碼管只顯示四位0,而且按鍵無反應,應該是邏輯上的問題,實在找不到,求大神!
作者:
wc86110
時間:
2019-5-30 06:52
這源程序明顯被閹割過
作者:
m182892
時間:
2019-5-30 08:22
定時器及中斷好像沒問題,按鍵和顯示程序認真檢查一下,這兩者其中一個出問題都會導致顯示0而沒有其它動作。
作者:
skcxks
時間:
2019-5-30 08:27
wc86110 發表于 2019-5-30 06:52
這源程序明顯被閹割過
這是我自己寫的程序,通過3位按鈕使用計算器
作者:
隨風飄遠
時間:
2019-5-30 11:20
可以自己調試一下, main函數里先把數碼管用延時的方式都顯示一遍,沒有問題再調試按鍵。剛開始還要多看別人的代碼
作者:
suncat0504
時間:
2019-5-30 14:13
1、keyaction()函數中
case 2:i=0;
i++;
if(i>9)
break;
case 3:j=0;
if(j<=3)
j++;
這樣的處理邏輯,每次主函數進入這個函數后,P1^1或者P1^2在按下時,走case 2或case 3的分支,i和j永遠都是從0開始,加一次變成1,永遠不會有2以后的數字出現?你確定是需要做成這樣的邏輯?
2、display()函數中case 1:P2=table[b][b];break;,這個table[b][b]是什么意思?
3、keyscan函數中
case 0:
key_temp=(P1&0x0f);
if(key_temp!=0x0f)
t=0;
state_key=1;
的處理,無論是否有按鈕按下,state_key=1;都會被執行,下次進入case 1的分支,你確定這個邏輯正確?不是應該有按鈕按下了,下次才進入case 1,判斷是那個按鈕按下嗎?是不是改成
if(key_temp!=0x0f) {
t=0;
state_key=1;
}更合理一些?
按照你現在的掃描邏輯,即使沒有按鈕按下,case 0,case 1,case 2也會按照順序全都走一遍!
另外自己的程序,無論是變量的聲明,還是代碼,都沒有注釋,即使現在你能看懂。過段時間你再看未必能明白。既然編程,一定要養成寫注釋的良好習慣。
作者:
wulin
時間:
2019-5-30 14:46
樓上都是亂猜的,這種最基礎最基礎的東西都是錯的怎么幫你???
case 1:
if(t>=10)
{
if(key_temp==(P1&0x0f))
{
if(P1^0==0)??????????
key=1;
if(P1^1==0)??????????
key=2;
if(P1^2==0)?????????
key=3;
if(P1^3==0)?????????
key=4;
}
state_key=2;
}
else
state_key=0;
break;
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1