你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】移植U8g2

[复制链接]
lugl 发布时间:2025-5-4 22:25

前面使用NKIA5110的显示屏制作了低功耗时间。这一篇,我将分享如何移植U8g2来实现图形化的界面。

【移植】

1、首先到github上下载一个开源的stm32f103的基于NKIA5110LCD屏的开源项目。

2、修改uint8_t u8x8_stm32_gpio_and_delay(u8x8_t u8x8, uint8_t msg, uint8_t arg_int, void arg_ptr)函数中的几个GPIO的时钟,修改后的代码如下:

//This Function will independtly keep the screen running by init GPIO it self
uint8_t u8x8_stm32_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
  switch(msg)
  {
    case U8X8_MSG_GPIO_AND_DELAY_INIT:  // called once during init phase of u8g2/u8x8
      break;                            // can be used to setup pins
    case U8X8_MSG_DELAY_NANO:           // delay arg_int * 1 nano second
            delay_us(1);
      break;  
    case U8X8_MSG_DELAY_100NANO:        // delay arg_int * 100 nano seconds
            delay_us(100);
      break;
    case U8X8_MSG_DELAY_10MICRO:        // delay arg_int * 10 micro seconds
            delay_ms(10);
      break;
    case U8X8_MSG_DELAY_MILLI:          // delay arg_int * 1 milli second
            __NOP();
      break;
    case U8X8_MSG_DELAY_I2C:                // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
      break;                            // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
    case U8X8_MSG_GPIO_D0:              // D0 or SPI clock pin: Output level in arg_int
          arg_int?HAL_GPIO_WritePin(SCREENGPIOGROUP, SCKPIN, GPIO_PIN_SET):HAL_GPIO_WritePin(SCREENGPIOGROUP, SCKPIN, GPIO_PIN_RESET);
      break;
    case U8X8_MSG_GPIO_D1:              // D1 or SPI data pin: Output level in arg_int

        arg_int?HAL_GPIO_WritePin(SCREENGPIOGROUP, DATAPIN, GPIO_PIN_SET):HAL_GPIO_WritePin(SCREENGPIOGROUP, DATAPIN, GPIO_PIN_RESET);
      break;
    case U8X8_MSG_GPIO_D2:              // D2 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D3:              // D3 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D4:              // D4 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D5:              // D5 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D6:              // D6 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D7:              // D7 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_E:               // E/WR pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_CS:              // CS CE (chip select) pin: Output level in arg_int
            arg_int?HAL_GPIO_WritePin(SCREENGPIOGROUP, CEPIN, GPIO_PIN_SET):HAL_GPIO_WritePin(SCREENGPIOGROUP, CEPIN, GPIO_PIN_RESET);
      break;
    case U8X8_MSG_GPIO_DC:              // DC (data/cmd, A0, register select) pin: Output level in arg_int
        arg_int?HAL_GPIO_WritePin(SCREENGPIOGROUP, DCPIN, GPIO_PIN_SET):HAL_GPIO_WritePin(SCREENGPIOGROUP, DCPIN, GPIO_PIN_RESET);
      break;
    case U8X8_MSG_GPIO_RESET:           // Reset pin: Output level in arg_int
        arg_int?HAL_GPIO_WritePin(GPIOB, RSTPIN, GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB, RSTPIN, GPIO_PIN_RESET);
            //Set/Reset Bit in OneLine
      break;
    case U8X8_MSG_GPIO_CS1:             // CS1 (chip select) pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_CS2:             // CS2 (chip select) pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_I2C_CLOCK:       // arg_int=0: Output low at I2C clock pin
      break;                            // arg_int=1: Input dir with pullup high for I2C clock pin
    case U8X8_MSG_GPIO_I2C_DATA:            // arg_int=0: Output low at I2C data pin
      break;                            // arg_int=1: Input dir with pullup high for I2C data pin
    case U8X8_MSG_GPIO_MENU_SELECT:
      u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
      break;
    case U8X8_MSG_GPIO_MENU_NEXT:
      u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
      break;
    case U8X8_MSG_GPIO_MENU_PREV:
      u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
      break;
    case U8X8_MSG_GPIO_MENU_HOME:
      u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
      break;
    default:
      u8x8_SetGPIOResult(u8x8, 1);          // default return value
      break;
  }
  return 1;
}

3、定义一个初始化的函数:

void InitNokia5110(u8g2_t *u8g2){
u8g2_Setup_pcd8544_84x48_f(u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_stm32_gpio_and_delay);  // init u8g2 structure
u8g2_InitDisplay(u8g2); // send init sequence to the display, display is in sleep mode after this,
u8g2_SetPowerSave(u8g2, 0); // wake up display
u8g2_ClearBuffer(u8g2);

}

4、同时还需要提供三个延时函数给U8g2:

image.png

5、最后把u8g2文件夹下的csrc的文件添加到工程中:

image.png

image.png

LCD驱动为u8x8_d_pcd8544_84x48.c

6、添加测试代码如下:

InitNokia5110(&u8g2); //Screen Init
uint8_t t = 2;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

            HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
            /* Get the RTC current Date */
            HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
          u8g2_FirstPage(&u8g2);
          u8g2_SetFontMode(&u8g2, 1); /*字体模式选择*/
            u8g2_SetFontDirection(&u8g2, 0);
          u8g2_SetFont(&u8g2, u8g2_font_amstrad_cpc_extended_8u);
// 绘制时钟表盘
    u8g2_DrawCircle(&u8g2,40,  24, 16, U8G2_DRAW_ALL);
        u8g2_DrawCircle(&u8g2,40,  24, 15, U8G2_DRAW_ALL);
    // 计算时针、分针、秒针的角度
    float second_angle = (sTime.Seconds / 60.0) * 360;
    float minute_angle = ((sTime.Minutes + sTime.Seconds / 60.0) / 60.0) * 360;
    float hour_angle = ((sTime.Hours % 12 + sTime.Minutes / 60.0) / 12.0) * 360;

    // 计算时针、分针、秒针的终点坐标
    int center_x = 40 ;
    int center_y = 24;
    int second_x = center_x + 15 * sin(second_angle * 3.1415926 / 180);
    int second_y = center_y - 15 * cos(second_angle * 3.1415926 / 180);
    int minute_x = center_x + 12 * sin(minute_angle * 3.1415926 / 180);
    int minute_y = center_y - 12 * cos(minute_angle * 3.1415926 / 180);
    int hour_x = center_x + 10 * sin(hour_angle * 3.1415926 / 180);
    int hour_y = center_y - 10 * cos(hour_angle * 3.1415926 / 180);

    // 绘制时针、分针、秒针
    u8g2_DrawLine(&u8g2, center_x, center_y, second_x, second_y);
    u8g2_DrawLine(&u8g2, center_x, center_y, minute_x, minute_y);
    u8g2_DrawLine(&u8g2, center_x, center_y, hour_x, hour_y);

    // 绘制数字时间
    char time_str[20];
    sprintf(time_str, "%02d:%02d:%02d", sTime.Hours, sTime.Minutes, sTime.Seconds);
    u8g2_DrawStr(&u8g2, 10, 8, time_str);

    // 发送缓冲区内容到屏幕
    u8g2_SendBuffer(&u8g2);
            HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);


    }

}

实现效果如下:

9cb6c1e48606349f1f8e114174a31b7.jpg

收藏 评论0 发布时间:2025-5-4 22:25

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版