您的位置:首页 > 其它

苏嵌学习日志12 07.20

2018-07-20 21:04 99 查看

学习日志                        姓名 :刘易中           日期 :2018/7/20

今日学习任务

编写一个基于单片机的数字时钟,并用6位数码管显示,且可以调节时分秒

今日任务完成情况

完成编写

今日开发中出现的问题汇总

有一些变量数组定义有误

对于延时时长的把控

 

今日未解决问题

6位数码管一直有些闪烁,秒表跳得略慢

今日开发收获

怎样显示6位数码管

自我评价

自己独立编写程序还是有困难,上网参考了很多程序自己整合了一下基本完成了任务,但很多细节或者深入的问题还是不太清楚。

其他

sbit SEG1 = P0^0;      //显示1
sbit SEG2 = P0^1;   //显示2
sbit SEG3 = P0^2;     //显示3
sbit SEG4 = P0^3;      //显示4
sbit SEG5 = P0^4;   //显示5
sbit SEG6 = P0^5;     //显示6

sbit DUAN=P2^6;
sbit WEI=P2^7;
unsigned char code tab[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管
uchar Display_Digit[20];
unsigned int  count;//秒计时
//-------时间--------------
uchar shi=0,fen=0,miao=0;// 时分秒
//-------时间--------------
uchar  set;

uchar  flag;          //模式 0 1 2 3


void delay(uint z)     
{
    uint x,y;
    for(x=z;x>0;x--)
    for(y=65;y>0;y--);
}

void DIS_SEG(void)    
{
      Display_Digit[0]=shi%100/10;   //时
      Display_Digit[1]=shi%10;       //时
       Display_Digit[2]=fen%100/10;     //分
      Display_Digit[3]=fen%10;         //分
      Display_Digit[4]=miao%100/10;     //秒
      Display_Digit[5]=miao%10;         //秒
              
              DUAN=1;
            P0=tab[Display_Digit[0]];   // 数码管显示负数 或正的百位
            DUAN=0;
        
            delay(1);
            WEI=1;
            P0=0xfe;         //片选数码管    
            delay(3);    
            P0=0xff;         //关闭数码管
            WEI=0;

            DUAN=1;
            P0=tab[Display_Digit[1]]+0x80;    //十位    
             DUAN=0;
        

            delay(1);
            WEI=1;
            P0=0xfd;             
            delay(3);   
            P0=0xff;     
            WEI=0;


            DUAN=1;
            P0=tab[Display_Digit[2]]; //个位和小数点
            DUAN=0;
            delay(1);

            WEI=1;
            P0=0xfb;            
            delay(3);   
            P0=0xff;     
            WEI=0;

            DUAN=1;
            P0=tab[Display_Digit[3]]+0x80;  //小数位
            DUAN=0;
            delay(1);
            WEI=1;
            P0=0xf7;             
            delay(3);  
            P0=0xff;     
            WEI=0;    

            DUAN=1;
            P0=tab[Display_Digit[4]];  
            DUAN=0;
            delay(1);
            WEI=1;
            P0=0xEF;         
            delay(3);    
            P0=0xff;     
            WEI=0;

            DUAN=1;
            P0=tab[Display_Digit[5]];   
            DUAN=0;
            delay(1);
            WEI=1;
            P0=0xDF;
            delay(3);   
            P0=0xff;         
            WEI=0;

}

void S2_ADD(void)

    if(flag==1)  
    {
         shi++; 
        if(shi>23)
        {
        shi=23;
        }    //最大值23
    }
    if(flag==2)   //
    {
         fen++; 
        if(fen>59)
        {
        fen=59;
        }    //最大值59
    }
    if(flag==3)
    {   
         miao++;
         if(miao>59)
         {
         miao=59;
         }  //最大值59
    }

}
void S3_SUB(void)
{     if(flag==1)   
    {
         if(shi<1)
        {
        shi=1;
        }
        shi--;      //最小减到0
    }
    if(flag==2)   
    {
         if(fen<1)
        {
        fen=1;
        }
        fen--;      //最小减到0
    }
    if(flag==3)
    {
         if(miao<1)
        {
        miao=1;
        }
        miao--;   //最小减到0
    }
}
void KEY_SCAN(void)           //键盘扫描
{

    if(S1==0)//切换 设置
    {    delay(10);   
        if(S1==0)
                {
                    while(!S1)
                    if(set==0)
                    {
                    set=1;TR1=0;EA=0;
                    }
                    else
                    {
                    set=0;
                    TR1=1;
                    EA=1;
                    }//设置时间,退出切换
                }
    }     
        if(S2==0) //加
    {
        delay(10);   //延时去抖动
        S2_ADD();
               //加
         while(!S2){;}
        }  //等待按键释放
    
         if(S3==0)        //减
    {
        delay(10);   //延时去抖动
        S3_SUB();        // 减
        while(!S3){;}    //等待按键释放
    }
    if(S4==0)//切换 设置
    {
        delay(10);   
                if(S4==0)
                {    flag++;
                    TR1=0;
                    EA=0;
                    if(flag>3)
                    {
                    flag=1;
                    }     //在 1 2 3中切换
                    while(!S4){;}
                }
        }     
}


//--------------key---------------------------------------
int main()
{  
    P0=0;                                 

    TMOD=0x10;    //定时器1方式2
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;    
    EA=1;        //开总中断
    ET1=1;        //开定时器1中断
    TR1=1;         //开启定时器,

    while(1)
    {
    KEY_SCAN();//键盘扫描
    DIS_SEG(); //数码管显示
    }
    return 0;

}
//定时器1
void timer1_() interrupt 3
{  
    TH1=(65536-50000)/256;
    TL1=(65536-50000)%256;
    count++;
    if(count>20)
        {
            count=0;
            miao++;
            if(miao==60)        //秒
            {
                miao=0;
                fen++;
                if(fen==60)     //分
                {
                    fen=0;
                    shi++;
                    if(shi==24) //时
                    {
                        shi=0;
                    }  
                }
            }
    }
}

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: