一什么黑板| 手机飞行模式是什么意思| 血小板聚集是什么意思| 出入是什么意思| 放化疗后吃什么恢复快| 春天的花开秋天的风是什么歌| 神经性头疼是什么原因造成的| 鸡蛋壳薄是什么原因| 魂牵梦萦的意思是什么| 肠炎能吃什么食物| 自行车什么牌子好| 防微杜渐是什么意思| 身上长白斑是什么原因造成的| 羞羞是什么意思| 梦见自己的手机丢了是什么意思| 聚乙烯醇是什么材料| 土是什么颜色| 朱顶红什么时候剪叶子| 戏谑什么意思| 女人烂桃花多说明什么| m是什么品牌| 少将是什么级别| 祛斑去医院挂什么科| 台风是什么意思| 脚底褪皮是什么原因| 什么叫房颤| 卵巢炎症有什么症状| 鹿沼土是什么土| 花中西施指的是什么花| 家门不幸是什么意思| 陈赫是什么星座的| 阿尼是什么意思| 言尽于此是什么意思| 普通健康证都检查什么| 甲鱼和什么不能一起吃| 什么数码相机好| 乙状结肠冗长是什么意思| 蕃秀什么意思| 阴虚火旺有什么症状| 孩子老是流鼻血是什么原因| 切是什么偏旁| balea是什么牌子| 生长因子是什么东西| 虫离念什么| 香皂和肥皂有什么区别| 86年属什么的生肖| 身份证后四位代表什么| 普通健康证都检查什么| 测血型挂什么科| 教师节给老师送什么礼物| 猴子捞月是什么生肖| 偶尔头疼是什么原因| 花心什么意思| 弈五行属什么| 异象是什么意思| 妊娠纹什么时候开始长| 止血敏又叫什么名| 十指纤纤尽夸巧是什么生肖| 小便憋不住是什么原因| iga是什么| prp是什么意思| 杜字五行属什么| 最贵的烟是什么牌子| 骨折吃什么好| 牙齿经常出血是什么原因| 松香对人体有什么危害| 扁桃和芒果有什么区别| 县委办公室主任是什么级别| 嗓子哑了是什么原因| 骑单车锻炼什么好处| spf是什么意思| 儿童肠炎吃什么药| 艾滋病初期皮疹是什么样的| 梦见滑雪是什么意思| 滔滔不绝的绝是什么意思| 辐照食品是什么意思| 失孤什么意思| 总是困是什么原因| 奉献是什么意思| 口大是什么字| 尿酸高吃什么肉| 胸部疼痛是什么原因| 磁场是什么| 总胆汁酸高吃什么药| 风寒感冒喉咙痛吃什么药| 挫伤是什么意思| 广东是什么气候| 鸡的贵人是什么生肖| 疏是什么意思| 藏红花和什么一起泡水喝效果好| 一什么雨衣| 哔哩哔哩是什么| 白萝卜煮水喝有什么功效和作用| 老婆的弟弟叫什么| 高钾血症是什么原因引起的| 药店属于什么行业| elf是什么意思| 3月23日什么星座| 吃护肝片有什么副作用| 咽炎吃什么消炎药最好| 碱中毒是什么引起的| 肝郁脾虚吃什么药| 22年什么婚| 做一半就软了是什么原因| 肝岛是什么意思| 每天早上起来口苦是什么原因| 飞短流长是什么意思| 什么是无为| 梦见梳头发是什么意思| 吃什么对肝脏有好处能养肝| 湿疹是什么原因| 喝蜂蜜水有什么好处| 清明节一般开什么生肖| 小儿肠炎吃什么药最好| 古代男宠叫什么| 红颜知己是什么意思| 山竹是什么味道| 六角恐龙吃什么| pks是什么意思| 吃什么保养皮肤| 神经损伤是什么症状| 神经性头疼是什么症状| 怎么知道自己缺什么五行| lg手机是什么牌子| 咽炎是什么症状| 什么高| 医院查怀孕做什么检查| 右束支传导阻滞是什么意思| 女人脾虚吃什么最好| 1960年是什么年| 吃槟榔有什么好处和坏处| 肺气虚吃什么中成药| 华佗是什么生肖| 什么是牙结石| 总是感觉口渴是什么原因| 旌旗是什么意思| 断头婚是什么意思| 内向什么意思| 太白金星是什么神| 附件炎吃什么药好| 早晨起来口干舌燥是什么原因| 方圆脸适合什么发型| 炒菜放什么调料最好吃| 川字五行属什么| 眼压高有什么症状| 梦见着火是什么预兆| 烫发对身体有什么危害| 探病送什么花| 数字1代表什么意思| 神机妙算是什么意思| 宝宝热疹用什么药膏| 爱情是什么样子的| 梦见狗死了是什么预兆| 顾客为什么购买| eva鞋底是什么材质| 屈原为什么投江| 卵巢囊性回声什么意思| 锡字五行属什么| 孕妇宫缩是什么症状| 我一言难尽忍不住伤心是什么歌| 直肠炎吃什么药最好| cnv是什么意思| 什么是讨好型人格| 意味深长是什么意思| 生意兴隆是什么意思| 肺部做什么检查最准确| 感冒打喷嚏吃什么药| 焯水是什么意思| 马女和什么属相最配| 粉尘螨是什么东西| 吃完避孕药有什么反应| 什么牌子的氨基酸洗面奶好| 林黛玉和贾宝玉是什么关系| 教主是什么意思| 什么药止血效果最快| 慢性肠炎吃什么药调理| 拉肚子能吃什么水果| 为什么医院不推荐钡餐检查| 阴虚内热吃什么药| 发芽土豆含有什么毒素| sf什么意思| 高血钙有什么症状| 星五行属性是什么| 白头翁是什么鸟| 六安瓜片是什么茶| 卵巢囊性结构是什么意思| 枭神夺食会发生什么| 奥肯能胶囊是什么药| 奥特曼有什么| 在什么前面用英语怎么说| 同病相怜什么意思| 异类是什么意思| 姓薄的读音是什么| sjb什么意思| 榨菜的原料菜叫什么| 尿尿疼是什么原因| 什么叫意象| 冠心病吃什么药最好| 只是女人容易一往情深是什么歌| 人为什么要火化| 临床医生是什么意思| 宫颈口出血是什么原因| 讲师是什么职称| 穿孔是什么意思| 人大是干什么的| 薄荷脑是什么| 鱼胶是什么东西| 太阳花什么时候开花| 晚上9点到11点是什么时辰| 嘈杂纳减是什么意思| 牛三合生肖是什么| 武警是干什么的| 舒服的意思是什么| 火命适合佩戴什么首饰| 似乎的近义词是什么| 孕妇贫血对胎儿有什么影响| 仙居杨梅什么时候上市| 雅五行属性是什么| 枯草芽孢杆菌治什么病| 肾最怕什么食物| 左手发麻是什么病征兆| 什么手机电池最耐用| 反流性胃炎吃什么药| 稍高回声是什么意思| 公历是什么意思| 四川代表什么生肖| 鼻腔干燥是什么原因| 狂风暴雨是什么意思| 肾结石喝酒有什么影响| bpd是胎儿的什么意思| 医调委是什么机构| 龙的五行属性是什么| 头晕喝什么饮料| 栅栏是什么意思| 基因检测是什么意思| 冲正什么意思| 20至30元什么烟最好抽| 骨骼惊奇什么意思| 喝酒前吃什么不容易醉| 1117什么星座| 牙齿涂氟是什么意思| 甲状腺结节吃什么中药| 高湛为什么帮梅长苏| 米醋是什么| 食管炎吃什么药最好| 水泻拉肚子是什么原因| 稻谷什么时候成熟| 断掌是什么意思| 什么鱼刺少| 印泥干了用什么稀释| 无动于衷什么意思| 九牛一毛指什么生肖| 乙型肝炎核心抗体阳性是什么意思| nbp是什么意思| 素股是什么意思| 女性内分泌失调有什么症状| 上升水瓶座为什么可怕| yuki是什么意思| Fish什么意思| 丹参泡水喝有什么功效| 肝脏挂什么科| 白带什么样| 肠炎是什么原因引起的| 烂脚丫用什么药最好| 百度
发新帖本帖赏金 80.00元(功能说明)我要提问
返回列表
打印
[产品应用]

