第五讲 DS1302程序设计

1.建立工程模板

2.编写所需的底层文件

3.定义数码管显示模式变量

·将三个显示界面放到0-2 三个设置界面放到3-5

4.编写时钟显示界面

1)定义时钟数据数组

·数组的数据以BCD码形式储存 不建议以十进制储存

2)上电初始化DS1302芯片

3)实时读取DS1302数据 并显示在数码管上

5.编写闹钟显示界面

1)定义闹钟数据变量

方法一:

·建议以BCD码形式定义

·删除数据以0xbb储存 0xbb/16 = 0xbb%16 = 11 -> “-”

方法二:

2)定义闹钟编号变量

3)显示闹钟数据

方法一:

仿真显示(好慢啊这玩意儿

简化版

方法二:一维数组显示闹钟

6.日期显示界面

1)补充日期相关底层

隔开了就不能用for循环了

2)定义日期数据数组

3)上电初始化日期

4)实时读取日期数据

5)显示日期数据在数码管上

仿真显示

7.编写界面切换按键

界面切换按键,“时钟-闹钟-日期”循环切换【显示模式】  不需要保存啥的莫

PS:蓝桥杯板子的按键是4 而仿真上是3!!

显示over!!

8.编写设置界面

1)定义设置数组

·简化程序变量繁多的问题

2)显示设置数组

9.编写参数设置按键

参数设置按键,跳转到当前【显示参数】的【设置模式】

·memcpy(目标数组,数据数组,数据长度) -> <string.h>

·指针数组优化程序

才可以跳过去

10.设置界面完善

1)定义计时变量、闪烁标志位变量

2)编写中断代码 取反!!

3)定义闪烁判断位

4)编写数码管代码

11.数据输入

1)定义标志位 

2)编写按键代码

12.数据保存

1)数据合理性的判​​​​​​

  • Set_Dat[0]直接引用了数组的第一个元素,其类型为unsigned char。这意味着它是一个值,而非一个地址。
  • &Set_Dat[0]是获取Set_Dat数组第一个元素的地址(或简单地使用Set_Dat,其类型为unsigned char*,即指向unsigned char的指针。
case 15:/*参数设置按键,跳转到当前【显示参数】的【设置模式】*/
			if(Seg_Mode < 3)//在非设置界面 而在显示界面
			{
				Seg_Mode +=3;//切换到对应设置界面
				Alarm_Index = 0;//开始设置 对应的设置数组的指针要复位
				Input_Index=Input_Flag=0;
//				switch(Seg_Mode)
//				{
//					case 3://切换到 时钟设置界面
//						memcpy(Set_Dat,ucRtc,9);
//					break;
//					case 6://切换到 闹钟设置界面
//						memcpy(Set_Dat,ucAlarm,9);
//					break;
//					case 9://切换到 日期设置界面
//						memcpy(Set_Dat,ucDate,9);
//					break;
//				}
				//把实际值赋值给设置值
				memcpy(Set_Dat,Set_Flag[Seg_Mode-3],9);//3 6 9--> 0 1 2
			}
			else//在参数设置界面下
			{
				if(Input_Index >= 3)//只有输入完三次数据后才能使能保存按键
				{
					if(Seg_Mode==4)
					{
						if(Dat_Judgment(&Set_Dat[0],Seg_Mode - 3) && Dat_Judgment(&Set_Dat[3],Seg_Mode - 3),Dat_Judgment(&Set_Dat[6],Seg_Mode - 3))
							result = 1;
					}
					else if(Seg_Mode == 3 || Seg_Mode == 5)
					{	
						if(Dat_Judgment(&Set_Dat[0],Seg_Mode - 3))
							result = 1;
						else 
							result = 0;
					}
					if(result == 1)//有效
					{
//					if(Dat_Judgment(&Set_Dat[0],Seg_Mode-3) && Dat_Judgment(&Set_Dat[3],Seg_Mode-3) && Dat_Judgment(&Set_Dat[6],Seg_Mode-3))
//					{
					switch(Seg_Mode)
					{
						case 3://时钟
							Set_Rtc(Set_Dat);
						break;
						case 4://闹钟
							memcpy(ucAlarm,Set_Dat,9);
						break;
						case 5://日期
							Set_Date(Set_Dat);
						break;
					}
					Seg_Mode -= 3;//跳转回显示界面
				}
				else//无效
				{
					memcpy(Set_Dat,Set_Flag[Seg_Mode - 3],9);
					Input_Index = Input_Flag =0;
				}
			}
		}
			
		break;

Seg_Disp_Mode -= 3;//跳转回数据显示界面

13.闹钟删除按键

14.闹钟切换按键

15.设置退出按键 (退出设置界面时,设置的指针清零

16.闹钟功能按键

1)定义使能标志位

2)编写按键代码

17.Led显示

1)L1

1.定义标志位

2.判断闹钟使能条件

可能是没删干净,if后面加了个;......

3.点亮L1

2)L2-L4

3)L8

18.关于什么时候设置指针清零

  • 28
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值