horalxi 发表于 2012-8-23 16:37:50

段式LCD驱动

各位大侠:

谁能讲讲内置LCD驱动的单片机如何驱动段式LCD。
最好能有实例工参考。
在线等万分感谢。

gracialee 发表于 2012-8-23 23:33:40

能不能把问题描述清楚?

raxb 发表于 2012-8-24 10:23:25

内置还不简单,设置一下寄存器,往显示RAM填数据就OK了

duci002 发表于 2012-8-24 10:33:37

下载一份带LCD的PIC单片机datasheet,有详细解释,
另外再下载一份《PIC中档单片机参考手册》,有更详细的说明!

horalxi 发表于 2012-8-25 13:09:28

duci002 发表于 2012-8-24 10:33 static/image/common/back.gif
下载一份带LCD的PIC单片机datasheet,有详细解释,
另外再下载一份《PIC中档单片机参考手册》,有更详细的 ...

大哥,我用51的。

horalxi 发表于 2012-8-25 13:11:59

我想用内置LCD驱动的单片机直接驱动附件中的LCD,请各位大侠指点一下。

eaglelpx 发表于 2012-8-25 13:29:54

本帖最后由 eaglelpx 于 2012-8-25 13:30 编辑

我也在搞,直接驱动电路参考论坛中那个,M8搞得,不错的

lxa0 发表于 2012-8-25 22:15:59

我用51直接驱动的~~~~~~~~~~~

hengjng_t 发表于 2012-8-29 11:22:58

用单片机内置LCD驱动器的话,要看什么单片机了,不过基本步骤应该都一样,设置I/O口工作模式、寄存器,然后抛数据就可以了!至于怎么设置,就要看单片机的手册了! 我前段时间用中颖的SH79F 166A 驱起来一个!
如果说想要用 I/O口直接驱动LCD的话,对液晶本身的参数是有要求的,映像中,好像LCD的占空比要是 1/2,驱动电压要和你I/O口电压一样! 此项,仅供参考!

horalxi 发表于 2012-8-31 08:32:57

hengjng_t 发表于 2012-8-29 11:22 static/image/common/back.gif
用单片机内置LCD驱动器的话,要看什么单片机了,不过基本步骤应该都一样,设置I/O口工作模式、寄存器,然后 ...

谢谢,这段时间又要忙了,回头慢慢搞。

lengshuicha 发表于 2012-8-31 09:02:40

不用专门的驱动芯片的话,那么就要直接用I/O口驱动了。根据断式液晶的特性,不能采用数码管的方法驱动,需要“交流”。什么叫段式液晶的“交流”呢,别人告诉我的,就是在一段(6楼图片中的A段吧)的两端都接上I/O口,设置单片机的端口为P1.0和P1.1,在两个端口之间一会儿左,一会儿右,这就是“交流”。

杜洋在《无线电》杂志上有文章发表,我看过,表述不清,你可以去书店翻一下就知道了。好像现在《无线电》有电子版本。

studyqu309 发表于 2012-9-26 16:35:36

lxa0 发表于 2012-8-25 22:15 static/image/common/back.gif
我用51直接驱动的~~~~~~~~~~~

你是用51直接驱动段式液晶的吗
,可以请教一下你吗

nicksean 发表于 2012-9-27 13:08:39

STC手册上就有例子 STC12C5A60S2新版的

dgdzas 发表于 2012-9-27 13:23:21

找到要用的MCU关于LCD驱动那章,把那章全部的寄存器描述都看看,重点在频率,电压参数设置;不愿看硬件图的话,就在对应LCD RAM里,一个一个位去置高,看对应哪划亮了,再记录。

horalxi 发表于 2012-9-28 10:54:22

dgdzas 发表于 2012-9-27 13:23 static/image/common/back.gif
找到要用的MCU关于LCD驱动那章,把那章全部的寄存器描述都看看,重点在频率,电压参数设置;不愿看硬件图的 ...

谢谢,准备买一块带LCD驱动的单片机研究研究

rqiang 发表于 2012-9-28 11:43:51

horalxi 发表于 2012-8-25 13:11 static/image/common/back.gif
我想用内置LCD驱动的单片机直接驱动附件中的LCD,请各位大侠指点一下。

这么简单,直接用IO驱动就可以。

yao1 发表于 2012-9-28 14:17:03

//STC单片机控制HT1621B驱动LCD
#include"STC12C5A60S2.h"
#include"stdio.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int


