STM8L单片机驱动LCD-LCD的驱动
今天记录下,使用STM8L152驱动LCD段码屏。
一般来讲,使能单片机外设需要进行如下配置:
1、如涉及到IO端口,须配置IO口,如设为输入/输出/浮空输入或者进行复用功能重映射等。注意,在某些单片机,如stm32,还需要使能相应端口时钟。
2、使能外设端口时钟。
3、配置外设参数,初始化外设。
4、开启中断等功能。
下面说下如何驱动LCD:
针对STM8L152 LCD外设部分,需要注意两个寄存器:
1、LCD_PM寄存器,对端口LCD复用功能的配置。
LCD_PM寄存器
对相应BIT位置1使能LCD复用功能,清零则为普通IO口。
2.LCD_RAM寄存器,LCD显示缓冲寄存器。
LCD_RAM寄存器
对stm8l152c6单片机来说,共有4个COM23个SEG,14个LCD_RAM寄存器:COM0-RAM0/1/2、COM1-RAM3/4/5/6、COM2-RAM7/8/9、COM3-RAM10/11/12/13
LCD驱动初始化程序如下:
LCD驱动初始化程序
需要注意的是,由于LCD频率发生器使用的时钟源是RTC时钟,所以必须使能RTC时钟。
频率发生器
STM8L152单片机LCD相关引脚
从原理图中可看出,我们使用了4个COM,10个SEG口-SEG8,9,16,17,18,19,20,21,22,23.所以,对LCD_PM配置如下:
LCD_PortMaskConfig(LCD_PortMaskRegister_1,0X03); // seg 8,9为seg口
LCD_PortMaskConfig(LCD_PortMaskRegister_2,0XFF); // seg 16,17,18,19,20,21,22,23为seg口
由于当时规划原理图时,没有仔细研究LCD外设,导致程序驱动,有些复杂。这应该引以为戒!
本次实验显示一个数需要驱动四个LCD_RAM,每个RAM中的2个SEG.如显示灵敏度值,则需要配置LCD_RAM1,4,8,11,显示延时,则需要配置LCD_RAM2,6,913等。
简单程序实例如下:
typedef enum {DELAY,SENSE,...}ITEM_t;
typedef struct
{
ITEM_t Item;
INT8U RamValue[4];
}FIGURE_t;//定义一个包含显示项目类型以及需要显示段的结构体类型。
const FIGURE_t FigureGroup[42]=
{
......
{SENSE,{0x02,0x30,0x01,0x30}}, //0
{SENSE,{0x00,0x20,0x00,0x20}}, //1
{SENSE,{0x02,0x10,0x02,0x30}}, //2
......
{DELAY,{0x30,0x03,0x10,0x03}}, //10
{DELAY,{0x10,0x02,0x00,0x02}}, //11
{DELAY,{0x30,0x01,0x20,0x03}}, //12
{DELAY,{0x30,0x02,0x20,0x03}}, //13
};//显示缓冲数组
显示驱动
void DISP_ShowFigure(INT8U num)
{
INT8U temp=num;
switch(FigureGroup[temp].Item)
{
...
case SENSE:
LcdCache1&=0xfc;
LcdCache1|=FigureGroup[temp].RamValue[0];
LcdCache4&=0xcf;
LcdCache4|=FigureGroup[temp].RamValue[1];
LcdCache8&=0xfc;
LcdCache8|=FigureGroup[temp].RamValue[2];
LcdCache11&=0xcf;//数据处理以防对其他显示SEG产生影响
LcdCache11|=FigureGroup[temp].RamValue[3];
LCD_WriteRAM(LCD_RAMRegister_1,LcdCache1);
LCD_WriteRAM(LCD_RAMRegister_4,LcdCache4);
LCD_WriteRAM(LCD_RAMRegister_8,LcdCache8);
LCD_WriteRAM(LCD_RAMRegister_11,LcdCache11);
break;
case DELAY:
......
break;
......
}
}
显示效果
单片机实例分享,自制电感和电容测量仪
电子爱好者进行制作时经常需要绕制电感,而一般的数字万用表通常又没有电感测量挡,所以无法测量绕好的电感的电感量。本文介绍一种用单片机制作的电感和电容测量仪(见图23.1),可以有效地解决这一问题。
测量原理
本测量仪采用谐振法测量电感和电容,其方法是用谐振回路的谐振特性来进行测量,其测量原理可用如图23.2所示的电路进行说明。
图23.1 电感和电容测量仪
测量电感Lx时,配用标准电容C1,用Lx和C1组成谐振回路,测量出回路的谐振频率f即可计算出Lx的电感量;测量电容Cx时,配用标准电感L1,用L1和Cx组成谐振回路,测量出回路的谐振频率f即可计算出Cx的电容量。
上述测量方法也有一个缺陷:当Lx或Cx很小时,谐振频率f会很大,测量比较困难,为此我们可以采用如图23.2所示的改进型电路,分别用L1和C1作“垫底”,降低了测量时的谐振频率。
假设由 L1和C1 组成的谐振回路谐振频率为f1,测量Lx时,Lx和L1串联,测得(L1+Lx)和C1组成的谐振回路谐振频率为f2,则根据下式可计算出Lx的电感量:
Lx=[(f1/f2)2-1]L1
测量Cx时,Cx和C1并联,测得L1和(C1+Cx)组成的谐振回路谐振频率为f2,则可根据下式可计算出Cx的电容量:
Cx=[(f1/f2)2-1]C1
硬件电路
测量仪电路如图23.2所示。电路由LC振荡电路、单片机电路、显示电路等部分组成。
CD4069是6非门CMOS集成电路,其中非门F1、F2和C2、R1、R2等组成两级放大电路。第一级放大电路中,R2是负反馈偏置电阻,将F1输出端的直流电位钳制在VCC/2,使F1工作在线性放大区域。第二级放大电路没有加反馈电阻,直接用第一级放大电路输出的直流电压作偏置电压,以提高放大器的增益。放大电路通过正反馈回路R3、C3与L1、C1谐振电路一起组成正弦波振荡电路,非门F3用于信号整形,把F2输出的正弦波转换成矩形波输入到单片机ATmega8的T1脚,由单片机进行脉冲计数,从而测出LC回路的谐振频率。通过单片机对数据进行计算处理后,由LCD1602液晶屏显示测量结果。
图23.2 测量仪电路原理图
S1为测量转换开关,当S1转向L时测量电感,转向C时测量电容。S2是归0按钮。
LCD1602采用4线制传递数据,只使用了数据端口D4~D7。
当开关S1在电容挡但没有测量电容Cx,或在电感挡并且用短路线代替Lx时,电路的振荡频率约为503kHz,我们把这个频率称为基准频率。测试电容或电感时,被测试元件的电容量或电感量越大,对应的振荡频率越低。当被测电容的电容量为10μF(或电感的电感量为1H)时,对应的振荡频率约为5.03kHz。
电阻R5的阻值控制LCD1602液晶屏的对比度,R5阻值越小,液晶屏对比度越大。LED和LED+是液晶屏背光发光二极管的供电端口。
程序设计
测量仪的电路比较简单,而功能的实现更重要地依赖于程序的设计。程序的设计和优化需要花费更多的精力。
程序由频率测量、测试数据的计算处理、LCD1602液晶屏驱动显示三大部分组成。频率测量部分用定时器T/C1作脉冲计数,定时器T/C2产生测量脉冲频率的闸门时间。这里闸门时间选择0.5s,定时器T/C1累计的脉冲数乘以2即得脉冲频率。闸门时间选择0.5s是为了提高LCD1602显示数据刷新速度,如果闸门时间选1s,则刷新速度偏慢。
测试数据的计算处理部分主要利用前面给的两个公式计算出测量结果,并经过数据预处理后,输出到显示电路显示读数。
LCD1602的数据传输采用4线制,8位数据分两次传送,先传高4位,后传低4位,因为传递的数据量不大,所以你感觉不到4线制速度传输和8线制有什么区别。
安装调试
制作所需元器件的清单见表23.1。
C1、L1要选用精度比较高的元件,有条件的可用万能电桥进行筛选。L1如买不到成品电感也可自制,磁芯用Φ8×10的工字磁芯,用Φ0.42的漆包线绕55.5圈。
安装前先将程序的目标文件写入单片机ATmega8L,熔丝位的设置如图23.3所示。
图23.3 熔丝位的设置
电路板的装配图如图23.4所示。LCD1602的接口排座焊接在电路板上,排针焊接在LCD1602模块上如图23.5所示。
表23.1 元器件清单
图23.4 电路板装配图
安装完成后,用一根USB线将电源接口连到电脑USB插座上,接通测量仪的电源,将S1置于电容挡,测量端不接电容,这时LCD1602第二行显示的是基准频率f1,如图23.6所示。基准频率如果超出503kHz±5kHz的范围,说明L1、C1中有元件误差较大,需进行相应的调整。如果L1是自绕的,出现误差的可能性相对较大,可适当增减其圈数,直至满足要求。
接通电源后,以电容挡为例,虽然我们在测试端并没有接任何电容,但LCD1602第一行显示的电容量读数并不为零,如图23.6所示,我们称其为初始值,这是由基准频率略有漂移造成的。这时如果测量小容量的电容,误差就比较大,当初始值后有“-”号时,测量值是实际值减去了初始值,即读数比实际容量小了。反之,测量值是实际值加上了初始值,即读数比实际容量大了。
对于上述问题,我在程序中也作了考虑,只要在不接测试电容的情况下按一下S2就可以归0了,其实质就是基准频率作了修正,并把修正结果存入EEPROM,掉电后不会丢失。归0后的显示数据如图23.7所示。
电容挡归0后,电感挡就不需要归0了,因为电容挡归0就相当于在电感挡测试端接了一个短路线,等同于电感挡归0(在S1置于电感挡,S2归0时其测试端必须接短路线),分析一下电路就明白了。
图23.5 排针的焊接
如果使用中发现测量误差较大,可通过程序进行修正,具体做法如下:找一个精度高的1000pF电容进行测量,假设读数为950pF,则计算1000/950≈1.05,我们将其称为修正系数,将计算公式Cx=[(f1/f2)2-1]C1改为Cx=[(f1/f2)2-1]C1×1.05,用这个公式计算就能减小测量误差了。为了简化程序中的计算,我采取把程序中的语句“unsigned int C1=1000”改为“unsigned int C1=1050”的方法,效果是一样的。
再找一个精度高的100μH电感进行测量,假设读数为94,则计算100/94≈1.06,把程序中的语句“unsigned char L1=100”改为“unsigned char L1=106”,同样也能减小测量误差。
把重新编译好的目标文件烧写到ATmega8L,再进行测量,精度就提高了。
用本测试仪测量电容的实例如图23.8所示(测量对象分别为240pF云母电容和0.47μF安规电容),测量电感的实例如图23.9所示(测量对象分别为10μH电感和电子节能灯的电感线圈)。
当测量值超过量程时,读数显示“OVE”,测电感时电感测试端不接电感(相当于电感量为无穷大),读数也显示“OVE”。
图23.6 基准频率的测量结果
图23.7 按S2归0后的显示数据
使用这个电感和电容测量仪时有一个问题需要注意,即电感或电容的参数会受测试频率的影响。例如,具有磁芯的电感,由于受磁芯的频率特性影响,不同的测试频率,其结果可能有所不同,用这个测量仪测的数据和用信号源频率为1000Hz的万能电桥测的数据可能会不一致。笔者认为,用更接近实际工作频率的测试频率可以得到比较符合实际的测试结果。由于本测试仪工作频率比较高,不适合测量电解电容器。笔者测量一个10μF的电解电容器,对应测试频率为6.5kHz,读数为6.26μF,误差很大。
图23.8 电容的测量结果
图23.9 电感的测量结果
相关问答
请用 单片机 实现输出 LCD 显示器,实现简单的加减法运算,按+键加...[5]程序自己忙吧。while(1){while((ADD==1)&&(SUB==1));if(ADD==0){while(ADD==0);num++;}if(SUB==0)...
STM32 单片机 可以用来做人机交互界面吗?第二种方案利用stm32单片机自带的Fsmc接口驱动TFT彩屏,Fsmc原是stm32的一种存储并线接口,那用在彩屏驱动时,在硬件设计上就需要考虑布线等长,还要做防静电...总...
51 单片机lcd 1602不显示字符?LCD1602是不能直接显示变量数值的,只能显示ASCII码,即显示字符。因此,要显示变量数值,需要把变量的每一位数转换成字符0~9。字符0~9的ASCII码是0x30~0x39。...
单片机 怎样用C语言实现二进制转十进制并在 LCD 中显示 - MBJDX...假设被转换的二进制数为tempunsignedchari=0;unsignedchardis_buf[3];for(i=0;i<3;i++){dis_buf[i]=temp%10;temp/=1...
单片机 中,如何将数据显示到液晶屏上,最好有 程序 范本~?char变量转换为三个数后查表,如constunsignedcharnumasc[10]=;然后用显示字符函数显示在屏上。char变量转换为三个数后查表,如constunsignedcha...
请问如何用STC 单片机 直接驱动段码 LCD ,具体那些型号,各位高手可否提供方法与参考代码?1602吧,我们做过那个,挺简单的,随便一本单片机书上都有他的代码,汇编写的,也有c的,我这有一段它的控制显示代码,C的,不短1602吧,我们做过那个,挺简单的,随便...
lcd 1602间接连法?虽然LCD1602的显示屏幕与显示字符都较小,实用性并不强,但是在一般的教学实验中,它仍不失为一个常用的输出显示设备。LCD1602与单片机连接的线路共有11条,其...
...品牌好有经验的都来说说哪位大佬,跪求解答, 单片机LCD 编程?[回答]还不错的,他们专业承接单片机解决方案,以前朋友在那做了,还批量生产了下面由旺扬科技技术人员为大家介绍:1、驱动电路在功率较大的无刷电机中,驱动...
如何在线实时监控调试 单片机程序 运行?在线实时监控调试单片机程序运行只有一种方式:程序在线仿真。在线实时监控单片机程序运行可以有多种方式:在线仿真;程序实时输出运行状态(可通过LED,LCD等显...
51 单片机 按键怎么显示数字到液晶屏?通过51单片机控制取得按键的值,利用LCD1602液晶屏的驱动码和操作步骤将数字显示在液晶屏上。由于51单片机需要读取按键的值来获取用户的输入,所以需要通过编写...