您尚未登录。

#1 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 在LVGL上实现二维码显示 » 2022-11-22 09:57:54

khalilchen
回复: 2

https://github.com/lvgl/lv_lib_qrcode 上获取LVGL二维码库,将库中源代码添加到你的工程包含相关头文件。
如下例实现二维码创建
static void goback_event_cb(lv_event_t *event)
{
    LV_ASSERT_NULL(event);

    if(event->code == LV_EVENT_CLICKED){
    }
}

void QrcodePgeCreate(void)
{
    lv_color_t bg_color = lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 5);
    lv_color_t fg_color = lv_palette_darken(LV_PALETTE_BLUE, 4);

    lv_obj_t * qr = lv_qrcode_create(lv_scr_act(), 150, fg_color, bg_color);
    lv_obj_add_flag(qr, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_add_event_cb(qr, goback_event_cb, LV_EVENT_CLICKED, NULL);

    /*Set data*/
    const char * data = "https://www.baidu.com/";
    lv_qrcode_update(qr, data, strlen(data));
    lv_obj_align(qr, LV_ALIGN_CENTER, 0, 20);
}

#2 华芯微特 » 在SWM32SRET6上搞了一个ARM2D » 2022-11-22 09:50:45

khalilchen
回复: 2

extern const uint8_t LOG_map[84 * 82 * 2];

static ARM_NOINIT arm_2d_helper_pfb_t s_tExamplePFB;

extern const uint8_t c_bmpBlueSlashes[];
const arm_2d_tile_t c_tileBlueSlashes = {
    .tRegion = {
        .tSize = {
            .iWidth = 84,
            .iHeight = 82
        },
    },
    .tInfo.bIsRoot = true,
    .phwBuffer = (uint16_t *)LOG_map,
};

static char LCD_TextBuffer[128];
void log_refresh_handler(const arm_2d_tile_t *ptTarget)
{
    arm_2d_region_t tBarRegion = {
        .tLocation = {
           .iX = (ptTarget->tRegion.tSize.iWidth - c_tileBlueSlashes.tRegion.tSize.iWidth) / 2,
           .iY = (ptTarget->tRegion.tSize.iHeight - c_tileBlueSlashes.tRegion.tSize.iHeight) / (int16_t)2,
        },
        .tSize = {
            .iWidth = 84,
            .iHeight = 82,
        },
    };
   
    arm_2d_rgb16_tile_copy( &c_tileBlueSlashes,
                            ptTarget,
                            &tBarRegion,
                            ARM_2D_CP_MODE_COPY);
   
    lcd_text_location(200, 200);
    snprintf(LCD_TextBuffer, sizeof(LCD_TextBuffer), "%s\r\n", "SD卡升");
    lcd_puts(LCD_TextBuffer, 0xffffffff);
}

static
IMPL_PFB_ON_DRAW(__pfb_draw_LOG_handler)
{
    ARM_2D_UNUSED(pTarget);
   
    arm_2d_rgb16_fill_colour(ptTile, NULL, 0x24ff);
    log_refresh_handler(ptTile);
    
    return arm_fsm_rt_cpl;
}

static
IMPL_PFB_ON_DRAW(__pfb_draw_background_handler)
{
    ARM_2D_UNUSED(pTarget);
    ARM_2D_UNUSED(bIsNewFrame);

    arm_2d_rgb16_fill_colour(ptTile, NULL, 0x24ff );

    return arm_fsm_rt_cpl;
}

static
IMPL_PFB_ON_LOW_LV_RENDERING(__pfb_render_handler)
{
    const arm_2d_tile_t *ptTile = &(ptPFB->tTile);

    ARM_2D_UNUSED(pTarget);
    ARM_2D_UNUSED(bIsNewFrame);

    GLCD_DrawBitmap(ptTile->tRegion.tLocation.iX,
                    ptTile->tRegion.tLocation.iY,
                    ptTile->tRegion.tSize.iWidth,
                    ptTile->tRegion.tSize.iHeight,
                    ptTile->pchBuffer);
                   
    arm_2d_helper_pfb_report_rendering_complete(&s_tExamplePFB,
                                                (arm_2d_pfb_t *)ptPFB);
}

void display_task(void)

    /*! define dirty regions */
    IMPL_ARM_2D_REGION_LIST(s_tDirtyRegions, static const)
       
        ADD_REGION_TO_LIST(s_tDirtyRegions,
            .tLocation = {0,
                          0},
            .tSize = {
                .iWidth = 480,
                .iHeight = 272, 
            },
        ),

    END_IMPL_ARM_2D_REGION_LIST()

    //! call partial framebuffer helper service
    while(arm_fsm_rt_cpl != arm_2d_helper_pfb_task(
                                &s_tExamplePFB,
                                (arm_2d_region_list_item_t *)s_tDirtyRegions));                                   
}       