#define BIAS   0X52   //1/3偏压,4背极        0x50 1/2偏压,
#define RC256K   0X30   //系统时钟选择为片内RC振荡器
#define WDTDIS10X0A   //禁止WDT溢出标志输出
#define TIMERDIS 0X08   //时基输出禁止
#define SYSEN    0X02   //打开系统时钟
#define SYSDIS   0X00   //关闭系统时钟和偏压发生器
#define LCDON    0X06   //打开LCD偏压发生器
#define LCDOFF   0X04   //关闭LCD偏压发生器
#define TONEON   0X12   //打开音频输出
#define TONEOFF0X10   //关闭音频输出

//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit HT1621_DAT=P1^4; //HT1621数据引脚
sbit HT1621_CS=P1^5;//HT1621使能引脚
sbit HT1621_WR=P1^6;//HT1621时钟引脚

//HT1621段地址
#define    LCD_1   4    //①
#define    LCD_2   5    //②
#define    LCD_3   6    //③
#define    LCD_4   7           //④
#define    LCD_T4    8           //T4
#define    LCD_T1    9           //T1
#define    LCD_T2   10           //T2
#define    LCD_T3   11           //T3
#define    LCD_T5   16           //T5
#define    LCD_1B   17           //数码管1
#define    LCD_1G   18
#define    LCD_1C   19
#define    LCD_1A   21
#define    LCD_1F   22
#define    LCD_1E   23
#define    LCD_1D   24
#define    LCD_NSZ25          //逆时针箭头
#define    LCD_2B   26          //数码管2
#define    LCD_2G   27
#define    LCD_2C   28
#define    LCD_2A   29
#define    LCD_2F   30
#define    LCD_2E   31
#define    LCD_2D   32
#define    LCD_TPD33          //TPD
#define    LCD_3B   34          //数码管3
#define    LCD_3G   35
#define    LCD_3C   36
#define    LCD_3A   37
#define    LCD_3F   38
#define    LCD_3E   39
#define    LCD_3D   40
#define    LCD_SSZ41          //顺时针箭头
#define    LCD_4B   42          //数码管4
#define    LCD_4G   43
#define    LCD_4C   44
#define    LCD_4A   45
#define    LCD_4F   46
#define    LCD_4E   47
#define    LCD_4D   48
#define    LCD_LINE 49          //LINE
#define    LCD_5B   50          //数码管5
#define    LCD_5G   51
#define    LCD_5C   52
#define    LCD_5A   53
#define    LCD_5F   54
#define    LCD_5E   55
#define    LCD_5D   56


//unsigned char data LCD_clear[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

//unsigned char data LED_smg0[]={0xFA,0x0A,0xD6,0x9E,0x2E,0xBC,0xFC,0x1A,0xFE,0xBE,0xFF,0x00}; //时针标志0 不显示
                                                  //    0       1          2           3        4          5          6           7       8       9    on   off
//unsigned char data LED_smg[]={0xFB,0x0B,0xD7,0x9F,0x2F,0xBD,0xFD,0x1B,0xFF,0xBF,0xFF,0x00};//时针标志1显示
                                              //          0       1          2           3        4       5          6           7        8       9   on   off

//unsigned char data LED_smg1[]={0x00,0x10,0x20,0x40,0x80,0x02,0x06,0x0e,0x0f,0xff};
                                                 //   off①    ②   ③   ④   T1   T2   T3   T4       on

/*
void delay(uchar i)   //j=12延时约4.3us               
{
        while(i--)
        {
                uchar j=0;
                while(j<8)
                j++;
        }
}        */
/*
void delay(uchar z)   //1us               
{
        unsigned int x,y;
          for(x=z;x>0;x--)
                for(y=6;y>0;y--);
}        */

void delay(unsigned int n)// STC 1T系列单片机1.25us      
{
    while(n--);
}

void Delayms(unsigned int z) //STC 1T系列单片机24MHZ z=1时精确延时1ms
{      
    unsigned int x,y;
          for(x=z;x>0;x--)
                for(y=1850;y>0;y--);       
}

/******************************************************
SendBit_1621(送数据程序)
*******************************************************/
void SendBit_1621(uchar dat ,uchar cnt)       //data 的高cnt 位写入HT1621,高位在前
{
        uchar i;
        for(i =0; i <cnt; i ++)
        {
           if((dat&0x80)==0)HT1621_DAT=0;
           elseHT1621_DAT=1;
           HT1621_WR=0;
           delay(5);          
           HT1621_WR=1;
           delay(5);//需加延迟 否则4.6V以下显示不了
           dat=dat<<1;
        }
}

