2024-09-01
售卖作品
00

目录

功能
实物图
原理图
一些程序片段
矩阵键盘
内部温度读取
将年月日转为星期
帮助、问询

功能

1 显示万年历,利用内部RTC模块

2 按键修改时间

3 显示芯片内部的温度数值

实物图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

原理图

在这里插入图片描述

一些程序片段

矩阵键盘

https://qq742971636.blog.csdn.net/article/details/131650521

内部温度读取

这段代码是用来初始化一个模拟-数字转换器(ADC)的函数。它的作用是配置ADC的参数和寄存器,以便进行模拟信号的采样和转换。

具体解释如下:

首先,设置ADC12CTL0寄存器的位操作。将ADC12ON置1,表示打开ADC;将ADC12SHT0_12设置为1,表示设置采样保持时间为1024个时钟周期。

然后,配置ADC12CTL1寄存器的位操作。将ADC12SHP置1,表示使用脉冲采样模式;将ADC12SSEL_1置1,表示选择ACLK作为时钟源;将ADC12DIV_1置1,表示时钟分频系数为1。

接下来,设置ADC12IE寄存器的值为0x01,表示允许中断使能。这样当ADC转换完成时,将会触发中断。

清除REFCTL0寄存器的REFMSTR位,将参考电压控制权交给ADC12。这是为了确保ADC使用内部参考电压。

设置ADC12CTL0寄存器的ADC12REFON位为1,表示打开参考电压。此时参考电压被设置为1.5V。

设置ADC12MCTL0寄存器的ADC12SREF_1位为1,表示ADC的正输入端连接到参考电压(VREF)。这是为了使用内部参考电压来测量。

设置ADC12MCTL0寄存器的ADC12INCH_10位为1,表示ADC的输入通道选择为内部温度传感器。

最后,设置ADC12CTL0寄存器的ADC12ENC位为1,表示使能ADC12_A转换。这样配置完成后,即可开始进行ADC转换。

总结起来,这段代码的作用是初始化ADC,设置采样保持时间、选择时钟源、配置输入通道等参数,并打开ADC使能,以便进行模拟信号的采样和转换。

c
#define CALADC12_15V_30C *((unsigned int *)0x1A1A) //6682 #define CALADC12_15V_85C *((unsigned int *)0x1A1C) //6684 void ADC_Init(void) { ADC12CTL0 |= ADC12ON + ADC12SHT0_12; /* 打开AD,设置采样保持时间为1024个时钟周期 */ ADC12CTL1 = ADC12SHP + ADC12SSEL_1 + ADC12DIV_1; /* 脉冲采样模式 ACLK 2分频 */ ADC12IE = 0x01; /* 中断使能 */ REFCTL0 &= ~REFMSTR; /* 参考电压控制权交给ADC12 */ ADC12CTL0 |= ADC12REFON; /* REF_ON REF=1.5V */ ADC12MCTL0 |= ADC12SREF_1; /* V+ = REF V- = AVSS */ ADC12MCTL0 |= ADC12INCH_10; /* ADC输入为内部温度传感器 */ ADC12CTL0 |= ADC12ENC; /* 开启ADC12_A转换 最后写 */ } unsigned int temperature = 0; void main(void){ double tmp; int temp_k; WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */ ADC_Init(); while(1){ ADC12CTL0 |= ADC12SC; tmp = (float) (((long) temperature - CALADC12_15V_30C) * (85 - 30)) / (CALADC12_15V_85C - CALADC12_15V_30C) + 30.0f; temp_k = tmp * 100; //显示温度 oled_cnt = 0; oled_disp[oled_cnt++] = 'T'; oled_disp[oled_cnt++] = 'E'; oled_disp[oled_cnt++] = 'M'; oled_disp[oled_cnt++] = ':'; oled_disp[oled_cnt++] = temp_k / 1000 + '0'; oled_disp[oled_cnt++] = temp_k % 1000 / 100 + '0'; oled_disp[oled_cnt++] = '.'; oled_disp[oled_cnt++] = temp_k % 100 / 10 + '0'; oled_disp[oled_cnt++] = temp_k % 10 + '0'; oled_disp[oled_cnt++] = 'C'; oled_disp[oled_cnt++] = 0; OLED_ShowString(0, 6, oled_disp, 0); } } #pragma vector = ADC12_VECTOR __interrupt void ADC12_ISR(void) { switch (__even_in_range(ADC12IV, 34)) { case 6: // Vector 6: ADC12IFG0 temperature = ADC12MEM0; //__bic_SR_register_on_exit(LPM0_bits); // Exit active CPU default: break; } }

将年月日转为星期

这段代码是一个函数,用于根据给定的年月日计算对应的星期几。

代码以输入参数 iY、iM 和 iD 代表年、月和日。然后,根据公式计算出一个数值 iWeekDay 来表示星期几。

首先,代码检查给定的月份是否为1月或2月,如果是,则将传入的月份 iM 增加12,并将年份 iY 减去1。这是因为在公式中,一月和二月被认为属于前一年的13月和14月。

然后,使用如下公式计算星期几的数值:(iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7

最后,如果计算出的星期几数值为0,则将其转换为7,以符合星期数值的范围。

函数返回计算得到的星期几数值,范围在1到7之间,分别代表星期一到星期天。

c
/* * 由年月日获取星期 https://www.cnblogs.com/fengbohello/p/3264300.html * 返回1到7 代表星期一到星期天 * */ int getWeekdayByYearday(int iY, int iM, int iD) { int iWeekDay = -1; if (1 == iM || 2 == iM) { iM += 12; iY--; } iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7; if (iWeekDay == 0) iWeekDay = 7; return (iWeekDay); }

源码:http://dt4.8tupian.net/2/28880a12b16800.pg3

帮助、问询

csharp
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!