将十六进制键盘连接到arduino uno。

这篇文章是关于如何将一个十六进制键盘连接到arduino。十六进制键盘是嵌入式系统中非常重要的组件,典型的应用是密码锁、计算器、自动化系统或任何需要字符或数字输入的东西。这个项目将在ardui的串行监视器窗口中显示按下的键没有IDE。同一项目可以修改为在7段LED显示屏或LCD显示屏上显示按下的键。在进入详细信息之前,请查看十六进制键盘。

十六进制键盘。

十六进制键盘只是一种4X4矩阵形式的16个按钮开关的排列。通常,十六进制键盘将有数字0、1、2、3、4、5、6、7、8、9和字母a、B、C、D、*、#。十六进制键盘将有8条连接线,即R1、R2、R3、R4和C1、C2、C3、C4,分别代表行和列。示意图下图显示了一个典型的十六进制键盘的照片。

十六进制键盘的照片


程序通过一种称为列扫描的方法来识别按下的键。在这种方法中,一个特定行保持低位,其他行保持高位。扫描每个列行的逻辑状态。如果发现一个特定列处于低位,则表示该列和该行之间的键较短(按下)。然后程序注册被按下的键。然后对随后的行应用相同的程序,并重复整个过程。例如,如果在扫描过程中第1行保持低位,第1列发现低位,则表示按下了键“1”。接口十六进制键盘的完整电路图如下所示。

线路图。

接口十六进制键盘和arduino

行R1、R2、R3和R4分别连接到arduino的数字管脚6、7、8和9。列C1、C2、C3和C4与arduino的数字管脚10、11、12、13相连。arduino通过USB端口连接到PC。该电路由USB本身供电,无需外部电源。下面给出了将十六进制键盘连接到arduino的完整程序。

Arduino程序-接口十六进制键盘(4×4)

int行[]={6,7,8,9};//定义连接到Arduino管脚int col[]={10,11,12,13}的键盘阵列行管脚//定义连接到Arduino int i,j的键盘阵列列管脚;//循环int col_scan内部计数的两个计数器变量;//用于保存扫描列的值的变量void setup(){Serial.begin(9600);for(i=0;i<=3;i++){pinMode(行[i],输出);pinMode(列[i],输入);digitalWrite(列[i],高);}}void loop(){for(i=0;i<=3;i++{digitalWrite(行[0],高);digitalWrite(行[1],高);digitalWrite(行[2],高);digitalWrite(行[3],高);digitalWrite(行[i],低);for(j)若(j)若(c)若(i)若(i)若(i==0和j==0和j==1)串行.印刷(2)若(i==0和j==0和j==0和j==2)串行.印刷(j)若(3)延迟(300)延迟(300)延迟(300)延迟(300)}}}}}}}}}}无效(3)关键词关键词(3)关键词(3)关键词(3)无效)关键词关键词(j)关键词(3)关键词(3)关键词(i)关键词(i)若(i)关键词(i,j)关键词(i,i,j)是(i,INT7)是(i,int 7)是(i,INTJ)和(i,int 7)是(i,INTJ)的7)是(i,j)的)是(i,j(i,int)的)的)是(i,j(i)和(i)是(i)的)的2)序列号打印项次(“5”)如果(i==1和j==1和j==1和j==1和j==1和j==1和j==3)串行.打印LN(“B”);如果(i==2和j==2和j==0和j==0)串行.打印LN(“7”);如果(i==1和j==1和j==1和j=2)串行.打印L4)串行.打印LN(“6“;如果(B”);如果(i==2和j==2和j==2和j==1和j==3)串行.打印L3)串行.打印L3)串行.印刷LN(“B(“B”);如果(B”);如果(B”);如果(B“;如果(B”);如果(B“;如果(i=2和j==2和j==2和j==2和j==2和j==2和j==2和j==2和j=3)串行..如果(i==3&&j==3)Serial.println(“D”);}

关于这个项目。

