一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4456|回复: 4
收起左侧

[STM8/STM32] STM8S数码管折腾半夜无果,早上就来求助

[复制链接]
发表于 2012-9-11 07:56 | 显示全部楼层 |阅读模式
本帖最后由 gw168sh 于 2012-9-11 07:57 编辑

用的STMS103F2,因数码管不在一个P口,要组到一起用。
但是显示会乱。还好现在知道一点规律了,请教一下论坛的朋友。

1。我试过,只让某一为显示,且这个数字不变的情况下显示正常。 如给数赋值1,只让个位显示就正常。(0-9都可以)
2.只扫描一位,如个位,如果让shu++; 1.2.正常后面就乱了套了。
3.如果扫描4位,shu=1234;不变。四位一样乱套。


昨夜折腾1.30没找到问题,郁闷的很


  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */

  5. #include <iostm8a.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define GE_ON PD_ODR&=0b11101111;//PD4输出0
  9. #define GE_OFF PD_ODR|=0b00010000;//PD4输出1

  10. #define SHI_ON PD_ODR&=0b11011111;//PD5输出0
  11. #define SHI_OFF PD_ODR|=0b00100000;//PD5输出1

  12. #define BAI_ON PD_ODR&=0b10111111;//PD6输出0
  13. #define BAI_OFF PD_ODR|=0b01000000;//PD6输出1

  14. #define QIAN_ON PA_ODR&=0b11110111;//PA3为输出0
  15. #define QIAN_OFF PA_ODR|=0b00001000;//PA3为输出1

  16. uint shu,num;
  17. const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  18. 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  19. //const uchar table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
  20. //0xF8,0x80,0x90};//共阳0-9的LED笔划
  21. void LED_7(unsigned char da)
  22. {
  23. uchar Px7,Px6,Px5,Px4,Px3,Px2,Px1,Px0;
  24. //Px7 = (da&0x80); //H---
  25. // if(Px7==1) ;
  26. //else if(Px7==0) ;

  27. Px6 = (da&0x40); //G---
  28. if(Px6==1) PC_ODR&=0b11110111;//PC3为输出0
  29. else if(Px6==0) PC_ODR|=0b00001000;//PC3为输出1

  30. Px5 = (da&0x20); //F
  31. if(Px5==1) PC_ODR&=0b11101111;//PC4为输出0
  32. else if(Px5==0) PC_ODR|=0b00010000;//PC4为输出1
  33. Px4 = (da&0x10); //E
  34. if(Px4==1) PC_ODR&=0b11011111;//PC5为输出0
  35. else if(Px4==0) PC_ODR|=0b00100000;//PC5为输出1
  36. Px3 = (da&0x08); //D
  37. if(Px3==1) PC_ODR&=0b10111111;//PC6为输出0
  38. else if(Px3==0) PC_ODR|=0b01000000;//PC6为输出1
  39. Px2 = (da&0x04); //C
  40. if(Px2==1) PC_ODR&=0b01111111;//PC7为输出0
  41. else if(Px2==0) PC_ODR|=0b10000000;//PC7为输出1
  42. Px1 = (da&0x02); //B
  43. if(Px1==1) PD_ODR&=0b11111101;//PD1为输出0
  44. else if(Px1==0) PD_ODR|=0b00000010;//PD1为输出1
  45. Px0 = (da&0x01); //A
  46. if(Px0==1) PD_ODR&=0b11111011;//PD2为输出0
  47. else if(Px0==0) PD_ODR|=0b00000100;//PD2为输出1
  48. }

  49. void GPIO_Init(void)
  50. {
  51. PD_DDR|=0b11110111;//PD为输出,
  52. PD_CR1|=0b11110111;//对应位设置为推挽输出

  53. PC_DDR|=0b11111111;//PC为输出,
  54. PC_CR1|=0b11111111;//对应位设置为推挽输出

  55. PA_DDR|=0b00001111;//PA为输出,
  56. PA_CR1|=0b00001111;//对应位设置为推挽输出

  57. //PD_CR1&=0xF2;//对应位设置为模拟开漏输出(不是真正开漏)

  58. }
  59. void Delay(unsigned int i)
  60. {
  61. unsigned int j;
  62. while(i--)
  63. {
  64. //for(j=0;j<10000;j++);
  65. }
  66. }
  67. main()
  68. {

  69. GPIO_Init();
  70. shu=0;

  71. while (1)
  72. {
  73. uchar a1,a2,a3,a4;
  74. a4=shu/1000;
  75. a3=shu%1000/100;
  76. a2=shu%100/10;
  77. a1=shu%10;
  78. num++;
  79. if(num==300)
  80. {
  81. num=0;
  82. shu++;
  83. }


  84. //LED_7(table[a1]); GE_ON; Delay(1000); GE_OFF;
  85. //LED_7(table[a2]); SHI_ON; Delay(1000); SHI_OFF;
  86. //LED_7(table[a3]); BAI_ON; Delay(1000); BAI_OFF;
  87. //LED_7(table[a4]); QIAN_ON; Delay(1000); QIAN_OFF;

  88. LED_7(table[a1]); GE_OFF; Delay(1000); GE_ON; Delay(100);
  89. //LED_7(table[a2]); SHI_OFF; Delay(1000); SHI_ON; Delay(100);
  90. //LED_7(table[a3]); BAI_OFF; Delay(1000); BAI_ON; Delay(100);
  91. //LED_7(table[a4]); QIAN_OFF; Delay(1000); QIAN_ON; Delay(100);

  92. }
  93. }
复制代码
 楼主| 发表于 2012-9-11 08:25 | 显示全部楼层
1111.jpg

电路图没有画呢
实际就是这样子连接的,a-g接500欧姆电阻到IO。
发表于 2012-9-11 09:25 | 显示全部楼层
放在不同的口上确实麻烦点,

你切换不同位的时候 记得关断下 所有位,然后在显示. 要不然数据肯定乱,不信你可以显示 1111 就是好的,显示1234 就乱
 楼主| 发表于 2012-9-11 10:24 | 显示全部楼层
LED_7(table[a1]);GE_OFF;         Delay(1000);GE_ON;  
        PD_ODR=0x00;PC_ODR=0x00;
       
  LED_7(table[a2]); SHI_OFF;  Delay(1000); SHI_ON;
        PD_ODR=0x00;PC_ODR=0x00;
       
        LED_7(table[a3]); BAI_OFF;  Delay(1000); BAI_ON;
        PD_ODR=0x00;PC_ODR=0x00;
       
        LED_7(table[a4]); QIAN_OFF; Delay(1000); QIAN_ON;
        PD_ODR=0x00;PC_ODR=0x00;

OK了谢谢
 楼主| 发表于 2012-9-11 10:26 | 显示全部楼层
总结一下,
程序弄不好的时候要出去转转,或者等等在弄。很简单的事,浪费时间,
早上6.30起来送孩子上学,日,瞌睡死了

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-20 21:23 , Processed in 0.056198 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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