0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

武汉芯源CW32L083 LCD计数器

华仔的编程随笔 来源:华仔的编程随笔 作者:华仔的编程随笔 2023-06-18 09:09 次阅读

【目的】实现一个计数器,按下按键1开始计时,再次按下按键1实现暂停,再次按下,继续计时。按下按键2实现清零。

【实现步骤】

1、初始化时钟,代码如下:

void RCC_Configuration(void)

{

/* 0. HSI使能并校准 */

// RCC_HSI_OUT();

RCC_HSI_Enable(RCC_HSIOSC_DIV6);

/* 1. 设置HCLK和PCLK的分频系数 */

RCC_HCLKPRS_Config(RCC_HCLK_DIV1);

RCC_PCLKPRS_Config(RCC_PCLK_DIV1);

// RCC_HCLK_OUT();

// __breakpoint(0);

/* 2. 使能PLL,通过HSI倍频到64MHz */

RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, RCC_PLL_MUL_8); // HSI 默认输出频率8MHz

// RCC_PLL_OUT();

///< 当使用的时钟源HCLK大于24M,小于等于48MHz:设置FLASH 读等待周期为2 cycle

///< 当使用的时钟源HCLK大于48M,小于等于72MHz:设置FLASH 读等待周期为3 cycle

__RCC_FLASH_CLK_ENABLE();

FLASH_SetLatency(FLASH_Latency_3);

/* 3. 时钟切换到PLL */

RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);

RCC_SystemCoreClockUpdate(64000000);

/* 4. 配置外设时钟 */

// __RCC_GPIOF_CLK_ENABLE();

// __RCC_GPIOE_CLK_ENABLE();

// __RCC_GPIOD_CLK_ENABLE();

// __RCC_GPIOC_CLK_ENABLE();

// __RCC_GPIOB_CLK_ENABLE();

// __RCC_GPIOA_CLK_ENABLE();

// __RCC_LCD_CLK_ENABLE();

}

  1. 初始化按键

板载按键1为PA4,按键2为PA5,根据原理图,都接了上位电阻,所以需要配置为下拉中断触发。

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 配置PA4、PA5为按键输入 */

GPIO_InitStruct.IT = GPIO_IT_FALLING;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pins = GPIO_PIN_4 | GPIO_PIN_5;

__RCC_GPIOA_CLK_ENABLE();

GPIO_Init(CW_GPIOA, &GPIO_InitStruct);

}

3、中断配置

void NVIC_Configuration(void)

{

__disable_irq();

// NVIC_EnableIRQ(WDT_IRQn);

NVIC_SetPriority(GPIOA_IRQn, 0);

// NVIC_SetPriority(SysTick_IRQn, 1);

NVIC_EnableIRQ(GPIOA_IRQn);

__enable_irq();

}

4、中断回调函数,在中断回调中只清除中断标志,业务处理在主函数中处理:

/**

  • @brief This funcation handles GPIOA
    */
    void GPIOA_IRQHandler(void)
    {

CW_GPIOA->ICR = 0; //清除中断标志

}

5、LCD驱动

在LCD驱动中,我们初始化LCD(具体见官方示例),然后是书写LCD数字显示驱动,具体代码如下:

#include "lcd.h"

// 7 6 5 4 3 2 1 0

// RAM01 RAM00 RAM03 RAM02 RAM801 RAM10 RAM13 RAM12 RAM92 RAM91

/* 段码低8(左) */

static uint8_t num_L[10] = {

0x0d, //0

0x00, //1

0x0e, //2

0x0a, //3

0x03, //4

0x0b, //5

0x0f, //6

0x00, //7

0x0f, //8

0x0b, //9

};

/* 段码高8(右) */

static uint8_t num_H[10] = {

0x07,

0x06,

0x03,

0x07,//3

0x06,//4

0x05, //5

0x05, //

0x07, //7

0x07, //8

0x07, //9

};

void show_nums(uint32_t num)

{

uint8_t i=0;

uint8_t j;

uint32_t temp;

temp = num;

//空显示

CW_LCD->RAM0 = 0;

CW_LCD->RAM1 = 0;

CW_LCD->RAM8 = 0;

CW_LCD->RAM9 = 0;

if(temp == 0)

show_num(0,0);

while(temp>0)

{

j = temp%10;

show_num(i,j);

temp /=10;

i++;

}

}

void show_num(uint8_t wei, uint8_t num)