焦虑什么意思

[复制链接]
1706|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-7-21 14:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#有奖活动# #申请原创#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]
CW32L052 内部集成 2 个 I2C 控制器,能按照设定的传输速率(标准,快速,高速)将需要发送的数据按照 I2C 规范串行发送到 I2C 总线上,并对通信过程中的状态进行检测,另外还支持多主机通信中的总线冲突和仲裁处理。
其实实现对I2C外设的控制,目前有两种驱动方式,一种是纯硬件的驱动,另一种是用GPIO摸拟出时序。两种驱动方式各有所长,硬件驱动可以实现高速的通信速度,占用CPU时间少,但是其也有缺点,一是有些MCU的硬件I2C的驱动有BUG,与莫些外设不兼容等。模拟I2C驱动,具有不受IO的限制,移植到不同的MCU,只需要改动GPIO的驱动就行,移植比较方便,但是因为它也有缺点,由于需要延时函数,占用CPU时间多,通信速度受GPIO速度的影响等。就我目前接触的大多数MCU来说,程序员更加会选择模拟来实现I2C的驱动,因为移植起来方便、快速。
经过几天的学习CW32L052的用户手册,我发现其硬件的I2C的驱动的掌握难点在于,对其过 I2C 状态寄存器 I2Cx_STAT的掌握是一个难点,在其用户手册中,他的状态达28个之多,其中的26个为正常接收或发送状态,2个特殊状态(0xF8:I2C总线无可用信息;0x00: 总线错误)。其I2C状态码如下表所示:


