找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7300|回复: 3
打印 上一主题 下一主题
收起左侧

STM32+74HC595源码 三位数码管显示时间,按键调节时间加减,一个按键执行

[复制链接]
跳转到指定楼层
楼主
数码管电路原理图如下:


单片机源程序如下:

595驱动:
  1. #include "stm32f10x.h"
  2. #include "HC595.h"
  3. #include "delay.h"
  4. #include "key.h"


  5. #define uint  unsigned int
  6. #define uchar unsigned char

  7. //初始化PA0、PA1和PA2为输出口,并使能这个端口的时钟                    
  8. //HC595 IO初始化
  9. void HC595_Init(void)
  10. {
  11.         GPIO_InitTypeDef  GPIO_InitStructure;
  12.          
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                                                                 //使能PA端口时钟
  14.         
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;        //端口配置
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                                                  //推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  19.         GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);                                                 //PA0,1,2 输出高

  20. }

  21. void HC595_Display(unsigned char Bai, unsigned char Shi, unsigned char Ge)
  22. {
  23.         uchar k;
  24.         uchar n = Ge;
  25.         uchar m = Shi;
  26.         uchar x = Bai;
  27.         for(k=0;k<8;k++)
  28.         {
  29.                 if(n&0x80) HC595_SDI = 1;
  30.                 else HC595_SDI = 0;   //判断当前发送位数据
  31.                 n <<= 1;                                      //左移一位
  32.                 HC595_CLK = 0;
  33.                 //delay_ms(1);
  34.                 HC595_CLK = 1;               //移位寄存器操作
  35.                 //delay_ms(1);               
  36.         }               
  37.         for(k=0;k<8;k++)
  38.         {
  39.                 if(m&0x80)HC595_SDI =1;
  40.                 else HC595_SDI = 0;                //判断当前发送位数据
  41.                 m <<= 1;                                                        //左移一位
  42.                 HC595_CLK = 0;
  43.                 //delay_ms(1);
  44.                 HC595_CLK = 1;               //移位寄存器操作
  45.                 //delay_ms(1);
  46.         }
  47.         
  48.         for(k=0;k<8;k++)
  49.         {
  50.                 if(x&0x80)HC595_SDI =1;
  51.                 else HC595_SDI = 0;                //判断当前发送位数据
  52.                 x <<= 1;                                                        //左移一位
  53.                 HC595_CLK = 0;
  54.                 //delay_ms(1);
  55.                 HC595_CLK = 1;               //移位寄存器操作
  56.                 //delay_ms(1);
  57.         }
  58.         
  59.         HC595_LE = 1;
  60.         //delay_ms(1);
  61.         HC595_LE = 0;                        //锁存数据
  62.         //delay_ms(1);
  63. }

  64. //void HC595_Off(void)
  65. //{
  66. //        //OE = 1;               
  67. //}

  68. //void SMG(void)
  69. //{  
  70. //         
  71. //          u8 key;
  72. //          int a=0;//b=0, c=0;

  73. //          unsigned char Bai_Wei,Shi_Wei,Ge_Wei;        //千位,百位,十位,个位Qian_Wei,
  74. //                //数码管编码
  75. //                unsigned char table[] =
  76. //                {0xc0,0xf9,0xa4,0xb0,0x99,
  77. //                0x92,0x82,0xf8,0x80,0x90,
  78. //                0xff,0x00,0x90,0x86,0xaf,
  79. //                0xc0,0x89,0xc7,0x8e,0xc1,0x7f};
  80. //                //0,1,2,3,4,5,6,7,8,9,全暗,全亮,g,E,r,O,H,L,F,U,小数点,共阳数码管使用
  81. //   
  82. //               
  83. //    key=KEY_Scan(0);   //扫描按键
  84. //                if(key==KEY_LEFT)
  85. //                {
  86. //            a++;               
  87. //               
  88. //                }
  89. //                Bai_Wei = table[a];
  90. //                Shi_Wei = table[2];
  91. //                Ge_Wei = table[3];
  92. //                HC595_Display(Bai_Wei,Shi_Wei,Ge_Wei);
  93. //}