void Peripherals_Init(void)
{
    lcd_memory_init();
    lcd_rgb_init();
   
    gt9x_init();

    GPIO_Init(GPIOM, PIN16, 0, 1, 0);
    GPIO_Init(GPIOM, PIN18, 1, 1, 0);
}

int main(void)
{
    SystemInit();

    systick_init();
   
    Peripherals_Init();

    arm_irq_safe
    {
        arm_2d_init();
    }

    //! initialise FPB helper
    if (ARM_2D_HELPER_PFB_INIT(
            &s_tExamplePFB,                 //!< FPB Helper object
            APP_SCREEN_WIDTH,               //!< screen width
            APP_SCREEN_HEIGHT,              //!< screen height
            uint16_t,                       //!< colour date type
            PFB_BLOCK_WIDTH,                //!< PFB block width
            PFB_BLOCK_HEIGHT,               //!< PFB block height
            1,                              //!< number of PFB in the PFB pool
            {
                .evtOnLowLevelRendering = {
                    //! callback for low level rendering
                    .fnHandler = &__pfb_render_handler,                         
                },
                .evtOnDrawing = {
                    //! callback for drawing GUI
                    .fnHandler = &__pfb_draw_background_handler,
                },
            }
        ) < 0) {
        //! error detected
        assert(false);
    }

    //! draw background first
    while (arm_fsm_rt_cpl != arm_2d_helper_pfb_task(&s_tExamplePFB, NULL));

    //! update draw function
    ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER(&s_tExamplePFB,
        &__pfb_draw_LOG_handler);

    while (1) {
        display_task();
        GPIO_InvBit(GPIOM, PIN18);
        swm_delay_ms(500);
    }
}

#3 Re: 全志 SOC » SWMS4S LCD RGB565驱动 » 2022-11-22 09:40:58

因为之前没发过贴,只是随便弄了一点上来水一水的:D

#4 全志 SOC » 中微SC8F6790 ADC使用 » 2022-11-21 17:03:20

khalilchen
回复: 1

#define ADC_Verf (2.0f)

void ADC_Init(void)
{
    /* RC0 配置为 模拟输入 */
    SET_BIT(TRISA, 0);
    SET_BIT(ANSEL0, 0);

    /*********** ADCON0 ****************************
            Bit7~Bit6  ADCS<1:0>:  AD转换时钟选择位。
                    00=  FSYS/8
                    01=  FSYS/16
                    10=  FSYS/32
                    11=  F RC (内部振荡器32KHz的时钟)
            Bit5~Bit2  CHS<3:0>:  模拟通道选择位。与ADCON1寄存器CHS4组合CHS<3:0>
                    00000=  AN0
                    00001=  AN1
                    00010=  AN2
                    00011=  AN3
                    ……  ……
                    01101=  AN13
                    01110=  OPA0/OPA1输出
                    01111=  0.6V固定参考电压
                    10000=  AN16
                    10001=  AN17
                    10010=  AN18
                    10011=  AN19
                    其他=  保留
            Bit1  GO/DONE: AD转换状态位。
                    1=  AD转换正在进行。将该位置1启动AD转换。当AD转换完成以后,该位由硬件自动清零。
                            当GO/DONE位从1变0或ADIF从0变1时,需至少等待两个TAD时间,才能再次启动AD转换。
                    0=  AD转换完成/或不在进行中。
            Bit0  ADON:  ADC使能位。
                    1=  使能ADC;
                    0=  禁止ADC,不消耗工作电流。
    *********************************************/
    // ADCON0 = 0X00; // A0,AD采样时间选为FSYS/8

    /*********** ADCON1 ****************************
            Bit7  ADFM:  AD转换结果格式选择位;
                    1=  右对齐;
                    0=  左对齐。
            Bit6  CHS4  与ADCON0的CHS3~0组合使能
            Bit5~Bit3  未用
            Bit2  LDO_EN:  内部参考电压使能位。
                    1=  使能ADC内部LDO参考电压;
                            当选择内部LDO作参考电压时,ADC最大有效精度为8位。
                    0=  VDD作为ADC参考电压。
            Bit1~Bit0  LDO_SEL<1:0>:  参考电压选择位
                    00=  禁用(注:选择内部LDO作为参考电压时,禁止为00)
                    01=  2.0V
                    10=  2.4V
                    11=  3.0V
    *********************************************/
    ADCON1 = 0x05;
}