经过学习官方的cw32l052_i2c.c中的函数,结合我以住驱动SSD1306的经验,成细的驱动了OLED屏,现在驱动方法分享如下:
1、选取合适的硬件I2C驱动管脚, 由于我原来在L083开发板上面使用了与LCD段码屏的管脚导致不起时序,所以这次我避免用到有可能起冲突的管脚。经查看原理图,开发板上的PB8,PB9是接到的开发板的EEPROM上的,原理图如下:

于是,我选取PB8为SCL,PB9为SDA,经查看用户手册,这两个管脚为I2C1,复用管脚代码如下:
PB08_AFx_I2C1SCL();

PB09_AFx_I2C1SDA();

初始化的次序为:使能GPIOB的时钟——使能I2C1时钟——复用GPIO为I2C1——配置GPIO为GPIO_MODE_OUTPUT_OD模式——配置I2C的波特率——配置I2C1总线——使用能I2C1,具体代码如下:
void OLED_I2C_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure = {0};

I2C_InitTypeDef I2C_InitStruct = {0};

//__RCC_GPIOB_CLK_ENABLE();

//__RCC_I2C1_CLK_ENABLE();

CW_SYSCTRL->AHBEN_f.GPIOB = 1;

CW_SYSCTRL->APBEN1_f.I2C1 = 1U; //

PB08_AFx_I2C1SCL();

PB09_AFx_I2C1SDA();

GPIO_InitStructure.Pins = I2C1_SCL_GPIO_PIN | I2C1_SDA_GPIO_PIN;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;

GPIO_Init(I2C1_SCL_GPIO_PORT, &GPIO_InitStructure);

I2C_InitStruct.I2C_Baud = 0x1; // 48000 000/(8*(1+11) = 500k

I2C_InitStruct.I2C_BaudEn = ENABLE;

I2C_InitStruct.I2C_FLT = DISABLE;

I2C_InitStruct.I2C_AA = DISABLE;

I2C1_DeInit();

I2C_Master_Init(CW_I2C1,&I2C_InitStruct);//初始化模块

I2C_Cmd(CW_OLED_I2C, ENABLE);

}

void OLED_I2C_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure = {0};

I2C_InitTypeDef I2C_InitStruct = {0};

//__RCC_GPIOB_CLK_ENABLE();

//__RCC_I2C1_CLK_ENABLE();

CW_SYSCTRL->AHBEN_f.GPIOB = 1;

CW_SYSCTRL->APBEN1_f.I2C1 = 1U; //

PB08_AFx_I2C1SCL();

PB09_AFx_I2C1SDA();

GPIO_InitStructure.Pins = I2C1_SCL_GPIO_PIN | I2C1_SDA_GPIO_PIN;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;