{

switch(wei)

{

case 7:

{

//显示第7个数码管

CW_LCD->RAM0 |= num_H[num]<<8 | num_L[num];

break;

}

case 6:

{

//显示第6个数码

CW_LCD->RAM0 |= (num_H[num]<<8 | num_L[num]) <<16;

break;

}

case 5:

{

//显示第5个数码管

CW_LCD->RAM1 |= num_L[num];

CW_LCD->RAM8 |= num_H[num];

break;

}

case 4:

{

//显示第4个数码管

CW_LCD->RAM8 |= num_H[num]<<16 | num_L[num]<<8;

break;

}

case 3:

{

//显示第3个数码管

CW_LCD->RAM8 |= num_L[num]<<24;

CW_LCD->RAM9 |= num_H[num];

break;

}

case 2:

{

//显示第2个数码管

CW_LCD->RAM9 |= num_H[num]<<16 | num_L[num]<<8;

break;

}

case 1:

{

//显示第1个数码管

CW_LCD->RAM1 |= num_H[num]<<8;

CW_LCD->RAM9 |= num_L[num]<<24;

break;

}

case 0:

{

//显示第0个数码管

CW_LCD->RAM1 |= num_H[num]<<24 | num_L[num]<<16;

break;

}

}

}

void LCD_Configuration(void)

{

LCD_InitTypeDef LCD_InitStruct = {0};

LCD_InitStruct.LCD_Bias = LCD_Bias_1_3;

LCD_InitStruct.LCD_ClockSource = LCD_CLOCK_SOURCE_LSI;

LCD_InitStruct.LCD_Duty = LCD_Duty_1_4;

LCD_InitStruct.LCD_ScanFreq = LCD_SCAN_FREQ_256HZ;

LCD_InitStruct.LCD_VoltageSource = LCD_VoltageSource_Internal;

__RCC_LCD_CLK_ENABLE();

RCC_LSI_Enable();

LCD_Init(&LCD_InitStruct); //基本配置

// BTL004 LCD 对应的连接

//PA12 COM3

//PA11 COM2

//PA10 COM1

//PA09 COM0

//PA08 SEG0

//PC09 SEG1

//PC08 SEG2

//PC07 SEG3

//PC06 SEG4

//PD15 SEG32

//PD14 SEG33

//PD13 SEG34

//PD12 SEG35

//PD11 SEG36

//PD10 SEG37

//PD09 SEG38

//PD08 SEG39

//PB15 SEG5

//PB14 SEG6

//PB13 SEG7

// 分配引脚

LCD_COMConfig(LCD_COM0 | LCD_COM1 | LCD_COM2 | LCD_COM3, ENABLE);

LCD_SEG0to23Config(0x0000FF, ENABLE);

LCD_SEG32to55Config(0x0000FF,ENABLE);

CW_LCD->RAM[0] = 0;

CW_LCD->RAM[1] = 0;

CW_LCD->RAM2 = 0;

CW_LCD->RAM3 = 0;

CW_LCD->RAM4 = 0;

CW_LCD->RAM5 = 0;

CW_LCD->RAM6 = 0;

CW_LCD->RAM7 = 0;

CW_LCD->RAM8 = 0;

CW_LCD->RAM9 = 0;

CW_LCD->RAM10 = 0;

CW_LCD->RAM11 = 0;

CW_LCD->RAM12 = 0;

CW_LCD->RAM13 = 0;

LCD_Cmd(ENABLE);

CW_LCD->RAM0 = 0x0f0f;

LCD_ContrastConfig(LCD_Contrast_Level_2);

LCD_DriveVoltageConfig(LCD_INRS_LEVEL_0);

}

5、主函数中,我们检查按键1、按键2,并做出相应的处理。具体代码如下:

#include "main.h"

void NVIC_Configuration(void);

void RCC_Configuration(void);

uint8_t Key1Count = 0;

uint8_t Key2Count = 0;

int32_t main(void)