复制代码

  1. //2位数码管测试代码           
  2. //樊川技术
  3. //实验现象:3位数码管轮流显示数码管编码表里面的字符
  4. #include "led.h"
  5. #include "delay.h"
  6. #include "sys.h"
  7. #include "HC595.h"
  8. #include "key.h"
  9. #include "time.h"

  10. unsigned char Qian_Wei,Bai_Wei,Shi_Wei,Ge_Wei;        //千位,百位,十位,个位
  11. float d=0;
  12. //数码管编码
  13. unsigned char table[] =
  14. {0xc0,0xf9,0xa4,0xb0,0x99,
  15. 0x92,0x82,0xf8,0x80,0x90,
  16. 0xff,0x00,0x90,0x86,0xaf,
  17. 0xc0,0x89,0xc7,0x8e,0xc1,0x7f};
  18. //0,1,2,3,4,5,6,7,8,9,全暗,全亮,g,E,r,O,H,L,F,U,小数点,共阳数码管使用

  19. unsigned char table1[] =
  20. {0xc0,0xf9,0xa4,0xb0};
  21. //0,1,2,3,4,5,6,7,8,9,全暗,全亮,g,E,r,O,H,L,F,U,小数点,共阳数码管使用

  22. int KEY_ING=1;


  23. int main(void)
  24. {
  25.         u8 key;
  26.   int a=0,b = 0,c = 0;
  27.         SystemInit();                                        //系统时钟初始化为72M          SYSCLK_FREQ_72MHz
  28.         delay_init(72);                                //延时函数初始化
  29.         NVIC_Configuration();        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  30.         LED_Init();                //LED端口初始化

  31.         HC595_Init();
  32.         KEY_Init();
  33.         TIM4_Init(1000,36000-1);  //定时500ms

  34.         
  35.         
  36. //        //清空LED数码管
  37. //        Bai_Wei = table[10];//清空LED
  38. //        Shi_Wei = table[10];//清空LED
  39. //        Ge_Wei = table[10];//清空LED
  40. //        HC595_Display(Bai_Wei, Shi_Wei,Ge_Wei);
  41. //        delay_ms(3000);

  42.         
  43.         
  44.         while(1)
  45.         {               
  46.                 key=KEY_Scan(0);   //扫描按键
  47.                 switch(key)
  48.                 {
  49.                         case KEY_DOWN: KEY_ING=1;break;    //按下K_DOWN按键  熄灭D2指示灯
  50.                         case KEY_LEFT: c=c+5;break;    //按下K_LEFT按键  点亮D3指示灯
  51.                         case KEY_RIGHT: c=c-5;break;   //按下K_RIGHT按键 熄灭D3指示灯
  52.                 }
  53.                                                         if(c == 10)
  54.                                                         {
  55.                                                                 c = 0;
  56.                                                                 b++;
  57.                                                         }
  58.                                                         if(c == -5)
  59.                                                         {
  60.                                                                 c = 5;
  61.                                                                 b--;
  62.                                                         }
  63.                                                         if(b == -1)
  64.                                                         {
  65.                                                                 b = 9;
  66.                                                                 a--;                        
  67.                                                         }
  68.                                                         if(b == 10)
  69.                                                         {
  70.                                                                 b = 0;
  71.                                                                 a++;                        
  72.                                                         }
  73.                                                         if(a == 3)
  74.                                                         {  
  75.                                                                 b= 0;
  76.                                                                 c= 0;
  77.                                                         }
  78.                                                         if(a <0)
  79.                                                         {  
  80.                                                                 a=0;
  81.                                                                 b=0;
  82.                                                                 c= 0;
  83.                                                         }
  84.                
  85.                 d=a*10+b+0.1*c;
  86.     Bai_Wei = table1[a];
  87.                 Shi_Wei = table[b];
  88.                 Ge_Wei =  table[c];
  89.                 HC595_Display(Bai_Wei,Shi_Wei,Ge_Wei);
  90.         }
  91. }
复制代码

Keil代码下载:
STM32_3位数码管定时程序.rar (295.17 KB, 下载次数: 190)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:430492 发表于 2019-3-19 20:11 | 只看该作者
正在弄这个程序,感谢楼主分享啊!
回复

使用道具 举报

板凳
ID:924454 发表于 2021-5-20 15:03 | 只看该作者
感谢楼主的精彩分享!
回复

使用道具 举报

地板
ID:928738 发表于 2022-2-10 11:15 | 只看该作者
没有原理图,图片不清晰
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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