IO口驱动液晶原理
单片机1602液晶显示原理

单片机1602液晶显示原理
首先,从硬件连接方面来看,单片机与1602液晶显示器之间的连接通常需要16个引脚。
这些引脚包括数据总线(D0-D7)、控制引脚(RS、RW、E)以及电源和地线。
数据总线用于传输要显示的数据,而控制引脚用于控制液晶显示器的工作状态。
单片机通过这些引脚与液晶显示器进行通信,从而实现对显示内容的控制。
其次,从工作原理方面来看,单片机控制1602液晶显示器的基本原理是利用单片机的IO口向液晶显示器发送指令和数据。
当单片机需要在液晶显示器上显示内容时,首先需要向液晶显示器发送控制指令,如清屏、定位光标等,然后再发送要显示的数据。
液晶显示器接收到指令和数据后,根据单片机发送的信号来控制液晶显示器的内部驱动电路,从而在屏幕上显示相应的内容。
总的来说,单片机1602液晶显示原理涉及到单片机与液晶显示器之间的硬件连接和通信协议。
通过单片机向液晶显示器发送指令和数据,实现对液晶显示器显示内容的控制。
这样的设计使得单片机能够方便地控制液晶显示器,实现各种复杂的显示效果。
用普通 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;*********************************************。
单片机IO口结构及工作原理

单片机IO口结构及工作原理单片机(Microcontroller Unit,MCU)的IO口是指可用来输入输出数据的引脚,在单片机系统中具有重要的作用。
本文将详细介绍单片机IO口的结构和工作原理。
一、单片机IO口的结构单片机的所有IO口都可以看作是一个通用的数字引脚。
常用的单片机IO口主要包括输入端和输出端两个部分。
1.输入端:单片机IO口的输入端包含一个输入缓冲区,用于对输入信号进行缓冲和驱动。
输入缓冲区通常由一个高阻抗的MOSFET器件构成,可以对输入信号进行放大和处理。
输入端能够接收来自外界的高电平和低电平信号,通过输入缓冲区将信号传递给单片机的内部电路。
2.输出端:单片机IO口的输出端是由一个输出缓冲器和驱动电路构成的。
输出缓冲器一般由一个强驱动能力的MOSFET器件构成,可以对输出信号进行放大和驱动。
输出端能够将单片机内部的数据通过输出缓冲器传递给外部电路,形成相应的高电平或低电平电压信号。
3. 接口电路:为了提高单片机IO口的抗干扰能力和适应外部电路的需求,通常在IO口的输入和输出端之间设置了一些接口电路,如上拉电阻(Pull-Up Resistor)和下拉电阻(Pull-Down Resistor)。
上拉电阻和下拉电阻可以对输入或输出信号进行稳定的电平处理和电流限制,使得单片机的IO口在复杂的电路环境中能够正常工作。
二、单片机IO口的工作原理单片机的IO口工作原理主要包括输入和输出两种模式。
1.输入模式:当IO口被设定为输入模式时,输入信号可以通过外部电路或者内部电路输入到IO口,并经过输入缓冲器进行电平放大和处理。
在输入模式下,可以通过软件对IO口进行设置,使其能够读取外部电路的电平状态。
通过输入模式,单片机可以读取外部的开关状态、传感器的输出以及其他的输入信号,实现数据的采集和处理。
2.输出模式:当IO口被设定为输出模式时,单片机可以将内部处理的数据通过输出缓冲器驱动外部电路。
液晶驱动板的原理是什么