{

uint32_t show_conut=0;

uint32_t time_count = 0;

CW_SYSCTRL->AHBEN_f.GPIOC = 1U; //Open GPIOA Clk

CW_GPIOC->ANALOG_f.PIN2 = 0U; //Digital

CW_GPIOC->BRR_f.BRR2 = 1U; //Reset PA00

CW_GPIOC->DIR_f.PIN2 = 0U; //Output

RCC_Configuration();

GPIO_Configuration();

NVIC_Configuration();

LCD_Configuration();

show_nums(show_conut);

while(1)(//file1.elecfans.com/web2/M00/8A/01/wKgaomSOTM-AOJUkAAWbBlv4TTM763.zip)

{

if(PA04_GETVALUE() == 0)

{

FirmwareDelay( 20000 );

if(PA04_GETVALUE() == 0)

{

Key1Count++;

}

}

if(PA05_GETVALUE() == 0)

{

FirmwareDelay( 20000 );

if(PA05_GETVALUE() == 0)

{

Key2Count++;

}

}

//如果按下2暂停显示

if(Key1Count == 2 )

{

Key1Count=0;

}

//按下K2清零,停止显示

if(Key2Count==1)

{

show_conut = 0;

Key1Count = 0;

Key2Count = 0;

show_nums(show_conut);

}

FirmwareDelay( 200 );

time_count ++;

if(time_count > 1000)

{

time_count = 1;

//如果按下1开始显示

if(Key1Count ==1)

{

show_conut ++;

show_nums(show_conut);

}

//溢出清零

if(show_conut==65535)

{

show_conut=0;

}

//翻转LED1

CW_GPIOC->TOG = bv2;

}

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4278

    浏览量

    164101
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92980
  • RCC
    RCC
    +关注

    关注

    0

    文章

    91

    浏览量

    26705
  • LCD驱动
    +关注

    关注

    4

    文章

    77

    浏览量

    26524
收藏 人收藏

    评论

    相关推荐

    基于CW32L083的线控器方案设计

    基于武汉芯源推出的CW32L083设计的空调线控器产品.
    的头像 发表于 06-25 14:23 1.1w次阅读
    基于<b class='flag-5'>CW32L083</b>的线控器方案设计

    基于CW32L083的空调遥控器方案设计

    基于武汉芯源半导体推出的CW32L083而设计的的空调遥控器方案
    的头像 发表于 06-21 16:03 1175次阅读
    基于<b class='flag-5'>CW32L083</b>的空调遥控器方案设计

    [技术手册] CW32L083数据手册

    CW32L083数据手册,PSMCU0116.pdf,Rev1.2
    发表于 05-31 16:13

    [技术手册] CW32L083用户手册

    CW32L083用户手册
    发表于 06-02 15:41

    武汉】IAR Embedded Workbench®集成开发环境已全面支持武汉CW32 MCU系列

    版本起,IAR将全面支持武汉CW32F030系列、CW32F003系列、CW32L083
    发表于 06-14 14:54

    武汉Cortex-M0+ 32位低功耗MCU CW32L083系列产品介绍

    、有线和无线传感模块、表计等产品。武汉官方网站已经发布了CW32L083系列MCU的数据手册、用户手册、应用笔记等技术文档,以及配套的
    发表于 08-24 09:12

    武汉CW32L083系列MCU在空气净化的应用介绍

    单片机CW32L083系列产品作为空气净化的控制核心,结合传感、显示、驱动以及无线收发
    发表于 10-13 16:57

    武汉CW32L083开发板介绍

    VxTx StartKit 评估板需要搭配 CW-DAPLINK 调试一起使用。该评估板配有 CW32L083 StartKit 软件包及 CW32L083-StdPeriph-Li
    发表于 10-20 11:35

    CW32L083系列MCU系统时钟详解

    的PCLKPRS位域设置,有效的分频系数为2^n(n= 0~3),可作为GTIM,BTIM,ATIM等定时以及SPI,I2C,UART等外设的配置时钟和工作时钟。CW32L083还有两个低速时钟
    发表于 10-25 13:32

    分享武汉CW32L083VxTx_StartKit开发板资料

    最近武汉在做超低功耗开发活动,我申请到了CW32L083VxTx_StartKit开发板。将做一系列的开发板连载活动。今天把收集放到这里,一来可以以后取用方便,二来给大家分享资料
    发表于 06-08 10:00

    CW32L083产品介绍

    CW32L083是一款基于eFlash的单芯片低功耗微控制,集成了ARM®Cortex®-M0+ 核心,主频高达64MHz,高速嵌入式存储(高达256K字节的FLASH和 高达24K字节
    发表于 09-14 06:41

    CW32L083微控制数据手册

    CW32L083 是基于 eFlash 的单芯片低功耗微控制,集成了主频高达 64MHz 的 ARM® Cortex®-M0+ 内核、高速嵌入式存储(多至 256K 字节 FLASH 和多至
    发表于 09-14 06:27

    分享武汉芯源CW32L083VxTx_StartKit开发板资料

    分享武汉芯源CW32L083开发板资料
    的头像 发表于 06-08 09:54 2.5w次阅读

    CW32L083段码屏驱动

    CW32L083开发板上有8个段码LCD显示,使其显示为0-9数字。
    的头像 发表于 06-18 09:13 18w次阅读
    <b class='flag-5'>CW32L083</b>段码屏驱动

    CW32L083实现SHT30驱动

    CW32L083驱动SHT30,并显示到LCD屏上。
    的头像 发表于 06-22 09:57 2390次阅读
    <b class='flag-5'>CW32L083</b>实现SHT30驱动