GPIO_Init(I2C1_SCL_GPIO_PORT, &GPIO_InitStructure);

I2C_InitStruct.I2C_Baud = 0x1; // 48000 000/(8*(1+11) = 500k

I2C_InitStruct.I2C_BaudEn = ENABLE;

I2C_InitStruct.I2C_FLT = DISABLE;

I2C_InitStruct.I2C_AA = DISABLE;

I2C1_DeInit();

I2C_Master_Init(CW_I2C1,&I2C_InitStruct);//初始化模块

I2C_Cmd(CW_OLED_I2C, ENABLE);

}

此次I2C不起用中断,采取循环获取I2C状态来决定下一步数据写入的方法。
需要驱动OLED,首先发出起始信号,然后判断STA状态寄存器的状态来做下一步的动作。而驱动SSD1306最基本的函数为向其写入一个byte的数据,其他的都是可以通用的,具体实现的代码如下:
//向OLED寄存器地址写一个byte的数据

int I2C_WriteByte(uint8_t addr,uint8_t data)

{

uint8_t u8i = 0, u8State;

uint16_t timeout = 0xffff;

I2C_GenerateSTART(CW_OLED_I2C, ENABLE);

//获取状态

while(1)

{

while((0 == I2C_GetIrq(CW_OLED_I2C)) && timeout--);

if(timeout == 0) return 1;

u8State = I2C_GetState(CW_OLED_I2C);

switch(u8State)

{

case 0x08: //发送完START信号

I2C_GenerateSTART(CW_OLED_I2C, DISABLE);

I2C_Send7bitAddress(CW_OLED_I2C, OLED_ADDR, 0x00);

break;

case 0x18: //发送完SLA+W信号,ACK已收到

I2C_SendData(CW_OLED_I2C, addr);

break;

case 0x28:

I2C_SendData(CW_OLED_I2C, data);

u8i ++;

break;

case 0x20: //发送完SLA+W后从机返回NACK

break;

case 0x38: //主机在发送 SLA+W 阶段或者发送数据阶段丢失仲载 或者 主机在发送 SLA+R 阶段或者回应 NACK 阶段丢失仲裁

I2C_GenerateSTART(CW_OLED_I2C, ENABLE);

break;

case 0x30:

I2C_GenerateSTOP(CW_OLED_I2C, ENABLE);

break;

default:

break;

}

if(u8i>1)

{

I2C_GenerateSTOP(CW_OLED_I2C, ENABLE);

I2C_ClearIrq(CW_OLED_I2C);

break;

}

I2C_ClearIrq(CW_OLED_I2C);

}

return 0;

}

实现好这个函数后,我们就可以往ssd1306中写数据了,经过测试显示图片如下:

到此图形的显示就好了,但是要显示出优雅的OLED时钟,还需要处理很多东西,比如图片的制作,上翻等动画,就需要很多时间来制作,于是我在B站上面找到了大佬“@量子卫星的索莱内姆”的开源作品,他在github上提供了源码。我经学习他的作品实现了漂亮时钟的制作,现将移植过程分享如下:
要实现时钟的显示,需要用到三个函数,一个是OLED.c显示,他用于OLED的初始化、显存的读写、实现画点画园、画图片的功能。在函数中先初定义GDDRAM缓存区
static uint8_t OLED_RAM[8][128];用于预先对缓存的数据填写,然后做一次性的写入OLED中。在制作时钟翻滚显示中有两个重要的函数,现在对函数作解读如下:
1、设置像素点的偏移,其中X、Y为起始坐标,x、y为坐标的偏移,如果set_pexl为1则点亮,如果是0测关闭。
/***************************************************************

Prototype : void SetPixel_for_ScrollDigit(int16_t X, int16_t Y, int16_t x, int16_t y, uint8_t set_pixel)

Parameters : X

Parameters : Y

Parameters : x

Parameters : y

Parameters : set_pixel

return: none

Description : 设置坐标像素点数据(可以为滚动动画服务)

***************************************************************/

void SetPixel_For_Scroll(int16_t X, int16_t Y, int16_t x, int16_t y, uint8_t set_pixel)

