|
|
如题小弟最近刚开始学习 arduino 以前也没有C语言的基础 求大神 教导 用举证键盘单独控制 2个74HC595点亮2个4位数共阳极的数码港怎么改 下面是写的矩阵键盘控制 数码港扫描的程序
#include <Keypad.h> // 定义矩阵键盘‘库’文件
int Led1 = 21;
int Led2 = 20;
int Led3 = 19;
int Led4 = 18;
int Led5 = 17;
int Led6 = 16;
int Led7 = 15;
int Led8 = 14;
int FMQ=13;
long ShuMG;
int JCPin = A2;//ST_CP
int clockPin = A1;//SH_CP
int IOPin = A0; //DS
const byte ROWS = 4; // 设定4行
const byte COLS = 4; //设定4列
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup ()
{
pinMode(JCPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(IOPin,OUTPUT);
pinMode(14, OUTPUT);
digitalWrite(14, HIGH);
pinMode(15, OUTPUT);
digitalWrite(15, HIGH);
pinMode(16, OUTPUT);
digitalWrite(16, HIGH);
pinMode(17, OUTPUT);
digitalWrite(17, HIGH);
pinMode(18, OUTPUT);
digitalWrite(18, HIGH);
pinMode(19, OUTPUT);
digitalWrite(19, HIGH);
pinMode(20, OUTPUT);
digitalWrite(20, HIGH);
pinMode(21, OUTPUT);
digitalWrite(21, HIGH);
pinMode(FMQ, OUTPUT);
Serial.begin(9600);
}
//这个函数是显示一个数用的disNum(显示的数,显示的位,是否有小数点(1为有小数点))
void disNum(int Num_Qua, int Num_Pos, int Num_Dec)
{
int Num_Qua_B = 0;
int Num_Pos_B = 0;
switch (Num_Qua)
{
case 0:Num_Qua_B = 192;break;
case 1:Num_Qua_B = 249;break;
case 2:Num_Qua_B = 164;break;
case 3:Num_Qua_B = 176;break;
case 4:Num_Qua_B = 153;break;
case 5:Num_Qua_B = 146;break;
case 6:Num_Qua_B = 130;break;
case 7:Num_Qua_B = 248;break;
case 8:Num_Qua_B = 128;break;
case 9:Num_Qua_B = 144;break;
default: Num_Qua_B = 255;break;
};
//这个值转换为2进制 为一个数abcdefg的需要亮的针脚。
switch (Num_Pos)
{
case 1:Num_Pos_B = 1;break;
case 2:Num_Pos_B = 2;break;
case 3:Num_Pos_B = 4;break;
case 4:Num_Pos_B = 8;break;
case 5:Num_Pos_B = 16;break;
case 6:Num_Pos_B = 32;break;
case 7:Num_Pos_B = 64;break;
case 8:Num_Pos_B = 128;break;
default: Num_Pos_B = 0;break;
};
//这个值转换为2进制 为当前点亮的位数。
if (Num_Dec == 0)
{
Num_Qua_B = Num_Qua_B + 128;
};
//128是Q7端口2进制值转换为10进制的结果。
digitalWrite(JCPin,LOW); //将RCLK口上面加低电平让芯片准备好接收数据
int L = Num_Qua_B; int R = Num_Pos_B;
shiftOut(IOPin,clockPin,MSBFIRST,R);
shiftOut(IOPin,clockPin,MSBFIRST,L);
digitalWrite(JCPin,HIGH); //将ST_CP这个针脚恢复到高电平
//上面是74HC595的输出方式 每个74HC595能接受一个8位的2进制数值来电灯 第一个74HC595再次输入一个8位的数值他会把他现在的数值传给第二个串联的74HC595。
delayMicroseconds(100);
}
//这个是显示数用的函数
void showNum(long number)//注意用double,int不够长了。
{
long num = number;
int ShowDec [8];
for (int x = 1; x < 9; x++)
{
ShowDec [x] = 0;
}
//创建显示小数点的数组,0为不显示,1为显示
int ShowNumber [8];
ShowNumber[1] = (num/10000000)%10;
ShowNumber[2]= (num/1000000)%10;
ShowNumber[3] = (num/100000)%10;
ShowNumber[4] = (num/10000)%10;
ShowNumber[5] = (num/1000)%10;
ShowNumber[6] = (num/100)%10;
ShowNumber[7] = (num/10)%10;
ShowNumber[8]= (num/1)%10;
//取得每一位的数。然后存在一个数组里。
disNum(ShowNumber[1],1,ShowDec[1]);
disNum(ShowNumber[2],2,ShowDec[2]);
disNum(ShowNumber[3],3,ShowDec[3]);
disNum(ShowNumber[4],4,ShowDec[4]);
disNum(ShowNumber[5],5,ShowDec[5]);
disNum(ShowNumber[6],6,ShowDec[6]);
disNum(ShowNumber[7],7,ShowDec[7]);
disNum(ShowNumber[8],8,ShowDec[8]);
//依次显示数字,因为LED的闪烁很快,所以人眼无法识别闪烁。
}
void loop()
{
showNum(ShuMG);
char customKey = customKeypad.getKey();
if (customKey)
{
Serial.println(customKey);
}
if (customKey =='1')
{
ShuMG = 10000000;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='2')
{
ShuMG = 2000000;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='3')
{
ShuMG = 300000;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='4')
{
ShuMG = 40000;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='5')
{
ShuMG = 5000;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='6')
{
ShuMG = 600;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='7')
{
ShuMG = 70;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='8')
{
ShuMG = 8;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='9')
{
ShuMG = 99999999;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
else if(customKey =='A')
{
ShuMG = 12345678;
digitalWrite(FMQ, HIGH);
digitalWrite(FMQ, LOW);
}
}
想问下怎么单独调用 ShowNumber 跟 ShowDec 因为我一上点数码港就全部亮了 我想单独控制 案件开关 比如按下1 数码港 00000000 就 最前面的一位数码港亮了然后后面的全灭 按下 2 就是第二位数码港亮了然后其他数码港全灭 求大神教小弟怎么修改 |
|