三星9454,4位一体数码管 动态显示 0-9999 每秒钟计数加1

[复制链接]
6284|4
 楼主| JACK_1986 发表于 2011-6-28 14:33 | 显示全部楼层 |阅读模式
本帖最后由 JACK_1986 于 2011-6-28 16:30 编辑

向各位高手求助,三星9454,4位一体数码管,P2.0-P2.3控制个十百千位,P0.0-P0.6控制段位abcdefg,我现在的遇到的难题是能显示,但有明显的闪烁,内部0.5MHz,T0定时器fosc/4096分频,上图和程序 file:///d:/0-9999.bmp   ,代码如下:
  1. //********************************
  2. //产品名称: IAR-C编程示例
  3. //使用MCU: S3F9454
  4. //FOSC = 0.5MHZ
  5. //以下示例中很多变量及定义可能并未
  6. //用到,在此仅仅作为示范性列示
  7. //********************************
  8. #include "ioS3C9454.h"//
  9. #include "intrinsics.h"//包含内部函数
  10. //************************************************
  11. //**此处为宏定义替换******
  12. //平台相关
  13. #define SET_BIT(port, bit) (port = port | (0x1 << bit))
  14. #define CLR_BIT(port, bit) (port = port & ~(0x1 << bit))
  15. #define TEST_BIT(port, bit) (port & (0x1 << bit))
  16. #define COM_BIT(port,bit) (port = port ^ (0x1 << bit))
  17. #define NOP (__no_operation()) // 将后者指令行缩写为nop;
  18. #define DI (__disable_interrupt()) //将后者指令行缩写为di;
  19. #define EI (__enable_interrupt()) //将后者指令行缩写为ei;
  20. //部分通用宏操作定义
  21. #define Clr_WatchDog (BTCON |= 0x02) //喂狗
  22. //************************************************
  23. //**此处定义程序所用到的全局变量*******
  24. unsigned char RUNFLAG = 0;
  25. unsigned char DISPFLAG = 0;
  26. unsigned char ERRFLAG = 0; //错误代码标志寄存器
  27. unsigned char KEY_CODE = 0; //键扫描码
  28. unsigned char table[10] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //数码管
  29. unsigned char tab_bit[4] = {0x1,0x2,0x4,0x8}; //p2.0-P2.3
  30. unsigned int count;
  31. unsigned char tp[4];
  32. unsigned char num;

  33. //*************************************************************************
  34. //位操作寄存器定义

  35. //*************************************************************************
  36. //***程序所用函数声明*****
  37. //***凡程序中所用到的函数请先在这里声明***
  38. __interrupt void int_9454();
  39. //*************************************************************************
  40. //*************************************************************************
  41. //**定义9454的SMART OPTION值****
  42. //**003CH,must be initialized to 0
  43. //**003DH,must be initialized to 0
  44. //**003EH,enable LVR(2.3V)
  45. //**003FH,internal RC(0.5MHZ in Vdd=5V)
  46. //*************************************
  47. __code const volatile unsigned char SmartOption[4] @0x003c = {0x0,0x0,0xe7,0x02};
  48. //*************************************************************************
  49. //*************************************************************************

  50. **********************************************************
  51. void Delay5ms(void) //延时函数
  52. {
  53. unsigned int i;
  54. for(i=50;i>0;i--)
  55. {
  56. Clr_WatchDog;
  57. NOP;
  58. NOP;
  59. NOP;
  60. NOP;
  61. NOP;
  62. NOP;
  63. NOP;
  64. NOP;
  65. NOP;
  66. NOP;
  67. }
  68. }

  69. void LedScan(unsigned char num,unsigned char wei)
  70. {
  71. //这里是LED显示动态扫描过程
  72. P2=0x0;
  73. P0=table[num]; //段码
  74. P2=tab_bit[wei]; //位
  75. Delay5ms(); //延时
  76. P2=0x0; //关闭显示

  77. }

  78. //========================主程序控制===========================
  79. void main(void)
  80. {
  81. unsigned char buffer = SmartOption[0];


  82. BTCON= 0xA2;
  83. CLKCON=0x98;

  84. P0PND = 0x00;
  85. //P0CONH=0x9a;//
  86. P0CONH = 0xAA; //推挽输出
  87. P0CONL = 0xAA; //推挽输出
  88. P0 = 0x0;

  89. P1CON = 0xCA;
  90. P1 = 0x0;

  91. P2CONH = 0x4A;
  92. P2CONL = 0xAA;
  93. P2=0x0;

  94. PWMDATA = 0x80;
  95. PWMCON = 0x10; //FOSC/64
  96. //PWMCON = 0x4;

  97. T0DATA = 0x7A; //1s
  98. T0CON = 0x0A; //fosc/4096

  99. EI;

  100. while(1)
  101. {
  102. unsigned char i;
  103. for(i=0;i<4;++i)
  104. {
  105. LedScan(tp,i); //显示

  106. }


  107. }
  108. }
  109. //******************************************************************
  110. #pragma vector=0x00
  111. __interrupt void int_9454()
  112. {
  113. T0CON = T0CON & 0xFE; //必须清T0中断标志
  114. T0DATA=0x7A;
  115. T0CON=0xA;
  116. count++; //1s来一次中断
  117. if(count>9999)
  118. {
  119. count=0;
  120. }
  121. tp[3]=count/1000; //千位
  122. tp[2]=count%1000/100; //百位
  123. tp[1]=count%100/10; //十位
  124. tp[0]=count%10; //个位

  125. }
  126. //*************************************************************************
 楼主| JACK_1986 发表于 2011-6-28 14:37 | 显示全部楼层
本帖最后由 JACK_1986 于 2012-4-27 20:42 编辑

高手赐教
tianjigg 发表于 2011-6-28 21:41 | 显示全部楼层
不要用除法,自己写一个
老鱼探戈 发表于 2011-6-28 21:53 | 显示全部楼层
确定岩石时间是5ms左右,把ledscan函数中最后一句关闭现实去掉试试。
另最好不要用除法,直接用BCD码,高4位和低4位分别表示一位,两个uchar型就可以。
 楼主| JACK_1986 发表于 2011-6-29 10:51 | 显示全部楼层
本帖最后由 JACK_1986 于 2012-4-27 20:42 编辑

嗯,谢谢两位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

16

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部