51单片机oled显示时间代码
时间: 2023-10-11 13:13:26 浏览: 300
以下是51单片机通过I2C驱动OLED显示时间的基本代码。需要注意的是,这里的代码使用了IIC总线通讯方式,因此需要设置好相关的GPIO引脚。
```c
#include <reg52.h>
#include <intrins.h>
#define SCL P1_0 // I2C时钟线
#define SDA P1_1 // I2C数据线
sbit OLED_RES = P3^3; // OLED复位引脚
sbit OLED_DC = P3^2; // OLED数据/命令选择引脚
sbit OLED_CS = P3^4; // OLED片选引脚
unsigned char code num_table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay_us(unsigned int us)
{
while(us--)
{
_nop_();
_nop_();
_nop_();
}
}
void I2C_start()
{
SDA=1;
SCL=1;
delay_us(5);
SDA=0;
delay_us(5);
SCL=0;
}
void I2C_stop()
{
SDA=0;
SCL=1;
delay_us(5);
SDA=1;
delay_us(5);
}
void I2C_ACK()
{
SDA=0;
SCL=1;
delay_us(5);
SCL=0;
delay_us(5);
SDA=1;
}
void I2C_nACK()
{
SDA=1;
SCL=1;
delay_us(5);
SCL=0;
delay_us(5);
SDA=1;
}
void I2C_write_byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=dat&0x80;
SCL=1;
delay_us(5);
SCL=0;
delay_us(5);
dat<<=1;
}
I2C_ACK();
}
void OLED_write_cmd(unsigned char cmd)
{
OLED_DC=0;
I2C_start();
I2C_write_byte(0x78);
I2C_ACK();
I2C_write_byte(0x00);
I2C_ACK();
I2C_write_byte(cmd);
I2C_ACK();
I2C_stop();
}
void OLED_write_data(unsigned char data)
{
OLED_DC=1;
I2C_start();
I2C_write_byte(0x78);
I2C_ACK();
I2C_write_byte(0x40);
I2C_ACK();
I2C_write_byte(data);
I2C_ACK();
I2C_stop();
}
void OLED_init()
{
OLED_RES=1;
delay_us(100);
OLED_RES=0;
delay_us(100);
OLED_RES=1;
delay_us(100);
OLED_write_cmd(0xae); // 关闭显示
OLED_write_cmd(0xd5); // 设置时钟分频因子,震荡频率
OLED_write_cmd(0x80); // 分频因子=1,震荡频率=~1000Khz
OLED_write_cmd(0xa8); // 设置驱动路数
OLED_write_cmd(0x1f); // 默认0x3f(1/64) 0x1f(1/32)
OLED_write_cmd(0xd3); // 设置显示偏移
OLED_write_cmd(0x00); // 无偏移
OLED_write_cmd(0x40); // 设置显示开始行 [5:0]
OLED_write_cmd(0xa0); // SEG重映射:列地址31~0映射到0~127
OLED_write_cmd(0xc0); // COM重映射:行地址从上到下顺序排列
OLED_write_cmd(0xda); // 设置COM硬件引脚配置
OLED_write_cmd(0x12);
OLED_write_cmd(0x81); // 对比度设置
OLED_write_cmd(0xcf);
OLED_write_cmd(0xd9); // 预充电周期设置
OLED_write_cmd(0xf1);
OLED_write_cmd(0xdb); // VCOMH增强
OLED_write_cmd(0x40);
OLED_write_cmd(0xa4); // 全局显示开启;0xa4:开启;0xa5:关闭;
OLED_write_cmd(0xa6); // 设置显示方式;0xa6:正常显示;0xa7:反色显示;
OLED_write_cmd(0xaf); // 开启显示
}
void OLED_clear()
{
unsigned char i,n;
for(i=0;i<8;i++)
{
OLED_write_cmd(0xb0+i); // 设置页地址
OLED_write_cmd(0x00); // 设置显示位置—列低地址
OLED_write_cmd(0x10); // 设置显示位置—列高地址
for(n=0;n<128;n++)
{
OLED_write_data(0);
}
}
}
void OLED_show_num(unsigned char x, unsigned char y, unsigned char num)
{
OLED_write_cmd(0xb0+y);
OLED_write_cmd(((x&0xf0)>>4)|0x10);
OLED_write_cmd((x&0x0f)|0x00);
OLED_write_data(num_table[num]);
}
void main()
{
unsigned int i,j;
unsigned char hour,minute,second;
OLED_init();
OLED_clear();
while(1)
{
for(i=0;i<60;i++)
{
for(j=0;j<1000;j++);
second = i % 60;
minute = i / 60;
hour = minute / 60;
OLED_show_num(0,0,hour/10);
OLED_show_num(1,0,hour%10);
OLED_show_num(2,0,10); // 冒号
OLED_show_num(3,0,minute/10);
OLED_show_num(4,0,minute%10);
OLED_show_num(5,0,10); // 冒号
OLED_show_num(6,0,second/10);
OLED_show_num(7,0,second%10);
}
}
}
```
这个代码会在OLED显示屏上不断显示当前的时间,每秒钟更新一次。如需更改时间格式,可以根据需要修改`OLED_show_num`函数的调用参数。
阅读全文