液晶驱动板的原理是什么液晶驱动板是液晶显示屏的核心组件之一,用于控制每个像素的颜色和亮度,实现图像的显示。
液晶驱动板的原理主要涉及对液晶分子的定向控制和对电信号的解析和转换。
液晶分子定向控制是液晶显示原理中最基本的环节之一,液晶分子有两个主要定向状态:平行和垂直。
液晶显示屏通过对液晶分子的定向控制,来改变其对光的透过性从而实现图像的显示。
液晶分子的定向控制由液晶驱动板上的液晶导向层完成,液晶导向层将涂覆在透明导电层上,通过施加电压来改变导向层的分子排列状态,进而改变液晶分子的定向状态。
液晶驱动板的另一个主要功能是对电信号的解析和转换。
液晶显示屏上的每个像素都由一个液晶分子和一个透明导电层组成,通过液晶驱动板上的解码和转换电路,将输入的视频信号经过解析和转换后,将相应的电压信号传输到对应的像素点上,控制液晶分子的定向状态,进而改变液晶的透光性,最终显示出高质量的图像。
液晶驱动板的输入信号包括视频信号源(如电视、电脑等)和控制信号源(如遥控器、触摸屏等)。
首先,视频信号源会将信号传输至液晶驱动板上的解码电路进行解析,解析出视频信号的各个分量,如亮度、色度等。
解码电路会对这些分量进行处理,如增益调整、去噪等,以提高图像质量。
在解析和处理完成后,液晶驱动板上的转换电路会将信号转换为适合液晶屏的电压信号,以控制液晶分子的定向状态。
转换电路中的主要元件是继电器、变压器、电容和晶体管等。
继电器负责将处理好的信号分配给相应的像素点,变压器用于调整电压的大小,电容用于存储电荷,晶体管则用于控制电压信号的开关。
通过液晶驱动板的控制,液晶显示屏上的每个像素点就可以根据输入信号的不同显示出相应的颜色和亮度。
液晶驱动板上的电路设计和布线都需要符合液晶分子的特性和工作要求,以确保图像的清晰度、色彩还原度和亮度均衡性等,从而提供给用户良好的视觉体验。
总之,液晶驱动板通过对液晶分子的定向控制和对电信号的解析和转换,实现对液晶显示屏的图像显示控制。
51单片机io口输出低电平,但接了lcd后变成高电平

51单片机io口输出低电平,但接了lcd后变成高电平1.引言1.1 概述概述部分的内容可以如下所示:在当前的电子设备应用中,单片机(Microcontroller)作为一种常见的电子控制器件,被广泛应用于各个领域。
而51单片机作为一种经典的单片机系列,也被广泛使用。
在使用51单片机进行控制时,IO口的控制是必不可少的一部分。
然而,在实际应用中,有时我们会遇到一些奇怪的问题。
比如,当我们将51单片机的IO口设置为输出低电平时,但是当我们接上LCD液晶显示屏之后,电平却变成了高电平,这究竟是为什么呢?本文将会对这个问题进行深入的探讨和分析。
首先,我们将介绍51单片机的IO口输出低电平的原理和应用场景。
然后,我们将会详细讨论当我们接上LCD液晶显示屏后,为什么IO口的电平会发生变化,其原因是什么。
通过本文的研究和分析,我们旨在帮助读者更好地理解51单片机的IO口输出低电平和LCD接口之间的关系,并引导读者解决此类问题时采取合适的措施。
接下来,我们将会从两个方面展开讨论。
首先,我们将介绍51单片机IO口输出低电平的基本原理和相关知识。
随后,我们将探讨当我们接上LCD液晶显示屏后,为什么IO口的电平会变为高电平。
通过本文的研究和分析,我们旨在帮助读者更好地理解这个问题,并提供一些解决方案,从而使读者能够更加顺利地进行51单片机与LCD液晶显示屏的接口设计和开发工作。
欢迎阅读本文,希望能为您带来有益的信息和启发。
1.2文章结构文章结构部分的内容可以包括以下内容:在本文中,将按照以下结构来描述和分析51单片机IO口输出低电平接上LCD后电平变高的现象。
首先,将在引言部分概述本文的主题和目的。
接下来,在正文部分,将详细介绍和解释51单片机IO口输出低电平的原理和机制,并通过实例来说明。
然后,将进一步探讨接上LCD后电平变高的原因,包括可能存在的电路连接问题和信号干扰等因素。
最后,在结论部分将总结全文的主要观点和结论,并进行结果分析和讨论。
IO口工作原理

