基于定时器的时钟程序设计那节课卷子的代码

#include <REGX52.H>
#include "Key.h"
#include "Seg.h"


//变量声明区 
unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned int Seg_Slow_Down;//按键扫描专用变量 500ms
unsigned char Seg_Pos;//数码管扫描变量
unsigned char Seg_Buf[6]={1,2,3,4,5,6};//数码管显示数据存放数组
unsigned char mode;//0时钟显示界面,1时钟设置界面,2闹钟设置界面
unsigned char Clock_Disp[3]={23,59,55};
unsigned int t1s;
unsigned char Seg_Point[6]={0,1,0,1,0,1};
unsigned char  Clock_Set[3];
unsigned char  Clock_Set_Index;//0指小时,1指分钟,2指秒
unsigned int Timer_500ms;
bit Seg_Flag;
unsigned char Alarm[]={0,0,0};
unsigned char Alarm_Set[3];//闹钟的设置数组不需要赋初值
bit af=1;
unsigned char led;
bit Alarm_Enable_Flag;

//按键处理函数
void Key_Proc()
{
    if(Key_Slow_Down)return ;
    Key_Slow_Down=1;//按键减速程序
    
    Key_Val=Key_Read();//读取按键的键码值
    Key_Down=Key_Val&(Key_Val^Key_Old);//捕捉下降沿
    Key_Old=Key_Val;//辅助扫描
    //按下按键2之后,Key_Down==2
    //按下按键1不松手,Key_Old==1,一旦松手Key_Old==0


    if(Key_Down!=0)Alarm_Enable_Flag=0;
    switch(Key_Down)
    {
        case 1://按下 S1 后系统切换到时钟设置界面
            Clock_Set_Index=0;
            Clock_Set[0]=Clock_Disp[0];
            Clock_Set[1]=Clock_Disp[1];
            Clock_Set[2]=Clock_Disp[2];mode=1;break;
        case 2://按下 S2 后系统切换到闹钟设置界面
            Clock_Set_Index=0;
            Alarm_Set[0]=Alarm[0];
            Alarm_Set[1]=Alarm[1];
            Alarm_Set[2]=Alarm[2];mode =2;break;
        case 3://按下 S3 后可在时分秒之间切换选中
            if(mode==1)
            {
                    if(++Clock_Set_Index==3)Clock_Set_Index=0;
            }break;
        case 4://按下 S4 后可开启/关闭闹钟功能
            af^=1;
            break;
        case 5://S5 为参数+按键,按下 S5 后可增加选中参数,若增加到上限值则变为下限值
                        if(mode==1)//时钟设置界面
                        {
                                        Clock_Set[Clock_Set_Index]++;//用数组去写可以把它归类起来
                                        if(Clock_Set_Index==0)//时
                                        {
                                                if(Clock_Set[Clock_Set_Index]==24)
                                                {
                                                        Clock_Set[Clock_Set_Index]=0;
                                                }
                                        }
                                        else//分秒
                                        {
                                                    if(Clock_Set[Clock_Set_Index]==60)
                                                    {
                                                            Clock_Set[Clock_Set_Index]=0;
                                                    }
                                        }
                        }
                        if(mode==2)//闹钟设置界面
                        {
                                            Alarm_Set[Clock_Set_Index]++;
                                    if(Clock_Set_Index==0)
                                        {
                                                if(Alarm_Set[Clock_Set_Index]==24)
                                                {
                                                        Alarm_Set[Clock_Set_Index]=0;
                                                }
                                        }
                                        else
                                        {
                                                    if(Alarm_Set[Clock_Set_Index]==60)
                                                    {
                                                            Alarm_Set[Clock_Set_Index]=0;
                                                    }
                                        }
                        
                        
                        }
                        break;
        case 6:// S6 为参数-按键,按下 S6 后可减小选中参数,若减小到下限值则变为上限值

            if(mode==1)//时钟设置界面
            {
                            Clock_Set[Clock_Set_Index]--;//用数组去写可以把它归类起来
                            if(Clock_Set_Index==0)
                            {
                                    if(Clock_Set[Clock_Set_Index]==255)
                                    {
                                            Clock_Set[Clock_Set_Index]=23;
                                    }
                            }
                            else
                            {
                                        if(Clock_Set[Clock_Set_Index]==255)
                                        {
                                                Clock_Set[Clock_Set_Index]=59;
                                        }
                            }
            }
            if(mode==2)//闹钟设置界面
            {
                                Alarm_Set[Clock_Set_Index]--;//用数组去写可以把它归类起来
                            if(Clock_Set_Index==0)
                            {
                                    if(Alarm_Set[Clock_Set_Index]==255)
                                    {
                                            Alarm_Set[Clock_Set_Index]=23;
                                    }
                            }
                            else
                            {
                                        if(Alarm_Set[Clock_Set_Index]==255)
                                        {
                                                Alarm_Set[Clock_Set_Index]=59;
                                        }
                            }
            }
            break;
            
            
        case 7://把显示数组给设置数组
            //S7 为确认按键,按下 S7 后保存当前修改的参数值,返回时钟显示界面
            if(mode==1)
            {
                    Clock_Disp[0]=Clock_Set[0];
                    Clock_Disp[1]=Clock_Set[1];
                    Clock_Disp[2]=Clock_Set[2];
            }
            if(mode==2)
            {
                        Alarm[0]=Alarm_Set[0];
                        Alarm[1]=Alarm_Set[1];
                        Alarm[2]=Alarm_Set[2];
            }
            //返回时钟显示界面
        mode=0;
            break;
            
        case 8://S7 为确认按键,按下 S7 后保存当前修改的参数值,返回时钟显示界面
            mode=0;
        break;
        
    
    }
}


