LCD12864(带字库的)使用教程

起因

数码管和 LED 能表达的信息量太少,设备要做中文菜单、状态界面,就需要一块能显示汉字的点阵屏。12864 是最常见的选择之一,而且分“带字库”和“不带字库”两种:不带字库的屏显示汉字要自己生成字模、逐字节搬点阵(一套字库工具链的活);带字库的屏控制芯片里已经烧好了汉字字库,发两个编码字节就出一个汉字,开发量小一大截。本篇使用带 ST7920 字库芯片、8 位并口驱动的 12864。

手把手教你上手Proteus仿真C51单片机

Proteus简介

Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。 Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。

Hugo增加Mermaid插件,显示流程图

在头部代码中增加开关

在文章头部,增加mermaid:true开关

1
2
3
4
5
6
7
---
title: "hugo支持绘图"
isCJKLanguage: true
date: 2020-10-13 22:24:53
...
mermaid: true
---

在模板中添加支持js代码

在你的主题文件夹中,找到文章模板,添加下面的js代码, 例如我的模板位置:

STC的51单片机使用FwLib_STC8库

介绍

FwLib_STC8 是一个针对STC8G, STC8H系列MCU的C语言封装库, 适用于基于这些MCU的快速原型验证.

GITEE项目地址: https://gitee.com/iosetting/fw-lib_-stc8

GITHUB项目地址: https://github.com/IOsetting/FwLib_STC8

为什么要写 FwLib_STC8

如果直接用寄存器开发, 在不同的MCU之间切换就会感觉到每次写都像是第一次写, 都得去查手册去计算, 还容易出错, 费时费力. 把一些先验知识代码化, 就能简化这个过程, 用一次的时间节省将来无数时间.

STC8H单片机驱动嗡鸣器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
sbit BUZZ = P2^3; //蜂鸣器控制引脚
int i=0;
unsigned char T0RH = 0;	   //T0重载值高字节
unsigned char T0RL = 0;	   //T0重载值低字节
sbit k2=P2^7;
//延迟函数
void delay_ms(unsigned int m)
{
int  a, b;

for(a=0;a<5000;a++)
for(b=0;b<m;b++);

}
		 
/* 蜂鸣器启动函数,frequ-工作频率 */
void OpenBuzz(unsigned int frequ)
{
	unsigned int reload; //计算所需的定时器重载值
 
	reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
	T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节
	T0RL = (unsigned char)reload;
	TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
	TL0 = 0xFE;
	ET0 = 1; //使能 T0 中断
	TR0 = 1; //启动 T0
}

/* 蜂鸣器停止函数 */
void StopBuzz()
{
	ET0 = 0; //禁用 T0 中断
	TR0 = 0; //停止 T0
}

/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{
	TH0 = T0RH; //重新加载重载值
	TL0 = T0RL;
	BUZZ = ~BUZZ; //反转蜂鸣器控制电平
}

调用

Stc8h单片机驱动嗡鸣器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
sbit BUZZ = P2^3; //蜂鸣器控制引脚
int i=0;
unsigned char T0RH = 0;	   //T0重载值高字节
unsigned char T0RL = 0;	   //T0重载值低字节
sbit k2=P2^7;
//延迟函数
void delay_ms(unsigned int m)
{
int  a, b;

for(a=0;a<5000;a++)
for(b=0;b<m;b++);

}
		 
/* 蜂鸣器启动函数,frequ-工作频率 */
void OpenBuzz(unsigned int frequ)
{
	unsigned int reload; //计算所需的定时器重载值
 
	reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
	T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节
	T0RL = (unsigned char)reload;
	TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
	TL0 = 0xFE;
	ET0 = 1; //使能 T0 中断
	TR0 = 1; //启动 T0
}

/* 蜂鸣器停止函数 */
void StopBuzz()
{
	ET0 = 0; //禁用 T0 中断
	TR0 = 0; //停止 T0
}

/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{
	TH0 = T0RH; //重新加载重载值
	TL0 = T0RL;
	BUZZ = ~BUZZ; //反转蜂鸣器控制电平
}

调用

LVGL加载外部flash上图片

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void loadBitmap(lv_img_dsc_t *image, uint32_t start_addr, uint32_t file_size)
{
    uint8_t *pbuf;        //读取数据缓冲区
    uint8_t *pbmp;
    uint32_t header;
    int secTime = file_size/4096;
    int secOff = file_size%4096;
    int i;
    dbg_printf(" secTime = %d, secOff = %d\r\n", secTime, secOff);

    pbuf = lv_mem_alloc(file_size);

    for (i=0; i<secTime; i++) {
        SPI_Flash_Read(&pbuf[i*4096], start_addr+i*4096, 4096);
    }
    if (secOff>0) {
        SPI_Flash_Read(&pbuf[secTime*4096], start_addr+secTime*4096, secOff);
    }
    /* 获取图片数据流 */
    pbmp = (uint8_t *)pbuf + 4;
    /* 获取头 */
    header = (uint32_t)pbuf[3] << 24;
    header |= (uint32_t)pbuf[2] << 16;
    header |= (uint32_t)pbuf[1] << 8;
    header |= (uint32_t)pbuf[0];

    image->header.cf = pbuf[0];
    image->header.always_zero = 0;
    image->header.w = (uint16_t)(header >> 10);
    image->header.h = (uint16_t)(header >> 21);
    image->data_size = file_size - 4;
    image->data = pbmp;
}