用IO直接驱动LCD的方法
- 格式:pdf
- 大小:372.48 KB
- 文档页数:15
用普通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;*********************************************。
51单片机任意2个IO口驱动LCD1602相信大家对1602显示屏已经十分熟悉,驱动方式有8线制(需要11根线)和4线制(需要7根线),这里为大家推荐一种只需要2根线就能驱动1602的方法。
之前在网上见到Arduino通过IIC驱动1602的实例,本人完全不懂Arduino程序,看了一下驱动电路,发现PCF8574这个关键芯片,它就相当于一个桥梁,将IIC总线转换为8位准双向口。
思路1、单片机通过IIC与PCF8574进行通信。
首先写好IIC通信程序,网上到处都是IIC通信程序,很容易找。
PCF8574 的器件地址为40h,由于硬件地址引脚A0-A2可寻址8 个器件,所以器件地址并不唯一,具体说明大家去查查PCF8574芯片手册。
2、单片机4线制驱动1602网上也有很多相关程序,我就不再多说。
4线制驱动方式需要7个IO口(RS、RW、E 和4条数据线),而PCF8574提供了8位准双向口,所以管脚还有剩余。
3、IIC通信程序和1602的4线制驱动程序相结合4、51单片机任意2个IO口驱动1602成功!!!。
(我只是个业余爱好者,要是各位觉得太低端那就见谅了)驱动电路图效果图实物图Proteus仿真程序#include <reg52.h>#include <intrins.h>sbit SCL = P3^0;sbit SDA = P3^1;bit ack;unsigned char LCD_data;unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字//*****************延时************************void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)_nop_();}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i,j;for (i=0;i<n;i++)for (j=0;j<1140;j++);}void nop4(){_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期}//***************************************void Start(){SDA=1;_nop_();SCL=1;nop4();SDA=0;nop4();SCL=0;_nop_();_nop_();}void Stop(){SDA=0;_nop_();SCL=0;nop4();//>4us后SCL跳变SCL=1;nop4();SDA=1;_nop_();_nop_();}//******************************************void Write_A_Byte(unsigned char c){unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<BitCnt)&0x80) SDA=1; //判断发送位else SDA=0;_nop_();SCL=1; //置时钟线为高,通知被控器开始接收数据位nop4();_nop_();SCL=0;}_nop_();_nop_();SDA=1; //8位发送完后释放数据线,准备接收应答位_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0;else ack=1; //判断是否接收到应答信号SCL=0;_nop_();_nop_();}bit Write_Random_Address_Byte(unsigned char add,unsigned char dat){Start(); //启动总线Write_A_Byte(add); //发送器件地址if(ack==0)return(0);Write_A_Byte(dat); //发送数据if(ack==0)return(0);Stop(); //结束总线return(1);}//********************液晶屏使能*********************void Enable_LCD_write(){LCD_data|=(1<<(3-1));//E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data&=~(1<<(3-1));//E=0;Write_Random_Address_Byte(0x40,LCD_data);}//*************写命令****************************void LCD_write_command(unsigned char command){delay_nus(16);LCD_data&=~(1<<(1-1));//RS=0;LCD_data&=~(1<<(2-1));//RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data&=0X0f; //清高四位LCD_data|=command & 0xf0; //写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();command=command<<4; //低四位移到高四位LCD_data&=0x0f; //清高四位LCD_data|=command&0xf0; //写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();}//*************写数据****************************void LCD_write_data(unsigned char value){delay_nus(16);LCD_data|=(1<<(1-1));//RS=1;LCD_data&=~(1<<(2-1));//RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data&=0X0f; //清高四位LCD_data|=value&0xf0; //写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();value=value<<4; //低四位移到高四位LCD_data&=0x0f; //清高四位LCD_data|=value&0xf0; //写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();}//**********************设置显示位置********************************* void set_position(unsigned char x,unsigned char y){unsigned char position;if (y == 0)position = 0x80 + x;elseposition = 0xc0 + x;LCD_write_command(position);}//**********************显示字符串*****************************void display_string(unsigned char x,unsigned char y,unsigned char *s){set_position(x,y);while (*s){LCD_write_data(*s);s++;}}//*************液晶初始化****************************void LCD_init(void){LCD_write_command(0x28);delay_nus(40);LCD_write_command(0x28);delay_nus(40);Enable_LCD_write();delay_nus(40);LCD_write_command(0x28); //4位显示!!!!!!!!!!!!!!!!!!LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(2);}void main(void){LCD_init();display_string(4,0,"imxuheng"); //显示一段文字display_string(2,1,"Hello Today!"); //显示一段文字while(1);}程序还不够完美,自身工作与电学没什么关系,只是业余爱好鼓捣鼓捣,希望各位能够提出修改意见。
如何使用普通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的实现方法下面介绍多路复用显示驱动方法。
LCD 原理及驱动方法简介1、LCD 显示器原理LCD 是一种被动式显示器,其本身不发光,只是调节光的亮度。
LCD 利用液晶的扭曲-向列效应制成,这是一种电场效应,夹在两片导电玻璃电极间的液晶经过一定的处理,它内部的分子呈90°的扭曲,当线性偏振光透过时其偏振面便会旋转90。
当在玻璃电极上加上电压后,在电场作用上,液晶的扭曲结构消失,其旋光作用也消失,偏振光便可直接通过。
当去掉电场后,液晶分子又恢复其扭曲结构。
把这样的液晶置于两偏振片之间,改变偏振相对位置就可得到字的显示形式。
LCD 七段显示器有a~g 七段外,还有一个公共极COM 。
可用静态方式驱动,也可用动态方式驱动。
前者加直流信号,后者加交流信号。
今天所讲的LCD 驱动也是用动态方式驱动的。
当加在a~g 七段中的某一电极的方波与公共电极COM 上的方波信号同相时,相对电压为0,则该段不显示;当加在某段电极上的方波与公共电极COM 的非选通点上加只有选通点电压的少交叉效应的影响,这就是上面仅仅是COM口的驱动波形,那么SEG口的驱动波形又是怎样的呢?对应上面的6个时段,在COM口为高电平时,如果该段需要显示,则对应的SEG口输出低电平;反之,则输出高电平。
根据同LED的有关段显示的规则,得出如下表所示的段码表。
段码表:L C D码表(4位半-18.8.8.8)com1 seg1com2seg2c o m3s e g3com1seg4com2seg5c o m3s e g6digit f a b e g c dp d s f a b e g c d dp s 0000010101111101100 1110110111001001000 2100001101011110100 3100100101011011100 40101001111010110005001100101110011100 6001000101110111100 7100110111011001000 8000000101111111100 9000100101111011100a000000111111111000b011000101100111100c001011101110110100d110000101001111100e111111111000000000不显示f111101111000010000显示“-”3、程式流程图如下图所示:4、程式如下1;title:通用I/O口驱动LCD范例程式2;MCU:EM78P447BS,clock:2,crystal:4MHz3;LCD规格:1/2Bias,1/3duty4;writer:RenBin5;date:2005-5-2311:276;*****************************************************************7;程式说明:本程式是用通用I/O口驱动LCD的程式,用一个I/O口作COM口及SEG口8;9;-------------------10;port611;port64com112;port65com213;port66com314;port515;port504b/4c16;port514a/4g/4d17;port524f/4e/dp318;port543b/3c/s219;port553a/3g/3d20;port563f/3e/dp221;port722;port702b/2c/s123;port712a/2g/2d24;port722f/2e/dp125;port741b/1c/1h26;port751a/1g/1d27;port761f/1e28;---------------------------------29include<em78p447.inc>1C;*****************************************************;2C;Tilte:EM78447include file;3C;Description:The Definition of EM78x447Registers;4C;Company:ELAN MICROELECTRONICS(SZ)LTD.;5C;Author:YouFang.Bao;6C;Date:5/14/2004;7C;Version:v1.0;8C;******************************************************;9C;10C;======================================================;11C;Operational Registers Define;12C;======================================================;13C;14C;======================================================;15C;Registers R0~R3F;16C;======================================================;17C;18C;R0/IAR:Indirect Address Register19C;200000C R0==0x00210000C IAR==0x0022C;23C;R1/TCC:Time Clock/Counter24C;250001C R1==0x01260001C TCC==0x01270001C RTCC==0x0128C;29C;R2/PC:Program Counter&Stack30C;310002C R2==0x02320002C PC==0x0233C;34C;R3/PSR:Process Status Register35C;360003C R3==0x03370003C PSR==0x03380003C STATUS==0x0339C;{400007C GP==0x07;General read/write bit410006C PS1==0x06;420005C PS0==0x05;(PS0~PS1):Page Select Bits43C;----------------------------------------;44C;PS1PS0Program memory page [Address];45C;00Page0[000-3FF];46C;01Page1[400-7FF];47C;10Page2[800-BFF];48C;11Page3[C00-FFF];49C;----------------------------------------;500004C T==0x04;Time-out bit510003C P==0x03;Power down bit520002C Z==0x02;Zero flag530001C DC==0x01;Auxiliary carry flag540000C C==0x00;Carry flag550000C cy==056C;57C;R4/RSR:RAM Select Register58C;590004C R4==0x04600004C RSR==0x0461C;{620007C RS1==0x07;RAM-Bank Select Bit1630006C RS0==0x06;RAM-Bank Select Bit064C;65C;R5~R7:I/O Port Address66C;670005C PORT5==0x05680006C PORT6==0x06690007C PORT7==0x0770C;710005C P5==0x05720006C P6==0x06730007C P7==0x0774C;750005C R5==0x05760006C R6==0x06770007C R7==0x0778C;79C;R3F/ISR:Interrupt Status Register80C;81003F C R3F==0x3F82003F C ISR==0x3F83C;{840003C EXIF==0x03;External interrupt flag850000C TCIF==0x00;TCC overflow interrupt flag86C870008C mEXIF==0x08;External interrupt flag880001C mTCIF==0x01;TCC overflow interupt flag89C;}90C;91C;92C;======================================================; 93C;Special Purpose Registers Define;94C;======================================================;95C;96C;IOC5~IOC7:I/O Port Control Register97C;980005C IOC5==0x05;Bit[n]=1,Set P5[n]as input pin,n=0~7 99C;Bit[n]=0,Set P5[n]as output pin, n=0~7100C;1010006C IOC6==0x06;Bit[n]=1,Set P6[n]as input pin, n=0~7102C;Bit[n]=0,Set P6[n]as output pin, n=0~7103C;1040007C IOC7==0x07;Bit[n]=1,Set P7[n]as input pin, n=0~7105C;Bit[n]=0,Set P7[n]as output pin, n=0~7106C;107C;108C;IOCB/WCR:Wake-up Control Register for PORT6109C;110000B C IOCB==0x0B111000B C WCR==0x0B112C;{1130007C WUE7==0x07;Control bit is used to enable the wake-up function of P67pin1140006C WUE6==0x06;Control bit is used to enable the wake-up function of P66pin1150005C WUE5==0x05;Control bit is used to enable the wake-up function of P65pin1160004C WUE4==0x04;Control bit is used to enable the wake-up function of P64pin1170003C WUE3==0x03;Control bit is used to enable the wake-up function of P63pin1180002C WUE2==0x02;Control bit is used to enable the wake-up function of P62pin1190001C WUE1==0x01;Control bit is used to enable the wake-up function of P61pin1200000C WUE0==0x00;Control bit is used to enable the wake-up function of P60pin121C;0:Enable internal wake-up122C;1:Disable internal wake-up123C;124C;IOCE/WDTCON:WDT Control Register125C;126000E C IOCE==0x0E127000E C WDTCON==0x0E128C;129C;IOCF/IMR:Interrupt Mask Register130C;131000F C IOCF==0x0F132000F C IMR==0x0F133C;{1340008C mEXIE==0x08;EXIF Interrupt enable bit135C;0:Disable EXIF interrupt136C;1:Enable EXIF interrupt 1370001C mTCIE==0x01;TCIF Interrupt enable bit138C;0:Disable TCC interrupt139C;1:Enable TCC interrupt140C;141C;======================================================; 142C;Others Define;143C;======================================================; 144C;145C;Bit set use BC or BS146C;1470000C B0==0x001480001C B1==0x011490002C B2==0x021500003C B3==0x031510004C B4==0x041520005C B5==0x051530006C B6==0x061540007C B7==0x07155C;======================================================; 156C;Macros Define;157C;======================================================; 158C;----------------------------159C;160C Page0MACRO161C;162C BC PSR,PS0163C BC PSR,PS1164C;165C ENDM166C;167C;----------------------------168C;169C Page1MACRO170C;171C BS PSR,PS0 172C BC PSR,PS1 173C;174C ENDM175C;176C;----------------------------177C;178C Page2MACRO179C;180C BC PSR,PS0 181C BS PSR,PS1 182C;183C ENDM184C;185C;----------------------------186C;187C Page3MACRO188C;189C BS PSR,PS0 190C BS PSR,PS1 191C;192C ENDM193C;194C;----------------------------195C;196C Bank0MACRO197C;198C BC RSR,RS0 199C BC RSR,RS1 200C;201C ENDM202C;203C;----------------------------204C;205C Bank1MACRO206C;207C BS RSR,RS0208C BC RSR,RS1209C;210C ENDM211C;212C;----------------------------213C;214C Bank2MACRO215C;216C BC RSR,RS0217C BS RSR,RS1218C;219C ENDM220C;221C;----------------------------222C;223C Bank3MACRO224C;225C BS RSR,RS0226C BS RSR,RS1227C;228C ENDM229C;----------------------------230C;231C;************************************************; 232C;Clear EM78P447General Register Macro Program; 233C;; 234C;************************************************; 235C;236C m447clrrambank macro237C;238C mov a,@0x10239C mov rsr,a240C$_Clrloop:241C clr r0242C inc rsr243C jbc rsr,6244C bs rsr,5245C jbc rsr,7246C bs rsr,5247C jbs status,z248C jmp$_clrloop249C endm30include"e:\lcd\lcddriverram.inc"1C;title:lcddriver register define2C;mcu:em78p447sb3C;---------------------------------------4C;50010C reg_acc1==0x1060011C reg_acc2==0x1170012C reg_acc3==0x1280017C temp_value==0x17;温度寄存器90019C humi_value==0x19;湿度寄存器10001B C sysstatus==0x1b;标志寄存器11C;--------------------------------------12C;bank1130020C mstimer==0x20140021C stimerlow==0x21150022C stimerhigh==0x22160023C cont==0x2317C;180024C commondata==0x24;common数据寄存器190025C segdata==0x25;segment数据寄存器20C;210026C temp1==0x26;中间变量寄存器220027C temp2==0x27;中间变量寄存器230028C temp3==0x28;中间变量寄存器240029C temp4==0x2925C;26002A C tempL==0x2a;温度bcd码低位寄存器27002B C tempH==0x2b;高位28002C C humiL==0x2c;湿度bcd低位码寄存器29002D C humih==0x2d;高位30C;31002E C timer05s==0x2e;0.5s寄存器32C;temp_value==0x2f;分钟寄存器33C;humi_value==0x30;小时寄存器34C;---------------------------------------------35C;register bit define36C;sysstatus register define370003C timer500ms==3;500ms标志380004C LCDdsp==4;LCD显示标志390005C datachange==5;数据更新标志400006C timer==6;定时标志410007C am==7;上下午标志42C;常数定义4300B2C tcc_5ms==178;tcc5ms timer4400C8C kmstimer==200;1000ms timer45000C C segment==12;define LCD segment data 460002C duty==2470003C common==3;2;define LCD common data 480002C bias==231;32org0xfff3300FFF0000nop34org035000001408jmp start36org137000010000nop3800002083F bc r3f,tcif39000030B1B bs sysstatus,lcddsp40000040B9B bs sysstatus,timer41000051886mov a,@(256-122)42000060041mov tcc,a43000070013reti4400008start:45M m447clrrambank;清寄存器0000818101MOV A,@(16)0000900441MOV RSR,A0000A1??0001$_CLRLOOP:0000A00C01CLR R0,0000B05441INC RSR,0000C0D841JBC RSR,60000D0B441BS RSR,50000E0DC41JBC RSR,70000F0B441BS RSR,5000100E831JBS STATUS,Z00011140A1JMP??0001$_CLRLOOP,46000121800mov a,@0x047000130045mov port5,a48000141800mov a,@0x049000150005iow ioc550;51000161800mov a,@0x052000170046mov p6,a53000181800mov a,@0x054000190006iow ioc655;560001A1800mov a,@0x0570001B0047mov p7,a580001C1800mov a,@0x0590001D0007iow ioc760;610001E1804mov a,@0b00000100;TCC=1:32,4.096ms 620001F0002contw63000201811mov a,@0x116400021000E iow ioce65000221801mov a,@0x016600023000F iow iocf67000241886mov a,@(256-122)68000250041mov tcc,a69;7000026183F mov a,@63;12;59;11;88;00;88;2371000270057mov temp_value,a7200028184A mov a,@74;34;11;11;88;00;88;30 73000290059mov humi_value,a;74;750002A1806mov a,@(common*2)760002B0064mov commondata,a770002C0010eni78;****************************************7980;****************************************810002D main:820002D0004wdtc830002E1096call lcddisplay840002F142D jmp main85;**************************************** 8600030LCD1_table:;段码表87000300020TBL88000311C00RETL@0B00000000;089000321C06RETL@0B00000110;190000331C04RETL@0B00000100;2 91000341C04RETL@0B00000100;3 92000351C02RETL@0B00000010;4 93000361C01RETL@0B00000001;5 94000371C01RETL@0B00000001;6 95000381C04RETL@0B00000100;7 96000391C00RETL@0B00000000;8 970003A1C00RETL@0B00000000;9 98;990003B1C00RETL@0B00000000;A 1000003C1C03RETL@0B00000011;b 1010003D1C01RETL@0B00000001;c 1020003E1C06RETL@0B00000110;d 1030003F1C01RETL@0B00000001;E 104000401C0F RETL@0B00001111;F105106;--------------------------------------------------------------10700041LCD2_table:108000410020TBL109000421C02RETL@0B00000010;0 110000431C06RETL@0B00000110;1 111000441C01RETL@0B00000001;2 112000451C04RETL@0B00000100;3 113000461C04RETL@0B00000100;4 114000471C04RETL@0B00000100;5 115000481C00RETL@0B00000000;6 116000491C06RETL@0B00000110;7 1170004A1C00RETL@0B00000000;8 1180004B1C04RETL@0B00000100;9 119;1200004C1C00RETL@0B00000000;A 1210004D1C00RETL@0B00000000;b 1220004E1C03RETL@0B00000011;c 1230004F1C00RETL@0B00000000;d 124000501C01RETL@0B00000001;E 125000511C05RETL@0B00000101;F 126;--------------------------------------------------------------12700052LCD3_table:128000520020TBL129000531C05RETL@0B00000101;0 130000541C07RETL@0B00000111;1131000551C05RETL@0B00000101;2 132000561C05RETL@0B00000101;3 133000571C07RETL@0B00000111;4 134000581C05RETL@0B00000101;5 135000591C05RETL@0B00000101;6 1360005A1C07RETL@0B00000111;7 1370005B1C05RETL@0B00000101;8 1380005C1C05RETL@0B00000101;9 139;1400005D1C07RETL@0B00000111;A 1410005E1C05RETL@0B00000101;b 1420005F1C05RETL@0B00000101;c 143000601C05RETL@0B00000101;d 144000611C05RETL@0B00000101;E 145000621C07RETL@0B00000111;F 146;--------------------------------------------------------------14700063LCD4_table:148000630020TBL149000641C07RETL@0B00000111;0 150000651C01RETL@0B00000001;1 151000661C03RETL@0B00000011;2 152000671C03RETL@0B00000011;3 153000681C05RETL@0B00000101;4 154000691C06RETL@0B00000110;5 1550006A1C06RETL@0B00000110;6 1560006B1C03RETL@0B00000011;7 1570006C1C07RETL@0B00000111;8 1580006D1C07RETL@0B00000111;9 159;1600006E1C07RETL@0B00000111;A 1610006F1C04RETL@0B00000100;b 162000701C06RETL@0B00000110;c 163000711C01RETL@0B00000001;d 164000721C06RETL@0B00000110;E 165000731C00RETL@0B00000000;F 166;------------------------------------16700074LCD5_table:168000740020TBL169000751C05RETL@0B00000101;0 170000761C01RETL@0B00000001;1 171000771C06RETL@0B00000110;2172000781C03RETL@0B00000011;3 173000791C03RETL@0B00000011;4 1740007A1C03RETL@0B00000011;5 1750007B1C07RETL@0B00000111;6 1760007C1C01RETL@0B00000001;7 1770007D1C07RETL@0B00000111;8 1780007E1C03RETL@0B00000011;9179;1800007F1C07RETL@0B00000111;A 181000801C07RETL@0B00000111;b 182000811C04RETL@0B00000100;c 183000821C07RETL@0B00000111;d 184000831C06RETL@0B00000110;E 185000841C06RETL@0B00000110;F186;---------------------------------------------18700085LCD6_table:188000850020TBL189000861C02RETL@0B00000010;0 190000871C00RETL@0B00000000;1 191000881C02RETL@0B00000010;2 192000891C02RETL@0B00000010;3 1930008A1C00RETL@0B00000000;4 1940008B1C02RETL@0B00000010;5 1950008C1C02RETL@0B00000010;6 1960008D1C00RETL@0B00000000;7 1970008E1C02RETL@0B00000010;8 1980008F1C02RETL@0B00000010;9199;200000901C00RETL@0B00000000;A 201000911C02RETL@0B00000010;b 202000921C02RETL@0B00000010;c 203000931C02RETL@0B00000010;d 204000941C02RETL@0B00000010;E 205000951C00RETL@0B00000000;F206;******************************************* 20700096Lcddisplay:208000960F1B jbs sysstatus,lcddsp2090009714B4jmp lcddisplayret21000098091B bc sysstatus,lcddsp211;212000990417mov a,temp_value;2130009A0050mov reg_acc1,a2140009B117B call sub_bintobcd2150009C0412mov a,reg_acc32160009D006B mov temph,a2170009E0411mov a,reg_acc22180009F006A mov tempL,a219;220000A00419mov a,humi_value221000A10050mov reg_acc1,a222000A2117B call sub_bintobcd223000A30412mov a,reg_acc3224000A4006D mov humih,a225000A50411mov a,reg_acc2226000A6006C mov humiL,a227;228000A705E4djz commondata229000A814AB JMP lcddisplay1;$+3 230000A91806MOV a,@(common*2) 231000AA0064MOV commondata,a 232000AB lcddisplay1:233000AB0424MOV a,commondata 234000AC0020TBL235000AD0000NOP236000AE14B5jmp Lcd1display237000AF14D6jmp Lcd2display238000B014F7jmp Lcd3display239000B11518jmp Lcd4display240000B21539jmp lcd5display241000B3155A jmp lcd6display242000B4lcddisplayret:243000B40012ret244;-----------------------------------------------245;显示LCD1246000B5LCD1display:247000B5042A mov a,tempL;温度个位248000B61030call lcd1_table249000B70066mov temp1,a250;251000B8042B mov a,tempH;温度十位252000B91030call lcd1_table253000BA0067mov temp2,a254000BB0727swapa temp2255000BC0226or a,temp1256000BD0066mov temp1,a257000BE0766swap temp1258;259000BF042C mov a,humiL;湿度个位,260000C01030call lcd1_table261000C10068mov temp3,a262;263000C2042D mov a,humiH;湿度十位264000C31030call lcd1_table265000C40069mov temp4,a266000C50729swapa temp4267000C60228or a,temp3268000C70068mov temp3,a269000C80768swap temp3270;271000C90428mov a,temp3272000CA0047mov port7,a273000CB0426mov a,temp1274000CC0045mov port5,a275;276000CD0016ior ioc6277000CE1A0F and a,@0x0f278000CF1960or a,@0b01100000279000D00006iow ioc6;com1:2:3:2.5v 280000D10406mov a,port6281000D21A0F and a,@0x0f282000D31910or a,@0b00010000283000D40046mov port6,a284000D50012ret285;--------------------------------------------286000D6lcd2display:287000D6042A mov a,tempL;温度个位288000D71041call LCD2_table289000D80066mov temp1,a290;291000D9042B mov a,temph;温度十位292000DA1041call LCD2_table293000DB0067mov temp2,a294000DC0727swapa temp2295000DD0226or a,temp1296000DE0066mov temp1,a297000DF0766swap temp1298;299000E0042C mov a,humiL;湿度个位,300000E11041call LCD2_table301000E20068mov temp3,a302;303000E3042D mov a,humih;湿度十位304000E41041call LCD2_table305000E50069mov temp4,a306000E60729swapa temp4307000E70228or a,temp3308000E80068mov temp3,a309000E90768swap temp3310;311000EA0428mov a,temp3312000EB0047mov port7,a313000EC0426mov a,temp1314000ED0045mov port5,a315;316000EE0016ior ioc6317000EF1A0F and a,@0x0f318000F01950or a,@0b01010000319000F10006iow ioc6;com1:2:3:2.5v 320000F20406mov a,port6321000F31A0F and a,@0x0f322000F41920or a,@0b00100000323000F50046mov port6,a324000F60012ret325;-------326000F7lcd3display:327000F7042A mov a,tempL;温度个位328000F81052call LCD3_table329000F90066mov temp1,a330;331000FA042B mov a,temph;温度十位332000FB1052call LCD3_table333000FC0067mov temp2,a334000FD0727swapa temp2335000FE0226or a,temp1336000FF0066mov temp1,a337001000766swap temp1338;33900101042C mov a,humiL;湿度个位,340001021052call LCD3_table341001030068mov temp3,a342;34300104042D mov a,humih;湿度十位344001051052call LCD3_table345001060069mov temp4,a346001070729swapa temp4347001080228or a,temp3348001090068mov temp3,a3490010A0768swap temp3350;3510010B0428mov a,temp33520010C0047mov port7,a3530010D0426mov a,temp13540010E0045mov port5,a355;3560010F0016ior ioc6357001101A0F and a,@0x0f358001111930or a,@0b00110000359001120006iow ioc6;com1:2:3:5v 360001130406mov a,port6361001141A0F and a,@0x0f362001151940or a,@0b01000000363001160046mov port6,a364001170012ret365;------36600118lcd4display:36700118042A mov a,tempL;温度个位368001191063call lcd4_table3690011A0066mov temp1,a370;3710011B042B mov a,temph;温度十位3720011C1063call lcd4_table3730011D0067mov temp2,a3740011E0727swapa temp23750011F0226or a,temp1376001200066mov temp1,a377001210766swap temp1378;37900122042C mov a,humiL;湿度个位,380001231063call lcd4_table381001240068mov temp3,a382;38300125042D mov a,humih;湿度十位384001261063call lcd4_table385001270069mov temp4,a386001280729swapa temp4387001290228or a,temp33880012A0068mov temp3,a3890012B0768swap temp3390;3910012C0428mov a,temp33920012D0047mov port7,a3930012E0426mov a,temp13940012F0045mov port5,a395;396001300016ior ioc6397001311A0F and a,@0x0f398001321960or a,@0b01100000399001330006iow ioc6;com1:2:2.5v,com:2.5V 400001340406mov a,port6401001351A0F and a,@0x0f402001361900or a,@0b00000000403001370046mov port6,a404001380012ret405;--------------40600139lcd5display:40700139042A mov a,tempL;温度个位4080013A1074call lcd5_table4090013B0066mov temp1,a410;4110013C042B mov a,temph;温度十位4120013D1074call lcd5_table4130013E0067mov temp2,a4140013F0727swapa temp2415001400226or a,temp1416001410066mov temp1,a417001420766swap temp1418;41900143042C mov a,humiL;湿度个位,420001441074call lcd5_table421001450068mov temp3,a422;42300146042D mov a,humih;湿度十位424001471074call lcd5_table425001480069mov temp4,a426001490729swapa temp44270014A0228or a,temp34280014B0068mov temp3,a4290014C0768swap temp3430;4310014D0428mov a,temp34320014E0047mov port7,a4330014F0426mov a,temp1434001500045mov port5,a435;436001510016ior ioc6437001521A0F and a,@0x0f438001531950or a,@0b01010000439001540006iow ioc6;com1:2:0v,com:2.5V 440001550406mov a,port6441001561A0F and a,@0x0f442001571900or a,@0b00000000443001580046mov port6,a444001590012ret445;----------------------------4460015A lcd6display:4470015A042A mov a,tempL;温度个位4480015B1085call lcd6_table4490015C0066mov temp1,a450;4510015D042B mov a,temph;温度十位4520015E1085call lcd6_table4530015F0067mov temp2,a454001600727swapa temp2455001610226or a,temp1456001620066mov temp1,a457001630766swap temp1458;45900164042C mov a,humiL;湿度个位,460001651085call lcd6_table461001660068mov temp3,a462;46300167042D mov a,humih;湿度十位464001681085call lcd6_table465001690069mov temp4,a4660016A0729swapa temp44670016B0228or a,temp34680016C0068mov temp3,a4690016D0768swap temp3470;4710016E0428mov a,temp34720016F0047mov port7,a473001700426mov a,temp1474001710045mov port5,a475;476001720016ior ioc6477001731A0F and a,@0x0f478001741930or a,@0b00110000479001750006iow ioc6;com1:2:2.5v,com:0V 480001760406mov a,port6481001771A0F and a,@0x0f482001781900or a,@0b00000000483001790046mov port6,a4840017A0012ret485;------------------------------------------486;--------------------------------------487;此程式是将小于100的数(reg_acc1)转换为BCD码,488;将高位存放于reg_acc2,低位存入于reg_acc3中。
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,注意一点,如果给段码式液晶屏通直流电,不用多久屏幕就会废了,所以千万注意。
上次发了个人肉驱动LCD1602的帖子,没什么技术含量,居然得裤子,有点不好意思,正好这几天有点时间,于是就再做一个小试验,用尽量少的IO来驱动16 02,以适应在某些引脚较少的MCU,如Tiny系列等。
废话少说,先上图,如果大家觉得有意思请起个哄...(原文件名:001.jpg)引用图片(原文件名:002.jpg)引用图片说明一下,连接LCD1602的四根引线,除了红黑两根电源,两根黄色的就是信号线,其中一根传送RS和E信号,另一根传送D4~D7信号,即用四位总线驱动。
电路和程序整理中,迟些上传。
[已上传]===================================================================== ================================================【59楼】更新:挑战一下极限,再减少一根线,仍然好使,不过要另加一个电容和一个二极管。
(原文件名:003.jpg)引用图片===================================================================== ================================================【167楼】更新:无线馈电及传送数据。
资料邮回复引用回编辑2010-10-03,23:08:10编辑删除2010-10-03,23:10:1资料邮件回复引用回沙渺编辑删除2010-10-03,23:1资料邮件回复引用回编辑删除2010-10-03,23:资料邮件回复引用回编辑删除2010-10-03,23:资料邮件回复引用回【5楼】JQ_Lin2010-10-03,23:46:3资料邮件回复引用回编辑删除编辑删除2010-10-04,00:资料邮件回复引用回编辑删除2010-10-04,00:资料邮件回复引用回2010-10-04,00:资料邮件回复引用回编辑删除v编辑删除2010-10-04,00:3资料邮件回复引用回积分:3205派别:等级:------来自:(原文件名:2wire_1602.PNG)引用图片示范程序很简单,不用多注释应该都能看懂。
上次发了个人肉驱动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 的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 是利用液晶分子的光学特性和物理结构进行显示的一种元件。
液晶
分子是介于固体和液体之间的一种物质,多呈长棒状大分子形态,在自然形态下,液晶分子排列没有规则,具有光学各向异性的特点,不透光;在电(磁)场作
用下,液晶分子排列规则,光学各向同性,可透光。
将液晶分子灌入精良加工
的开槽平面,液晶分子大致会顺着槽排列。
假如那些槽非常平行,液晶分子也
大致平行。
利用单片机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的阀值电压,则该字符段就显示出来。
用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的电压了。