12864 OLED屏显示日历

目录

  • calendar.c
  • 测试程序
  • 效果

普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


       stdint.h见【51单片机快速入门指南】1:基础知识和工程创建
       I2C版OLED驱动程序见【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解
       SPI版OLED驱动程序见SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制
       软件I2C程序见【51单片机快速入门指南】4: 软件 I2C
       软件SPI程序见【51单片机快速入门指南】5:软件SPI

calendar.c

#include "./I2C_OLED/oled.h"
#include <string.h>
#include <stdint.h>
#include <stdio.h>#define DAYS_PER_WEEK 7
#define MONTHS 12
#define is_leap_year(year) ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) //返回当前年份是否为闰年
#define Date_Distance 16//存储平年每月的天数
code uint8_t month_days[MONTHS] =
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };code uint8_t Month_Str[12][10] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};code uint8_t Week_Str[] = "MoTuWeThFrSaSu";code uint8_t F4X6[][4] =
{{ 0x00, 0x1F, 0x11, 0x1F },/*0*/{ 0x00, 0x00, 0x00, 0x1F },/*1*/{ 0x00, 0x1D, 0x15, 0x17 },/*2*/{ 0x00, 0x15, 0x15, 0x1F },/*3*/{ 0x00, 0x07, 0x04, 0x1F },/*4*/{ 0x00, 0x17, 0x15, 0x1D },/*5*/{ 0x00, 0x1F, 0x15, 0x1D },/*6*/{ 0x00, 0x01, 0x01, 0x1F },/*7*/{ 0x00, 0x1F, 0x15, 0x1F },/*8*/{ 0x00, 0x17, 0x15, 0x1F }, /*9*/
};void OLED_Showsmallnum(uint8_t x, uint8_t y, uint8_t chr)
{uint8_t i = 0;OLED_Set_Pos(x, y);for (i = 0; i < 4; i++)OLED_WR_Byte(F4X6[chr][i], OLED_DATA);
}//返还某年某月有几天
uint8_t days_of_month(uint16_t year, uint8_t month)
{if (2 == month && is_leap_year(year))return 29; // 如果是闰年2月,返回29天elsereturn month_days[month - 1];  //正常返回
}//返回某年某月某日是当前年份第几天
uint16_t days_of_year(uint16_t year, uint8_t month, uint8_t day)
{uint8_t i;uint16_t days = 0;for (i = 1; i < month; i++){days += days_of_month(year, i);}return days + day;
}//返回从公元元年算起,某年某月某日是第几天,用这个数字算星期几
uint32_t get_days(uint16_t year, uint8_t month, uint8_t day)
{uint16_t days = days_of_year(year, month, day);uint16_t temp = year - 1;return (uint32_t)temp * 365 + temp / 4 - temp / 100 + temp / 400 + days;
}//返回某年某月某日是星期几,星期天返回0
uint8_t day_of_week(uint16_t year, uint8_t month, uint8_t day)
{return get_days(year, month, day) % DAYS_PER_WEEK;
}void printfsm(uint8_t x, uint8_t y, uint8_t num)
{if (num < 10)OLED_Showsmallnum(x, y, num);else{OLED_Showsmallnum(x - 4, y, num / 10);OLED_Showsmallnum(x, y, num % 10);}
}//输出某年某个月的日历
void print_date_of_month(uint16_t year, uint8_t month)
{uint8_t first, days, i, h = 2;int16_t x;uint8_t year_month_str[14] = {0}; //先求出这个月第一天星期几first = day_of_week(year, month, 1);//求出这个月一共有几天days = days_of_month(year, month);if(first){x = first * Date_Distance;}else{x = 7 * Date_Distance;}for (i = 0; i < days; ++i){printfsm(x + Date_Distance * i, h, i + 1);if ((first + i) % 7 == 0){h++;x = -Date_Distance * i;}}OLED_ShowNum(64 - 4 * (strlen(Month_Str[month - 1]) + 5), 0, year, 4, 6, 0);OLED_ShowString(64 - 4 * strlen(Month_Str[month - 1] + 5) + 4, 0, Month_Str[month - 1], 6, 0);OLED_ShowString(64 - 4 * strlen(Week_Str), 1, Week_Str, 6, 0);
}

测试程序

#include <STC89C5xRC.H>
#include "intrins.h"
#include "stdint.h"
#include "./I2C_OLED/oled.h"void print_date_of_month(int year, int month);void main(void)
{OLED_Init();OLED_Clear();OLED_Display_On();	    print_date_of_month(2022, 1);OLED_Refresh_Gram();while(1){}
}

效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【联盛德W806上手笔记】二、GPIO

目录GPIO 控制器库函数函数参数宏极限翻转速度寄存器操作库函数操作测试main.cwm_it.cWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 GPIO 控制器 摘自《W806 芯片设计指导书 V1.0》 可配置的 GPIO、软件控制的输入输出、硬件控制的输入输出、可配置中断方式。…

【联盛德W806上手笔记】三、MCU系统与时钟结构

目录总线结构AHB-1 总线AHB-2 总线时钟与复位主要特性时钟结构功能描述时钟门控时钟自适应关断功能复位时钟分频寄存器描述寄存器列表软件时钟门控使能寄存器软件时钟掩码寄存器软件复位控制寄存器时钟分频配置寄存器调试控制寄存器I2S 时钟控制寄存器复位状态寄存器调试功能控…

如何开发一个异常检测系统:如何评价一个异常检测算法

利用数值来评价一个异常检测算法的重要性 使用实数评价法很重要&#xff0c;当你用某个算法来开发一个具体的机器学习应用时&#xff0c;你常常需要做出很多决定&#xff0c;如选择什么样的特征等等&#xff0c;如果你能找到如何来评价算法&#xff0c;直接返回一个实数来告诉你…

