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,一经查实,立即删除!

相关文章

【笔记】iOS开发基础笔记二

1.block 2.didReceiveMemoryWarning 使用 3.HTTP&#xff0c;TCP&#xff0c;UDP 答&#xff1a;HTTP是应用层协议&#xff0c;定义的是传输数据的内容的规范HTTP协议中的数据是利用TCP协议传输的&#xff0c;所以支持HTTP也就一定支持TCP HTTP支持的是www服务 而TCP/IP是协议…

心得体会2-7

通过例题2-7&#xff0c;i1还是il的一次次反复错误导致难以运行&#xff0c;我懂得了输完程序并不只是盯着程序看&#xff0c;还应该看看例题中提示&#xff0c;真正明白表达式是什么意思。转载于:https://www.cnblogs.com/huangsilinlana/p/3349449.html

【动态规划】POJ-2229

一、题目 Description Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an integer power of 2. Here are the possible sets of numbers that sum to 7: 1) 1111111 2) 111112 3) 1…

【联盛德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、软件控制的输入输出、硬件控制的输入输出、可配置中断方式。…

php 显示变量类型

echo "<br/> type ".gettype($my_data);

Java知多少(105)套接字(Socket)

网络应用模式主要有&#xff1a; 主机/终端模式&#xff1a;集中计算&#xff0c;集中管理&#xff1b;客户机/服务器&#xff08;Client/Server,简称C/S&#xff09;模式&#xff1a;分布计算&#xff0c;分布管理&#xff1b;浏览器/服务器模式&#xff1a;利用Internet跨平台…

fastq-dump 报错 解决方案

命令行&#xff1a; ~/sratoolkit/sratoolkit.2.3.2/bin/fastq-dump --split-spot --gzip xxxx.sra 报错信息: fastq-dump.2.3.2 err: name not found while resolving tree within virtual file system module - failed to open xxxx.sra 解决方法&#xff1a; 找不到xxx.sra&…

css格式化排版

body{ font-family:"宋体";} body{font-family:"Microsoft Yahei"&#xff0c;“微软雅黑”;} 2.文字排版--字号、颜色&#xff1a; body{ font-size:12px; color:#666;} 3.文字排版--粗体&#xff1a; p span{ font-weight:bold; } 4.文字排版--斜体&a…

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

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

datatables 搜索框 placeholder 属性

$(#table_id_example).DataTable({"fnPreDrawCallback": function( oSettings ) {$(.dataTables_filter input).attr({name:search,placeholder: 搜索站内新闻公告});//提示},language: {"sProcessing": "处理中...","sLengthMenu": &…

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

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

计算机类产品评价技术指标体系研究之图形(像)篇

(一&#xff09;显卡对于核心的显卡来说&#xff0c;显存工作频率越高性能越好&#xff0c;而显存的ns数值越小的显存能跑更高的频率&#xff0c;所以显存的ns被认为是显卡选购的关键之一&#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…

datatable 自定义搜索框 + 汉化

HTML <input type"text" id"my_news_search" class"" placeholder"搜索站内新闻"> <button class"" id"my_news_search_btn" type"button">搜索</button> JS <script>$(docu…

vlan

分割广播域1.物理分割&#xff08;路由器&#xff09;2.逻辑分割&#xff08;VLAN&#xff09;VLAN的优势&#xff1a;1.控制广播2.增强网络安全性3.简化管理VLAN的种类&#xff1a;1.静态VLAN&#xff1a;基于端口划分静态VLAN2.动态VLAN&#xff1a;基于MAC地址划分VLAN注&am…

【联盛德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…

linux驱动分离分层的概念

这个分离分层的概念和输入子系统有点像&#xff0c;但不是完全一样的。为什么会再弄一个这个模型出来我也没有搞懂&#xff0c;现在我的学习还停留在把知识学懂的层面上。至于为什么会产生这种知识&#xff0c;现在我还无从解释&#xff0c;还需时日成长。 这次先上代码在解释整…

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

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