【蓝桥杯单片机】第十五届模拟题I满分实现

#include "stc15f2k60s2.h"
#include "iic.h"
#include "ds1302.h"

unsigned char smg_mode = 1;

unsigned char sec = 0;
unsigned char min = 0;
unsigned char hour = 0;
unsigned char flag_min = 0;
unsigned char flag_hour = 0;

unsigned char bit1 = 0;//右
unsigned char bit2 = 0;
unsigned char bit3 = 0;
unsigned char bit4 = 0;
unsigned char keyboard_count = 0;

unsigned char stat_led = 0xff;
unsigned int last_num = 0;
unsigned char flag = 0;
unsigned int num = 0;

sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;

sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

code unsigned char SegNoDot_Table[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };
code unsigned char SegDot_Table[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

unsigned char code RTC_READ[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char code RTC_WRITE[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char TIME[7] = {0x48,0x59,0x23,0x10,0x04,0x03,0x24};

void HC573_Choose(unsigned char channel, unsigned char value)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = value;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
			break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
			break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
			break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
			break;
	}
	P2 = (P2 & 0x1f) | 0x00;
	
}

void DelaySMG(unsigned int t)
{
	while(t--);
}

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

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}


void DisplaySMG_bit(unsigned char pos, unsigned char dat)
{
	HC573_Choose(6,0x01 << pos);
	HC573_Choose(7,dat);
	DelaySMG(500);
	HC573_Choose(6,0x01 << pos);
	HC573_Choose(7,0xff);
}

void DisplaySMG_All(unsigned char value)
{
	HC573_Choose(6,0xff);
	HC573_Choose(7,value);
}

void DisplaySMG_Function()
{
	switch(smg_mode)
	{
		case 1:

			DisplaySMG_bit(7, SegNoDot_Table[sec & 0x0f]);
			DisplaySMG_bit(6, SegNoDot_Table[(sec >> 4) & 0x7f]);
			DisplaySMG_bit(5, 0xbf);
			DisplaySMG_bit(4, SegNoDot_Table[min & 0x0f]);
			DisplaySMG_bit(3, SegNoDot_Table[min >> 4]);
			DisplaySMG_bit(2, 0xbf);
			DisplaySMG_bit(1, SegNoDot_Table[hour & 0x0f]);
			DisplaySMG_bit(0, SegNoDot_Table[hour >> 4]);
			break;
		case 2:
			if(keyboard_count == 0)
			{
				DisplaySMG_bit(7, 0xff);
				DisplaySMG_bit(6, 0xff);
				DisplaySMG_bit(5, 0xff);
				DisplaySMG_bit(4, 0xff);
			}
			else if(keyboard_count == 1)
			{
				DisplaySMG_bit(7, SegNoDot_Table[bit1]);
				DisplaySMG_bit(6, 0xff);
				DisplaySMG_bit(5, 0xff);
				DisplaySMG_bit(4, 0xff);
			}
			else if(keyboard_count == 2)
			{
				DisplaySMG_bit(7, SegNoDot_Table[bit1]);
				DisplaySMG_bit(6, SegNoDot_Table[bit2]);
				DisplaySMG_bit(5, 0xff);
				DisplaySMG_bit(4, 0xff);
			}
			else if(keyboard_count == 3)
			{
				DisplaySMG_bit(7, SegNoDot_Table[bit1]);
				DisplaySMG_bit(6, SegNoDot_Table[bit2]);
				DisplaySMG_bit(5, SegNoDot_Table[bit3]);
				DisplaySMG_bit(4, 0xff);
			}
			else if(keyboard_count == 4)
			{
				DisplaySMG_bit(7, SegNoDot_Table[bit1]);
				DisplaySMG_bit(6, SegNoDot_Table[bit2]);
				DisplaySMG_bit(5, SegNoDot_Table[bit3]);
				DisplaySMG_bit(4, SegNoDot_Table[bit4]);
			}
			DisplaySMG_bit(0, 0xc6);
			break;
		case 3:
			DisplaySMG_bit(7, SegNoDot_Table[flag_min & 0x0f]);
			DisplaySMG_bit(6, SegNoDot_Table[flag_min >> 4]);
			DisplaySMG_bit(5, 0xbf);
			DisplaySMG_bit(4, SegNoDot_Table[flag_hour & 0x0f]);
			DisplaySMG_bit(3, SegNoDot_Table[flag_hour >> 4]);
			DisplaySMG_bit(0, 0x86);
			break;
	}
}