/******************************************************
写数据函数,cnt为传送数据位数,数据传送为低位在前
*******************************************************/
void SendDataBit_1621(uchar dat,uchar cnt)
{
        uchar i;
        for(i =0; i <cnt; i ++)
        {
           if((dat&0x01)==0) HT1621_DAT=0;
           else HT1621_DAT=1;
           HT1621_WR=0;
           delay(5);
           HT1621_WR=1;
           delay(5);//需加延迟 否则4.6V以下显示不了
           dat=dat>>1;
        }
}

/********************************************************
函数名称:void SendCmd(uchar command)
功能描述: HT1621命令写入函数
参数说明:Cmd为写入命令数据
返回说明:无
说    明:写入命令标识位100
********************************************************/
void SendCmd(uchar command)
{
        HT1621_CS=0;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

        SendBit_1621(0x80,4);        //写入命令标志100
        SendBit_1621(command,8); //写入命令数据
        HT1621_CS=1;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

/********************************************************
函数名称:void Write_1621(uchar addr,uchar dat)
功能描述: HT1621在指定地址写入数据函数
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
说    明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/

void Write_1621(uchar addr,uchar dat)
{
        HT1621_CS=0;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
       
        SendBit_1621(0xa0,3);    //写入数据标志101
        SendBit_1621(addr,6);        //写入地址数据
        SendDataBit_1621(dat,4); //写入数据
        HT1621_CS=1;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
       
}

/********************************************************
函数名称:void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
参数说明:Addr为写入初始地址,*p为连续写入数据指针, cnt为写入数据总数
返回说明:无
说    明:HT1621的数据位4位,此处每次数据为8位,写入数据总数按8位计算
********************************************************/
void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
{
        uchar i;
        HT1621_CS=0;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

        SendBit_1621(0xa0,3); //写入数据标志101
        SendBit_1621(addr,6); //写入地址数据
        for(i =0; i <cnt; i ++,p++)
        {
          SendDataBit_1621(*p,8);//写入数据
        }
        HT1621_CS=1;
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
返回说明:无
说    明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
Delayms(1000);    //延时使LCD工作电压稳定
SendCmd(BIAS);         //1/3偏压,4背极
SendCmd(RC256K);//使用内部振荡器
SendCmd(SYSDIS);         //关闭系统时钟和偏压发生器
SendCmd(WDTDIS1); //禁止WDT溢出标志输出
SendCmd(SYSEN);         //打开系统时钟
SendCmd(LCDON);         //打开LCD偏压发生器
}

yao1 发表于 2012-9-28 14:36:42

yao1 发表于 2012-9-28 14:43:13

S1S2 当成为2位数码管的小数点11 12 是不是搞反了啊 这样得编2个译码{:sad:}

horalxi 发表于 2012-9-29 10:04:31

yao1 发表于 2012-9-28 14:43 static/image/common/back.gif
S1S2 当成为2位数码管的小数点11 12 是不是搞反了啊 这样得编2个译码 ...

是不合理,LCD厂做出来了才发现。

lxa0 发表于 2012-10-3 03:42:22

studyqu309 发表于 2012-9-26 16:35 static/image/common/back.gif
你是用51直接驱动段式液晶的吗
,可以请教一下你吗

是的
请教不敢当
..........

alien_duck 发表于 2013-3-6 19:26:17

请问LZ这个驱动现在做成怎样啦?

donkey456 发表于 2013-7-18 09:06:58

楼主可以参照论坛圈圈大神的思路,,非常好

气球 发表于 2013-7-18 09:15:45

mark!!!!!!!

黑夜之狼 发表于 2014-7-26 10:37:24

hengjng_t 发表于 2012-8-29 11:22
用单片机内置LCD驱动器的话,要看什么单片机了,不过基本步骤应该都一样,设置I/O口工作模式、寄存器,然后 ...

我也在用中颖的单片机来驱动段式液晶,SH79F6488,感觉配置寄存器不对,请问你调试出来了没?可以提供例程来看看吗?

lxa0 发表于 2014-11-6 00:15:29

studyqu309 发表于 2012-9-26 16:35
你是用51直接驱动段式液晶的吗
,可以请教一下你吗

当时试验的时候
直接用51驱动3位半的lcd
现在想起来
和你说的段式lcd还是有区别的

前几日偶得一电子秤上的lcd显示屏
见下图
正在搞呢

OYL 发表于 2014-11-6 00:19:41

单片机模拟交流信号驱动
页: [1]
查看完整版本: 段式LCD驱动