页次: 1
从 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);
}
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);
}
}
因为之前没发过贴,只是随便弄了一点上来水一水的:D
#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;
}
使用了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);
}
页次: 1