找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2880|回复: 6
收起左侧

共阳数码管,不显示时间数据,请大家帮我看看程序什么问题。

[复制链接]
ID:653323 发表于 2019-12-13 21:32 | 显示全部楼层 |阅读模式
共阳数码管,不显示时间数据
mmexport1574254844189.jpg
mmexport1574254848000.jpg
mmexport1576241612376.jpg
mmexport1576241618120.jpg
mmexport1576241626973.jpg
mmexport1576241633354.jpg
mmexport1576241639625.jpg
mmexport1576241644393.jpg
mmexport1576241649845.jpg
mmexport1576241655121.jpg
回复

使用道具 举报

ID:235200 发表于 2019-12-14 01:39 | 显示全部楼层
程序都是贴的图片,程序也不短,光凭眼去分析也是需要花时间的,建议把原程序贴出来,或许会有好心人帮你去调试一下找到问题!
回复

使用道具 举报

ID:3212 发表于 2019-12-14 06:37 | 显示全部楼层
我一个问题:你的MCU是什么封装?
SOP的,TTSOP的还是DIP的?
回复

使用道具 举报

ID:155507 发表于 2019-12-14 12:19 | 显示全部楼层
这里错了

seg1=1; // <====== PnP三极管  需用IO低电平输出驱动
displayHH1(disdata[num/10]);
delay10us();
seg1=0; // <======

换成

seg1=0;
displayHH1(disdata[num/10]);
delay10us();
seg1=1;

回复

使用道具 举报

