写一段STC15单片机获取到时间后显示到0.96oled,iic方式的程序
时间: 2023-10-16 14:07:16 浏览: 105
好的,下面是相应的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define IIC_SCL P2_1
#define IIC_SDA P2_0
#define OLED_ADDR 0x78
sbit LED = P1^0; // 用于指示程序是否在运行
// 延时函数
void delay(int ms) {
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 110; j++);
}
// 启动IIC总线
void IIC_Start() {
IIC_SDA = 1;
IIC_SCL = 1;
_nop_();
IIC_SDA = 0;
_nop_();
IIC_SCL = 0;
}
// 停止IIC总线
void IIC_Stop() {
IIC_SDA = 0;
IIC_SCL = 1;
_nop_();
IIC_SDA = 1;
}
// 发送一个字节的数据
void IIC_SendByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
if (dat & 0x80)
IIC_SDA = 1;
else
IIC_SDA = 0;
IIC_SCL = 1;
_nop_();
IIC_SCL = 0;
dat <<= 1;
}
IIC_SDA = 1;
IIC_SCL = 1;
_nop_();
IIC_SCL = 0;
}
// 初始化OLED屏幕
void OLED_Init() {
IIC_Start();
IIC_SendByte(OLED_ADDR);
IIC_SendByte(0xAE); // 关闭OLED显示
IIC_SendByte(0xD5); // 设置时钟分频因子
IIC_SendByte(0x80);
IIC_SendByte(0xA8); // 设置驱动路数
IIC_SendByte(0x3F); // 设置为1/64模式
IIC_SendByte(0xD3); // 设置显示偏移
IIC_SendByte(0x00);
IIC_SendByte(0x40); // 设置显示起始行
IIC_SendByte(0x8D); // 设置电荷泵
IIC_SendByte(0x14); // 0x14使能,0x10禁止
IIC_SendByte(0x20); // 设置内存地址模式
IIC_SendByte(0x00); // 设置水平模式
IIC_SendByte(0xA1); // 设置段重定义
IIC_SendByte(0xC8); // 设置COM扫描方向
IIC_SendByte(0xDA); // 设置COM硬件引脚
IIC_SendByte(0x12);
IIC_SendByte(0x81); // 设置对比度
IIC_SendByte(0xCF);
IIC_SendByte(0xD9); // 设置预充电周期
IIC_SendByte(0xF1);
IIC_SendByte(0xDB); // 设置VCOMH
IIC_SendByte(0x40);
IIC_SendByte(0xA4); // 开启显示
IIC_SendByte(0xA6); // 设置正常显示
IIC_Stop();
}
// 在指定位置显示一个字符
void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr) {
unsigned char c = chr - 32;
IIC_Start();
IIC_SendByte(OLED_ADDR);
IIC_SendByte(0x00 + x * 6);
IIC_SendByte(0xB0 + y);
for (int i = 0; i < 6; i++)
IIC_SendByte(font6x8[c][i]);
IIC_Stop();
}
// 在指定位置显示一个字符串
void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str) {
while (*str) {
OLED_ShowChar(x, y, *str++);
x++;
}
}
// 主函数
void main() {
LED = 0;
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, "Time:");
while (1) {
// 获取时间并显示
int hour = get_hour();
int minute = get_minute();
int second = get_second();
OLED_ShowNumber(48, 2, hour);
OLED_ShowChar(60, 2, ':');
OLED_ShowNumber(72, 2, minute);
OLED_ShowChar(84, 2, ':');
OLED_ShowNumber(96, 2, second);
delay(1000);
}
}
```
其中,`get_hour()`、`get_minute()` 和 `get_second()` 函数用于获取当前时间,`OLED_Clear()` 函数用于清空OLED屏幕,`font6x8` 数组保存了ASCII字符集的6x8点阵字模。
阅读全文