蓝桥杯模拟题--15届

一:题目描述

二:参考代码

1、main.c

#include "stc15.h"
#include "intrins.h"
#include "ds1302.h"
#include "iic.h"
#include "Display.h"

sbit L1=P4^4;  //矩阵键盘列引脚定义
sbit L2=P4^2;
sbit L3=P3^5;
sbit L4=P3^4;

unsigned char Time[]={0x59,0x09,0x23};
u8 jilu_time[2];  //保存记录时间
u8 Key_Slow_Flag,Data_Slow_Flag,Smg_Slow_Flag,Led_Slow_Flag;
u8 jiemian=0;  //0:时间界面 1:输入界面 2:记录界面
bit input_flag=0;  //刚进入输入界面还未输入标志为0,有输入为1。
u16 dat=0;  //四位数据
u8 keynum=0xFF;  //键值
u8 count=0;
bit jilu_flag=0;  //记录输入四位数的时间
bit w_f_flag=0;  //输入完成标志
u8 AT_dat[4];  //保存要写入EEPROM的数据
bit led_flag=0;
u8 led=0xFF;
u16 lastdat;  //保存上次数据

void Key_Proc(void);
void Data_Proc(void);
void Smg_Proc(void);
void Led_Proc(void);
void LedDisplay(u8 LED);

void Delay2ms(void)	//@12.000MHz
{
	unsigned char data i, j;

	i = 24;
	j = 85;
	do
	{
		while (--j);
	} while (--i);
}

void Timer0_Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x40;				//设置定时初始值
	TH0 = 0xA2;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
    ET0=1;
    EA=1;
}

void Init(u8 i)
{
    P2&=0x1F;
    switch(i)
    {
        case 4:P0=0xFF;HC138(i);P2&=0x1F;P0=0x00;break;
        case 5:HC138(i);break;
        case 6:HC138(i);break;
        case 7:P2&=0x1F;P0=0xFF;HC138(i);break;
    }
    P2&=0x1F;
}

void main(void)
{
    Init(4);
    Init(5);
    Init(6);
    Init(7);
    Time_Write();
    Timer0_Init();
    while(1)
    {
        Key_Proc();
        Data_Proc();
        Smg_Proc();
        Led_Proc();
    }
}

void Time0(void) interrupt 1
{
    if(++Key_Slow_Flag==10) Key_Slow_Flag=0;
    if(++Data_Slow_Flag==100) Data_Slow_Flag=0;
    if(++Smg_Slow_Flag==100) Smg_Slow_Flag=0;
    if(++Led_Slow_Flag==10) Led_Slow_Flag=0;
    SmgDisplay();
    LedDisplay(led);
}

u8 GetKeynum(void)
{
    u8 i,j,value;
    value=0xFF;
    for(i=0;i<3;i++)
    {
        P3=(P3|0xFF)&(~((1<<1)<<i));
        if(L1==0)
        {
            Delay2ms();
            if(L1==0)
            {
                j=0;
                value=i*4+j;
                if(i==1)
                {
                    value=10;
                }
                else if(i==2)
                {
                    value=11;
                }
                return value;
            }
        }
        else if(L2==0)
        {
            Delay2ms();
            if(L2==0)
            {
                j=1;
                value=i*4+j;
                if(i==1)
                    value-=1;
                else if(i==2)
                    value-=2;
                return value;
            }
        }
        else if(L3==0)
        {
            Delay2ms();
            if(L3==0)
            {
                j=2;
                value=i*4+j;
                if(i==1)
                    value-=1;
                else if(i==2)
                    value-=2;
                return value;
            }
        }
        else if(L4==0)
        {
            Delay2ms();
            if(L4==0)
            {
                j=3;
                value=i*4+j;
                if(i==1)
                    value-=1;
                else if(i==2)
                    value-=2;
                return value;
            }
        }
    }
    return value;
}

