本人只學過c,請用C來修改
1. 使用矩陣鍵盤,除了8個按鍵之外額外設定一個清零鍵(與自帶復位不同的)
2. 搶答器按下一個按鍵后數值固定,只有按下清零鍵才能進行下一輪搶答
3. 使用數碼管或者LCD1602顯示八路搶答器的數值
4. 使用外部中斷
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define GPIO_DIG P0
#define GPIO_KEY P1
uchar KeyValue;
sbit k1=P3^1;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Int0Init()
{
IT0=1;
EX0=1;
EA=1;
}
void delay(uint i)
{
while(i--);
}
void KeyDown()
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=https://bbs.csdn.net/topics/1;break;
case(0X0b): KeyValue=https://bbs.csdn.net/topics/2;break;
case(0X0d): KeyValue=https://bbs.csdn.net/topics/3;break;
case(0X0e): KeyValue=https://bbs.csdn.net/topics/4;break;
}
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=https://bbs.csdn.net/topics/KeyValue;break;
case(0Xb0): KeyValue=https://bbs.csdn.net/topics/KeyValue+4;break;
case(0Xd0): KeyValue=https://bbs.csdn.net/topics/KeyValue+8;break;
case(0Xe0): KeyValue=https://bbs.csdn.net/topics/KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
a++;
}
}
}
}
void main()
{
KeyDown();
switch(KeyValue)
{
case 1:P2=0xfd;break;
case 2:P2=0xfe;break;
case 3:P2=0xfb;break;
case 4:P2=0xf7;break;
case 5:P2=0xef;break;
case 6:P2=0xdf;break;
case 7:P2=0xbf;break;
case 8:P2=0x7f;break;
default: Int0Init();
}
LSA=0;
LSB=0;
LSC=0;
GPIO_DIG=smgduan[KeyValue];
KeyDown();
switch(KeyValue)
{
case 1:P2=0xfe;break;
case 2:P2=0xfd;break;
case 3:P2=0xfb;break;
case 4:P2=0xf7;break;
case 5:P2=0xef;break;
case 6:P2=0xdf;break;
case 7:P2=0xbf;break;
case 8:P2=0x7f;break;
default: Int0Init();
}
LSA =1;
LSB=1;
LSC=1;
}
void Int0() interrupt 0
{
P2=0xff;
if(k1==0)
{
delay(100);
if(k1==0)
{
uchar code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
(*((void(*)(void))(rst)))();
}
}
}
uj5u.com熱心網友回復:
有人來幫忙解決一下嗎?uj5u.com熱心網友回復:
當檢測到按鈕按下時可以控制EX0=1;或 EA=1;回復時也是控制EX0=1;或 EA=1;uj5u.com熱心網友回復:
當檢測到按鈕按下時可以控制EX0=0;或 EA=0;回復時也是控制EX0=1;或 EA=1;uj5u.com熱心網友回復:
這是寫在中斷里還是寫在主函式里?( '? ' )
uj5u.com熱心網友回復:
說得很清楚了,在有按鈕按下的地方
uj5u.com熱心網友回復:
首先就是在你原來的基礎上說:1、你這個程式是完成不了你的功能的。在主函式里面的流程就有問題,以下給一個參考的主函式模式供你參考。注意這里面的有一個while回圈,你的函式里面沒有,這樣就不知道運行一遍以后程式回到什么地方。估計會繼續復位運行,具體怎么個邏輯我也不知道。
void main(void)
{
init(); //這個函式時上電以后只執行一次的。
while(1) //這個回圈就要求程式一直在運行中。
{
sub1(); //這個二個函式只要單片機沒有掉電,就會不停回圈執行。
sub2();
}
}
2、再看keydown這個函式。沒有電路圖,從程式上看,第一次用GPIO_KEY的低4位輸入了4個按鍵,再用GPIO_KEY的高四位輸入了按鍵,這個是什么意圖看不懂。如果按照你要求,采用矩陣式的按鍵,GPIO_KEY的8個IO中,應該用4個輸出,四個輸入,就可以滿足你8個按鍵的要求(16按鍵以內都可以)。
3、沒有看到你是如何連接INT0的,如果采用Keydown里面的4*4的方法來做。那么4個輸入的信號如何并入到int0?這些信號并入一個IO的話需要考慮之間相互的影響。
最后建議你的解決方法就是:
1、用GPIO_KEY做輸出,用INT0這個IO來做輸入。上電以后,直接在GPIO_KEY上輸出0,INT0需要上拉。
2、設定INT0為下降沿中斷。
3、打開INT0中斷,再進入主回圈(while(1)回圈體)。
4、在INT0中斷程式里面需要關閉中斷(一來中斷即關閉中斷),再將GPIO_KEY從bit0到bit7,依次輸出0(每次只輸出一位0,其他位為高),每次輸出以后再讀INT0的IO口狀態,如果發現讀回來的狀態是0,則說明這個按鍵按下產生了中斷,這時可以退出中斷服務程式。
5、在主回圈里面對此按鍵處理。如果是歸零按鍵,就再次開啟INT0中斷即可。
單片機程式是需要結合硬體電路來做的。所以,寫程式前先考慮硬體怎么做。做好硬體以后,再來考慮軟體。
uj5u.com熱心網友回復:
一個類似的代碼,自己去修改,有問題再來問
uj5u.com熱心網友回復:
檢測任何按鈕按下代碼自己添加到中斷按鈕那里即可,如if(!k0||!k1||!k2||!k3)uj5u.com熱心網友回復:
倒計時16路搶答器秀一個
uj5u.com熱心網友回復:
倒計時16路搶答器秀一個
用的什么軟體啊



uj5u.com熱心網友回復:
單片機仿真軟體
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/123233.html
標籤:單片機/工控
上一篇:流水燈
