如何使用普通IO口驱动LCD 单片机直接驱动 LCD 段码液晶 低成本 宁波北仑恒晶电子科技有限公司
用普通 IO 口驱动 LCD 显示
用普通I/O口驱动LCD显示文件编码:HA0092s介绍:在一些特定环境,为了节省成本,控制I/O口需求较少,但芯片本身的I/O口又较多的情况下,客户往往用普通I/O口驱动LCD显示,而且在实际应用中很多学习者也需求这方面的知识,所以下面给出一个范例,以供参考。
理可以延长LCD的使用寿命。
如果LCD玻璃是3V,则V DD=3V;如果LCD玻璃是5V的,则V DD=5V。
5. 范例程序是以分钟计时的方式,从“00”~“59”循环显示。
图26. LCD 两个七段码对应表如表1所示。
表1程序清单:;*********************************************;FILE NAME: IO_LCD;MCU: HT46R22;MASK OPTION: WAKE-UP: PA6,PA7; PULL-HIGH: PA,PB,PC; IIC: DISABLE; PFD: DISABLE; PWM: DISABLE; WDT: ENABLE; CLRWDT: ONE; WDT CLOCK SOURCE: T1; WDT TIME OUT SELECT: WDT CLOCK SOURCE/32768 ; LVR: DISABLE; OSC: CRYSTAL; SYSVOLT: 3.0V; SYSFRAG: 4000KHZ;AUTHOR: RADOME;HISTORY: 2005.08.22;*********************************************include Ht46r22.incinclude Micro.inc;*********************************************IO_data .section 'data';*********************************************acc_bk db ?status_bk db ?pa_bk db ?pb_bk db ?pbc_bk db ?pulse_count db ?display_temp db ?display_temp0 db ?display_temp1 db ?display_temp2 db ?number0 db ?number1 db ?number2 db ?msecond db ?second db ?minute db ?;----------------------------------------segment0 equ pa_bk.0segment1 equ pa_bk.1segment2 equ pa_bk.2segment3 equ pa_bk.3segment4 equ pb_bk.4segment5 equ pb_bk.5com0 equ pb_bk.3com0_ctrl equ pbc_bk.3com1 equ pb_bk.6com1_ctrl equ pbc_bk.6com2 equ pb_bk.7com2_ctrl equ pbc_bk.7;*********************************************IO_code .section 'code';*********************************************org 0000hjmp initorg 0004h ;External Interrupt retiorg 0008h ;Timer Interruptjmp timer_intorg 0020h;*********************************************;Initializers;*********************************************init:clr intc0clr intc1clr tmrcclr msecondclr secondclr minuteclr pulse_countclr display_tempclr display_temp0clr display_temp1clr display_temp2clr number0clr number1clr number2mov a,11011111bmov pa,amov pa_bk,amov a,11010000bmov pac,aset pbset pb_bkmov a,00000001bmov pbc,amov pbc_bk,amov a,00000001bmov pc,aclr pccclr pdclr pdcmov a,00000101bmov intc0,amov a,94mov tmr,amov a,10010110bmov tmrc,a;********************************************* ;Main;********************************************* main_loop:clr wdtmov a,minuteadd a,bcd_tablemov tblp,atabrdl number2mov a,number2and a,0f0hswap accmov number0,amov a,number2and a,0fhmov number1,amov a,number0mov display_temp0,amov a,number1mov display_temp1,amov a,number2mov display_temp2,ajmp main_loop;********************************************* ;Interrupt;********************************************* timer_int: ;2592uspush;----------------------------------------;COM Operation Mode;----------------------------------------com_pulse:inc pulse_countmov a,pulse_countsub a,7snz cjmp $+3mov a,1mov pulse_count,amov a,pulse_countsdz accjmp $+2jmp com1_out_highsdz accjmp $+2jmp com1_out_lowsdz accjmp $+2jmp com2_out_highsdz accjmp $+2jmp com2_out_lowsdz accjmp com0_out_lowcom0_out_high:clr com0_ctrlset com0set com1_ctrlset com2_ctrljmp segment_pulsecom0_out_low:clr com0_ctrlclr com0set com1_ctrlset com2_ctrljmp segment_pulsecom1_out_high:set com0_ctrlclr com1_ctrlset com1set com2_ctrljmp segment_pulsecom1_out_low:set com0_ctrlclr com1_ctrlclr com1set com2_ctrljmp segment_pulsecom2_out_high:set com0_ctrlset com1_ctrlclr com2_ctrlset com2jmp segment_pulsecom2_out_low:set com0_ctrlset com1_ctrlclr com2_ctrlclr com2;---------------------------------------- ;SEGMENT Operation Mode;---------------------------------------- segment_pulse:;------------------------segment0_out:mov a,display_temp0add a,number_tablemov tblp,atabrdl display_temprl display_temprl display_temprl display_tempmov a,display_tempand a,00000111binc accsdz accjmp $+2jmp segment0_000sdz accjmp $+2jmp segment0_001sdz accjmp $+2jmp segment0_010sdz accjmp $+2jmp segment0_011sdz accjmp $+2jmp segment0_100sdz accjmp $+2jmp segment0_101sdz accjmp segment0_111jmp segment0_110segment0_000:mov a,com_000_table jmp segment0_next segment0_001:mov a,com_001_table jmp segment0_next segment0_010:mov a,com_010_table jmp segment0_next segment0_011:mov a,com_011_table jmp segment0_next segment0_100:mov a,com_100_table jmp segment0_next segment0_101:mov a,com_101_table jmp segment0_next segment0_110:mov a,com_110_table jmp segment0_nextsegment0_111:mov a,com_111_tablesegment0_next:add a,pulse_count mov tblp,atabrdl accclr segment0sz accset segment0 ;------------------------ segment1_out:rl display_temprl display_temprl display_tempmov a,display_temp and a,00000111binc accsdz accjmp $+2jmp segment1_000sdz accjmp $+2jmp segment1_001sdz accjmp $+2jmp segment1_010sdz accjmp $+2jmp segment1_011sdz accjmp $+2jmp segment1_100sdz accjmp $+2jmp segment1_101sdz accjmp segment1_111jmp segment1_110segment1_000:mov a,com_000_table jmp segment1_next segment1_001:mov a,com_001_table jmp segment1_next segment1_010:mov a,com_010_table jmp segment1_next segment1_011:mov a,com_011_table jmp segment1_next segment1_100:mov a,com_100_table jmp segment1_next segment1_101:mov a,com_101_table jmp segment1_next segment1_110:mov a,com_110_table jmp segment1_next segment1_111:mov a,com_111_tablesegment1_next:add a,pulse_count mov tblp,atabrdl accclr segment1sz accset segment1;------------------------ segment2_out:clr accsz display_temp.7 set acc.0inc accsdz accjmp $+2jmp segment2_000sdz accjmp $+2jmp segment2_001sdz accjmp $+2jmp segment2_010sdz accjmp $+2jmp segment2_011sdz accjmp $+2jmp segment2_100sdz accjmp $+2jmp segment2_101sdz accjmp segment2_111jmp segment2_110segment2_000:mov a,com_000_table jmp segment2_next segment2_001:mov a,com_001_table jmp segment2_next segment2_010:mov a,com_010_table jmp segment2_next segment2_011:mov a,com_011_table jmp segment2_next segment2_100:mov a,com_100_table jmp segment2_next segment2_101:mov a,com_101_table jmp segment2_next segment2_110:mov a,com_110_table jmp segment2_next segment2_111:mov a,com_111_tablesegment2_next:add a,pulse_count mov tblp,atabrdl accclr segment2sz accset segment2;------------------------ segment3_out:mov a,display_temp1 add a,number_table mov tblp,atabrdl display_temprl display_temprl display_temprl display_tempmov a,display_temp and a,00000111binc accsdz accjmp $+2jmp segment3_000sdz accjmp $+2jmp segment3_001sdz accjmp $+2jmp segment3_010sdz accjmp $+2jmp segment3_011sdz accjmp $+2jmp segment3_100sdz accjmp $+2jmp segment3_101sdz accjmp segment3_111jmp segment3_110segment3_000:mov a,com_000_table jmp segment3_next segment3_001:mov a,com_001_table jmp segment3_next segment3_010:mov a,com_010_table jmp segment3_next segment3_011:mov a,com_011_table jmp segment3_nextsegment3_100:mov a,com_100_table jmp segment3_next segment3_101:mov a,com_101_table jmp segment3_next segment3_110:mov a,com_110_table jmp segment3_next segment3_111:mov a,com_111_tablesegment3_next:add a,pulse_count mov tblp,atabrdl accclr segment3sz accset segment3;------------------------ segment4_out:rl display_temprl display_temprl display_tempmov a,display_temp and a,00000111binc accsdz accjmp $+2jmp segment4_000sdz accjmp $+2jmp segment4_001sdz accjmp $+2jmp segment4_010sdz accjmp $+2jmp segment4_011sdz accjmp $+2jmp segment4_100sdz accjmp $+2sdz accjmp segment4_111jmp segment4_110segment4_000:mov a,com_000_table jmp segment4_next segment4_001:mov a,com_001_table jmp segment4_next segment4_010:mov a,com_010_table jmp segment4_next segment4_011:mov a,com_011_table jmp segment4_next segment4_100:mov a,com_100_table jmp segment4_next segment4_101:mov a,com_101_table jmp segment4_next segment4_110:mov a,com_110_table jmp segment4_next segment4_111:mov a,com_111_tablesegment4_next:add a,pulse_count mov tblp,atabrdl accclr segment4sz accset segment4;------------------------ segment5_out:clr accsz display_temp.7 set acc.0inc accsdz accjmp $+2sdz accjmp $+2jmp segment5_001sdz accjmp $+2jmp segment5_010sdz accjmp $+2jmp segment5_011sdz accjmp $+2jmp segment5_100sdz accjmp $+2jmp segment5_101sdz accjmp segment5_111jmp segment5_110segment5_000:mov a,com_000_table jmp segment5_next segment5_001:mov a,com_001_table jmp segment5_next segment5_010:mov a,com_010_table jmp segment5_next segment5_011:mov a,com_011_table jmp segment5_next segment5_100:mov a,com_100_table jmp segment5_next segment5_101:mov a,com_101_table jmp segment5_next segment5_110:mov a,com_110_table jmp segment5_next segment5_111:mov a,com_111_tablesegment5_next:add a,pulse_countmov tblp,atabrdl accclr segment5sz accset segment5;---------------------------------------- ;Output COM&SEGMENT;---------------------------------------- output_com_segment:mov a,pb_bkmov pb,amov a,pbc_bkmov pbc,amov a,pa_bkmov pa,a;---------------------------------------- ;Time;---------------------------------------- inc msecondmov a,msecondsub a,192snz cjmp timer_endclr msecondinc secondmov a,secondsub a,120snz cjmp timer_endclr secondinc minutemov a,minutesub a,60snz cjmp timer_endclr minutetimer_end:popreti;********************************************* ;Table;********************************************* org 0700hnumber_table:; gbefadc0dw 11111010b ;"0" 0dw 00010010b ;"1" 1dw 10101110b ;"2" 2dw 10011110b ;"3" 3dw 01010110b ;"4" 4dw 11011100b ;"5" 5dw 11111100b ;"6" 6dw 00011010b ;"7" 7dw 11111110b ;"8" 8dw 11011110b ;"9" 9dw 00000100b ;"-" adw 00000000b ;" " b;-------------------------------------com_000_table:dw 0dw 1,0,1,0,1,0com_001_table:dw 0dw 1,0,1,0,0,1com_010_table:dw 0dw 0,1,1,0,1,0com_011_table:dw 0dw 0,1,1,0,0,1com_100_table:dw 0dw 1,0,0,1,1,0com_101_table:dw 0dw 1,0,0,1,0,1com_110_table:dw 0dw 0,1,0,1,1,0com_111_table:dw 0dw 0,1,0,1,0,1;----------------------------------------bcd_table:dw 00h,01h,02h,03h,04h,05h,06h,07h,08h,09h dw 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h dw 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h dw 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h dw 40h,41h,42h,43h,44h,45h,46h,47h,48h,49h dw 50h,51h,52h,53h,54h,55h,56h,57h,58h,59h dw 60h,61h,62h,63h,64h,65h,66h,67h,68h,69h dw 70h,71h,72h,73h,74h,75h,76h,77h,78h,79h dw 80h,81h,82h,83h,84h,85h,86h,87h,88h,89h dw 90h,91h,92h,93h,94h,95h,96h,97h,98h,99hend;*********************************************。
段码LCD液晶屏驱动方法
段码LCD液晶屏驱动方法生活中小电器见到最多的lcd模组就是段码lcd液晶屏,段码lcd有普通的数码管的特征,又有点阵LCD的特征,固定的图形,优点是省成本而有好看,那么段码LCD液晶屏是怎么驱动的呢?下面我们就来简单了解一下:首先,不要以为用单片机来驱动就以为段码屏是直流驱动的,其实,段码屏是交流驱动,什么是交流?矩形波,正弦波等。
大家可能会经常用驱动芯片来玩,例如HT1621等,但是有些段式屏IO口比较少,或者说IO口充足的情况下,也可以省去写控制器的驱动了。
与单片机接口方便,而后者驱动电流小,功耗低、寿命长、字形美观、显示清晰、视角大、驱动方式灵活、应用广泛【1】。
但在控制上LCD较复杂,因为LCD电极之间的相对电压直流平均值必须为0【2】,否则易引起LCD氧化,因此LCD不能简单地用电平信号控制,而要用一定波形的方波序列来控制。
LCD显示有静态和时分割两种方式,前者简单,但是需要较多的口线;后者复杂,但所需口线较少,这两种方式由电极引线的选择方式确定。
下面以电子表的液晶显示为例,小时的高位同时灭或亮,分钟的高位在显示数码1~5时,其顶部和底部也是同时灭或亮,两个dot点也是同时亮或灭,其驱动方式是偏置比为1/2的时分割驱动,共有11个段电极和两个公共电极。
但是,IO模拟驱动段式液晶有一个前提条件,就是IO必须是三态,为什么?下面我们一起细细道来:第一步,段码式液晶屏的重要参数:工作电压,占空比,偏压比。
这三个参数非常重要,必须都要满足。
第二步,驱动方式:根据LCD 的驱动原理可知,LCD 像素点上只能加上AC 电压,LCD 显示器的对比度由COM脚上的电压值减去SEG 脚上的电压值决定,当这个电压差大于 LCD 的饱和电压就能打开像素点,小于LCD 阈值电压就能关闭像素点,LCD 型MCU 已经由内建的LCD 驱动电路自动产生LCD 驱动信号,因此只要I/O 口能仿真输出该驱动信号,就能完成 LCD 的驱动。
单片机io口驱动led电路
单片机io口驱动led电路
单片机IO口驱动LED电路是一种常见的电子电路应用。
在这种
电路中,单片机的IO口用来控制LED的亮灭,实现不同的功能。
一
般来说,单片机的IO口输出电流能力有限,因此通常需要外部电路
来驱动LED。
一种常见的单片机IO口驱动LED电路是使用普通的NPN晶体管。
具体电路连接方式如下:
将LED的阳极连接到正极,阴极接地;
单片机的IO口通过一个限流电阻连接到NPN晶体管的基极;
NPN晶体管的发射极接地,集电极连接LED的阴极。
当单片机的IO口输出高电平时,NPN晶体管导通,LED亮起;
当IO口输出低电平时,NPN晶体管截止,LED熄灭。
这样就实现了
单片机IO口对LED的控制。
另外,为了保护单片机,还可以在IO口和NPN晶体管之间加上
一个限流电阻,限制电流的大小,防止对单片机的损坏。
此外,还可以使用集成的LED驱动芯片,如常见的ULN2003芯片,它能够为LED提供更大的驱动能力,同时还具有过流保护功能,能够保护单片机不受损坏。
总的来说,单片机IO口驱动LED电路的设计需要考虑到单片机
的输出电流能力、LED的工作电流、保护单片机的安全性等因素,
选用合适的驱动电路方案,以实现可靠的LED控制功能。
单片机与LCD液晶显示屏的接口技术
单片机与LCD液晶显示屏的接口技术LCD液晶显示屏是现代电子产品中常见的显示设备之一,它广泛应用于手机、电视、电子手表、智能家居等各种场景。
而单片机则是一种功能强大的集成电路,可以控制和管理各种外部设备。
在很多电子产品中,单片机与LCD液晶显示屏的接口技术起着至关重要的作用。
本文将介绍单片机与LCD液晶显示屏的接口技术原理和实现方法。
1. LCD液晶显示屏的工作原理LCD液晶显示屏采用液晶分子的光学特性来显示图像。
它由液晶面板、驱动电路和背光等组成。
液晶面板通过液晶分子的电场控制来改变光的透过度,从而实现对图像的显示。
驱动电路负责控制液晶分子的电场,使其定向排列以显示所需图像。
背光则提供光源,确保图像在背面光的照射下能够清晰可见。
2. 单片机与LCD液晶显示屏的接口类型通常情况下,使用较小的单片机时,可以采用并行接口的方式与LCD液晶显示屏进行连接。
而当液晶屏规模较大时,例如在电视等大尺寸设备中,采用串行接口更为常见。
2.1 并行接口并行接口是指将单片机的数据引脚与LCD液晶显示屏的数据引脚一一对应连接的方式。
通过这种方式,单片机可以通过并行传输大量数据来驱动LCD液晶显示屏。
通常的并行接口有8位并行和16位并行两种。
2.2 串行接口串行接口是指使用少量的引脚通过串行传输方式来控制和驱动LCD液晶显示屏。
串行接口可以有效减少引脚的使用数量,降低设备的成本和复杂度。
同时,通过串行接口传输数据的速度可以更快,图像显示更加流畅。
3. 单片机与LCD液晶显示屏的数据传输无论是使用并行接口还是串口接口,都需要单片机与LCD液晶显示屏之间进行数据的传输。
在数据传输中,液晶显示屏通常需要通过命令与数据两种不同方式来接收数据。
3.1 命令传输通过发送命令,单片机可以控制LCD液晶显示屏进行各种操作,例如清屏、光标的移动、设置光标位置等。
在数据传输时,单片机将命令数据通过接口发送给液晶显示屏的控制引脚,从而实现对液晶显示屏的控制。
段码LCD液晶屏驱动方法
TFT液晶屏:段码LCD液晶屏驱动方法段码LCD液晶屏驱动方法首先,不要以为用单片机来驱动就以为段码屏是直流驱动的,其实,段码屏是交流驱动,什么是交流?矩形波,正弦波等。
大家可能会经常用驱动芯片来玩,例如HT1621等,但是有些段式屏IO口比较少,或者说IO口充足的情况下,也可以省去写控制器的驱动了。
与单片机接口方便,而后者驱动电流小,功耗低、寿命长、字形美观、显示清晰、视角大、驱动方式灵活、应用广泛。
但在控制上LCD较复杂,因为LCD 电极之间的相对电压直流平均值必须为0,否则易引起LCD氧化,因此LCD不能简单地用电平信号控制,而要用一定波形的方波序列来控制。
LCD显示有静态和时分割两种方式,前者简单,但是需要较多的口线;后者复杂,但所需口线较少,这两种方式由电极引线的选择方式确定。
下面以电子表的液晶显示为例,小时的高位同时灭或亮,分钟的高位在显示数码1~5时,其顶部和底部也是同时灭或亮,两个dot点也是同时亮或灭,其驱动方式是偏置比为1/2的时分割驱动,共有11个段电极和两个公共电极。
但是,IO模拟驱动段式液晶有一个前提条件,就是IO必须是三态,为什么?下面我们一起细细道来:第一步,段码式液晶屏的重要参数:工作电压,占空比,偏压比。
这三个参数非常重要,必须都要满足。
第二步,驱动方式:根据LCD的驱动原理可知,LCD像素点上只能加上AC电压,LCD显示器的对比度由COM脚上的电压值减去SEG脚上的电压值决定,当这个电压差大于LCD的饱和电压就能打开像素点,小于LCD阈值电压就能关闭像素点,LCD型MCU已经由内建的LCD驱动电路自动产生LCD驱动信号,因此只要I/O口能仿真输出该驱动信号,就能完成LCD的驱动。
段码式液晶屏幕主要有两种引脚,COM,SEG,跟数码管很像,但是,压差必须是交替变化,例如第一时刻是正向的3V,那么第二时刻必须是反向的3V,注意一点,如果给段码式液晶屏通直流电,不用多久屏幕就会废了,所以千万注意。
单片机驱动液晶屏的方法
单片机驱动液晶屏的方法
单片机驱动液晶屏的方法需要根据液晶屏的型号和接口类型来
确定。
一般情况下,液晶屏的接口类型可分为并行接口和串行接口两种。
对于使用并行接口的液晶屏,单片机需要至少有8个I/O口输出数据和控制信号。
具体步骤如下:
1. 确定液晶屏的接口类型和引脚定义;
2. 通过单片机的GPIO配置寄存器设置相应的引脚为输出模式;
3. 将待显示的图像数据通过并行接口传输到液晶屏;
4. 控制液晶屏的各种参数以达到所需的显示效果。
对于使用串行接口的液晶屏,单片机只需要一个I/O口即可完成数据传输和控制。
具体步骤如下:
1. 确定液晶屏的接口类型和引脚定义;
2. 配置单片机的GPIO口为串行通信模式,并设置相应波特率等参数;
3. 将待显示的图像数据通过串行接口传输到液晶屏;
4. 控制液晶屏的各种参数以达到所需的显示效果。
在实际操作中,单片机驱动液晶屏涉及到的技术点较多,需要具备一定的电子技术和嵌入式系统开发经验。
若有需要,可以参考相关的开发文档或咨询专业人士。
成功了!任意2个io直接驱动LCD1602,并且不需外加芯片很少的线驱动LCD1602
上次发了个人肉驱动LCD1602的帖子,没什么技术含量,居然得裤子,有点不好意思,正好这几天有点时间,于是就再做一个小试验,用尽量少的IO来驱动1602,以适应在某些引脚较少的MCU,如Tiny系列等。
废话少说,先上图,如果大家觉得有意思请起个哄...(原文件名:001.jpg)(原文件名:002.jpg)说明一下,连接LCD1602的四根引线,除了红黑两根电源,两根黄色的就是信号线,其中一根传送RS和E 信号,另一根传送D4~D7信号,即用四位总线驱动。
电路和程序整理中,迟些上传。
[已上传]============================================================================================ =========================【59楼】更新:挑战一下极限,再减少一根线,仍然好使,不过要另加一个电容和一个二极管。
(原文件名:003.jpg)============================================================================================ =========================【167楼】更新:无线馈电及传送数据。
(原文件名:007.jpg)这就是电路,细心的朋友会发现实物图中有几个贴片的阻容件,秘密就在这里,利用电容的记忆效应,把并行的数据转为串行。
(原文件名:2wire_1602.PNG)示范程序很简单,不用多注释应该都能看懂。
作为演示用途,其中有些长时间延时没有没有使用定时器,在多任务系统中当然要用定时中断来代替了。
// Drive a LCD1602 with 2 wire//===================================================//ICC-A VR application builder : 2010-10-3 19:30:02// Target : M16// Crystal: 4.0000Mhz#include <iom16v.h>#include <macros.h>#define Set_E PORTB|=2#define Clr_E PORTB&=~2#define Set_D PORTB|=1#define Clr_D PORTB&=~1#define Set_xy(y,x) Send(0,(y<<6)|(x&15)|0x80)//=================================================== void init_devices(void){CLI(); //disable all interruptsDDRB = 0x03;MCUCR = 0x00;GICR = 0x00;SEI(); //re-enable interrupts}//=================================================== void Delay(unsigned int i){while(i--);}//=================================================== void Send(unsigned char RS, unsigned char dat){unsigned char i;for (i = 2; i > 0; i--){if (dat & 0x80) Set_D; else Clr_D;Delay(10608);//14520usif (RS) Set_E;if (dat & 0x40) Set_D; else Clr_D;Delay(462); //660usif (dat & 0x20) Set_D; else Clr_D;Delay(18); //30usSet_E;if (dat & 0x10) Set_D; else Clr_D;_NOP(); //0.5us < t < 1.36usClr_E;dat <<= 4;}}//=================================================== void init_1602(void){unsigned char i = 3;Clr_D;Clr_E;Delay(10608);do{Clr_D;Delay(462);Set_D;Set_E;Delay(18);if (i == 0) Clr_D;_NOP();_NOP();_NOP();Clr_E;}while(i--);Send(0,0x28);Send(0,0x01);Send(0,0x0f);}//=================================================== void Send_S(unsigned char *p){while(*p) Send(1,*p++);}//=================================================== void main(void){unsigned char i;init_devices();init_1602();Set_xy(0,2);Send_S("Hello world!");Set_xy(1,3);Send_S("I'm COWBOY.");for (i=0;i<255;i++) Delay(10000);Send(0,0x01);Set_xy(0,3);Send_S("Welcome to");Set_xy(1,1);Send_S("");while(1);}。
MSP430 I-O 口驱动段式 LCD 设计(上)
MSP430 I/O 口驱动段式LCD 设计(上)
引言
本文介绍了使用MSP430 的GPIO 端口直接驱动LCD(液晶显示)的方法,从而扩展了不带LCD 控制器的MSP430 系列产品功能和使用场合,在一些要求低成本显示的场合,本方案具有很大的使用价值。
简介
针对LCD(液晶)显示,德州仪器MSP430 系列单片机可分为两类,一类内置LCD 控制器,另一类不带LCD 控制器。
内置LCD 控制器的单片机价
格较高,使用成本增加。
不带LCD 控制器的单片机可配合液晶驱动芯片使用,但需增加额外的芯片,也增加了成本。
本文介绍的方案,适用于不带LCD 控
制器的MSP430 系列单片机,通过使用通用I/O 口直接驱动LCD 显示,其显示效果以及占用的资源和内置液晶控制器的单片机相同。
市面上针对4-COM 和3-COM 的液晶,多是1/3Bias 偏压方式,本设计方法适用于1/3Bias 液晶屏,仅仅通过端口增加分压电阻即可完成显示。
1/2Bias 液晶屏的驱动设计见ti/lit/zip/slaa516 。
1/3 Bias LCD 使用1/2Bias 的驱动时序,会导致显示对比度下降,显示效果不理想。
LCD 显示原理
LCD 是利用液晶分子的光学特性和物理结构进行显示的一种元件。
液晶
分子是介于固体和液体之间的一种物质,多呈长棒状大分子形态,在自然形态下,液晶分子排列没有规则,具有光学各向异性的特点,不透光;在电(磁)场作
用下,液晶分子排列规则,光学各向同性,可透光。
将液晶分子灌入精良加工
的开槽平面,液晶分子大致会顺着槽排列。
假如那些槽非常平行,液晶分子也
大致平行。
单片机IO口直接驱动LCD
利用单片机I/O口直接驱动LCD如何将小家电成本降低的同时,又保证其性能,是对应用工程师提出的更高要求。
本控制板需要进行温度控制,显示界面要求LCD显示。
带专用LCD驱动器,又带A/D转换器的单片机成本太高,因此选用台湾义隆公司带A/D的单片机EM78P259N直接驱动LCD。
该款单片机性价比高,性能可靠,很适合在家电控制中应用。
1 LCD简介清华微电子推出高频管分立器件裸片,已做到9G截止频率目前,市面主流LCD(液晶显示器)分成以下几大类:TN(扭曲阵列型)、STN(超扭曲阵列型)、DSTN(双层超扭曲阵列)、HPA(高性能定址或快速DSTN)、TFT(薄膜场效应晶体管)等。
由于成本因素,目前小家电大多数采用的是TN型单色液晶显示器,它的原理是把液晶灌入两个列有细槽的平面之间。
这两个平面上的槽互相垂直(相交成90°),也就是说,若一个平面上的分子南北向排列,则另一平面上的分子东西向排列,而位于两个平面之间的分子被强迫进入一种90°扭转的状态。
由于光线顺着分子的排列方向传播,所以光线经过液晶时也被扭转90°。
当液晶上加一个电压时,分子便会重新垂直排列,使光线能直射出去,而不发生任何扭转。
LCD正是由这样两个相互垂直的极化滤光器构成的,所以在正常情况下应该阻断所有试图穿透的光线。
但是,由于两个滤光器之间充满了扭曲液晶,所以在光线穿出第一个滤光器后,会被液晶分子扭转90°,最后从第二个滤光器中穿出。
另一方面,若为液晶加一个电压,分子又会重新排列并完全平行,使光线不再扭转,所以正好被第二个滤光器挡住。
总之,加电将光线阻断,不加电则使光线射出。
LCD模型可以把其看成一个电容器,一个电极连接着公共极板,另一个连接着字符段。
LCD受电压的均方根值控制,当施加在LCD上的电压为零时,LCD呈透明状态。
当施加在字符段与公共极的电压大于LCD的阀值电压,则该字符段就显示出来。
用IO驱动LCD
用I/O 驱动LCD在现今的电子产品中,LCD显示被广泛的应用。
LCD显示驱动有内建于MCU中的亦有独立于MCU单一的驱动IC。
这些LCD能驱动的点数一般比较多,在一些需要显示点数不多的应用中这些IC就显的浪费。
所以在这里我们介绍一种用I/O来驱动LCD做显示的方法来满足一些点数不多的显示应用。
1.I/O 驱动LCD 原理LCD的显示原理请参考3.6节,这里不多叙述。
大家都知道I/O口最多只能有三种状态: 高电平,低电平及悬空状态(Floating)如何造出LCD驱动波形呢? 下面我们以2X8(2个COM和8个SEG)的例子来做一介绍。
观察图5-14,这是一个1/2bias,1/2duty的LCD驱动波形,观察COM0和COM1可以发现同一时间内只有一个COM口有输出,它的平均电压为零。
节点信号SEGMENT则表示要显示的数据,如果节点信号与COM口之间有出现脉冲,代表对应的这个点是亮的,反之则是暗的。
在知道要显示的内容的情况下,如果是要显示,那么SEGMENT的信号就和COM 相反而产生脉冲,如果是不显示,那么SEGMENT的信号就和COM的信号一样而两端之间没有脉冲,没有显示。
有了LCD驱动波形的概念之后,接着就可以着手设计电路了,观察SEGMENT 上的波形,对微控制器来讲不是问题,VLCD=1,VSS=0就能造出漂亮的方波。
那COMMON上面的阶梯波怎么解决呢? 其实只要利用I/O Port三种状态就可实现,如图1-1所示,PD1、PD2为COM0、COM1的输出波形,利用两个分压电阻以及I/O Port 的特性,表1-1是它的真值表,由此表不难看出,要产生VDD或者0电压,只要利用端口输出1或者0就可以产生,可是没有直接输出1/2 VDD(V1)。
其实要产生1/2VDD是很简单的,因为当I/O Port设成输入时形成一个高阻抗的状态,对COM 而言所看到的只是R1和R2分压而已。
所以我们 将R1=R1=100K欧姆,那么在COM 端来说就是1/2VDD的电压了。
用单片机IO口直接驱动段式LCD的方法
用单片机IO口直接驱动段式LCD的方法用IO口驱动段式LED(数码管)的方法相信大家比较清楚,但用IO口直接驱动段式LCD的方法相对复杂一些。
在网上搜了一下单片机IO口驱动段式LCD的方法,大部分资料讲得不够清晰、具体,而且简单问题复杂化。
后来查了LCD的显示原理,结合网上的相关介绍,发现IO口直接驱动段式LCD原理比较简单,用几句话就可以描述清楚:1.LCD和LED的显示原理不一样:LED是加正向电压发光,而LCD必须交替加正、反向电压才会持续显示(可以做个实验,如果把恒定电压加到LCD的一段上,该段会显示一下,但马上不能显示,而且长时间加恒定电压,会加速LCD的老化和损坏)2.常听说1/2bias,1/3bias LCD,是什么意思呢?对于1/2bias LCD,假如LCD的显示电压是3V,则1/2bias是1.5V,也就是说在±3V电压作用时,LCD有显示;±1.5V及以下的电压作用时没有显示3.普通单片机IO口不能直接输出半高电平(1.5V),但可以用相等的上下拉电阻实现,当IO口设置为输入(高阻)时,由于上下拉电阻的分压作用,则产生一个半高电平(1.5V)知道了以上3点后,动态驱动LCD就不是难事了,对于4*8段的LCD(4个COM,8个SEG,显示电压为3V,1/2bias),驱动方法如下:1、四个COM采用交替扫描的方式,每个COM在相邻两次扫描时又进行电压交变的方式。
2、若扫描到某一个COM时,该COM输出3V(0V):与该COM相连的SEG输出与COM相反,ΔV=±3V,则该相连点亮;与该COM相连的SEG输出与COM相同,ΔV=0,则该相连点不亮。
3、其他没有扫描到的COM,单片机IO口为输入,从而产生1/2 bias(1.5V),不管SEG为何值,ΔV<±1.5V,故该点不亮。
本人用4*8段的LCD自制了一个数字钟表,验证了以上方法的可行性,现把制作过程罗列如下1.原理图说明:由于管脚不够用,所以时钟芯片DS1302的RST和LCD的一个SEG是复用的,只要在这个SEG无效的时候去读取时间就可以了,另外,3PIN串口是ISP 下载程序用的。
普通MCU驱动液晶LCD方法
在众多显示器件中,TN液晶显示器以它价格低廉,耗电量低,显示清晰等优势成为很多小产品的首选显示器件;lcd正常显示需要交流方波,而且为了不重复显示笔段,需要4个COM分时显示,但是专用的lcd驱动芯片价格较高,且增加了系统的复杂程度,带lcd驱动的mcu价格更是不低,怎么办呢? 如果我们徐娅的笔段不多的话就可以考虑用普通IO型的单片机模拟lcd驱动波形来使用lcd了.要使用LCD之前我们需要了解关于LCD的几个参数:1. 电压: 这个我们一般和mcu供电电压一致就可以了,lcd电压高于mcu电压易造成亮度不够,lcd电压低于mcu电压易造成鬼影(不该点亮的笔段却点亮)2. 偏压(BIAS): 偏压级数越多lcd的对比度级别就越多,对于mcu驱动的简单lcd我们为了简单只需要亮和不亮两种状态就够了,所以只要1/2的就可以了,不必做成1/3,1/4 .3. 周期(DUTY): 周期跟公共端COM的个数有关,例如3个com,周期就是1/3 ,4个com周期就是1/4了解以上几点我们就可以进行下一步了,下面以一个例子作为引述:图1 LCD 逻辑图图2 MCU脚位图我们以以上两个图片作为此次实验,图1为LCD的逻辑图和连线图,图2是与单片机连接的脚位图,注意实际上单片机的COM1-COM4这几个引脚对地和VCC之间接有100K的电阻.我们需要在lcd上面第一个8字从0-9依次显示,每秒递增1次,一直循环: 根据图1得到0-9的com1-com 4对应的SEG码如下:;;;;;;;;;COM1BTL查表;;;;;;;;;;;;;COM1BTL: ADD PC,ARETL 0XF1;0RETL 0XF3RETL 0XF1RETL 0XF1RETL 0X03;4RETL 0XF1;5RETL 0XF1RETL 0XF1RETL 0XF1RETL 0XF1;9;;;;;;;;;;;;;;;;;;;;;;;COM2BTL查表;;;;;;;COM2BTL: ADD PC,ARETL 0XF0;0RETL 0XF2;1RETL 0XF2;2RETL 0XF2;3RETL 0XF0;RETL 0XF1RETL 0XF1;6RETL 0XF2;RETL 0XF0;RETL 0XF0;9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;COM3BTL查表;;;;;;;; COM3BTL: ADD PC,ARETL 0XF1;0RETL 0XF3;1RETL 0XF0;2RETL 0XF2;3RETL 0XF2;4RETL 0XF2;5RETL 0XF0;6RETL 0XF3;7RETL 0XF0;8RETL 0XF2;9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;COM4BTL查表;;;;;;;;; COM4BTL: ADD PC,ARETL 0XF0;0RETL 0XF2;1RETL 0XF1;2RETL 0XF0;3RETL 0XF2;4RETL 0XF0;5RETL 0XF0;6RETL 0XF2;7RETL 0XF0;8RETL 0XF0;9以上查表采用的是0代表点亮1代表不点亮,得到以上查表我们需要做的就是每个COM分时输出固定的波形, com输出波形同时查表输出对应的笔段,这样就能正常显示了,具体流程图如下;1. COM1 输出高,其他com1/2电平(输入),seg查表1 输出低,其他com1/2电平(输入),seg查表并取反3. COM2 输出高,其他com1/2电平(输入),seg查表4. COM2 输出低,其他com1/2电平(输入),seg查表并取反5. COM3 输出高,其他com1/2电平(输入),seg查表6. COM3 输出低,其他com1/2电平(输入),seg查表并取反7. COM4 输出高,其他com1/2电平(输入),seg查表8. COM4 输出低,其他com1/2电平(输入),seg查表并取反9. 跳到1具体程序如下:LCD_DSPLY:;11111;COM1=3V,其他COM=1.5V;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM1BTL ;MOV P6,A;驱动seg显示;;;;;;;;;;;;;MOV A,@0B00001110IOW P5;P5方向BS P5,COM1;COM1=3V;;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;2222;COM1=0V,其他COM=1.5V;;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM1BTL ;MOV TBL_BUF,A;COMA TBL_BUF;seg取反MOV P6,A;驱动seg显示 ;;;;;;;;;;;;;;;MOV A,@0B00001110IOW P5;P5方向BC P5,COM1;COM1=0V;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;;;3333333;COM2=3V,其他COM=1.5V;;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM2BTL ;MOV P6,A;驱动seg显示 ;;;;;;;;;;;;;;;;MOV A,@0B00001101IOW P5;P5方向BS P5,COM2;COM2=3V ;;;;;;;;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;;;;;;44444444,COM2=0V,其他COM=1.5V;;;;;;;;;;;;;; MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM2BTL ;MOV TBL_BUF,A;COMA TBL_BUF;seg取反MOV P6,A;驱动seg显示 ;;;;;;;;;;;;;;;;;;;MOV A,@0B00001101IOW P5;P5方向BC P5,COM2;COM2=0V ;;;;;;;;;;;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;;;;55555,COM3=3V,其他COM=1.5V;;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM3BTL ;MOV P6,A;驱动seg显示;;;;;;;;;;;MOV A,@0B00001011IOW P5;P5方向BS P5,COM3;COM3=3V ;;;;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;;6666666,COM3=0V,其他COM=1.5V;;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM3BTL ;MOV TBL_BUF,A;COMA TBL_BUF;seg取反MOV P6,A;驱动seg显示;;;;;;;;;;;MOV A,@0B00001011IOW P5;P5方向BC P5,COM3;COM3=3V;;;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;;7777777,COM4=3V,其他COM=1.5V;;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM4BTL ;MOV P6,A;驱动seg显示 ;;;;;;;;;;;;;;MOV A,@0B00000111IOW P5;P5方向BS P5,COM4;COM4=3V;;;;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZ;;;;888888,COM4=0V,其他COM=1.5V;;;;;;;;;;;;;;MOV A,@0XFF;IOW P5IOW P6;;;;;;;;;;;;;MOV A,LCD_BUF; LCD显示查表CALL COM4BTL ;MOV TBL_BUF,A;COMA TBL_BUF;seg取反MOV P6,A;驱动seg显示;;;;;;;;;;;;MOV A,@0B00000111IOW P5;P5方向BC P5,COM4;COM4=3V;;;;;;;;;;;MOV A,@0B11111100IOW P6;;;;;;;;;;;CALL DELAY16MS;延时16ms,扫描一个周期=16ms约60HZJMP LCD_DSPLY; 跳回第一步,循环通过上面的程序就能正常显示了,只中断里面LCD_BUF每秒递增一个,到10就归零,这样就能从0-9一直循环显示了,正式使用时需要显示其他字形码,只要把TBL_BUF相应的位置1即可。
LCD段码屏是怎么驱动的?
LCD段码屏是怎么驱动的?
段码液晶屏的驱动步骤下面来介绍一下。
第一步,LCD段码式液晶屏驱动的重要数值:工作电压,占空比和偏压比。
这三个参数非常重要,都要满足。
第二步,驱动方式:根据LCD的驱动原理可知,LCD像素点上只能加上AC电压,LCD显示器的对比度是COM脚上的电压值和SEG脚上的电压值之差,当这个电压差大于LCD的饱和电压就能打开像素点,小于LCD或者值电压就能关闭像素点,LCD型MCU已经由内建的LCD驱动电路自动产生LCD驱动信号,因此只要I/O口能仿真输出该驱动信号,就能完成LCD 的驱动。
段码式液晶屏幕主要有两种引脚:COM和SEG,和数码管很像,但是,压差一定要有变化,例如第一时刻是正向的3V,那么第二时刻必须是反向的3V,注意一点,如果给段码式液晶屏通直流电,不用多久屏幕就会废了,所以千万注意。
单片机与液晶显示屏的连接与控制
单片机与液晶显示屏的连接与控制随着科技的不断发展,单片机和液晶显示屏的应用日益广泛。
单片机作为一种集成电路芯片,在各种电子设备中起着至关重要的作用。
而液晶显示屏则是现代电子设备中常见的一种显示器件。
本文将探讨单片机与液晶显示屏的连接和控制方法。
一、硬件连接单片机与液晶显示屏的连接可以通过接口电路来实现。
液晶显示屏通常具有一定数量的引脚,其中包括数据引脚、控制引脚、电源引脚等。
而单片机也具有相应的引脚用于与液晶显示屏进行连接。
具体的连接方法可以根据不同的单片机和液晶显示屏型号而略有不同。
例如,当我们使用的单片机为51系列,而液晶显示屏为16x2字符型液晶显示屏时,可以通过以下步骤进行连接:1. 将液晶显示屏的VSS引脚与单片机的地引脚连接;2. 将液晶显示屏的VDD引脚与单片机的正引脚连接;3. 将液晶显示屏的VO引脚通过一个可调电阻连接到地引脚,以调整液晶显示屏的对比度;4. 将液晶显示屏的RS引脚与单片机的一个IO引脚连接,用于选择数据或命令传输;5. 将液晶显示屏的RW引脚与单片机的另一个IO引脚连接,用于选择读写操作;6. 将液晶显示屏的E引脚与单片机的另一个IO引脚连接,用于产生时钟信号;7. 将液晶显示屏的D0-D7引脚依次与单片机的IO引脚连接,用于传输数据。
通过以上连接,单片机与液晶显示屏之间便建立了物理连接,为接下来的控制提供了基础。
二、控制方法在硬件连接完成后,我们可以通过编写单片机的程序代码来控制液晶显示屏的显示内容。
以51系列单片机为例,下面是一个简单的控制液晶显示屏显示“Hello, World!”的程序:```C#include <reg51.h> // 包含51系列单片机的寄存器定义sbit RS = P0^0; // 定义RS引脚为P0口的第0位sbit RW = P0^1; // 定义RW引脚为P0口的第1位sbit E = P0^2; // 定义E引脚为P0口的第2位// 液晶显示屏命令函数void LCD_Cmd(unsigned char cmd) {RS = 0; // RS引脚置低,选择命令传输RW = 0; // RW引脚置低,选择写操作E = 1; // E引脚置高P2 = cmd; // 将命令写入P2口E = 0; // E引脚置低,产生上升沿以触发命令传输}// 液晶显示屏数据函数void LCD_Data(unsigned char dat) {RS = 1; // RS引脚置高,选择数据传输RW = 0; // RW引脚置低,选择写操作E = 1; // E引脚置高P2 = dat; // 将数据写入P2口E = 0; // E引脚置低,产生上升沿以触发数据传输}// 延时函数void Delay() {unsigned int i, j;for(i=0; i<100; i++)for(j=0; j<1000; j++);}// 主程序void main() {LCD_Cmd(0x38); // 初始化液晶显示屏,设置为8位数据总线、2行显示、5x7点阵字体Delay();LCD_Cmd(0x0C); // 打开液晶显示屏,设置光标不显示、光标不闪烁、整体显示Delay();LCD_Cmd(0x01); // 清除液晶显示屏的显示内容Delay();LCD_Cmd(0x80); // 设置光标位置为第一行第一列// 显示“Hello, World!”LCD_Data('H');LCD_Data('e');LCD_Data('l');LCD_Data('l');LCD_Data('o');LCD_Data(',');LCD_Data(' ');LCD_Data('W');LCD_Data('o');LCD_Data('r');LCD_Data('l');LCD_Data('d');LCD_Data('!');while(1); // 程序循环执行}```通过以上程序,我们可以看到,通过单片机的IO引脚分别控制液晶显示屏的RS引脚、RW引脚和E引脚,可以向液晶显示屏发送命令或数据。
单片机实现LCD液晶显示器控制原理
单片机实现LCD液晶显示器控制原理LCD液晶显示器是一种广泛应用于电子产品中的显示设备,其通过控制液晶分子的排列来实现图像的显示。
单片机作为一种集成电路,可以通过控制LCD液晶显示器来实现对图像的显示和控制。
1.单片机与LCD液晶显示器的连接:单片机通过GPIO(通用输入输出)口与LCD液晶显示器进行连接,其中包括控制线和数据线。
控制线包括使能端(EN)、读写选择端(RW)、数据/命令选择端(RS)、复位端(RST)、以及其他一些信号线。
数据线用于传输显示图像的数据。
2.液晶分子的排列:LCD液晶显示器是通过控制液晶分子的排列来实现图像显示的。
液晶分子的排列方式有平行排列和垂直排列两种。
平行排列时,液晶分子与两块玻璃之间的基板平行排列;垂直排列时,液晶分子与两块玻璃之间的基板垂直排列。
3.显示数据的发送和控制信号的设置:单片机通过数据线向LCD液晶显示器发送显示数据,同时通过控制线发送相应的控制信号。
其中,使能端(EN)用于控制液晶显示器是否接受数据;读写选择端(RW)用于选择是读取显示数据,还是向液晶显示器写入数据;数据/命令选择端(RS)用于选择发送的是显示数据还是控制命令;复位端(RST)用于复位液晶显示器。
4.显示数据的处理和刷新:单片机通过程序对显示数据进行处理和刷新,使其能够正确显示在LCD液晶显示器上。
液晶显示器的显示图像是由像素点组成的,单片机程序需要将要显示的图像转换为相应的像素点,并将其通过数据线发送到液晶显示器上显示出来。
5.功能控制和处理:单片机还可以通过控制LCD液晶显示器的功能,实现其它的一些显示和操作功能。
例如,可以通过程序控制液晶显示器的亮度、对比度、背光等参数;还可以实现触摸屏幕的控制,以及与其它设备的通信等功能。
综上所述,单片机实现LCD液晶显示器控制的原理主要包括与液晶显示器的连接、液晶分子的排列、显示数据的发送和控制信号的设置、显示数据的处理和刷新,以及功能控制和处理等方面。
用单片机直接驱动液晶显示器_图文.
第22卷第4期量子电子学报V01.22No.4 2005年8月C王王:嘲E JOURNAL OF QUANTUM ELECTRONICS Aug.2005文章编号:螂秘61《20酾O枷65卿3用单片机直接驱动液晶显示器鲍健,。
丁湘琳2,孙力君,潘,媛。
(1中固科学豌爱徽光学精密机攘珊究雳豇安徽合肥230031;2舍犯工业大掌计算机每信息学院,安徽畲肥230009;3砉徽农北大学信息与计算机学院,毒徽畲肥230036摘要:讨沦了用普通单片机能否壹接驱动液晶显示器的问题,通过对液晶显示器工作原理及电气特性的深入分析,给出了具体豹硬件电路,驱动信号波形及软件设计愚錾,实验表明,警通单片机可以直接驱动液晶显示器,在许多场合下此法具有较高应用价值.关键词:光电子学;单片机;液晶显示器;偏置;占空比中囝分类号:TNl41.9文献标识码:A1引言液晶显示器(LCD具有显示清晰,美观、功耗微小等优点。
近年来随着产量的增加,其价格已十分低廉,是值得首选的显示器件,然而液晶显示器的使用相对复杂一些,令许多设计人员望而却步。
实际上,现在驱动液晶的器件很多,许多新型单片机本身就带液晶驱动器,使用起来当然很方便。
但是在我们设计产品时常常遇到这种情况:需要显示的内容并不多,如果选用带液晶驱动器的单片机颇有些大材小用,通过对液晶显示器工作原理的深入分析和实验,用我们熟悉的普通单片机直接驱动液晶显示器是完全可行的。
2液晶显示原理液晶显示器分为字段式与点阵式,字段式所显示的图形都是预先制作好的,例如七段数码字的“段”,在显示时不能变化;而点阵式比较灵活,可以组成任意的图形,但点阵式液晶显示器比较复杂,需要配专门的驱动电路,本文只讨论字段式的液晶显示器。
想要用普通单片机(不带液晶驱动器,以下同驱动液晶显示器,首先得熟悉液晶显示器的电参数。
液晶显示器是由面电极与底电极(面、底电极都是透明的,不加电几乎看不见中间充满液态晶体所构成。
驱动信号就加在面电极与底电极上。
单片机与LCD液晶显示屏接口设计方法
单片机与LCD液晶显示屏接口设计方法随着科技的发展,液晶显示屏已经成为了我们日常生活和工作中不可或缺的一部分。
而单片机作为一种高性能微控制器,也广泛应用于各种电子设备中。
因此,单片机与LCD液晶显示屏之间的接口设计显得非常重要。
本文将介绍几种常见的单片机与LCD液晶显示屏接口设计方法。
1. 并行接口法并行接口法是最基本也是最直接的接口方法。
它使用多个IO口来控制LCD的数据和控制信号。
通常需要8条数据线和3~4条控制线,用于传输显示数据和控制信号。
并行接口法的优点是传输速度较快,对单片机来说比较简单。
缺点是占用IO端口多,对于资源有限的单片机可能不太适用。
2. 串行接口法串行接口法采用串行通信方式来传输数据和控制信号。
它只需要3条IO口即可实现与LCD的通信。
由于只用到少量的IO口,因此在资源有限的情况下比较适用。
串行接口法的缺点是传输速度较慢,显示效果相对较差。
3. I2C接口法I2C接口法是一种常用的串行通信协议,具有多对多的特点。
它只需要2条IO 口,一条用于数据传输,一条用于时钟同步。
I2C接口法适用于单片机与多个外设的通信,能够节省IO资源。
缺点是传输速度较慢,对于要求实时性较高的应用场景可能不太适用。
4. SPI接口法SPI接口法是一种高速串行通信协议,适用于单片机与外设之间的通信。
它需要4条IO口,分别是时钟线、数据线、主设备输出线和主设备输入线。
SPI接口法传输速度快,对于要求实时性较高的应用场景非常适用。
但与此同时,SPI接口法所需的IO资源也比较多。
在设计单片机与LCD液晶显示屏接口时,需要注意以下几点:1. 引脚定义:根据具体的单片机和LCD液晶显示屏的规格书,合理选择引脚定义。
确保引脚连接正确,避免接错导致通信失败。
2. 时序要求:单片机与LCD液晶显示屏之间的通信需要遵循一定的时序要求。
在设计接口时,需根据LCD的规格书中提供的时序要求,设置单片机相应的延时时间,以保证通信稳定。
普通IO口驱动LCD
LED数码管的驱动是比较简单也容易理解的,多位数码管一般是LED阵列的形式,每个数字使用一个公共端,不同数字的对应同笔段使用一个控制端;驱动采用分时扫描没个数字位,动态显示。
但是LED比较费电,我想做一个用电池供电的钟,用发光管电池就撑不了多久了。
于是我考虑用液晶。
在这边的电子市场我买到一个4位笔段式液晶屏,4个数字最中间有冒号,边上还有几个箭头符号,一共有15个引脚,正合适用A VR来驱动做一个钟。
笔段式LCD屏的结构与LED数码管很相似,但是由于是液晶,工作机理上不同,驱动方式也有很大差异:(1) LED有正负之分,液晶笔划没有。
(2) LED在直流电压下工作,液晶需要交流电压,防止电解效应。
(3) LED需要电流提供发光的能量,液晶笔划显示状态下电流非常微弱。
(4) LED对微小电流不反应,液晶则很敏感。
不难看出,用LED的驱动方式来对待LCD屏是行不通的。
我在买回来测试这块屏之前没有意识到,于是走了不少的弯路。
与LED驱动不同的是需要给每个笔划加上一个交流电压。
一般用30-60Hz的方波就可以了,频率再低显示会有所波动,频率高了功耗也会增加,因为LCD对电路呈现容性。
而且,正负电压都可以“点亮”液晶。
好在A VR的I/O口可以三态输出,也就是除了高/低电平,还可以呈现高阻抗,相当于断开连接。
于是我想到了这样的办法:不需要显示的那一组笔划对应的公共端悬空(I/O口选择三态),那么就不会加上电压了。
照这个思路,我的实验电路焊好,出来的显示却是一团糟:笔划都黑了看不清。
我这才考虑到液晶本身的问题:阻抗高,而且有电容,是不可一边悬空的!这个道理也许跟CMOS输入端差不多。
查找了一些关于液晶的资料,大致知道LCD屏不是那么简单的,驱动方式通常是1/N, 也就是电压不止高低两档。
可是单片机I/O没有那么多输出状态可以选择。
1/2 Bias驱动不显示的液晶笔划两端电压相等,显示的不等。
这样一个要求在扫描方式下不能满足,于是改为电压等级不同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何使用普通I/O口驱动LCD一些特定环境,为了节省成本,又保证其性能。
在控制I/O口需求较少,但芯片本身的I/O口又较多的情况下,客户往往希望用普通I/O口驱动LCD显示,所以下面简单介绍一下,以供参考。
1、LCD简介:目前,市面主流LCD(液晶显示器)分成以下几大类:TN(扭曲阵列型)、STN(超扭曲阵列型)、DSTN(双层超扭曲阵列)、HPA(高性能定址或快速DSTN)、TFT(薄膜场效应晶体管)等。
由于成本因素,目前大多数采用的是TN型单色液晶显示器,它的原理是把液晶灌入两个列有细槽的平面之间。
这两个平面上的槽互相垂直(相交成90°),也就是说,若一个平面上的分子南北向排列,则另一平面上的分子东西向排列,而位于两个平面之间的分子被强迫进入一种90°扭转的状态。
由于光线顺着分子的排列方向传播,所以光线经过液晶时也被扭转90°。
当液晶上加一个电压时,分子便会重新垂直排列,使光线能直射出去,而不发生任何扭转。
LCD正是由这样两个相互垂直的极化滤光器构成的,所以在正常情况下应该阻断所有试图穿透的光线。
但是,由于两个滤光器之间充满了扭曲液晶,所以在光线穿出第一个滤光器后,会被液晶分子扭转90°,最后从第二个滤光器中穿出。
另一方面,若为液晶加一个电压,分子又会重新排列并完全平行,使光线不再扭转,所以正好被第二个滤光器挡住。
总之,加电将光线阻断,不加电则使光线射出。
LCD模型可以把其看成一个电容器,一个电极连接着公共极板,另一个连接着字符段。
LCD受电压的均方根值控制,当施加在LCD上的电压为零时,LCD呈透明状态。
当施加在字符段与公共极的电压大于LCD的阀值电压,则该字符段就显示出来。
如果用直流驱动LCD,将会引起显示单元永久性的损坏。
为了防止不可逆转的电化学反应使LCD损坏,加在所有字符段上的电压必须周期性翻转极性,以使加在字符段上的平均电压为0。
2、I/O口直接驱动LCD的实现方法下面介绍多路复用显示驱动方法。
电路图如图a所示。
在多路复用显示驱动方法中,像素被分成选通像素、非选通像素和半选通像素。
它们都被加上了一定的电压,所以引出了平均电压法。
选通像素上的电压与非选通像素上的电压比就是常说的LCD偏压比。
在动态显示时,要使LCD的某个像素实现显示,就必须循环地在该像素上用公共级扫描脉冲(COM)和段扫描脉冲(SEG)合成一个超过液晶阀值电压的工作电压(及平均电压)才能完成。
说到底,平均电压法是把半选通像素上的电压和非选通像素的电压平均化,用适度提高非选择像素的电压来抵消半选择像素的一部分电压,从而扩大选择像素与半选择像素之间电压的差距,提高显示对比度,使非选择像素和半选择像素的显示更均匀。
图a根据单片机的特性,采用1/2偏压,1/2占空比方法驱动LCD,现以COM=2,SEG=4的LCD为例:LCD屏共有8个像素,公共极有2极,字符段为4段。
公共极信号产生的波形如图b所示。
从图b可看出,公共极信号发生可分成4个阶段S0、S1、S2和S3。
S0: COM0=5V , COM1=2.5V。
S1: COM0=2.5V , COM1=5V。
S2: COM0=0V , COM1=2.5V。
S3: COM0=2.5V , COM1=0V。
图b在S0阶段,选通的像素只可能是与COM0连接的像素,并且SEG段必须为0 V,该像素才会亮。
与COM1连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM1连接的像素都不会亮。
在S1阶段,选通的像素只可能是与COM1连接的像素,并且SEG段必须为0 V,该像素才会亮。
与COM0连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM0连接的像素都不会亮。
在S2阶段,选通的像素只可能是与COM0连接的像素,并且SEG段必须为+5 V,该像素才会亮。
同时,驱动LCD 的电压极性相反,与COM1连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM1连接的像素都不会亮。
在S3阶段,选通的像素只可能是与COM1连接的像素,并且SEG段必须为+5 V,该像素才会亮。
同时,驱动LCD 的电压极性相反,与COM0连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM0连接的像素都不会亮。
3、应用说明I/O口电平的设置方法:对COM口,输出高=>输入FLOATING=>输出低,这样就得到Vdd、1/2Vdd、0Vdd 三种电压。
在LCD点亮时,对应的液晶段COM和SEG加±Vdd,LCD段就亮;加0Vdd或1/2Vdd时LCD灭。
显示时对液晶段先加+Vdd,再加-Vdd的原理可以延长LCD的使用寿命。
如果LCD玻璃是3V,则Vdd=3V; 如果LCD玻璃是5V的,则Vdd=5V。
LCD七段码对应表如表1:表14、范例程式;;========================================================= ;文件名:普通IO口驱动LCD显示.asm;母体:AM8EB056;工作频率:4MHz 2Clock;作者:Sunny;版本:1.0.0;日期:2007.02.13;备注:原理图及LCD七段码对应表分别为图a及表1;修改记录:;;=========================================================;;========================================================= ;头文件引用区;;=========================================================;;========================================================= ;特殊寄存器定义区;;========================================================= TCC EQU 0X01PCL EQU 0X02 ; 低位程序指针STATUS EQU 0X03PA EQU 0X05 ; PA口寄存器PB EQU 0x06 ; PB口寄存器FE EQU 0X0EFF EQU 0X0FRF EQU 0X0F;;========================================================= ;用户RAM定区;;========================================================= A_BUFFER EQU 0X10ST_BUFFER EQU 0X11PA_RAM EQU 0X12PB_RAM0 EQU 0X13PB_RAM1 EQU 0X14R_DIS EQU 0X15 ;字型表地址指针R_1S EQU 0X16 ;1S计时SCANTIME EQU 0X17TEMP EQU 0X18;;========================================================= ;常量定义区;;========================================================= D_1S EQU 244BITS; STATUSC EQU 0Z EQU 2;;=========================================================;用户程序区;;========================================================= ORG 0X00LGOTO STARTORG 0X08LGOTO INTERRUPT ;中断入口地址;;=========================================================;;中断服务程序: Timer0,4.1ms中断一次;;========================================================= INTERRUPT:MOVAR A_BUFFERSWAPR A_BUFFER,1SWAPR STATUS,0MOVAR ST_BUFFERT0_INTERRUPT:BTRSS RF,0LGOTO INTERRUPT_EXITINCR R_1S,1MOVIA D_1S ;1S定时SUBAR R_1S,0BTRSS STATUS,CLGOTO TX_DISCLRR R_1SLCALL REFRESH_DATA ;将'0~9'循环送显示TX_DIS:LCALL DISPLAY ;加在字符段上的电压周期性翻转极性的显示INTERRUPT_EXIT:CLRR RFSWAPR ST_BUFFER,0MOVAR STATUSSWAPR A_BUFFER,0RETIESEG7_TBL: ;字型表,依次存放字型码ADDAR PCL,1RETIA 0X3F ;字型 0RETIA 0X06 ;字型 1RETIA 0X5B ;字型 2RETIA 0X4F ;字型 3RETIA 0X66 ;字型 4RETIA 0X6D ;字型 5RETIA 0X7D ;字型 6RETIA 0X07 ;字型 7RETIA 0X7F ;字型 8RETIA 0X6F ;字型 9START:DISIMOVIA 0X73 ;PA.0,PA.1输入口IOST PAMOVIA 0X00 ;PB输出口IOST PBMOVIA 0X20IOST FECLRR RFMOVIA 0X04 ;TCC RATE 1:32T0MODECLRR TCCCLRR A_BUFFERCLRR ST_BUFFERCLRR R_DISCLRR R_1SCLRR TEMPCLRR SCANTIMECLRR PA_RAMMOVIA 0X0F ;初始化送字符'00'MOVAR PB_RAM0MOVIA 0X03MOVAR PB_RAM1MOVIA 0X01 ;使能TCC和INT中断IOST FFENI ;使能总中断MAIN:NOPNOPLGOTO MAIN;;=========================================================;函数名称:DISPLAY;函数功能:加在字符段上的电压周期性翻转极性的显示;输入参数:;输出参数:;备注:;;========================================================= DISPLAY:MOVR SCANTIME,0XORIA 0X01BTRSS STATUS,ZLGOTO DISPLAY1MOVIA 0XFE ;PA0作输出口,PA1输入FLOATINGIOST PANOPMOVR PA_RAM,0XORIA 0X01ANDIA 0X01BCR PA_RAM,0 ;PA0口状态同上一次相反BTRSS STATUS,ZBSR PA_RAM,0MOVR PA_RAM,0MOVAR PABTRSS PA_RAM,0LGOTO $+5MOVR PB_RAM0,0 ;如果PA.0为高,字段(高)取反送显示输出XORIA 0X0FMOVAR PBRETMOVR PB_RAM0,0 ;如果PA.0为低,字段(高)直接送显示输出MOVAR PBRETDISPLAY1:MOVIA 0XFD ;PA1作输出口,PA0输入FLOATINGIOST PANOPMOVR PA_RAM,0XORIA 0X02ANDIA 0X02BCR PA_RAM,1 ;PA1口状态同上一次相反BTRSS STATUS,ZBSR PA_RAM,1MOVR PA_RAM,0MOVAR PABTRSS PA_RAM,1LGOTO $+5MOVR PB_RAM1,0 ;如果PA.1为高,字段(高)取反送显示输出XORIA 0X0FMOVAR PBRETMOVR PB_RAM1,0 ;如果PA.1为低,字段(高)直接送显示输出MOVAR PBRET;;=========================================================;函数名称:REFRESH_DATA;函数功能:每隔1S 调用该函数将'0~9'循环显示;输入参数:R_DIS =字型表地址指针;输出参数:PB_RAM0,PB_RAM1字型表返回值;备注:;;========================================================= REFRESH_DATA: ;每隔1S '0~9'循环显示INCR R_DIS,1MOVR R_DIS,0SUBIA 9BTRSC STATUS,CLGOTO INDEX_DISCLRR R_DISINDEX_DIS:MOVR R_DIS,0LCALL SEG7_TBLMOVAR TEMPANDIA 0X0FMOVAR PB_RAM0SWAPR TEMP,0ANDIA 0X0F MOVAR PB_RAM1 RETEND。