void Key_Proc(void)
{
    if(Key_Slow_Flag) return;
    Key_Slow_Flag=1;
    if(GetKeynum()!=0xFF)
    {
        keynum=GetKeynum();
    }
        
    if(keynum==11)  //S4按下
    {
        jiemian++;
        if(jiemian==1)  //每次进入界面1数码管熄灭
        {
            input_flag=0;
            w_f_flag=0;
        }
            
        if(jiemian==2)  //进入记录界面写入EEPROM
        {
            AT_dat[0]=jilu_time[1];
            AT_dat[1]=jilu_time[0];
            AT_dat[2]=(u8)(dat>>8);
            AT_dat[3]=(u8)dat;
            AT24C02_Write(AT_dat,0,4);
        }
        
        if(jiemian>2)
            jiemian=0;
        while(1)
        {
            if(GetKeynum()==0xFF)
                Delay2ms();
            if(GetKeynum()==0xFF)
                break;
        }
    }
    else if(keynum==10&&jiemian==1)  //在输入界面按下清零数据
    {
        dat=0;
        input_flag=0;
        w_f_flag=0;
        while(1)
        {
            if(GetKeynum()==0xFF)
                Delay2ms();
            if(GetKeynum()==0xFF)
                break;
        }
    }
    else if(keynum!=0xFF&&w_f_flag==0)
    {
        count++;
        input_flag=1;
        if(count==1)
        {
            dat=keynum;
            jilu_flag=1;
            while(1)
            {
                if(GetKeynum()==0xFF)
                Delay2ms();
            if(GetKeynum()==0xFF)
                break;
            }
        }
        else if(count==2)
        {
            dat=dat*10+keynum;
            while(1)
            {
                if(GetKeynum()==0xFF)
                Delay2ms();
            if(GetKeynum()==0xFF)
                break;
            }
        }
        else if(count==3)
        {
            dat=dat*10+keynum;
            while(1)
            {
                if(GetKeynum()==0xFF)
                Delay2ms();
            if(GetKeynum()==0xFF)
                break;
            }
        }
        else if(count==4)
        {
            dat=dat*10+keynum;
            if(dat>lastdat&&lastdat!=0)
                led_flag=1;
            else
                led_flag=0;
            lastdat=dat;
            w_f_flag=1;
            count=0;
            while(1)
            {
                if(GetKeynum()==0xFF)
                Delay2ms();
            if(GetKeynum()==0xFF)
                break;
            }
        }
    }
    keynum=0xFF;
}

void Data_Proc(void)
{
    if(Data_Slow_Flag) return;
    Data_Slow_Flag=1;
    
    Time_Read();
    if(jilu_flag==1)
    {
        jilu_time[0]=Time[1];
        jilu_time[1]=Time[2];
        jilu_flag=0;
    }
    
}

void Smg_Proc(void)
{
    if(Smg_Slow_Flag) return;
    Smg_Slow_Flag=1;
    
    if(jiemian==0)
        TimeDisplay();
    else if(jiemian==1)
        InputDisplay();
    else if(jiemian==2)
        JiluDisplay();
}

void Led_Proc(void)
{
    if(Led_Slow_Flag) return;
    Led_Slow_Flag=1;
    
    if(jiemian==0)
        led&=0xFE;
    else
        led|=0x01;
    if(jiemian==1)
        led&=0xFD;
    else
        led|=0x02;
    if(jiemian==2)
        led&=0xFB;
    else
        led|=0x04;
    if(led_flag==1)
        led&=0xF7;
    else if(led_flag==0)
        led|=0x08;
}

void LedDisplay(u8 LED)
{
    HC138(4);
    P0=LED;
    P2&=0x1F;
}

2、Display.c

#include "Display.h"

unsigned char com=0;
unsigned char smg_num[]={10,10,10,10,10,10,10,10};
code unsigned char smg_dm[] =
{
0xc0, 0xf9, 0xa4, 0xb0, 
0x99, 0x92, 0x82,0xf8, 
0x80, 0x90,0xFF,0xBF,0xC6,0x86
};

void SmgDisplay(void)
{
    P0=0xFF;
    HC138(6);
    P0=(1<<com);
    HC138(7);
    P0=0xFF;
    P0=smg_dm[smg_num[com]];
    (com==7)?(com=0):(com++);
}

void TimeDisplay(void)
{
    smg_num[0]=Time[2]/16;
    smg_num[1]=Time[2]%16;
    smg_num[2]=11;
    smg_num[3]=Time[1]/16;
    smg_num[4]=Time[1]%16;
    smg_num[5]=11;
    smg_num[6]=Time[0]/16;
    smg_num[7]=Time[0]%16;
}

void InputDisplay(void)
{
    smg_num[0]=12;
    smg_num[1]=10;
    smg_num[2]=10;
    smg_num[3]=10;
    if(input_flag==0)
    {
        smg_num[4]=10;
        smg_num[5]=10;
        smg_num[6]=10;
        smg_num[7]=10;
    }
    else
    {
        if(dat>999)
        {
            smg_num[4]=dat/1000;
            smg_num[5]=dat/100%10;
            smg_num[6]=dat/10%10;
            smg_num[7]=dat%10;
        }
        else if(dat>99)
        {
            smg_num[4]=10;
            smg_num[5]=dat/100;
            smg_num[6]=dat/10%10;
            smg_num[7]=dat%10;
        }
        else if(dat>9)
        {
            smg_num[4]=10;
            smg_num[5]=10;
            smg_num[6]=dat/10;
            smg_num[7]=dat%10;
        }
        else
        {
            smg_num[4]=10;
            smg_num[5]=10;
            smg_num[6]=10;
            smg_num[7]=dat;
        }
    }
    
}

void JiluDisplay(void)
{
    smg_num[0]=13;
    smg_num[1]=10;
    smg_num[2]=10;
    smg_num[3]=jilu_time[1]/16;
    smg_num[4]=jilu_time[1]%16;
    smg_num[5]=11;
    smg_num[6]=jilu_time[0]/16;
    smg_num[7]=jilu_time[0]%16;
}

三、总结

DS1302时间读写函数及EEPROM读写函数都是基本的代码,在此不再提供,希望大家在比赛中都能取得好成绩。

    长风破浪会有时,直挂云帆济沧海!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值