当前位置:   article > 正文

(51单片机)习题:74HC595数码管8位显示与8位独立按键复用_74hc595驱动八位数码管电路图

74hc595驱动八位数码管电路图

     75HC595是一片具有8位串行输入/并行输出移位寄存器,利用三个端口,就可以驱动8位数码管,本文在显示的同时,外加一个51单片机IO口,将8位独立按键复用。

     74HC595驱动数码管不再累述,请查看规格书理解底层代码,仿真电路图如下:

 按键识别思路:利用74HC595驱动的8个位码端口,给按键依次发送低电平,当8个按键有按下时,检测P3.7,如为0,则进行识别,并将键值输出至数码管显示

头文件、变量声明、IO口定义如下:

  1. /******************************************************************
  2. 使用8个595输出端口+一个单片机IO口P3.7,利用两个数码管输出键值1-8
  3. 思路:使用动态扫描的间隙,去给按键写0,判断IO口,识别键值
  4. ******************************************************************/
  5. #include<reg52.h>
  6. #include<intrins.h>
  7. typedef unsigned char uint8;
  8. typedef unsigned int uint16;
  9. typedef unsigned long uint32;
  10. sbit Latch_clk = P2^0; //595的第12脚锁存
  11. sbit Shift_clk = P2^1; //595的第11脚移位
  12. sbit data_in = P2^2; //595的第14脚串行输入
  13. sbit key_IO = P3^7; //一个IO口
  14. /*****************************变量声明*****************************/
  15. uint8 code duanma[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf};
  16. uint8 code wei_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //定义八位数码管位选数据数组
  17. uint8 key_scan();

595的驱动底层函数:

  1. /***************************写入数据函数******************************
  2. *函数名称:Write_INT16_74hc595
  3. *函数功能:两片595级联输出16位数据函数
  4. *函数调用:Write_INT16_74hc595(uint16 Data);
  5. *参数列表:Data
  6. *返 回 值:无
  7. *结 果:把 16 Data 数据输出到两片595芯片输出引脚
  8. *备 注:
  9. *********************************************************************/
  10. void Write_INT16_74hc595(uint16 Data)
  11. {
  12. uint8 i=0;
  13. for(i=0;i<16;i++)
  14. {
  15. data_in = (Data<<i)&0X8000;
  16. Shift_clk = 0; //595第一列D触发器时钟
  17. Shift_clk = 1; //595第一列D触发器时钟
  18. }
  19. Latch_clk = 0; //595第二列D触发器时钟
  20. Latch_clk = 1; //595第二列D触发器时钟
  21. }

74HC595驱动共阳数码管,在指定位置输出一个几位数函数:

  1. /*************************74hc595驱动数码管输出函数***************************
  2. *函数名称:Disp_smg_74HC595_number
  3. *函数功能:74HC595驱动共阳数码管,在指定位置输出一个几位数
  4. *函数调用:Disp_smg_74HC595_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time) ;
  5. *参数列表:x_smg(位置),count_smg(几位数),number(数字),time(延时)
  6. *返 回 值:无
  7. *结 果:在数码管指定位上显示数字
  8. *备 注:
  9. ***************************************************************************/
  10. void Disp_smg_74HC595_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time) //在数码管第二号位置, 写一个6位数
  11. {
  12. uint8 i=0;
  13. uint8 number1[8]; //定义一个存储八位数的每一位的数字用的数组
  14. uint8 code duanma[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf}; //共阳段码
  15. uint8 code wei_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //定义八位数码管位选数据数组
  16. number1[0] = number % 10; //个位
  17. number1[1] = number % 100 / 10; //十位
  18. for(i=0;i < count_smg;i++)
  19. {
  20. Write_INT16_74hc595( duanma[number1[count_smg-1-i]] *256 + wei_dat[x_smg-1+i] );
  21. delay_100us(time);
  22. }
  23. }
  24. /******************************数码管上显示横杠*******************************
  25. *函数名称:HG_74HC595
  26. *函数功能:74HC595驱动共阳数码管,在指定位置输出一个横杠
  27. *函数调用:HG_74HC595(uint8 x_smg,uint8 time);
  28. *参数列表:x_smg(位置),time(延时)
  29. *返 回 值:无
  30. *结 果:在数码管某个位上显示横杠
  31. *备 注:
  32. ***************************************************************************/
  33. void HG_74HC595(uint8 x_smg,uint8 time)
  34. {
  35. Write_INT16_74hc595( duanma[18] *256 + wei_dat[x_smg-1] ); //duanma[18] 或 0xbf //数码管段选显示 "-" 段码数据
  36. delay_100us(time);
  37. }
  38. /******************************数码管上显示点*******************************
  39. *函数名称:XSD_74HC595
  40. *函数功能:74HC595驱动共阳数码管,在指定位置输出一个点
  41. *函数调用:XSD_74HC595(uint8 x_smg,uint8 time);
  42. *参数列表:x_smg(位置),time(延时)
  43. *返 回 值:无
  44. *结 果:在数码管某个位上显示小数点
  45. *备 注:
  46. ***************************************************************************/
  47. void XSD_74HC595(uint8 x_smg,uint8 time)
  48. {
  49. Write_INT16_74hc595( duanma[17] *256 + wei_dat[x_smg-1] ); //duanma[17] 或 0x7f //数码管段选显示 "." 段码数据
  50. delay_100us(time);
  51. }