{

if(set_pixel)

{

OLED_RAM[(Y+y)/8][X+x] |= (0x01 << ((Y+y)%8));

}

else

{

OLED_RAM[(Y+y)/8][X+x] &= ~(0x01 << ((Y+y)%8));

}

}

从bmp大图片中获取小图片作为滚动动画的一帧图片,函数输入参数为图片显示的x、y坐标,显示的图片,所选的图片在素材中的纵、横坐标,以及一帧图片的高度,获取素材的最一行的显示数据。
函数从坐标开始一行一行开始提取数据数据,把数据更新到相对的像素点上,以此来实现动画的效果。
代码如下:
/****************************************************************************************************************************************************

Prototype : void Draw_Digit_BMP(uint16_t x1, uint16_t y1, const uint8_t BMP[], uint16_t Y,uint8_t W, uint8_t H, uint16_t end_line)

Parameters : x1 确定图片显示位置(左上角像素点横坐标)

Parameters : y1 确定图片显示位置(左上角像素点纵坐标)

Parameters : BMP[] 素材图片

Parameters : Y 所选的一帧图片在素材图片中的纵坐标

Parameters : W 素材图片宽度(也是一帧图片的宽度)

Parameters : H 一帧图片的高度

Parameters : end_line 在素材图片中划出最后一行(用于滚动循环,首尾相接)

return: none

Description : 从bmp大图片中获取小图片作为滚动动画的一帧图片

*****************************************************************************************************************************************************/

void Draw_BMP_For_Scroll(uint16_t x1, uint16_t y1, const uint8_t BMP[], uint16_t Y, uint8_t W, uint8_t H, uint16_t end_line)

{

uint16_t x0,y0,y,Temp;

for(y = Y , y0 = 0 ; y0 < H ; y++ , y0++)

{

if(y > end_line) y -= (end_line+1);

for(x0 = 0; x0 < W ; x0++)

{

Temp = GetPixel_For_Scroll(x0, y, BMP, W);

SetPixel_For_Scroll(x1,y1,x0,y0,Temp);

}

}

}

在draw_rolling_colck.c文件中,其就一个函数Draw_Rollin_clock,他的主要功能就是实现不断的对整个画面进行数据刷新,在个位向10位进位时提供进位翻页的截图图显示,如果没有翻页测按原来动画进行显示。在数据组装完成后执行函数OLED_RefreshPartRAM(2,4,0,127);对整个显存进行更新,代码如下:
void Draw_Rolling_Clock()