//信息处理函数,显示信息
void Seg_Proc()
{
    //要在哪里用for循环,就在这个函数的第一行设置变量
    //unsigned char i;//不要定义在全局变量,要定义局部变量
    //全局变量不会刷新数据
if(Seg_Slow_Down)return ;
    Seg_Slow_Down=1;//数码管减速程序
    
    switch(mode)
    {
        case 0://有联系的变量,设置成数组
            Seg_Buf[0]=Clock_Disp[0]/10%10;
        Seg_Buf[1]=Clock_Disp[0]/1%10;
        Seg_Buf[2]=Clock_Disp[1]/10%10;
        Seg_Buf[3]=Clock_Disp[1]/1%10;
        Seg_Buf[4]=Clock_Disp[2]/10%10;
        Seg_Buf[5]=Clock_Disp[2]/1%10;

        break;
        case 1:
                    Seg_Buf[0]= Clock_Set[0]/10%10;
                    Seg_Buf[1]= Clock_Set[0]/1%10;
                    Seg_Buf[2]= Clock_Set[1]/10%10;
                    Seg_Buf[3]= Clock_Set[1]/1%10;
                    Seg_Buf[4]= Clock_Set[2]/10%10;
                    Seg_Buf[5]= Clock_Set[2]/1%10;
            
                    switch(Clock_Set_Index)
                    {
                        case 0:
                                    Seg_Buf[0]=Seg_Flag?Clock_Set[0]/10%10:10;
                                    Seg_Buf[1]=Seg_Flag?Clock_Set[0]%10:10;
                        break;
                        case 1:
                                    Seg_Buf[2]=Seg_Flag?Clock_Set[1]/10%10:10;
                                    Seg_Buf[3]=Seg_Flag?Clock_Set[1]%10:10;
                        
                        break;
                        
                        case 2:
                                    Seg_Buf[4]=Seg_Flag?Clock_Set[2]/10%10:10;
                                    Seg_Buf[5]=Seg_Flag?Clock_Set[2]%10:10;
                        
                        break;
                    
                    
                    }
                
        break;
        
        case 2:
                    Seg_Buf[0]= Alarm_Set[0]/10%10;
                    Seg_Buf[1]= Alarm_Set[0]/1%10;
                    Seg_Buf[2]= Alarm_Set[1]/10%10;
                    Seg_Buf[3]= Alarm_Set[1]/1%10;
                    Seg_Buf[4]= Alarm_Set[2]/10%10;
                    Seg_Buf[5]= Alarm_Set[2]/1%10;
        
                            switch(Clock_Set_Index)//指针可以共用
                    {
                        case 0:
                                    Seg_Buf[0]=Seg_Flag?Alarm_Set[0]/10%10:10;
                                    Seg_Buf[1]=Seg_Flag?Alarm_Set[0]%10:10;
                        break;
                        case 1:
                                    Seg_Buf[2]=Seg_Flag?Alarm_Set[1]/10%10:10;
                                    Seg_Buf[3]=Seg_Flag?Alarm_Set[1]%10:10;
                        
                        break;
                        
                        case 2:
                                    Seg_Buf[4]=Seg_Flag?Alarm_Set[2]/10%10:10;
                                    Seg_Buf[5]=Seg_Flag?Alarm_Set[2]%10:10;
                        
                        break;
                    
                    
                    }

            
        break;
    
    
    }
}


//其他显示函数
void Led_Proc()//闹钟
{
        if(af==1)
        {
                if(Clock_Disp[0]==Alarm[0]&&Clock_Disp[1]==Alarm[1]&&Clock_Disp[2]==Alarm[2])//到了闹钟的时间
                Alarm_Enable_Flag=1;
                if(Alarm_Enable_Flag==1)
                {
                P2_3=0;
                    P1=led;
                }
                else
                {
                
                    P2_3=1;
                P1=0xff;
                
                
                }
        }
        else
        {
                    P2_3=1;
                P1=0xff;
        
        
        }
}


//定时器0初始化函数
void Timer0Init(void)        //1毫秒@12.000MHz
{
    //AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x01;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0=1;
    EA=1;
}


//定时器0中断服务函数,名字可以随便取
void Timer0Server() interrupt 1
{
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    
    if(++Key_Slow_Down==10)Key_Slow_Down=0;
    if(++Seg_Slow_Down==500)Seg_Slow_Down=0;

if(++Seg_Pos==6)Seg_Pos=0;
    Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
    if(++t1s==1000)
    {
        t1s=0;
                Clock_Disp[2]++;
                if(Clock_Disp[2]==60)
                {
                        Clock_Disp[2]=0;
                        Clock_Disp[1]++;
                    if(Clock_Disp[1]==60)
                    {
                            Clock_Disp[1]=0;
                            Clock_Disp[0]++;
                            if(Clock_Disp[0]==24)
                            {
                                    Clock_Disp[0]=0;
                            }
                    }
                
                }
    }
        if(++Timer_500ms==500)
        {
                Timer_500ms=0;
                Seg_Flag^=1;
            if(Clock_Disp[0]>=12)//后4个灯闪烁
            {
            led^=0xf0;
            }    
            else//第4位闪烁
            {
            
            led^=0x0f;
            
            }
            
        }
}


//main函数
void main()
{
    Timer0Init();
    while(1)
    {
        Key_Proc();
        Seg_Proc();
        Led_Proc();
    }
}//85

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值