代码Serial.begin (9600);设置串口通信的波特率为9600。波特率是数字调制传输线中每秒发生的信号变化数。首先使用digitalWrite命令将row1保持高电平,将其他行保持低电平。然后使用digitalRead命令读取每一列的状态。然后使用if-else循环检查每一列是否为低。如果发现某一列为低,则假定已按下该列和row1相交的键,并且使用serial在串行监视器窗口上显示该键的名称。打印命令。在每个条件检查循环之间给出300ms的延迟,以避免在单个按键期间注册多个键。如果这个延迟进一步增加,键盘的响应将会减少。经过一些尝试和错误,我发现我的方案的最优值是300mS。 Then row 2 is made low and other rows are kept high. Then the same thing is done for row 3 and then for row 4. The the entire cycle is repeated over time. The result will be the name of the pressed key displayed on the serial monitor any time.

作者

5.评论

  1. Midas Soldaten (

    感谢Boulbahaiem Ali,
    这些都是很好的共享步骤3降低成本的编程代码。对于最新的代码,基于您的代码解释从ROW(输出)到COL(输入)的序列,主循环应该更改为以下初始工作人员:

    void循环()
    {
    对于(int行=0;行<=3;行++)
    {
    For (int col = 0;< = 3;坳坳+ +)
    {
    digitalWrite (ArduinoPins_Row_OUTPUT(行),低);
    if (digitalRead(ArduinoPins_Col_INPUT[col]) == LOW) / /显示当前位置
    {
    系列。println(矩阵(行)(col));
    延迟(200);
    }
    digitalWrite (ArduinoPins_Row_OUTPUT(行),高);
    }
    }

  2. 博尔巴哈姆·阿里

    int ArduinoPins_Row_OUTPUT[] = {6,7,8,9};
    int ArduinoPins_Col_INPUT[] = {10,11,12,13};
    字符矩阵[4][4]={{' 1 ',' 2 ',' 3 ',' '},{“4”、“5”、“6”、“B”},{' 7 ',' 8 ',' 9 ',' C '}, {' * ', ' 0 ', ' # ', ' D '}};
    无效的设置()
    {
    Serial.begin(9600);
    对于(int i=0;i<=3;i++)
    {
    pinMode(行输出[i],输出);
    数字写入(行输出[i],高);
    pinMode (ArduinoPins_Col_INPUT[我],输入);
    数字写入(输入[i],高)//上拉电阻器
    }
    }
    void循环()
    {
    对于(int行=0;行<=3;行++)
    {
    For (int col = 0;< = 3;坳坳+ +)
    {
    数字写入(行输出[col],低);
    if(数字读取(ArduinoPins_Col_INPUT[row]) == LOW)
    {
    系列。println(矩阵(col)(行));
    延迟(200);
    }
    digitalWrite (ArduinoPins_Row_OUTPUT (col)、高);
    }
    }
    }

  3. 博尔巴哈姆·阿里

    int ArduinoPins_Row_OUTPUT[] = {6,7,8,9};
    int ArduinoPins_Col_INPUT[] = {10,11,12,13};
    char Row_1_Data[] = {' 1 ', ' 2 ', ' 3 ', ' A '};
    char Row_2_Data[]={'4','5','6','B'};
    字符行3_数据[]={'7','8','9','C'};
    字符行_4_数据[]={'*','0'',#','D'};
    char *Matrix[] ={Row_1_Data,Row_2_Data,Row_3_Data,Row_4_Data};
    无效的设置()
    {
    Serial.begin(9600);
    对于(int i=0;i<=3;i++)
    {
    pinMode(行输出[i],输出);
    数字写入(行输出[i],高);
    pinMode (ArduinoPins_Col_INPUT[我],输入);
    数字写入(输入[i],高)//上拉电阻器
    }
    }
    void循环()
    {
    对于(int行=0;行<=3;行++)
    {
    For (int col = 0;< = 3;坳坳+ +)
    {
    数字写入(行输出[col],低);
    if(数字读取(ArduinoPins_Col_INPUT[row]) == LOW)
    {
    系列。println(矩阵(col)(行));
    延迟(200);
    }
    digitalWrite (ArduinoPins_Row_OUTPUT (col)、高);
    }
    }
    }

  4. 哈迪克·戈卡尼

    “很好解释”

  5. 大卫•福特

    你发表的是很好的材料,但我需要一些不同的东西,从我看到的评论来看,很多人都经历过我的问题。我想从SD卡存储和读取数据-主要是从VC0706相机模块,但数据源无关紧要。我能够下载的任何示例代码都不能编译。总是有错误消息(在某些范围内未定义的消息)表明SD卡的Arduino库有问题。如果你能发表一些有用的东西,我想很多人会喜欢的。

Baidu