[LKS32 硬件] 【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】+DS1302模块计时与OLED屏显示

[复制链接]
 楼主| jinglixixi 发表于 2023-6-24 11:13 | 显示全部楼层 |阅读模式
<
本帖最后由 jinglixixi 于 2023-6-24 11:23 编辑

#申请原创#  @21小跑堂
由于LKS32MC071没有内置RTC计时器,因此要实现电子时钟类的计时功能需外挂RTC计时模块,这里采用的DS1302功能模块。
在使用时,DS1302模块与开发板的连接关系为:
SCK ---P00
IO  ---P32
RST ---P210
1.bmp
1 所用接口

为便于编程,对各引脚输出高低电平的语句定义为:
#define SCK_Set()      GPIO_SetBits(GPIO0, GPIO_Pin_0)
#define SCK_Clr()      GPIO_ResetBits(GPIO0, GPIO_Pin_0)
#define IO_Set()       GPIO_SetBits(GPIO3, GPIO_Pin_2)
#define IO_Clr()       GPIO_ResetBits(GPIO3, GPIO_Pin_2)
#define RST_Set()      GPIO_SetBits(GPIO2, GPIO_Pin_10)
#define RST_Clr()      GPIO_ResetBits(GPIO2, GPIO_Pin_10)
#define IO_IN         GPIO_ReadInputDataBit(GPIO3,GPIO_Pin_2)
DS1302模块对所用引脚的配置函数为:
  1. void ds1302_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  6.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_0;
  7.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  8.     GPIO_StructInit(&GPIO_InitStruct);
  9.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  10.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_10;
  11.     GPIO_Init(GPIO2, &GPIO_InitStruct);
  12.     GPIO_StructInit(&GPIO_InitStruct);
  13.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  14.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2;
  15.     GPIO_Init(GPIO3, &GPIO_InitStruct);
  16. }

在使用过程中,DS1302模块的数据引脚既使用输出模式,又使用输入模式,故定义了输入与输出模式的函数,其内容如下:
  1. void INPUT_MODE_SET(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  6.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  7.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2;
  8.     GPIO_Init(GPIO3, &GPIO_InitStruct);
  9. }

  10. void OUTPUT_MODE_SET(void)
  11. {
  12.     GPIO_InitTypeDef GPIO_InitStruct;
  13.     GPIO_StructInit(&GPIO_InitStruct);
  14.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  15.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2;
  16.     GPIO_Init(GPIO3, &GPIO_InitStruct);
  17. }

DS1302模块写入时间值的函数为:
  1. void ds1302_write_time(void)
  2. {
  3.         ds1302_write_byte(ds1302_control_add,0x00);        
  4.         ds1302_write_byte(ds1302_sec_add,0x80);
  5.         ds1302_write_byte(ds1302_year_add,time_buf[1]);
  6.         ds1302_write_byte(ds1302_month_add,time_buf[2]);
  7.         ds1302_write_byte(ds1302_date_add,time_buf[3]);
  8.         ds1302_write_byte(ds1302_hr_add,time_buf[4]);
  9.         ds1302_write_byte(ds1302_min_add,time_buf[5]);
  10.         ds1302_write_byte(ds1302_sec_add,time_buf[6]);
  11.         ds1302_write_byte(ds1302_day_add,time_buf[7]);
  12.         ds1302_write_byte(ds1302_control_add,0x80);  
  13. }

DS1302模块读取时间值的函数为:
  1. void ds1302_read_time(void)
  2. {
  3.         time_buf[1]=ds1302_read_byte(ds1302_year_add);
  4.         time_buf[2]=ds1302_read_byte(ds1302_month_add);
  5.         time_buf[3]=ds1302_read_byte(ds1302_date_add);
  6.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);
  7.         time_buf[5]=ds1302_read_byte(ds1302_min_add);
  8.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;
  9.         time_buf[7]=ds1302_read_byte(ds1302_day_add);
  10. }

为便于观察RTC计时效果,这里为其配备了OLED屏的显示功能。

OLED屏是一款I2C接口的显示屏,它占用引脚少,显示信息较丰富,其显示效果如图2所示。
2.bmp
2 显示效果

该显示屏与开发板的连接关系为:
SDA ---P22
CLK ---P23
定义引脚输出高低电平输出的语句为:
#define SDA_high   GPIO_SetBits(GPIO2, GPIO_Pin_2)
#define SDA_low   GPIO_ResetBits(GPIO2, GPIO_Pin_2)
#define SCL_high   GPIO_SetBits(GPIO2, GPIO_Pin_3)
#define SCL_low    GPIO_ResetBits(GPIO2,GPIO_Pin_3)