{

switch(H1)

{

case 0:if(Y1 < 24*2+1) Y1 = 24*2;if(Y1 < 24*2+24) Y1++;break;

case 1:

case 2:if(Y1 < H1*24-23 || Y1 > H1*24) Y1 = H1*24-24;if(Y1 < H1*24) Y1++;

}

Draw_BMP_For_Scroll(0, 16, Scroll_Digit_BMP[0], Y1, 20, 24, 2*24+23);//end_line=2*24+23,Scroll_Digit_Small_BMP划到2*24+23行,即0~2

switch(H2)

{

case 0:

{

if(Hour == 0) {TEMP = 3;if(Y2 < 24*3+1 || Y2 > 4*24) Y2 = 24*3;if(Y2 < 24*3+24) Y2++;break;}

if(Hour == 10 || Hour == 20){TEMP = 9;if(Y2 < 24*9+1) Y2 = 24*9;if(Y2 < 24*9+24) Y2++;break;}

}

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:if(Y2 < H2*24-23 || Y2 > H2*24) Y2 = H2*24-24;if(Y2 < H2*24) Y2++;TEMP = 9;//if(Hour == 23) TEMP = 3;else TEMP = 9;

}

Draw_BMP_For_Scroll(22, 16, Scroll_Digit_BMP[0], Y2, 20, 24, TEMP*24+23);//end_line=Temp*24+23,Scroll_Digit_Small_BMP划到Temp*24+23行,即0~Temp

switch(M1)

{

case 0:if(Y3 < 24*5+1) Y3 = 24*5;if(Y3 < 24*5+24) Y3++;break;

case 1:

case 2:

case 3:

case 4:

case 5:if(Y3 < M1*24-23 || Y3 > M1*24) Y3 = M1*24-24;if(Y3 < M1*24) Y3++;

}

Draw_BMP_For_Scroll(50, 16, Scroll_Digit_BMP[0], Y3, 20, 24, 5*24+23);//end_line=5*24+23,Scroll_Digit_Small_BMP划到5*24+23行,即0~5

switch(M2)

{

case 0:if(Y4 < 24*9+1) Y4 = 24*9;if(Y4 < 24*9+24) Y4++;break;

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:if(Y4 < M2*24-23 || Y4 > M2*24) Y4 = M2*24-24;if(Y4 < M2*24) Y4++;

}

Draw_BMP_For_Scroll(72, 16, Scroll_Digit_BMP[0], Y4, 20, 24, 9*24+23);//end_line=9*24+23,Scroll_Digit_Small_BMP划到9*24+23行,即0~9

switch(S1)

{

case 0:if(Y5 < 16*5+1) Y5 = 16*5;if(Y5 < 16*5+16) Y5++;break;

case 1:

case 2:

case 3:

case 4:

case 5:if(Y5 < S1*16-15 || Y5 > S1*16) Y5 = S1*16-16;if(Y5 < S1*16) Y5++;

}

Draw_BMP_For_Scroll(94, 24, Scroll_Digit_Small_BMP[0], Y5, 14, 16, 5*16+15);//end_line=6*16+15,Scroll_Digit_Small_BMP划到6*16+15行,即0~6

switch(S2)

{

case 0:if(Y6 < 16*9+1) Y6 = 16*9;if(Y6 < 16*9+16) Y6++;break;

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:if(Y6 < S2*16-15 || Y6 > S2*16) Y6 = S2*16-16;if(Y6 < S2*16) Y6++;

}

Draw_BMP_For_Scroll(111, 24, Scroll_Digit_Small_BMP[0], Y6, 14, 16, 9*16+15);//end_line=9*16+15,Scroll_Digit_Small_BMP划到9*16+15行,即0~9

if(Second % 2 == 1) OLED_DrawBMP(44,16,4,24,Colon_BMP[0]); //绘制冒号

else OLED_AreaClear(44,16,4,24); //清除冒号

OLED_RefreshPartRAM(2,4,0,127);

}

例程的时钟产生是基于systick的,我这里使用RTC的定时中断来产生,定时闹钟每一秒钟进入中断,然后更新时、分、秒的数据,代码如下:
void ShowTime(void)

{

static uint8_t show_state = 0;

show_state =show_state%2;

lcd_clear();

RTC_TimeTypeDef RTC_TimeStruct = {0};

RTC_DateTypeDef RTC_DateStruct = {0};

RTC_GetDate(&RTC_DateStruct);

RTC_GetTime(&RTC_TimeStruct);

//显示-

lcd_show_string(5,18);

lcd_show_string(2,18);

if(show_state == 0)

{

lcd_show_string(7,RTC_DateStruct.Year>>4);

lcd_show_string(6,RTC_DateStruct.Year&0x0F);

lcd_show_string(4,RTC_DateStruct.Month>>4);

lcd_show_string(3,RTC_DateStruct.Month&0x0F);

lcd_show_string(1,RTC_DateStruct.Day>>4);

lcd_show_string(0,RTC_DateStruct.Day&0x0F);

}else {

lcd_show_string(7,RTC_TimeStruct.Hour>>4);

lcd_show_string(6,RTC_TimeStruct.Hour&0x0F);

lcd_show_string(4,RTC_TimeStruct.Minute>>4);

lcd_show_string(3,RTC_TimeStruct.Minute&0x0F);

lcd_show_string(1,RTC_TimeStruct.Second>>4);

lcd_show_string(0,RTC_TimeStruct.Second&0x0F);

}

show_state++;

Hour = (RTC_DateStruct.Year>>4) + (RTC_TimeStruct.Hour&0x0F) ;

Minute = (RTC_TimeStruct.Minute>>4) + (RTC_TimeStruct.Minute&0x0F);

Second = (RTC_TimeStruct.Second>>4) + (RTC_TimeStruct.Second&0x0F);

H1 =RTC_TimeStruct.Hour>>4;

H2 = RTC_TimeStruct.Hour&0x0F;

M1 = RTC_TimeStruct.Minute>>4;

M2 = RTC_TimeStruct.Minute&0x0F;

S1 = RTC_TimeStruct.Second>>4;

S2 = RTC_TimeStruct.Second&0x0F;

// u1_printf(".Date is 20%02x/%02x/%02x(%s).Time is %02x%s:%02x:%02x\r\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Day, WeekdayStr[RTC_DateStruct.Week], RTC_TimeStruct.Hour, H12AMPMStr[RTC_TimeStruct.H24][RTC_TimeStruct.AMPM],RTC_TimeStruct.Minute, RTC_TimeStruct.Second);

}

