用c語言來寫,實在沒有思路了,試著寫了幾個 ,都是死回圈

實在對不起 這分我也很想給,但是我不知道為啥,不讓



uj5u.com熱心網友回復:
要緊的是態度并非你能給的分數! 看過的人還真不少就沒回復?uj5u.com熱心網友回復:
輪詢狀態 然后控制數碼管顯示 這個邏輯應該不難吧uj5u.com熱心網友回復:
先做好仿真圖,這題目要實作,估計要寫一個十進制轉二進制,然后對應送給8個數碼管顯示。
uj5u.com熱心網友回復:
到我的博客16路搶答器示例復制矩陣鍵盤代碼,把之前回復的靜態數碼管例子修改為動態,顯示按鍵定義的值,示例程式如下:
程式按位顯示0-15的值,下一步要處理的是把十進制轉為二進制送對應的數碼位顯示即可。
uj5u.com熱心網友回復:
數碼管動態顯示按下組合鍵盤二進制鍵值:/**************************************************************************************
實驗現象:動態顯示按下組合鍵盤二進制鍵值
接線說明: 單片機-->動態數碼管模塊
J22-->J6
P22-->J9(A)
P23-->J9(B)
P24-->J9(C)
J20-->JP3
注意事項:
***************************************************************************************/
#include "reg52.h" //此檔案中定義了單片機的一些特殊功能暫存器
typedef unsigned int u16; //對資料型別進行宣告定義
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
u8 KeyValue; //用來存放讀取到的鍵值
u8 KeyValueold; //
/*******************************************************************************
* 函 數 名 : delay
* 函式功能 : 延時函式,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : DigDisplay
* 函式功能 : 數碼管動態掃描函式,回圈掃描8個數碼管顯示
*******************************************************************************/
void DigDisplay(u8 jz)
{
u8 i;
u8 ls=0x80;
for(i=0;i<8;i++)
{
if((jz &(ls>>i))==0)
{
P0=smgduan[0];
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
delay(100); //間隔一段時間掃描
P0=0x00;//消隱
}
else
{
P0=smgduan[1];
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
delay(100); //間隔一段時間掃描
P0=0x00;//消隱
}
}
}
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測驗列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=https://bbs.csdn.net/topics/0;break;
case(0X0b): KeyValue=https://bbs.csdn.net/topics/1;break;
case(0X0d): KeyValue=https://bbs.csdn.net/topics/2;break;
case(0X0e): KeyValue=https://bbs.csdn.net/topics/3;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(100);
a++;
}
}
/*******************************************************************************
* 函 數 名 : main
* 函式功能 : 主函式
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
while(1)
{
KeyDown(); //按鍵判斷函式
DigDisplay(KeyValue); //數碼管顯示函式
KeyValueold=KeyValue;
}
}
uj5u.com熱心網友回復:
下圖為矩陣定義值6的轉二進制顯示運行效果:
下圖為鍵定義值7的運行效果:

程式實作代碼:
uj5u.com熱心網友回復:

矩陣按鍵的二進制編碼直接取陣列中的值即可: if(jz!=255)ls=zhi=ShaoMiaoZhi[jz];
uj5u.com熱心網友回復:
示例工程下載uj5u.com熱心網友回復:
謝謝!非常有用
很清晰!
uj5u.com熱心網友回復:
謝謝!很受教!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/27321.html
標籤:單片機/工控
上一篇:機器碼永久封停