对所用引脚的配置函数为:
  1. void oled_gpio_init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_StructInit(&GPIO_InitStruct);
  6.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  7.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2|GPIO_Pin_3;
  8.     GPIO_Init(GPIO2, &GPIO_InitStruct);
  9. }

OLED屏初始化函数为:
  1. void OLED_Init(void)
  2. {
  3.     OLED_WR_Byte(0xAE,OLED_CMD);
  4.     OLED_WR_Byte(0x02,OLED_CMD);
  5.     OLED_WR_Byte(0x10,OLED_CMD);
  6.     OLED_WR_Byte(0x40,OLED_CMD)
  7.     OLED_WR_Byte(0x81,OLED_CMD);
  8.     OLED_WR_Byte(0xff,OLED_CMD);
  9.     OLED_WR_Byte(0xA1,OLED_CMD);
  10.     OLED_WR_Byte(0xC8,OLED_CMD);
  11.     OLED_WR_Byte(0xA6,OLED_CMD);
  12.     OLED_WR_Byte(0xA8,OLED_CMD);
  13.     OLED_WR_Byte(0x3f,OLED_CMD);
  14.     OLED_WR_Byte(0xD3,OLED_CMD);
  15.     OLED_WR_Byte(0x00,OLED_CMD);
  16.     OLED_WR_Byte(0xd5,OLED_CMD);
  17.     OLED_WR_Byte(0x80,OLED_CMD);
  18.     OLED_WR_Byte(0xD9,OLED_CMD);
  19.     OLED_WR_Byte(0xF1,OLED_CMD);
  20.     OLED_WR_Byte(0xDA,OLED_CMD);
  21.     OLED_WR_Byte(0x12,OLED_CMD);
  22.     OLED_WR_Byte(0xDB,OLED_CMD);
  23.     OLED_WR_Byte(0x40,OLED_CMD);
  24.     OLED_WR_Byte(0x20,OLED_CMD);
  25.     OLED_WR_Byte(0x02,OLED_CMD);
  26.     OLED_WR_Byte(0x8D,OLED_CMD);
  27.     OLED_WR_Byte(0x14,OLED_CMD);
  28.     OLED_WR_Byte(0xA4,OLED_CMD);
  29.     OLED_WR_Byte(0xA6,OLED_CMD);
  30.     OLED_WR_Byte(0xAF,OLED_CMD);
  31.     OLED_WR_Byte(0xAF,OLED_CMD);
  32.     OLED_Clear();
  33.     OLED_Set_Pos(0,0);
  34. }

实现RTC计时值显示的函数为:
  1. void RTC_disp(void)
  2. {
  3.           sj[0]=(time_buf[4]>>4)+'0';
  4.           sj[1]=(time_buf[4]&0x0f)+'0';
  5.           sj[3]=(time_buf[5]>>4)+'0';
  6.           sj[4]=(time_buf[5]&0x0f)+'0';
  7.           sj[6]=(time_buf[6]>>4)+'0';
  8.           sj[7]=(time_buf[6]&0x0f)+'0';
  9.           OLED_ShowChar(0,4,sj[0],16);
  10.           OLED_ShowChar(8,4,sj[1],16);
  11.           OLED_ShowChar(16,4,':',16);
  12.           OLED_ShowChar(24,4,sj[3],16);
  13.           OLED_ShowChar(32,4,sj[4],16);
  14.           OLED_ShowChar(40,4,':',16);
  15.           OLED_ShowChar(48,4,sj[6],16);
  16.           OLED_ShowChar(56,4,sj[7],16);
  17. }

实现图3所示显示效果的主程序为:
  1. int main(void)
  2. {
  3.         Hardware_init();
  4.         Delay_Ms(500);
  5.         OLED_Init();
  6.         OLED_Clear();
  7.         OLED_ShowString(0,0,"LKS32MC071",16);
  8.         OLED_ShowString(0,2,"OLED & DS1302",16);
  9.         ds1302_init();
  10.         ds1302_write_time();
  11.         for (;;)
  12.         {
  13.                 ds1302_read_time();
  14.                 RTC_ disp ();
  15.                 GPIO_SetBits(GPIO0, GPIO_Pin_6);
  16.                 Delay_Ms(400);
  17.                 GPIO_ResetBits(GPIO0, GPIO_Pin_6);
  18.                 Delay_Ms(400);
  19.         }
  20. }

3.bmp
3  计时效果


有了DS1302模块的计时功能,就可以和点阵板相配合来实现计时公告牌的功能。

评论

赞~!学习一下!  发表于 2023-6-26 10:09
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2935

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部