当前位置:   article > 正文

51单片机:数码管和矩阵按键_51单片机矩阵按键控制数码管

51单片机矩阵按键控制数码管

目录

一:动态数码管模块

1:介绍

 2:共阴极和共阳极

A:共阴极

B:共阳极

C:转化表

 3:74HC138译码器

4:74HC138译码器控制动态数码管(位选)

5:数码管显示完整代码

6:74HC573锁存器

A:基本点

B:原理图介绍

c:74HC573控制数码管代码

二:矩阵按键模块

1:介绍

2:原理图

 3:矩阵按键代码


一:动态数码管模块

1:介绍

        LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件;

        我们的51单片机的1个数码管就相当于由8个发光二极管封装在一起, 所以我们只需要控制8个发光二极管封就可以实现数码管的显示,这款单片机是共阴极连接

        数码管扫描(输出扫描)     原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果,节省I/O口

 2:共阴极和共阳极

我们这款单片机是共阴极所以我们主要介绍共阳极连接

A:共阴极

1.LED共阴极是指LED灯中的二极管的阴极有一个共同的接点,并且该接点连接在GND端,即处于低电平状态。      我们只需要给它一个高电频(1)就可以点亮他

 从高位到低位读取

eg:让第一个数码管显示0

数码管段码表对应的0,1,2,3,4,5,6,7,8,9

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

B:共阳极

        LED共阳极是指LED灯中的二极管的阳极有一个共同的接点,并且该接点连接在VCC端,即处于高电平状态。  我们只需要给它一个低电频(0)就可以点亮他

 

    数码管段码表对应的0,1,2,3,4,5,6,7,8,9

  1. unsigned char LED7Code[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,
  2. 0xf8, 0x80, 0x90};

C:转化表

 3:74HC138译码器

        概述 D74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品

        3个io口控制8位,因为单片机上面的资源有限

 

 

 通过A0~A2数据的输入来控制Y0~Y7数据的输出;实现 3个io口控制8位,(位选)

4:74HC138译码器控制动态数码管(位选)

 eg:点亮LED8

        EDL1对应的是Y7的输出端口,所以只需要控制A,B,C输出Y7即可

        从高位到低位读和写;   (只需要将二进制转化位10进制的7即可)

P2_4=1;P2_3=1;P2_2=1;//二进制111转化十机制为:7,输出Y7;当用户选择1时点亮LED8

5:数码管显示完整代码

  1. #include <REGX52.H>
  2. unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  3. //延时函数的声明
  4. void Delay(unsigned int xms);
  5. /**
  6. * @brief 数码管的选择和读取
  7. * @param Location:选择那一个数码管; Number:选择显示那个数字(0~9)
  8. * @retval 无
  9. */
  10. void Nixie(unsigned char Location,Number)
  11. {
  12. switch (Location)
  13. {
  14. case 1:P2_4=1;P2_3=1;P2_2=1;break;//二进制111转化十机制为:7,当用户选择1时点亮LED8
  15. case 2:P2_4=1;P2_3=1;P2_2=0;break;//二进制110转化十机制为:6,当用户选择2时点亮LED7
  16. case 3:P2_4=1;P2_3=0;P2_2=1;break;//二进制101转化十机制为:5,当用户选择3时点亮LED6
  17. case 4:P2_4=1;P2_3=0;P2_2=0;break;//二进制100转化十机制为:4,当用户选择4时点亮LED5
  18. case 5:P2_4=0;P2_3=1;P2_2=1;break;//二进制11(高位补零)转化十机制为:3,当用户选择5时点亮LED4
  19. case 6:P2_4=0;P2_3=1;P2_2=0;break;//二进制10(高位补零)转化十机制为:2,当用户选择6时点亮LED3
  20. case 7:P2_4=0;P2_3=0;P2_2=1;break;//二进制1(高位补零)转化十机制为:1,当用户选择7时点亮LED2
  21. case 8:P2_4=0;P2_3=0;P2_2=0;break;//二进制0(高位补零)转化十机制为:0,当用户选择3时点亮LED1
  22. }
  23. P0=NixieTable[Number]; //段码输出
  24. Delay(1); //显示一段时间
  25. P0=0x00; //段码清0,消影
  26. }
  27. void Delay(unsigned int xms)
  28. {
  29. unsigned char i, j;
  30. while(xms--)
  31. {
  32. i = 2;
  33. j = 239;
  34. do
  35. {
  36. while (--j);
  37. } while (--i);
  38. }
  39. }
  40. void main()
  41. {
  42. while(1)
  43. {
  44. Nixie(1,1); //在数码管的第1位置显示1
  45. Delay(20);
  46. Nixie(2,2); //在数码管的第2位置显示2
  47. Delay(20);
  48. Nixie(3,3); //在数码管的第3位置显示3
  49. Delay(20);
  50. }
  51. }

