【原子哥,各位大神!】想利用八段数码管做一个电子表

2019-08-17 03:30发布

想利用八段数码管做一个电子表。
数码管一个有四片。
最后一片显示秒数。利用延时函数成功实现了,到9的时候,需要进位,想让倒数第二片数码管显示进位的数,但是问题出现了,按理第四片到9,第三片就应该变成1,然后第四片循环,直到下一次到9,第三片才变成2,以此类推。为什么我没有办法让第三片数码管停止在一个数不动,就是等到需要进位的时候第三片的状态完全跟第四片一样了!
[mw_shl_code=c,true] u8 const CharCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码表 //数码管显示 int main(void) { // u8 i; // u8 t; u8 a; //秒个位(第四片) u8 b; //秒十位(第三片) Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 SEG_Init(); //数码管初始化 SEG_DATAOUT(0); //取段码数据 KEY_Init(); /* 数码管第四片显示秒的个位数 */ b=0; for(a=1;;a++) { if(a==10) { delay_ms(1000); a=0; b=b+1; { SEG_DATAOUT(CharCode<<8); PC8=0; } { SEG_DATAOUT(CharCode[0]<<8); PC9=0; } } else if(a<=9) { delay_ms(1000); SEG_DATAOUT(CharCode[a]<<8); PC9=0; } }[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
八度空间
1楼-- · 2019-08-18 00:30
回复【5楼】Mr_Head:
---------------------------------
同意原子哥答案,数码管就是扫描的,不扫描不行,好好想想肿么扫描吧,生么共阳、共阴的,让它显示数字再说
老虎的菜
2楼-- · 2019-08-18 04:46
回复【6楼】Mr_Head:
---------------------------------
你这用中断好吗,就用延时 主函数啥都不用干了
羽神落
3楼-- · 2019-08-18 09:50
 精彩回答 2  元偷偷看……
mackyming
4楼-- · 2019-08-18 12:12
以前玩过51的代码,参考下吧,其中P10,11,12是控制74HC138译码器的,这里可直接改为你COM端口



 #include<reg52.h>



#define uint unsigned int
#define uchar unsigned char
 sbit 10=P1^0;
sbit 11=P1^1;
sbit 12=P1^2;
sbit beep=P3^4;
sbit ir=P3^3;
sbit relay=P3^5;
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
display(uint ,uint ,uint ,uint );
delay(uint);
uchar flag;
uint a;
uint b;
uchar c=50;
void main()
{ TMOD=0X20;
  TH1=0xfd;
  TL1=0xfd;
  TR1=1;
  SM0=0;
  SM1=1;
  REN=1;
  EA=1;
  ES=1;
while(1)
{display(a/1000,a%1000/100,a%100/10,a%10);
         b++;
if(flag==1)
{
ES=0;
flag=0;
SBUF=a+1;
while(!TI);
TI=0;
ES=1;}

     if(ir==0)
      c=50;
     if(ir==1)
      c=30;



 if(b==c) 
 {
  beep=!beep;
  b=0;
  a=a+1;
  if(a%10==0)
  relay=!relay;
 

 }
      
      
    
  }

}
void serail() interrupt 4
{a=SBUF-48;
flag=1;
 RI=0;
}
display(uint b,uint c,uint d,uint e)
{
     
P2=tabledu;
    10=0;
        11=0;
    12=1;
delay(10);

P2=tabledu[c];
     P10=1;
        11=0;
        12=1;
delay(10);
P2=tabledu[d];
     P10=0;
        11=1;
        12=1;
delay(10);
    P2=tabledu[e];
    P10=1;
        P11=1;
    P12=1;
   delay(10);
}
delay(uint x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=255;b>0;b--);
}
ArchiChain
5楼-- · 2019-08-18 17:12
楼主先要明白这么驱动数码管“同一时间”只有1位亮的,四片快速轮着亮人眼才觉得是同时在亮,不能点一位然后延时1秒。
一般可以开1个1毫秒的定时器,这1毫秒显示第一片内容, 下一毫秒显示第二片内容,.......
或者用个for循环扫描
沙野
6楼-- · 2019-08-18 22:49
动态显示,利用人眼的视觉暂停特性,每一位端口输出几个毫秒的时间。

一周热门 更多>