void DS1302_Init()
{
	unsigned char i;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i = 0;i<7;i++)
	{
		Write_Ds1302_Byte(RTC_WRITE[i],TIME[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void DS1302_Read()
{
	sec = Read_Ds1302_Byte(RTC_READ[0]);
	min = Read_Ds1302_Byte(RTC_READ[1]);
	hour = Read_Ds1302_Byte(RTC_READ[2]);
}

void AT24C02_Write(unsigned char pos,unsigned char value)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(pos);
	I2CWaitAck();
	I2CSendByte(value);
	I2CWaitAck();
	I2CStop();
}

void Save_Function()
{
	num = bit4*1000+bit3*100+bit2*10+bit1;
	AT24C02_Write(0x00,((flag_hour >> 4)*10+(flag_hour & 0x0f)));
	Delay5ms();
	AT24C02_Write(0x01,((flag_min >> 4)*10+(flag_min & 0x0f)));
	Delay5ms();
	AT24C02_Write(0x02,(num / 256));
	Delay5ms();
	AT24C02_Write(0x03,(num % 256));
	Delay5ms();
}

void num_trans(unsigned char num)
{
	if(keyboard_count == 3)
	{
		flag = 1;
		keyboard_count++;
		bit4 = bit3;
		bit3 = bit2;
		bit2 = bit1;
		bit1 = num;
	}
	else if(keyboard_count != 4)
	{
		keyboard_count++;
		bit4 = bit3;
		bit3 = bit2;
		bit2 = bit1;
		bit1 = num;
	}
	
	if(keyboard_count == 1)
	{
		flag_min = min;
		flag_hour = hour;
	}
}

void LED_Function()
{
	unsigned int now_num = 0;
	if(smg_mode == 1)
	{
		stat_led = (stat_led & 0xf8) | 0x06;
	}
	else if(smg_mode == 2)
	{
		stat_led = (stat_led & 0xf8) | 0x05;
	}
	else if(smg_mode == 3)
	{
		stat_led = (stat_led & 0xf8) | 0x03;
	}
	
	//记录指示灯
	if(keyboard_count == 4)
	{
		if(flag == 1)
		{
			now_num = bit4*1000+bit3*100+bit2*10+bit1;
			if(now_num > last_num)
			{
				stat_led = (stat_led & 0xf7) | 0x00;
			}
			else
			{
				stat_led = (stat_led & 0xf7) | 0x08;
			}
		}
	}
	HC573_Choose(4,stat_led);
}

void ScanKeys()
{
	C1 = 1;C2 = 1;C3 = 1;C4 = 1;
	R2 = 0;R3 = 1;R4 = 1;
	//S6
	if(C1 == 0)
	{
		DelaySMG(500);
		if(C1 == 0)
		{
			num_trans(0);
			while(C1 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S10
	if(C2 == 0)
	{
		DelaySMG(500);
		if(C2 == 0)
		{
			num_trans(1);
			while(C2 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S14
	if(C3 == 0)
	{
		DelaySMG(500);
		if(C3 == 0)
		{
			num_trans(2);
			while(C3 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S18
	if(C4 == 0)
	{
		DelaySMG(500);
		if(C4 == 0)
		{
			num_trans(3);
			while(C4 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	
	R2 = 1;R3 = 0;R4 = 1;
	//S5
	if(C1 == 0)
	{
		DelaySMG(500);
		if(C1 == 0)
		{
			if(smg_mode == 2)
			{
				last_num = bit4*1000+bit3*100+bit2*10+bit1;
				bit1 = 0;bit2 = 0;bit3 = 0;bit4 = 0;
				keyboard_count = 0;
			}
			while(C1 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S9
	if(C2 == 0)
	{
		DelaySMG(500);
		if(C2 == 0)
		{
			num_trans(4);
			while(C2 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S13
	if(C3 == 0)
	{
		DelaySMG(500);
		if(C3 == 0)
		{
			num_trans(5);
			while(C3 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S17
	if(C4 == 0)
	{
		DelaySMG(500);
		if(C4 == 0)
		{
			num_trans(6);
			while(C4 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	R2 = 1;R3 = 1;R4 = 0;
	//S4
	if(C1 == 0)
	{
		DelaySMG(500);
		if(C1 == 0)
		{
			switch(smg_mode)
			{
				case 1:
					smg_mode = 2;
					bit1 = 0;bit2 = 0;bit3 = 0;bit4 = 0;
					keyboard_count = 0;
					break;
				case 2:
					smg_mode = 3;
					Save_Function();
					break;
				case 3:
					smg_mode = 1;
					break;
			}
			while(C1 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S8
	if(C2 == 0)
	{
		DelaySMG(500);
		if(C2 == 0)
		{
			num_trans(7);
			while(C2 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S12
	if(C3 == 0)
	{
		DelaySMG(500);
		if(C3 == 0)
		{
			num_trans(8);
			while(C3 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
	//S16
	if(C4 == 0)
	{
		DelaySMG(500);
		if(C4 == 0)
		{
			num_trans(9);
			while(C4 == 0)
			{
				DisplaySMG_Function();
			}
		}
	}
}

void Init_sys()
{
	HC573_Choose(4,0xff);
	HC573_Choose(5,0x00);
	DisplaySMG_All(0xff);
	DS1302_Init();
}

void main()
{
	Init_sys();
	while(1)
	{
		DS1302_Read();
		ScanKeys();
		LED_Function();
		
		DisplaySMG_Function();
	}
}

总结:在做题时要注意划掉已完成的功能,防止漏写。

题中的

输入数据(高字节):E2PROM内部地址2;

输入数据(低字节):E2PROM内部地址3;

指的是/256和%256,而不是说把四位数字两两分开存入。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值