float GetGasValue(void)
{
    float gas = 0.0f;
    uint32_t timeout = 1000;

    ADCON0 = 0X03; /* 打开通道A0 使能ADC并开启转换 */

    while (GET_ADC_CONVER_DONE_FLAG() && timeout--) {
        __delay_us(1);
    }

    if (timeout == 0)
        return -1;

    gas = (((uint16_t)ADRESH << 4) | (ADRESL >> 4)) * ADC_Verf / 4095;
    CLEAR_BIT(ADCON0, 0); /* 关闭ADC */

    return gas;
}

#5 全志 SOC » SWMS4S LCD RGB565驱动 » 2022-11-03 17:32:52

khalilchen
回复: 5

使用了SWMS4S 的SRAMC,代码如下

void lcd_memory_init(void)
{
    SDRAM_InitStructure SDRAM_InitStruct;
   
    PORT_Init(PORTM, PIN13, PORTM_PIN13_SDR_CLK, 0);
    PORT_Init(PORTM, PIN14, PORTM_PIN14_SDR_CKE, 0);
    PORT_Init(PORTB, PIN7,  PORTB_PIN7_SDR_WE,   0);
    PORT_Init(PORTB, PIN8,  PORTB_PIN8_SDR_CAS,  0);
    PORT_Init(PORTB, PIN9,  PORTB_PIN9_SDR_RAS,  0);
    PORT_Init(PORTB, PIN10, PORTB_PIN10_SDR_CS,  0);
    PORT_Init(PORTE, PIN15, PORTE_PIN15_SDR_BA0, 0);
    PORT_Init(PORTE, PIN14, PORTE_PIN14_SDR_BA1, 0);
    PORT_Init(PORTN, PIN14, PORTN_PIN14_SDR_A0,  0);
    PORT_Init(PORTN, PIN13, PORTN_PIN13_SDR_A1,  0);
    PORT_Init(PORTN, PIN12, PORTN_PIN12_SDR_A2,  0);
    PORT_Init(PORTN, PIN11, PORTN_PIN11_SDR_A3,  0);
    PORT_Init(PORTN, PIN10, PORTN_PIN10_SDR_A4,  0);
    PORT_Init(PORTN, PIN9,  PORTN_PIN9_SDR_A5,   0);
    PORT_Init(PORTN, PIN8,  PORTN_PIN8_SDR_A6,   0);
    PORT_Init(PORTN, PIN7,  PORTN_PIN7_SDR_A7,   0);
    PORT_Init(PORTN, PIN6,  PORTN_PIN6_SDR_A8,   0);
    PORT_Init(PORTN, PIN3,  PORTN_PIN3_SDR_A9,   0);
    PORT_Init(PORTN, PIN15, PORTN_PIN15_SDR_A10, 0);
    PORT_Init(PORTN, PIN2,  PORTN_PIN2_SDR_A11,  0);
    PORT_Init(PORTM, PIN15, PORTM_PIN15_SDR_A12, 0);
    PORT_Init(PORTE, PIN7,  PORTE_PIN7_SDR_D0,   1);
    PORT_Init(PORTE, PIN6,  PORTE_PIN6_SDR_D1,   1);
    PORT_Init(PORTE, PIN5,  PORTE_PIN5_SDR_D2,   1);
    PORT_Init(PORTE, PIN4,  PORTE_PIN4_SDR_D3,   1);
    PORT_Init(PORTE, PIN3,  PORTE_PIN3_SDR_D4,   1);
    PORT_Init(PORTE, PIN2,  PORTE_PIN2_SDR_D5,   1);
    PORT_Init(PORTE, PIN1,  PORTE_PIN1_SDR_D6,   1);
    PORT_Init(PORTE, PIN0,  PORTE_PIN0_SDR_D7,   1);
    PORT_Init(PORTE, PIN8,  PORTE_PIN8_SDR_D8,   1);
    PORT_Init(PORTE, PIN9,  PORTE_PIN9_SDR_D9,   1);
    PORT_Init(PORTE, PIN10, PORTE_PIN10_SDR_D10, 1);
    PORT_Init(PORTE, PIN11, PORTE_PIN11_SDR_D11, 1);
    PORT_Init(PORTE, PIN12, PORTE_PIN12_SDR_D12, 1);
    PORT_Init(PORTE, PIN13, PORTE_PIN13_SDR_D13, 1);
    PORT_Init(PORTC, PIN14, PORTC_PIN14_SDR_D14, 1);
    PORT_Init(PORTC, PIN15, PORTC_PIN15_SDR_D15, 1);
    PORT_Init(PORTB, PIN6,  PORTB_PIN6_SDR_LDQM, 0);
    PORT_Init(PORTM, PIN12, PORTM_PIN12_SDR_UDQM,0);
   
    SDRAM_InitStruct.Size = SDRAM_SIZE_8MB;
    SDRAM_InitStruct.ClkDiv = SDRAM_CLKDIV_1;
    SDRAM_InitStruct.CASLatency = SDRAM_CASLATENCY_2;
    SDRAM_InitStruct.TimeTRP  = SDRAM_TRP_3;
    SDRAM_InitStruct.TimeTRCD = SDRAM_TRCD_3;
    SDRAM_InitStruct.TimeTRFC  = SDRAM_TRFC_15;
    SDRAM_Init(&SDRAM_InitStruct);
}

