我是個小白,想利用矩陣按鍵控制數碼管。我的想法是這樣的,當按鍵S1按下,左邊第一個數碼管點亮,顯示0(第1個按鍵),當按鍵S2按下,左邊第2個數碼管點亮,顯示1(第2個按鍵),依次類推,當按下S8時,左邊第8個數碼管顯示7
按下S9~S16,都在左邊第1一個數碼管依次顯示8~F
問題: 按下S3~S6時。有兩個數碼管點亮,按下S7~S8時,有4個數碼管點亮,原因是什么??138芯片同時不是只可以控制一個位選嗎???
代碼:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define anjian P1
#define GPIO_DIG P0
u8 shuzi;
u8 a=0;
sbit LSA0=P2^2;
sbit LSA1=P2^3;
sbit LSA2=P2^4;//位選
u8 code shumaguan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//段選
void delay(u16 i)
{
while(i--) ;
}
void keydown()//掃描的子函式
{
anjian=0x0f;
if(anjian!=0x0f)
{
delay(1000);//延時消抖
if(anjian!=0x0f)
{
anjian=0x0f;
switch(anjian) //判斷按鍵的列數,做出數字判斷
{
case 0x07: shuzi=0;break;
case 0x0b: shuzi=1;break;
case 0x0d: shuzi=2;break;
case 0x0e: shuzi=3;break;
}
anjian=0xf0;
switch(anjian) //判斷行數,做出數字判斷
{
case 0x70: shuzi=shuzi;break;
case 0xb0: shuzi=shuzi+4;break;
case 0xd0: shuzi=shuzi+8;break;
case 0xe0: shuzi=shuzi+12;break;
}
while((a<50)&&anjian!=0xf0)//使松開按鍵時退出,或者按鍵超時退出
{
delay(1000);
a++;
}
}
}
}
void weixuan(int shuzi)//控制位選函式
{
if(shuzi<=7)
{
switch(shuzi)
{
case 0: LSA0=1; LSA1=1; LSA2=1;break;
case 1:
LSA0=0; LSA1=1; LSA2=1;
break;
case 2:
LSA0=1; LSA1=0; LSA2=1;
break;
case 3:
LSA0=0; LSA1=0; LSA2=1;
break;
case 4:
LSA0=1; LSA1=1; LSA2=0;
break;
case 5:
LSA0=0; LSA1=1; LSA2=0;
break;
case 6:
LSA0=1; LSA1=0; LSA2=0;
break;
case 7 :
LSA0=0; LSA1=0; LSA2=0;break;
}
}
else
LSA0=1; LSA1=1; LSA2=1;
}
void main()
{
while(1)
{
weixuan(shuzi);
keydown() ;
GPIO_DIG=shumaguan[shuzi];
}
}




uj5u.com熱心網友回復:
給你參考程式:#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define anjian P1
#define GPIO_DIG P0
// 定義鍵盤鍵值常數
#define KEY_0 0x13// 數字0
#define KEY_1 0x24// 數字1
#define KEY_2 0x23// 數字2
#define KEY_3 0x22// 數字3
#define KEY_4 0x34// 數字4
#define KEY_5 0x33// 數字5
#define KEY_6 0x32// 數字6
#define KEY_7 0x44// 數字7
#define KEY_8 0x43// 數字8
#define KEY_9 0x42// 數字9
u8 keyz;
u8 gewei,shiwei;
u8 shuzi;
u8 a=0;
sbit LSA0=P2^2;
sbit LSA1=P2^3;
sbit LSA2=P2^4;//位選
u8 code shumaguan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//段選
/*void delay(u16 i)
{
while(i--) ;
}*/
void keydown()//讀鍵函式
{
P1=0x7f;
if(P1==0x77){keyz=0x44;anjian=0xff;return;}
if(P1==0x7b){keyz=0x43;anjian=0xff;return;}
if(P1==0x7d){keyz=0x42;anjian=0xff;return;}
if(P1==0x7e){keyz=0x41;anjian=0xff;return;}
P1=0xbf;
if(P1==0xb7){keyz=0x34;anjian=0xff;return;}
if(P1==0xbb){keyz=0x33;anjian=0xff;return;}
if(P1==0xbd){keyz=0x32;anjian=0xff;return;}
if(P1==0xbe){keyz=0x31;anjian=0xff;return;}
P1=0xdf;
if(P1==0xd7){keyz=0x24;anjian=0xff;return;}
if(P1==0xdb){keyz=0x23;anjian=0xff;return;}
if(P1==0xdd){keyz=0x22;anjian=0xff;return;}
if(P1==0xde){keyz=0x21;anjian=0xff;return;}
P1=0xef;
if(P1==0xe7){keyz=0x14;anjian=0xff;return;}
if(P1==0xeb){keyz=0x13;anjian=0xff;return;}
if(P1==0xed){keyz=0x12;anjian=0xff;return;}
if(P1==0xee){keyz=0x11;anjian=0xff;return;}
keyz=0x00;
}
void main()
{
while(1)
{
keydown() ;//讀鍵
if(keyz==0x24){shuzi=0;LSA0=0; LSA1=0; LSA2=0;}//1
if(keyz==0x23){shuzi=1;LSA0=0; LSA1=0; LSA2=1;}//2
if(keyz==0x22){shuzi=2;LSA0=0; LSA1=1; LSA2=0;}//3
if(keyz==0x34){shuzi=3;LSA0=0; LSA1=1; LSA2=1;}//4
if(keyz==0x33){shuzi=4;LSA0=1; LSA1=0; LSA2=0;}//5
if(keyz==0x32){shuzi=5;LSA0=1; LSA1=0; LSA2=1;}//6
if(keyz==0x44){shuzi=6;LSA0=1; LSA1=1; LSA2=0;}//7
if(keyz==0x43){shuzi=7;LSA0=1; LSA1=1; LSA2=1;}//8
if(keyz==0x00){shuzi=16;LSA0=1; LSA1=1; LSA2=1;}//0
P0=shumaguan[shuzi];
}
}
uj5u.com熱心網友回復:
給個建議,除非自己玩,否則變數不要寫拼音轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/54735.html
標籤:單片機/工控
上一篇:微型單片機連接WIFI模塊后,其WIFI控制模塊需要在單片機中進行撰寫體現嗎?
下一篇:筆記本相機出現錯誤,如何解決?