最后,在主函数中,调用Draw_Rolling_Clock,实现了效果:
int32_t main(void)

{

RCC_Configuration();

InitTick( 48000000 );

uart1_init();

my_rtc_init();

lcd_init();

lcd_clear();

OLED_Init();

UART_SendString(CW_UART1, "start\r\n");

while(1)

{

if(uart1_rx_state == 1)

{

uart1_rx_state = 0;

uart1_rx_cnt = 0;

u1_printf("rcv:%s\r\n",uart1_rx_buff);

ShowTime();

memset(uart1_rx_buff, 0, UART1_RX_MAXLEN);

}

SysTickDelay(20);

Draw_Rolling_Clock();

}

}
【总结】CW32L052的硬件I2C设计非常科学,提供了28个STA状态码,可以给用户提供精准的状态,来实现下一个状态的转换,为OLED时钟的显示提供了强大的显示驱动,时钟的动画显示非常优雅!效果见视频:


打赏榜单

21小跑堂 打赏了 80.00 元 2025-08-04
理由:恭喜通过原创审核!期待您更多的原创作品~

沙发
昨天| | 2023-8-2 14:04 | 只看该作者
源代码没打包啊??。
板凳
elephant00| | 2023-8-3 17:24 | 只看该作者
丝滑数字OLED小时钟
地板
lulugl|  楼主 | 2023-8-3 21:06 | 只看该作者
elephant00 发表于 2023-8-3 17:24
丝滑数字OLED小时钟

感谢大注的关注!
5
bogejiayou| | 2025-3-26 09:34 | 只看该作者
很好的学习心得,过程和思路都细说了,有空复刻一个学习一下。
发新帖 本帖赏金 80.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

825

帖子

12

粉丝
xl是什么码 主动脉硬化吃什么药好 山竹里面黄黄的是什么可以吃吗 中国黄金为什么比其它金店便宜 高钾血症是什么原因引起的
水痘疤痕用什么药膏 体毛旺盛是什么原因 妈妈桑是什么意思 口腔溃疡白色的是什么 ast什么意思
公分的单位是什么 乙肝不能吃什么东西 一岁宝宝口臭是什么原因引起的 反复发烧吃什么药 偶像包袱是什么意思
一个立一个羽读什么 壁虎长什么样 hb是什么意思 新生儿足底采血检查什么项目 阴火是什么意思
trendiano什么牌子hcv8jop3ns0r.cn 腰疼去医院挂什么科xinmaowt.com 早起胃疼是什么原因导致的hcv8jop4ns0r.cn 青梅是什么水果hcv7jop7ns0r.cn 成人感冒挂什么科hcv7jop7ns4r.cn
美的不可方物什么意思hcv8jop0ns1r.cn 精英是什么意思hcv8jop8ns7r.cn 饮食清淡主要吃什么hcv8jop0ns4r.cn 小腿肿胀是什么原因引起的naasee.com 1970属什么生肖hcv8jop9ns8r.cn
吃什么拉什么完全不能消化怎么办hcv8jop0ns7r.cn 欲望是什么hcv8jop0ns3r.cn 深覆合是什么样子的hcv8jop0ns7r.cn 什么是宫腔镜检查0735v.com 1938年中国发生了什么bjcbxg.com
脸上爱长痘痘是什么原因hcv9jop2ns4r.cn 头骨凹陷是什么原因hcv8jop7ns8r.cn 7月13日是什么星座hcv7jop9ns1r.cn 早早孕有什么征兆hcv9jop2ns1r.cn 单丛属于什么茶hcv9jop0ns3r.cn
百度