ID:213173 发表于 2019-12-14 19:40 | 显示全部楼层
STC15W402AS可以设置为推挽模式用于位码输出端口,不需要加三极管放大。段码端口到数码管间一定要加8个1K左右限流电阻,以免烧端口。这个代码是按STC15写的,仿真用的是8051,两者管脚不同。按键可以短按+长按连+,并有闪秒。
无标题.jpg

  1. //适用于STC15系列
  2. #include <STC15F2K60S2.H>
  3. //#include "STC15.h"
  4. #define uint unsigned int               
  5. #define uchar unsigned char   

  6. sbit key1 =P3^0;
  7. sbit key2 =P3^1;

  8. sbit seg1 =P5^4;
  9. sbit seg2 =P3^3;
  10. sbit seg3 =P3^7;
  11. sbit seg4 =P5^5;

  12. sbit a=P1^1;
  13. sbit b=P3^6;
  14. sbit c=P1^4;
  15. sbit d=P1^3;
  16. sbit e=P1^2;
  17. sbit f=P1^0;
  18. sbit g=P1^5;
  19. sbit h=P3^2;
  20. //顺序共阳极数码管段码表
  21. unsigned char code table[]={//共阳数码管段码"0~f-."
  22.                 0xc0,0xf9,0xa4,0xb0,
  23.                 0x99,0x92,0x82,0xf8,
  24.                 0x80,0x90,0x88,0x83,
  25.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  26. uchar hour=12,min=0,sec=0;
  27. uchar tcnt;
  28. bit flag;

  29. void delayms(uint k)//1T
  30. {
  31.     uint i,j;            
  32.     for(i=k;i>0;i--)   
  33.         for(j=1250;j>0;j--);//1T
  34. }

  35. /*
  36. void InitTimer0() //50毫秒@11.0592MHz
  37. {
  38.         AUXR &= 0x7F;        //定时器时钟12T模式
  39.         TMOD &= 0xF0;        //设置定时器模式
  40.         TL0 = 0x00;                //设置定时初值
  41.         TH0 = 0x4C;                //设置定时初值
  42.         TF0 = 0;                        //清除TF0标志
  43.         TR0 = 1;                        //定时器0开始计时
  44.         EA  = 1;
  45.         ET0 = 1;
  46. }*/

  47. void InitTimer0()//50毫秒@12.000MHz
  48. {
  49.         AUXR &= 0x7F;        //定时器时钟12T模式
  50.         TMOD &= 0xF0;        //设置定时器模式
  51.         TL0 = 0xB0;                //设置定时初值
  52.         TH0 = 0x3C;                //设置定时初值
  53.         TF0 = 0;                        //清除TF0标志
  54.         TR0 = 1;                        //定时器0开始计时
  55.         EA  = 1;
  56.         ET0 = 1;
  57. }

  58. void keyscan()       
  59. {
  60.         static uchar count1,count2;
  61.         if(!key1)
  62.         {
  63.                 if(++count1>=100)
  64.                 {
  65.                         count1=0;
  66.                         hour++;
  67.                         if(hour>=24)
  68.                                 hour=0;
  69.                 }
  70.         }
  71.         else count1=0;

  72.         if(!key2)
  73.         {
  74.                 if(++count2>=100)
  75.                 {
  76.                         count2=0;
  77.                         min++;
  78.                         tcnt=0;
  79.                         sec=0;
  80.                         if(min>=60)
  81.                                 min=0;
  82.                 }
  83.         }
  84.         else count2=0;
  85. }
  86. void displayHH(uchar i)
  87. {   
  88.     a=i&0x01;i>>=1;       
  89.     b=i&0x01;i>>=1;
  90.     c=i&0x01;i>>=1;
  91.     d=i&0x01;i>>=1;
  92.     e=i&0x01;i>>=1;
  93.     f=i&0x01;i>>=1;
  94.     g=i&0x01;i>>=1;
  95.     h=i&0x01;
  96. }
  97. /*
  98. void displayHH(uchar q)
  99. {   
  100.         switch(q)
  101.         {
  102.                 case 0:a=b=c=d=e=f=0;g=h=1;break;
  103.                 case 1:b=c=0;a=d=e=f=g=h=1;break;
  104.                 case 2:a=b=d=e=g=0;c=f=h=1;break;
  105.                 case 3:a=b=c=d=g=0;e=f=h=1;break;
  106.                 case 4:b=c=f=g=0;a=d=e=h=1;break;
  107.                 case 5:a=c=d=f=g=0;b=e=h=1;break;
  108.                 case 6:a=c=d=e=f=g=0;b=h=1;break;
  109.                 case 7:a=b=c=0;d=e=f=g=h=1;break;
  110.                 case 8:a=b=c=d=e=f=g=0;h=1;break;
  111.                 case 9:a=b=c=d=f=g=0;e=h=1;break;
  112.         }
  113. }*/

  114. void display()
  115. {
  116.         static uchar i=0;
  117.         seg1=seg2=seg3=seg4=0;//消隐
  118.         switch(i)
  119.         {
  120.                 case 0: displayHH(table[hour/10]);seg1=1;seg2=0;seg3=0;seg4=0;break;
  121.                 case 1: if(flag==1)
  122.                                         displayHH(table[hour%10]&0x7f);//加点
  123.                                   else displayHH(table[hour%10]);//不加点
  124.                                                                                                          seg1=0;seg2=1;seg3=0;seg4=0;break;
  125.                 case 2: displayHH(table[min/10]) ;seg1=0;seg2=0;seg3=1;seg4=0;break;
  126.                 case 3: displayHH(table[min%10]) ;seg1=0;seg2=0;seg3=0;seg4=1;break;
  127.         }
  128.         delayms(2);
  129.         i++;
  130.         i%=4;
  131. }

  132. void main(void)
  133. {
  134.         P3M1 = 0x00;         //P3.3/P3.7 推挽:0000 0000
  135.         P3M0 = 0x88;        //P3.3/P3.7 推挽:1000 1000
  136.         P5M1 = 0x00;         //P5.4/P5.5 推挽:0000 0000
  137.         P5M0 = 0x30;         //P5.4/P5.5 推挽:0011 0000
  138.         InitTimer0();
  139.         while (1)
  140.         {
  141.                 keyscan();
  142.                 display();
  143.         }
  144. }

  145. void Timer0Interrupt(void) interrupt 1
  146. {
  147.         tcnt++;
  148.         if(tcnt<10)
  149.                 flag=1;
  150.         else flag=0;
  151.         if(tcnt>=20)
  152.         {
  153.                 tcnt=0;
  154.                 sec++;
  155.                 if(sec>=60)
  156.                 {
  157.                         sec=0;
  158.                         min++;
  159.                         if(min>=60)
  160.                         {
  161.                                 min=0;
  162.                                 hour++;
  163.                                 if(hour>=24)
  164.                                         hour=0;
  165.                         }
  166.                 }
  167.         }
  168. }
复制代码



回复

使用道具 举报

ID:653323 发表于 2019-12-15 01:03 来自手机 | 显示全部楼层
wulin 发表于 2019-12-14 19:40
STC15W402AS可以设置为推挽模式用于位码输出端口,不需要加三极管放大。段码端口到数码管间一定要加8个1K左 ...

怎么只显示0000     1111
1576342949538.jpg
1576342990617.jpg
回复

使用道具 举报

ID:213173 发表于 2019-12-16 07:31 | 显示全部楼层
ljz123456 发表于 2019-12-15 01:03
怎么只显示0000     1111

程序的位驱动是按IO口直接输出编写,不加三极管放大。你不动脑?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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