极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10381|回复: 1

小弟刚学arduino求大神教导举证键盘控制数码管

[复制链接]
发表于 2015-8-6 15:34:48 | 显示全部楼层 |阅读模式
如题小弟最近刚开始学习 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 就是第二位数码港亮了然后其他数码港全灭 求大神教小弟怎么修改
回复

使用道具 举报

 楼主| 发表于 2015-8-6 15:37:32 | 显示全部楼层
本帖最后由 1ss1ss2 于 2015-8-6 15:39 编辑

顺带一提根据论坛里面  庚影! 同学的数码港扫描写的 矩阵键盘控制数码管扫描 顺带求管理帮我把这个帖子移到求助区我发错地方了 {:soso_e143:}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:40 , Processed in 0.043352 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表