LV_HOR_RES_MAX 为屏幕宽度
LV_VER_RES_MAX  为屏幕长度

extern uint32_t lcdbuf_show[LV_HOR_RES_MAX * LV_VER_RES_MAX / 2];
void lcd_rgb_init(void)
{
    uint32_t i;
    LCD_InitStructure LCD_initStruct;
   
    PORT_Init(PORTC, PIN9,  PORTC_PIN9_LCD_R3,  0);
    PORT_Init(PORTC, PIN10, PORTC_PIN10_LCD_R4, 0);
    PORT_Init(PORTC, PIN11, PORTC_PIN11_LCD_R5, 0);
    PORT_Init(PORTC, PIN12, PORTC_PIN12_LCD_R6, 0);
    PORT_Init(PORTC, PIN13, PORTC_PIN13_LCD_R7,  0);
   
    PORT_Init(PORTA, PIN14, PORTA_PIN14_LCD_G2,  0);
    PORT_Init(PORTA, PIN15, PORTA_PIN15_LCD_G3, 0);
    PORT_Init(PORTC, PIN0, PORTC_PIN0_LCD_G4, 0);
    PORT_Init(PORTC, PIN1, PORTC_PIN1_LCD_G5, 0);
    PORT_Init(PORTC, PIN2, PORTC_PIN2_LCD_G6, 0);
    PORT_Init(PORTC, PIN3, PORTC_PIN3_LCD_G7, 0);
   
    PORT_Init(PORTB, PIN15, PORTB_PIN15_LCD_B3, 0);
//    PORT_Init(PORTA, PIN2,  PORTA_PIN2_LCD_B4,  0);
    PORT_Init(PORTA, PIN9,  PORTA_PIN9_LCD_B5,  0);
    PORT_Init(PORTA, PIN10, PORTA_PIN10_LCD_B6,  0);
    PORT_Init(PORTA, PIN11, PORTA_PIN11_LCD_B7,  0);
   
    PORT_Init(PORTB, PIN2,  PORTB_PIN2_LCD_VSYNC, 0);
    PORT_Init(PORTM, PIN8,  PORTM_PIN8_LCD_HSYNC, 0);
    PORT_Init(PORTM, PIN11, PORTM_PIN11_LCD_DEN,   0);
    PORT_Init(PORTB, PIN5,  PORTB_PIN5_LCD_DCLK,  0);
   
    LCD_initStruct.ClkDiv = 6;
    LCD_initStruct.Format = LCD_FMT_RGB565;
    LCD_initStruct.HnPixel = 480;
    LCD_initStruct.VnPixel = 272;
    LCD_initStruct.Hfp = 5;
    LCD_initStruct.Hbp = 40;
    LCD_initStruct.Vfp = 8;
    LCD_initStruct.Vbp = 8;
    LCD_initStruct.HsyncWidth = 5;
    LCD_initStruct.VsyncWidth = 5;
    LCD_initStruct.DataSource = (uint32_t)lcdbuf_show;
    LCD_initStruct.Background = 0xFFFF;
    LCD_initStruct.SampleEdge = LCD_SAMPLE_FALL;    // ATK-4342 RGBLCD 下降沿采样
    LCD_initStruct.IntEOTEn = 1;
    LCD_Init(LCD, &LCD_initStruct);
    LCD_Start(LCD);
   
    memset(lcdbuf_show, 0, sizeof(lcdbuf_show));
}

void LCD_Handler(void)
{   
    LCD_INTClr(LCD);
    LCD_Start(LCD);
}

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn