找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何让数码管不关闭显示?附单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:53813 发表于 2022-9-27 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前遇到一个问题,求组论坛大神:
要求:

前8个LED左右来回一次后,第九个LED翻转一下,同时数码管显示循环次数
已实现:
8个LED左右来回一次后,第九个LED翻转一下
问题:

数码管的显示循环次数,不能一直保持显示
【补充说明,我的目标是:当新的一轮LED循环时,数码管能一直保持上一次的数据
   只有当新的一轮LED循环结束后 ,第九个LED翻转,数码管再更新数据】


如果,保持位选一直开着,则会在显示当前次数后,变成显示0;
如果,位选关闭,则会出现一闪一闪;

单片机源程序如下:
  1. /*
  2. * File:   Main.c
  3. * Author: 12618
  4. *
  5. * Created on 2022年9月30日, 上午9:53
  6. */
  7. /* Includes:主函数 ------------------------------------------------------------------*/
  8. #include <Main.h>

  9. /* Private define:个人定义变量 host变量 (字符常量)-------------------------------------------------------------*/


  10. /* Private variables:个人绑定变量----------------------------------------------------------*/


  11. /* Public variables:公共绑定变量-----------------------------------------------------------*/


  12. /* Private function prototypes:个人功能函数------------------------------------------------*/


  13. /*
  14.     * @name   main
  15.     * @brief  主函数
  16.     * @param  None   
  17.     * @retval None      
  18. */
  19. int main()
  20. {
  21.    
  22.     Sys.Sys_Init();
  23.    
  24.    
  25.    
  26.     //系统主循环
  27.     while(1)
  28.     {
  29.         //Isr.Timer0_ISR();中断查询法
  30.         SMG1.SumLed_SMG();
  31.          
  32.     }
  33.    
  34.             
  35.    
  36. }



  37. /********************************************************
  38.   End Of File
  39. ********************************************************/




  40. /*
  41. * File:   SMG.c
  42. * Author: Administrator
  43. *
  44. * Created on 2022年9月20日, 下午4:27
  45. */


  46. #include <Main.h>

  47. /* Private define-------------------------------------------------------------*/

  48. u16_int ge;
  49. u16_int shi;
  50. u16_int bai;
  51. u16_int qian;

  52. const u8_word LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //段码表

  53. /* Private variables----------------------------------------------------------*/
  54. static   void SMG_SumLed(void);                   //适用输入输出端口初始化


  55. /* Public variables-----------------------------------------------------------*/
  56. //结构体定义对应.h的结构体类型
  57. SMG_t    SMG1 =
  58. {
  59.     0,                        //定义数码管计数初值为0
  60.     SMG_SumLed,
  61. };

  62. /* Private function prototypes------------------------------------------------*/  

  63. /*
  64.     * @name  SMG_SumLed()
  65.     * @brief  数码管函数
  66.     * @param  None
  67.     * @retval None      
  68. */
  69. ///// 查询法,需要放入while(1)//////
  70.   static  void SMG_SumLed()
  71. {     
  72.      Run_LED.LED_Flash();
  73.      COUNT_LED = !COUNT_LED;
  74.      SMG1.Flash_count = ++SMG1.Flash_count;
  75.       
  76.    
  77.      
  78.     ge   =  SMG1.Flash_count % 10;
  79.     shi  =  SMG1.Flash_count % 100 / 10;
  80.     bai  =  SMG1.Flash_count % 1000 / 100;
  81.     qian =  SMG1.Flash_count / 1000;
  82.    
  83.      u16_int i = 2;
  84.    
  85.     while( i--)
  86.     {
  87.           PORTBbits.RB3 = 0;                              //选择个位数码管
  88.           PORTD = LED[ge];                            //获取个位值
  89.           Delay_timer.Delay_1us(5);                       //十延时
  90.           //PORTD = 0xFF;                                   //清数码管显示
  91.           //PORTBbits.RB3 = 1;                              //关数码管

  92.           PORTBbits.RB2 = 0;                              //选择十位数码管
  93.           PORTD = LED[shi];                         //获取十位值
  94.          Delay_timer.Delay_1us(5);                       //延时
  95.          // PORTD = 0xFF;                                   //清数码管显示
  96.           //PORTBbits.RB2 = 1;                              //关数码管*/


  97.           PORTBbits.RB1 = 0;                              //选择百位数码管
  98.           PORTD =LED[bai];                         //获取百位值
  99.           Delay_timer.Delay_1us(5);                       //延时
  100.          // PORTD = 0xFF;                                   //清数码管显示
  101.           //PORTBbits.RB1 = 1;                              //关数码管

  102.           PORTBbits.RB0 = 0;                              //选择千位数码管
  103.           PORTD = LED[qian];                          //获取千位值
  104.           Delay_timer.Delay_1us(5);                      //延时
  105.           //PORTD = 0xFF;                                   //清数码管显示
  106.           //PORTBbits.RB0 = 1;                              //关数码管
  107.    
  108.      }   
  109.                            
  110. }
复制代码

Desktop.zip

1.12 MB, 下载次数: 6

两种现象

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

使用道具 举报

沙发
ID:446095 发表于 2022-9-27 14:30 | 只看该作者
这个问题一般是延时函数造成的
回复

使用道具 举报

板凳
ID:446095 发表于 2022-9-27 14:35 | 只看该作者
检查延时函数
回复

使用道具 举报

地板
ID:384109 发表于 2022-9-27 14:58 | 只看该作者
如果是扫描方式驱动数码管的话是要关闭数码管的,while(i--)多余了
回复

使用道具 举报

5#
ID:53813 发表于 2022-9-27 15:28 | 只看该作者
人中狼 发表于 2022-9-27 14:58
如果是扫描方式驱动数码管的话是要关闭数码管的,while(i--)多余了

如果不while(--)的话,
这个Delay_timer.Delay_1us( );   不增加就会一闪而过
如果这个Delay_timer.Delay_1us( ); 增加,数码管就会明显趋于流水从右到左一闪而过

回复

使用道具 举报

6#
ID:123289 发表于 2022-9-28 09:59 | 只看该作者
太简单的问题了:
在你提出的时间节点上,多做几个标记,不就可以了。
回复

使用道具 举报

7#
ID:195496 发表于 2022-9-28 10:49 | 只看该作者
小儿科的事情,调试一下就可以搞定
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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