【联盛德W806上手笔记】四、PWM模块

目录PWM 控制器库函数函数参数宏测试程序独立模式main.cwm_hal_msp.cwm_it.c实验现象多通道同步模式main.cwm_hal_msp.cwm_it.c实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 PWM 控制器 5 …

C#中如何稳定精确地每隔5ms执行某个函数?

C#中如何稳定精确地每隔5ms执行某个函数&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C#的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xf…

【联盛德W806上手笔记】五、TIM定时器

目录定时器库函数函数参数宏Demo中的测试程序main.cwm_hal_msp.cwm_it.c实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 定时器 微秒与毫秒计时&#xff08;据时钟频率配置计数个数&#xff…

IOS-企业开发人员账号amp;邓白氏码申请记录

Apple开发人员账号分三种&#xff0c;个人。公司&#xff0c;还有企业。个人和公司都称为标准账号。另一种是教育机构的账号。 账号介绍 个人和公司的就不说了。如今仅仅说企业账号 首先是申请企业账号的地址&#xff1a; https://developer.apple.com/programs/ios/enterpri…

wordpress置顶文章调用与设置

文章来源: https://www.xuewangzhan.net/wpbbs/15737.html wordpress网站后台允许我们设置一些置顶文章&#xff0c;然后通过调用置顶文章的代码把它调用到自己的网站前台。 下面是最常用的wordpress调用置顶文章代码&#xff0c;适用于所有模板使用。 <?php $sticky g…

【联盛德W806上手笔记】六、7816/UART 控制器

目录7816/UART 控制器串口功能7816 接口功能下载口库函数函数参数宏Demo中的测试程序main.cwm_hal_msp.cwm_it.cfifo.cfifo.hWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 7816/UART 控制器 设备端…

【联盛德W806上手笔记】七、I2C

目录WM_SDK_W806_v0.6.0的库函数函数参数宏应用示例初始化使用测试I2C 控制器功能概述主要特性功能描述传输速率选择中断及启动停止可控快速输出及检测信号寄存器描述寄存器列表时钟分频寄存器_1时钟分频寄存器_2控制寄存器数据寄存器收发控制寄存器TXR 读出寄存器CR 读出寄存器…

【联盛德W806上手笔记】八、SPI及其DMA

目录高速 SPI 设备控制器库函数函数参数宏应用示例初始化引脚复用中断相关使用注意事项DataAlignmentDirection测试main.cwm_hal_msp.cwm_it.c其他改动实验现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书…

安装配置 radicale

为什么80%的码农都做不了架构师&#xff1f;>>> 可以直接pip安装,也可以下载源码安装,如果要存储到sql里面,则需要下载源码包,用里面的schema.sql 建表 默认安装后没有相应的配置文件,源码包里面也包含了 logging 和config,放到/etc/radicale 下 安装没什么说的,下…

【联盛德W806上手笔记】九、DMA

目录DMA 控制器功能概述功能描述DMA 通道DMA 数据流DMA 循环模式DMA 传输模式DMA 外设选择DMA 链表模式DMA 中断中断请求库函数函数参数宏应用Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》 DMA 控制…

SNF快速开发平台MVC-自由排序组件

1. 自由排序功能使用 在一些需要排序优先级的数据进行调整处理&#xff0c;如民族数据&#xff0c;在北方实施的时候汉族比较多&#xff0c;希望把汉族放在第一位。在蒙古实施项目时&#xff0c;蒙古族人最多把蒙古族放在第一选择位。 1.1. 效果展示 图 1.1 1.2. …

【联盛德W806上手笔记】十、ADC

目录ADCADC 电路设计库函数函数参数宏Demo中的例程main.cwm_hal_msp.cwm_it.cWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 ADC 基于 Sigma-Delta ADC 的采集模块&#xff0c;集成 4 路 16 比特 AD…

【电路补习笔记】8、稳压电路 —— 线性电源及LDO

目录有名的电源芯片品牌DCDC电源分类开关电源vs线性稳压器线性电源参数线性电源工作原理集成稳压器78/79系列&#xff08;固定输出电压&#xff09;正、负对称输出两组电源的稳压电路扩展输出电压扩大输出电流LM317/LM337&#xff08;可调输出电压&#xff09;正、负对称输出两…

ajax代码整理

$.ajax({ type: "post", 【以POST或GET的方式请求。默认GET。PUT和DELETE也可以用&#xff0c;有的浏览器不支持】 url: url, 【请求的目的地址&#xff0c;须是一个字符串。】 contentType: "application/json", 【以哪种数据类型发送请求】 data: data, …

创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像&#xff0c;我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单&#xff0c;但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说&#xff0c;这个例子将带领你正式进入WCF的世界。 在这个例…

深圳IO —— 一个汇编编程小游戏

目录简介数据手册接口简单 I/OXBus简单 I/O 对比 XBus语言参考程序结构注释标签寄存器accdatp0、p1、x0、x1、x2、x3null 伪寄存器指令操作数确保进行足够的睡眠 (slp)&#xff01;基本指令算法指令条件指令隐藏指令游戏界面DIY版本&#xff1a; 简介 以下介绍摘自未来软件园 …

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了&#xff0c;今天看文档时刚巧看到了&#xff0c;就来尝试了一下。 效果如图&#xff1a; shader 的编辑器扩展分为2种方法&#xff1a; 是通过UnityEditor下的ShaderGUI类来实现的&#xff0c;形式比较近似于我们一般对unity编辑器的扩展方式。是通…