延时函数

  1. /***************************************************************************
  2. *函数名称:delay
  3. *函数功能:延时函数
  4. *函数调用:delay(uint16 x_ms);
  5. *参数列表:x_ms
  6. *返 回 值:无
  7. *结 果:延迟时间= * x_ms(毫秒)
  8. *备 注:
  9. ***************************************************************************/
  10. void delay(uint16 X_ms) //延迟 X_ms*1 毫秒
  11. {
  12. uint16 m,n;
  13. for(m=X_ms;m>0;m--)
  14. for(n=114;n>0;n--);
  15. }
  16. /***************************************************************************
  17. *函数名称:delay_100us
  18. *函数功能:延时函数
  19. *函数调用:delay(uint16 x_100us);
  20. *参数列表:x_100us
  21. *返 回 值:无
  22. *结 果:延迟时间=100* x_100us(微秒)
  23. *备 注:
  24. ***************************************************************************/
  25. void delay_100us(uint16 x_100us) //延迟 x_100*100 微秒
  26. {
  27. uint16 i,j;
  28. for(i=x_100us;i>0;i--)
  29. for(j=11;j>0;j--);
  30. }

按键扫描:

  1. /*******************************按键识别**********************************
  2. *函数名称:key_scan
  3. *函数功能:写入16位数据,识别出键值
  4. *函数调用:key_scan();
  5. *参数列表:
  6. *返 回 值:key_num
  7. *结 果:识别出8个键值
  8. *备 注:
  9. *************************************************************************/
  10. uint8 key_scan()
  11. {
  12. static uint8 key_num=0;
  13. key_IO = 1;
  14. Write_INT16_74hc595(0xfffe);
  15. if(key_IO == 0)
  16. key_num = 1;
  17. Write_INT16_74hc595(0xfffd);
  18. if(key_IO == 0)
  19. key_num = 2;
  20. Write_INT16_74hc595(0xfffb);
  21. if(key_IO == 0)
  22. key_num = 3;
  23. Write_INT16_74hc595(0xfff7);
  24. if(key_IO == 0)
  25. key_num = 4;
  26. Write_INT16_74hc595(0xffef);
  27. if(key_IO == 0)
  28. key_num = 5;
  29. Write_INT16_74hc595(0xffdf);
  30. if(key_IO == 0)
  31. key_num = 6;
  32. Write_INT16_74hc595(0xffbf);
  33. if(key_IO == 0)
  34. key_num = 7;
  35. Write_INT16_74hc595(0xff7f);
  36. if(key_IO == 0)
  37. key_num = 8;
  38. return key_num;
  39. }

main主程序:

  1. /******************************main主程序**********************************/
  2. void main()
  3. {
  4. while(1)
  5. {
  6. Disp_smg_74HC595_number(7,2,key_scan(),5);
  7. }
  8. }

仿真结果如下 :

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

闽ICP备14008679号