找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3241|回复: 12
收起左侧

怎样把数码管的小数点加上去,而且左移移动小数点位,不影响数码管正常动态扫描显示?

[复制链接]
ID:792404 发表于 2020-8-3 08:57 | 显示全部楼层 |阅读模式
10黑币
#include"stc8g.h"
#include "intrins.h"
#define key_S 50                               
#define key_L key_S*120               
#define key_I key_S*100       

unsigned char T0RH=0;  //T0重载值的高字节
unsigned char T0RL=0;  //T0重载值的低字节
unsigned char i=0;         //数码管位缓冲变量
unsigned char j1=0;         //数码管位的显示值
unsigned char j2=0;
unsigned char j3=0;
unsigned char j4=0;

unsigned char x=0;         //按键按下次数
unsigned char x1=0;         //计数值变量,定时器用
unsigned char x2=0;         //标志位
unsigned int  x3=0;
unsigned int  x4=0;
unsigned char x5=0;
unsigned int js=0;         //数码管显示的值
unsigned int js1=0;
//unsigned int js2=0;
unsigned char js3=0;

unsigned char code duan[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
bit q1=1;
bit q2=1;
//bit q3=1;
bit q4=1;

sbit out=P3^3;        //out 输出

sbit pa=P1^0;        //a 数码管段
sbit pb=P1^1;        //b
sbit pc=P1^2;        //c
sbit pd=P1^3;        //d
sbit pe=P1^4;        //e
sbit pf=P1^5;        //f
sbit pg=P1^6;        //g
sbit ph=P1^7;        //.

sbit p1=P3^4;        //1         数码管位
sbit p2=P3^5;        //2
sbit p3=P3^6;        //3
sbit p4=P3^7;        //4

sbit ru=P5^4;
sbit sw1=P5^5;  //按键接口
sbit sw2=P3^1;
sbit sw3=P3^0;
sbit sw4=P3^2;  

void s0();
void s1();
void s2();
void s3();
void s4();
void s5();
void s6();
void s7();
void s8();
void s9();
void s10();
void s11();
void s12();
void s13();
void s14();
void s15();
void ssmg();
void xuaze(unsigned char j);
void xianshi1(unsigned int);               
void keyaction();
void cun();

/*掉电存储*/
void IapIdle();
char IapRead(int addr);
void IapProgram(int addr,char dat);
void IapErase(int addr);
/***************************************/

void delayms(unsigned int k)       
{
        unsigned int i,j;
        for(i=k;i>0;i--)
                for(j=110;j>0;j--);
}
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  //临时变量

    tmp=11059200/12;      //定时器计数频率
    tmp=(tmp*ms)/1000;  //计算所需的计数值
    tmp=65536-tmp;        //计算定时器重载值
    tmp=tmp+2;           //补偿中断响应延时造成的误差
    T0RH=(unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
    T0RL=(unsigned char)tmp;
        TMOD&=0xf0;        //清零T0的控制位
        TMOD|=0x01;        //配置T0为模式1
    TH0=T0RH;     //加载T0重载值
    TL0=T0RL;
    ET0=1;        //使能T0中断
    TR0=1;        //启动T0
}

void QL()
{
                                 if(js<=1)js=1;
                                 if(js1<=1)js1=1;
                                 if(js3>=33) js3=0;
}

void tm0_isr() interrupt 1 using 1
{
    TH0=T0RH;  //重新加载重载值
    TL0=T0RL;
    ssmg();
    x4++;
       
         switch(js3)
             {                  
                case 0:if(ru==0)out=0;else out=1;break;
                case 1:if(ru==0){out=~out;}break;
                  
               /* case 2:if(x1==0){x1=1;j1=duan[14];j2=duan[14];j3=duan[14];j4=duan[14];QL();}
                       if(x1==1){x1=2;js3=IapRead(3);QL();}
                       if(x1==2){if(x4>=1000){x4=0;js--;if(js==0)
                                        {js=0;x4=0;x1=5;out=0;js=IapRead(1);QL();}}}                                  
                                                        break;
                 
                case 3:if(x1==0){x1=1;j1=duan[14];j2=duan[14];j3=duan[14];j4=duan[14];QL();}
                       if(x1==1){x1=2;js3=IapRead(3);QL();}
                       if(x1==2){if(x4>=1000){x4=0;js--; if(js==0)
                                        {js=0;x4=0;x1=3;out=0;js=IapRead(1);QL();}}}
                   if(x1==3){if(x4>=1000){x4=0;js1--;if(js1==0)
                                        {js1=0;x4=0;x1=0;out=1;js1=IapRead(2);QL();}}}
                                                         break;          */
              }               
}
void keyscan()
{
        static unsigned int time=0;
        if(!sw1||!sw2||!sw3)
        {       
                time++;
                if(time>key_L)//长按有效
                        time=key_I;//连+/-间隔
                if(time==key_S)//短按消抖
                {
                        if(!sw1){x1++;if(x1>3){x1=0;if(x1==0)cun();}}
                }
                if(time==key_S||time==key_L)//短按消抖或长按连+/-
                {
                        if(!sw2 && x1!=0){if(x1==1){js3=(js3+1)%33;}
                                          if(x1==2){js=(js+1)%1000;}
                                          if(x1==3){js1=(js1+1)%1000;}}

                        if(!sw3 && x1!=0){if(x1==1){js3--;if(js3==-1)js3=32;}   
                                          if(x1==2){if(js>0){js--;if(js==0)js=1;}}
                                          if(x1==3){if(js1>0){js1--;if(js1==0)js1=1;}}}
                        if((!sw2)&&(!sw3)&&(x1!=0)){js=5;js1=5;js3=0;}                  
                }               
        }
        else time=0;       
}

                 
void cun()
{                                         if(js<=1) js=1;
                                         if(js1<=1) js1=1;
                                         if(js3>=33) js3=0;
       
                                         IapErase(0);
                                         IapProgram(1,js);                                    
                                         IapProgram(2,js1);                                     
                                         IapProgram(3,js3);
                                     
}

void main()
{
        EA=1;
        ConfigTimer0(1);
          
        P1M0=0x00;
        P1M1=0x00;
        P3M0=0xff;
        P3M1=0x00;
        P5M0=0x00;
        P5M1=0x00;

        js=IapRead(1);
        js1=IapRead(2);
        js3=IapRead(3);
        QL();

        while(1)
        {
            keyscan();                        
                if(x1==0){j1=duan[14];j2=duan[14];j3=duan[14];j4=duan[14];}
                if(x1==1){xianshi1(js3);j3=duan[14];j4=duan[15];}
                if(x1==2){xianshi1(js);j4=duan[11];}
                if(x1==3){xianshi1(js1);j4=duan[12];}
            delayms(1);
                                                 
        }                  
}

void IapIdle()
{
   IAP_CONTR=0;
   IAP_CMD=0;
   IAP_TRIG=0;
   IAP_ADDRH=0x80;
   IAP_ADDRL=0;
}

char IapRead(int addr)
{
   char dat;
   IAP_CONTR=0x80;
   IAP_TPS=12;
   IAP_CMD=1;
   IAP_ADDRL=addr;
   IAP_ADDRH=addr>>8;
   IAP_TRIG=0x5a;
   IAP_TRIG=0xa5;
   _nop_();
   dat=IAP_DATA;
   IapIdle();
   return dat;
}

void IapProgram(int addr,char dat)
{
   IAP_CONTR=0x80;
   IAP_TPS=12;
   IAP_CMD=2;
   IAP_ADDRL=addr;
   IAP_ADDRH=addr>>8;
   IAP_DATA=dat;
   IAP_TRIG=0x5a;
   IAP_TRIG=0xa5;
   _nop_();   
   IapIdle();   
}

void IapErase(int addr)
{
   IAP_CONTR=0x80;
   IAP_TPS=12;
   IAP_CMD=3;
   IAP_ADDRL=addr;
   IAP_ADDRH=addr>>8;   
   IAP_TRIG=0x5a;
   IAP_TRIG=0xa5;
   _nop_();   
   IapIdle();      
}

void s0(){pa=0;pb=0;pc=0;pd=0;pe=0;pf=0;pg=1;}
void s1(){pb=0;pc=0;pa=1;pg=1;pd=1;pe=1;pf=1;}
void s2(){pa=0;pb=0;pg=0;pe=0;pd=0;pf=1;pc=1;}
void s3(){pa=0;pb=0;pg=0;pc=0;pd=0;pf=1;pe=1;}
void s4(){pb=0;pg=0;pc=0;pf=0;pa=1;pd=1;pe=1;}
void s5(){pa=0;pg=0;pc=0;pd=0;pf=0;pe=1;pb=1;}
void s6(){pa=0;pg=0;pc=0;pd=0;pf=0;pe=0;pb=1;}
void s7(){pa=0;pb=0;pc=0;pf=1;pe=1;pd=1;pg=1;}
void s8(){pa=0;pb=0;pg=0;pc=0;pd=0;pf=0;pe=0;}
void s9(){pa=0;pb=0;pg=0;pc=0;pd=0;pf=0;pe=1;}
void s10(){pa=1;pb=1;pc=1;pf=1;pe=1;pd=1;pg=1;}
void s11(){pa=1;pb=1;pc=0;pf=0;pe=0;pd=0;pg=0;ph=1;}
void s12(){pa=1;pb=1;pc=1;pf=1;pe=0;pd=0;pg=0;ph=1;}
void s13(){pa=1;pb=1;pc=1;pf=1;pe=1;pd=1;pg=1;ph=0;}
void s14(){pa=1;pb=1;pc=1;pf=1;pe=1;pd=1;pg=0;ph=1;}
void s15(){pa=0;pb=0;pc=1;pf=0;pe=0;pd=1;pg=0;ph=1;}

void xuaze(unsigned char j)
{
        if(j==0){s0();}
        else if(j==1){s1();}
        else if(j==2){s2();}
        else if(j==3){s3();}
        else if(j==4){s4();}
        else if(j==5){s5();}
        else if(j==6){s6();}
        else if(j==7){s7();}
        else if(j==8){s8();}
        else if(j==9){s9();}
        else if(j==10){s10();}
        else if(j==11){s11();}
        else if(j==12){s12();}
        else if(j==13){s13();}
        else if(j==14){s14();}
        else if(j==15){s15();}
}
/*数码管显示函数,调用在主函数中*/
void xianshi1(unsigned int sec)
{
        j1=duan[sec%10];
        j2=duan[sec/10%10];
        j3=duan[sec/100%10];                                     
}

/*数码管扫描函数,放到中断中,中断时间要是1ms*/
void ssmg()
{
    s10();
    switch(i)
    {
              case 0:p1=1;p2=0;p3=0;p4=0;i++;s10();xuaze(j1);break;
           case 1:p1=0;p2=1;p3=0;p4=0;i++;s10();xuaze(j2);break;
           case 2:p1=0;p2=0;p3=1;p4=0;i++;s10();xuaze(j3);break;
           case 3:p1=0;p2=0;p3=0;p4=1;i=0;s10();xuaze(j4);break;
           default:break;
    }
}

最佳答案

查看完整内容

回帖中的附件《数码管时钟》有处理小数点在不同位置出现的方法。 http://www.51hei.com/bbs/dpj-193732-1.html
回复

使用道具 举报

ID:213173 发表于 2020-8-3 08:57 | 显示全部楼层
回帖中的附件《数码管时钟》有处理小数点在不同位置出现的方法。
http://www.51hei.com/bbs/dpj-193732-1.html
回复

使用道具 举报

ID:331263 发表于 2020-8-3 11:09 | 显示全部楼层
本帖最后由 dingpeng1980 于 2020-8-3 11:12 编辑

在个位加个或运算共阴极  P1 = P1 | 0x80    共阳极  P1 = P1 & 0x7F
回复

使用道具 举报

ID:331263 发表于 2020-8-3 11:10 | 显示全部楼层
在个位加一个语句 共阴极  P1 = P1 | 0x80 共阳极  P1 = P1 | 0x7F
回复

使用道具 举报

ID:792404 发表于 2020-8-3 13:36 | 显示全部楼层
dingpeng1980 发表于 2020-8-3 11:10
在个位加一个语句 共阴极  P1 = P1 | 0x80 共阳极  P1 = P1 | 0x7F

试过了,还是不显示,正常来说在某一位后面加上&0x7f会显示的,但是没用的。不知道是哪里出了问题
回复

使用道具 举报

ID:807712 发表于 2020-8-3 13:55 | 显示全部楼层
小数点在初始化时直接加进去就好,后面也不会再动得了他,就是一个固定的显示
回复

使用道具 举报

ID:792404 发表于 2020-8-3 14:13 | 显示全部楼层
这是一个倒计时的程序代码,还有个问题就是倒计时没开始,先加减键设置好时间后,程序开始运行,倒计时时间运行过程中,为什么按加减键还会增加或减小数字?正常情况下,倒计时运行过程中,只有按设置键(就是程序中sw1)才会使倒计时停止并进入设置状态,其他按键不起作用才对的。请各位大侠指点一下,问题出在哪个地方了。
回复

使用道具 举报

ID:792404 发表于 2020-8-3 14:19 | 显示全部楼层
塞北江南 发表于 2020-8-3 13:55
小数点在初始化时直接加进去就好,后面也不会再动得了他,就是一个固定的显示

我是直接用一个独立按键控制4位数码管的小数点循环点亮,以达到个位小数点亮,以秒倒计时,十位小数点亮,以0.1秒倒计时,百位小数点亮,以0.01秒倒计时的效果,初始化时直接加进去不合适。
回复

使用道具 举报

ID:275826 发表于 2020-8-3 19:04 | 显示全部楼层
程序结构不清晰
回复

使用道具 举报

ID:190577 发表于 2020-8-3 20:27 | 显示全部楼层
       j1=duan[sec%10];
        j2=duan[sec/10%10];
        j3=duan[sec/100%10];   这个位置加
回复

使用道具 举报

ID:792404 发表于 2020-8-3 21:30 | 显示全部楼层
bbxyliyang 发表于 2020-8-3 20:27
j1=duan[sec%10];
        j2=duan[sec/10%10];
        j3=duan[sec/100%10];   这个位置加

        j1=duan[sec%10];
        j2=duan[sec/10%10];
        j3=duan[sec/100%10]&0x7f;  
这样子加吗?试过了,小数点不显示。
        j1=duan[sec%10];
        j2=duan[sec/10%10];
        j3=duan[sec/100%10];
       P1=P1&0x7f;
这样子加,3位都会显示小数点,但是不符合我的设计要求,我要求用一个独立按键控制3位数码管的小数点循环点亮,以达到个位小数点亮,以秒倒计时,十位小数点亮,以0.1秒倒计时,百位小数点亮,以0.01秒倒计时的效果
回复

使用道具 举报

ID:462827 发表于 2020-8-4 00:44 | 显示全部楼层
你要哪个位置的数加就小数就只改它的段码就行,如果是共阴的|0x80就加上小数点了,共阳的&0x7f就可以。
回复

使用道具 举报

ID:792404 发表于 2020-8-4 07:05 | 显示全部楼层
wulin 发表于 2020-8-3 08:57
回帖中的附件《数码管时钟》有处理小数点在不同位置出现的方法。
http://www.51hei.com/bbs/dpj-193732-1. ...

这个方法可以,现在正常了,谢谢师傅
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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