标题: 如何让数码管不关闭显示?附单片机程序 [打印本页]

作者: 三极管一样的人    时间: 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

两种现象


作者: heropp    时间: 2022-9-27 14:30
这个问题一般是延时函数造成的
作者: heropp    时间: 2022-9-27 14:35
检查延时函数
作者: 人中狼    时间: 2022-9-27 14:58
如果是扫描方式驱动数码管的话是要关闭数码管的,while(i--)多余了
作者: 三极管一样的人    时间: 2022-9-27 15:28
人中狼 发表于 2022-9-27 14:58
如果是扫描方式驱动数码管的话是要关闭数码管的,while(i--)多余了

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


作者: yzwzfyz    时间: 2022-9-28 09:59
太简单的问题了:
在你提出的时间节点上,多做几个标记,不就可以了。
作者: 大漠落日    时间: 2022-9-28 10:49
小儿科的事情,调试一下就可以搞定




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1