6:74HC573锁存器

A:基本点

        74HC573是拥有八路输出的透明锁存器,输出为三态门,是一种高性能硅栅CMOS器件。如图,OE为三态允许控制端(低电平有效),通常叫做输出使能端。1D--8D为数据输入端;1Q--8Q为数据输出端:LE为锁存允许端,或锁存控制端。图为74HC573的真值表,真值表中字母代码含义如下:H-高电平,L一低电平;X一任意电平,Z一高阻态,也就是既不是高电平也不是低电平,而它的电平状态由与相连的其他电气状态决定,Q0一上次的电平状态。

 A:OE为片选段,低电平有效当,其为低电平时锁存器正常OE为低电平时,LE控制锁存器的状态

B:LE=1 时 输入D=输出的Q

C:LE=0 时  输出的nochange,与所上一次相同

D:  段选锁存:控制该数码管显示的内容             位选锁存:控制那一路数码管显示。

B:原理图介绍

 公阴极数码管段选:

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

 公阴极数码管位选:

        共阴数码管的每一位(WEI1,WEI2,WEI3…)都是公共的阴极,只有输入低电平的时候才会被点亮,所以位选的时候被选中的位必须是低电平。

eg:选择WE1 为:PO=0xfe  (从高位到低位开始写)

  1. unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  2. //位选的8个数码管

c:74HC573控制数码管代码

  1. #include <REGX52.H>
  2. sbit dula=P2^6; //段选:选择输出的内容
  3. sbit wela=P2^7; //位选:选择输出数码管的位置
  4. //段选:0~9
  5. unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  6. //位选:1~8个数码管
  7. unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  8. //延时子函数
  9. void Delay(unsigned int xms)
  10. {
  11. unsigned char i, j;
  12. while(xms--)
  13. {
  14. i = 2;
  15. j = 239;
  16. do
  17. {
  18. while (--j);
  19. } while (--i);
  20. }
  21. }
  22. //74HC573芯片控制的数码管
  23. //Location:位选选择哪一个数码管;Number段选:选择输出的内容
  24. void Nixie(unsigned char Location,Number)
  25. {
  26. switch (Location)
  27. {
  28. case 1:P0=table[Location-1];wela=1;wela=0;break;
  29. case 2:P0=table[Location-1];wela=1;wela=0;break;
  30. case 3:P0=table[Location-1];wela=1;wela=0;break;
  31. case 4:P0=table[Location-1];wela=1;wela=0;break;
  32. case 5:P0=table[Location-1];wela=1;wela=0;break;
  33. case 6:P0=table[Location-1];wela=1;wela=0;break;
  34. case 7:P0=table[Location-1];wela=1;wela=0;break;
  35. case 8:P0=table[Location-1];wela=1;wela=0;break;
  36. }
  37. P0=NixieTable[Number];
  38. dula=1;
  39. dula=0;
  40. Delay(1);
  41. P0=0x00;
  42. }
  43. void main(){
  44. while(1){
  45. Nixie(1,1);
  46. Nixie(2,2);
  47. Nixie(3,3);
  48. }
  49. }

二:矩阵按键模块

1:介绍

        矩阵键盘扫描(输入扫描)     原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果,节省I/O口

2:原理图

 按下为0;我们使用列扫描,

eg:按下1,5,9,13

1:使他P1端口全部为1

2:1,5,9,13为一列,他们的共同端口为P1^3,显示共同端口为P1^3为0;

3:依次使P1_7,  P1_6,  P1_5, P1_4为0,

 3:矩阵按键代码

  1. #include <REGX52.H>
  2. //声明
  3. void Delay(unsigned int xms)
  4. /**
  5. * @brief 矩阵键盘读取按键键码
  6. * @param 无
  7. * @retval KeyNumber 按下按键的键码值
  8. 如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
  9. */
  10. unsigned char MatrixKey()
  11. {
  12. unsigned char KeyNumber=0;
  13. P1=0xFF;
  14. P1_3=0;
  15. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
  16. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
  17. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
  18. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
  19. P1=0xFF;
  20. P1_2=0;
  21. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
  22. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
  23. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
  24. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
  25. P1=0xFF;
  26. P1_1=0;
  27. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
  28. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
  29. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
  30. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
  31. P1=0xFF;
  32. P1_0=0;
  33. if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
  34. if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
  35. if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
  36. if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
  37. return KeyNumber;
  38. }
  39. void Delay(unsigned int xms)
  40. {
  41. unsigned char i, j;
  42. while(xms--)
  43. {
  44. i = 2;
  45. j = 239;
  46. do
  47. {
  48. while (--j);
  49. } while (--i);
  50. }
  51. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/408791
推荐阅读
相关标签
  

闽ICP备14008679号