IO口工作原理
IO口是Input/Output口的简称,它是计算机与外部设备进行通信的接口。
IO口的工作原理是通过发送和接收电信号来实现数据的输入和输出。
对于输入操作,当外部设备需要将数据输入到计算机时,它会发送一个电信号到计算机的IO口。
计算机通过IO口接收到电信号后,会将其转换成数字信号,然后传递给相应的输入设备驱动程序进行处理和解析。
最终,输入设备驱动程序会将数据传递给操作系统,供应用程序进行处理和使用。
对于输出操作,当计算机需要将数据输出到外部设备时,它会将数字信号传递给相应的输出设备驱动程序。
输出设备驱动程序会将数字信号转换成相应的电信号,并通过IO口发送到外部设备上。
外部设备接收到电信号后,会进行相应的处理,从而实现数据的输出。
IO口的工作原理实质上是通过控制和传递电信号来实现数据输入和输出。
计算机通过IO口与外部设备进行通信,从而实现数据的交互和传输。
这样,用户就可以通过外部设备与计算机进行交互,实现各种功能和操作。
io驱动数码管原理

驱动数码管显示的原理通常涉及到单片机IO口输出控制和数码管的内部结构。
数码管的基本结构:
数码管(LED或LCD)由多个发光二极管(对于LED 数码管)或者液晶段组成,这些发光单元按照特定排列形成0-9的数字以及其他字符形状。
常见的7段数码管有8个引脚:7个段选(a-g)对应7个不同的发光段,以及1个公共端(Common Anode或Common Cathode)。
共阴极数码管驱动原理:
在共阴极数码管中,所有段的阴极连接在一起作为公共地线(公共端接地),而每个段的阳极为独立控制的输入端,分别与单片机的IO口相连。
要让数码管显示某个数字或字符,就需要通过单片机对应的IO口送出低电平信号给需要点亮的段选,同时公共端接高电平(+5V或其他工作电压)。
这样,相应的段就会被点亮,组合成所需的数字或字符。
共阳极数码管驱动原理:
而在共阳极数码管中,公共端为正极,各个段的阴极
为独立控制的输入端,当要点亮某个段时,其对应的IO口送出高电平,而公共端则提供电源电流,未被点亮的段对应的IO口保持低电平,不导通电流。
动态扫描方式:
为了节省单片机的IO资源,实际应用中常采用动态扫描的方式驱动多位数码管。
例如4位数码管仅使用8个IO口进行轮流点亮,通过快速循环刷新各位置的显示数据,利用人眼视觉暂留效应实现多位数码管的同时显示效果。
总结来说,单片机通过IO口对数码管的段选进行高低电平切换,配合公共端的电平控制,以达到选择性点亮数码管内部不同发光段的目的,从而显示出预设的数字、字母或者其他符号。
io驱动实验原理

在计算机科学和软件工程领域,"IO" 通常指的是输入输出,而"IO驱动实验" 可能指的是通过使用输入输出驱动程序进行实验。
然而,具体的"IO驱动实验" 可能取决于上下文和特定的实验目标。
以下是一些可能涉及的原理:
1. 输入输出驱动程序:许多计算机系统需要设备驱动程序来管理和控制输入和输出设备,例如键盘、鼠标、显示器、打印机等。
IO驱动实验可能涉及编写、测试和调试这些驱动程序,以确保它们能够正确地与硬件通信。
2. 底层硬件交互:IO驱动实验可能包括与硬件进行底层交互,这可能涉及到硬件寄存器的读写、中断处理等。
了解硬件与驱动程序之间的交互原理对于实验是至关重要的。
3. 中断处理:许多输入输出设备使用中断来通知计算机系统发生了某些事件,例如按键、鼠标移动等。
IO驱动实验可能包括中断处理程序的编写和测试,以确保在发生事件时能够正确地响应。
4. 设备管理:IO驱动实验可能要求对设备进行管理,包括设备的初始化、关闭、状态监测等。
这涉及到对设备的规范和文档的理解。
5. 驱动程序性能优化:高效的IO驱动程序对于系统性能至关重要。
IO驱动实验可能包括对驱动程序性能进行优化的实践,以确保系统能够在输入输出负载下保持高效运行。
6. 错误处理和容错:IO驱动实验可能要求实现良好的错误处理机制和容错机制,以应对设备可能出现的问题和异常情况。
总的来说,IO驱动实验通常涉及到理解计算机系统和硬件交互的原理,编写底层驱动程序,进行测试和调试,以确保系统能够正确、高效地与各种输入输出设备进行交互。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GND
北京中显电子有限公司
SEG2: V+
3/4
----------------
1/2
1/4 --------
---------
GND
实 际 做 法 就 是 SEGx 输 出 有 两 种 :
3/4*Vcc 和 1/4*Vcc, 而 COMy 输 出 有 三 种 :
Vcc, GND, 1/2*Vcc. 对于每个 I/O 口,并不需要 4 种电压输出。当
跟前面的例子分析对比看出,从 1/2 分时扫描变到 1/4 分时扫
描,显出来的笔段和不显的笔段上,电压产生平均功率的对比
从 5:1 变到 7:3 了。于是尝试从软件上改变扫描时序,也不能改进
显示效果,看来 1/2 Bias 不够用的了。
于是查询了 Nokia 3310 液晶手册其中对于 LCD 电压输出时序的
28DIP 的封装,看上去正合适。暂时不知道价格,于是先找来它的手
册看看。详细看了 LCD 驱动模块的部分,发现 PIC16F913 也只有
1/2 Bias 驱动和 1/3 Bias 驱动两种选项,分时最多为 1/4 分时驱动,
对于手里的屏正好。
1/3 Bias 驱动需要将 Vcc--GND 之间的电压三等分,一个周期驱
的 1/2 Bias 驱动。但是注意到要提供一个一半电源电压也不是难事,
既然 AVR I/O 口可以三态,可以用两个电阻分压将端口“拉”到
1/2 Vcc 就好了,于是,1/2 Bias 驱动的做法可以这样:
Vcc
|
[]
[ ] 1Meg
[]
|
Port pin-----+------------ to LCD COMx
sts TCCR2A, r16
; CTC mode
ldi r16, 31
sts OCR2A, r16 ; preset compare A
然这样跟 1/3 Bias 驱动是不一样的,但是却达到了 1/3 Bias 驱动
的效果,只不过加在液晶笔段上的电压绝对值最大不是 Vcc 而
是 3/4*Vcc 了,因此电源电压也需要提高。这里计算省略。
这种驱动方式称之为 "伪 1/3 Bias 驱动". 对于 COMy 的处理
和 前 面 一 样 , 对 于 SEGx, 将 I/O 输 出 电 压 改 变 一 下 , 高 电 平
久了。于是考虑用液晶。
现有一个 4 位笔段式液晶屏,4 个数字最中间有冒号,边上还有
几个箭头符号,一共有 15 个引脚,正合适用 AVR 来驱动做一个钟。
笔段式 LCD 屏的结构与 LED 数码管很相似,但是由于是液晶,工
作机理上不同,驱动方式也有很大差异:
(1) LED 有正负之分,液晶笔划没有。
(2) LED 在直流电压下工作,液晶需要交流电压,防止电解效应。
(3) LED 需要电流提供发光的能量,液晶笔划显示状态下电流非
常微弱。
(4) LED 对微小电流不反应,液晶则很敏感。
不难看出,用 LED 的驱动方式来对待 LCD 屏是行不通的。一般人
在买回来测试这块液晶屏之前没有意识到,于是走了不少的弯路。与
动波形示例如下:
COM1: V+
--------
2/3
--------
1/3
北京中显电子有限公司
--------
GND --------
COM2: V+
--------
2/3 --------
1/3
--------
GND
--------
SEG1: V+ --------
2/3
COM1: V+
--------
3/4
1/2
--------
--------
1/4
GND --------
COM2: V+
--------
3/4
1/2 --------
--------
1/4
GND
--------
SEG1: V+
3/4 --------
---------
1/2
1/4
----------------
北京中显电子有限公司
直接用单片机驱动 LCD,以求省电省钱
北京中显电子有限公司诚意奉献
LED 数码管的驱动是比较简单也容易理解的,多位数码管一般是
LED 阵列的形式,每个数字使用一个公共端,不同数字的对应同笔段
使用一个控制端;驱动采用分时扫描没个数字位,动态显示。但是
LED 比较费电,想做一个用电池供电的钟,用发光管电池就撑不了多
北京中显电子有限公司
以呈现高阻抗,相当于断开连接。于是想到了这样的办法:不需要显
示的那一组笔划对应的公共端悬空(I/O 口选择三态),那么就不会加
上电压了。照这个思路,把实验电路焊好,出来的显示却是一团糟:
笔划都黑了看不清。于是考虑到液晶本身的问题:阻抗高,而且有电
容,是不可一边悬空的!这个道理也许跟 CMOS 输入端差不多。查找
--------
1/3
--------
GND
--------
SEG2: V+
--------
2/3
--------
1/3 --------
GND
--------
在 (COM1,SEG1) 笔段上,电压为 +1, -1/3, -1, +1/3 ... 在
(COM1,SEG2) 上 为 +1/3, +1/3, -1/3, -1/3 ... 在 (COM2,SEG1)
|
[]
[ ] 1Meg
[]
|
GND
北京中显电子有限公司
取电阻 1Meg 是综合耗电与分压效果考虑的。这样在 COMx 就可 以产生三种电压值,就达到了 1/2 Bias 动态驱动的目的。实现起来 在前面的基础上增加电阻即可,我的屏有 4 个公共端,因此用了 8 个 电阻,数字就能够显示出来了。
虽然显示的确做到了,然而效果却不能让人满意。具体表现就是 需要正对着 LCD 屏看才是很清晰的;如果斜着看,就可能一片混浊了, 没有达到实用。用 2 节 Ni-MH 供电时候正着看没问题,用 2 节干电池 (电压提高一点)就不是很清晰了。如前面的分析,那些没有被选择的 笔段其实也加上了变化的电压,只不过与选择的比段相比电压平均有 效值低一些。这两个的差异足够显著,才能保证显示效果。
上 : +1/3, +1/3, -1/3, -1/3 ... 在 (COM2,SEG2) 上 :
-1/3, +1, +1/3, -1 ...
于 是 计 算 平 均 功 率 , 在 (COM1,SEG1) 和 (COM2,SEG2) 上 面
是 2*1^2+2*(1/3)^2=20/9 在 (COM1,SEG2) 和 (COM2,SEG1) 上 面
3/4*Vcc, 低电平 1/4*Vcc 就好了。具体做法是:
/-------------- I/O Port pin
|
[]
[ ] 1Meg
[]
|
to LCD SEGx --------------+
|
北京中显电子有限公司
[]
[ ] 1Meg
[]
|
|
1/2 Vcc
这里的 1/2 Vcc 可以将电源电压用电阻分压得到,想的办法是
SEG2 V+ ----
--------
----
1/2
北京中显电子有限公司
GND
--------
--------
如 此 , 在 COM1,SEG1 选 择 的 笔 划 上 , 加 上 的 电 压
为 -1/2, -1, +1/2, +1 ... 在 COM1,SEG2 选择的笔划上,加上的
了一些关于液晶的资料,大致知道 LCD 屏不是那么简单的,驱动方式
通常是 1/N(占空比), 也就是电压不止高低两档。可是单片机 I/O
没有那么多输出状态可以选择。
1/2 Bias 驱动
不显示的液晶笔划两端电压相等,显示的不等。这样一个要求在
扫描方式下不能满足,于是改为电压等级不同。1/2 Bias 驱动就是
个比值从 7:3 改善为 3:1 了。既然 PIC16F913 只设计了 1/2 Bias
与 1/3 Bias,用起来应该问题不大。
AVR 单个 I/O 口要实现 4 种电压输出——不可能吧,总之是想不
出来了。AVR 最多只有三种电压输出,能不能对这个电压再做等分呢?
一番思索之后决定就 4 等分吧.
北京中显电子有限公司
再分析 1/2 Bais 驱动在 LCD 屏上 1/4 分时扫描的结果:一个
周期内,“点亮”的笔段平均功率
=1^2+(1/2)^2+(1/2)^2+(1/2)^2=7/4, 而没有被“点亮”的笔段为
=0+(1/2)^2+(1/2)^2+(1/2)^2=3/4, 两者之比 7:3
描述。恰好里面有一个图,绘出了行和列控制线上的波形。从坐标轴
上看出 Vlcd 和 Vss 之间另外还有 4 个电压等级。这么多种电压用
AVR I/O 实现已经不现实了。
于 是 再 考 虑 选 用 带 有 LCD 驱 动 功 能 的 MCU, AVR 只 有 一 款
ATmega169, 封装形式不适合 DIY。Microchip 有一款 PIC16F913, 有
.DB 0b11111101, 0b11111001