ylkq 发表于 2011-10-11 11:09:00

求教用51单片机的普通I/0口驱动笔段式液晶屏的方法或实例

想用51单片机的普通I/0口驱动笔段式液晶屏,不知道有没有高手试验过,或者有这方面的实例?

wanglituan 发表于 2011-10-11 14:45:32

估计比较困难吧,等待高手出现。

kingwaykingway 发表于 2011-10-11 15:43:04

***************************************************/
//HT1621驱动模块通信驱动2010-11月.
//对HT1621 的读写 – 使用C 语言
//对s1302时钟芯片的读写
/**************************************************/
#include <pic.h>
#define uchar unsigned char
#define uintunsigned int
#define nop() asm("nop")
/***************************************************/
//ht1621设置函数
/**************************************************/
#define BIAS   0x24                           //设定偏压与com口
#define SYSEN0x01                           //打开系统震荡
#define LCDOFF 0x02                           //关闭LCD显示
#define LCDON0x03                           //打开LCD显示
#define csRC0                                 //ht1621液晶驱动模块
#define wrRC4                                 //ht1621
#define dat RC5                                 //ht1621
const uchar zm_1[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f};//LCD 1 2 3的0-9的数码
const uchar zm_2[]={0x5f,0x06,0x3d,0x2f,0x66,0x6b,0x7b,0x0e,0x7f,0x6f};//LCD 4 5 6 7的0-9的数码
void SendBit_1621(uchar data,uchar cnt);
void SendDataBit_1621(uchar data,uchar cnt);
void SendCmd(uchar command);
void Write_1621(uchar addr,uchar data);
void WriteAll_1621(uchar addr,uchar *p,uchar cnt);
/***************************************************/
//延时设置函数
/**************************************************/
void delay(uint x);                           //延时函数
/***************************************************/
//ds1302设置函数
/**************************************************/
const uchar table1[]={0x01,0x21,0x15,0x14,0x11,0x7,0x10};//秒 分 时 日 星期 月 年
const uchar write_table={0x80,0x82,0x84,0x86,0x88,0x08a,0x8c};//写秒 分 时 日 星期 月 年地址
const uchar read_table={0x81,0x83,0x85,0x87,0x89,0x08b,0x8d}; //读秒 分 时 日 星期 月 年地址
uchar table2;
#define rst RC1                                 //ds1302时钟芯片
#define sck RC3                                 //ds1302时钟芯片
#define ioo TRISC2                              //ds1302时钟芯片
#define io RC2                                  //ds1302时钟芯片
uchar write_8bits(uchar add);
void write_shineng(uchar add,uchar date);
void write_ren();
uchar read_8bits(uchar add);
void COL();
//void shijianchuli();
/***************************************************/
//主控制函数
/**************************************************/
void main()
{
   uchar i,shi,fen,miao,a1,a2,a3,a4,j=0x00;
uchar a;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;
a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;
a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;a=0x00;
TRISC=0X00;                                    //将端口设为输出
SendCmd(0x24);                                 //设置偏压和占空比
SendCmd(0x01);                                 //打开系统振荡器
SendCmd(0x03);                              //打开LCD偏压发生器
   //WriteAll_1621(0,a,31);                     //在起始地址为0 处连续写入5 个字节数据
                                                //a为写入数据的起始地址,5 为写入的字节
//write_ren();                                  //一次性写入ds1302的准确时间
    for(i=0;i<31;i++)
      {
            
         Write_1621(j,0x00);
               j++;
      }
    while(1)
   {
          fen=read_8bits(0x83);
          shi=read_8bits(0x85);
          a1=fen&0x0f;                        //分钟的个位
          a2=fen>>4;                            //分钟的十位
          a3=shi&0x0f;                        //小时的个位
          a4=shi>>4;                            //小时的十位
   
          SendCmd(0x03);
          //COL();
      Write_1621(0x11,zm_2&0x0f);
      Write_1621(0x10,zm_2>>4);
         delay(3);
       //SendCmd(0x02);
      Write_1621(0x13,zm_2&0x0f);
      Write_1621(0x12,zm_2>>4);
         delay(3);
       // SendCmd(0x02);
      Write_1621(0x15,zm_2&0x0f);
      Write_1621(0x14,zm_2>>4);
         delay(3);
      //SendCmd(0x02);
      Write_1621(0x17,zm_2&0x0f);
      Write_1621(0x16,zm_2>>4);
         delay(3);
      //SendCmd(0x02);
       Write_1621(0x08,0x0f);
       Write_1621(0x09,0x0f);
      //delay(30);
      SendCmd(0x02);
   
}
SendCmd(0x02);                              //关闭LCD 显示
}
/***************************************************/
//主板初始化
/***************************************************/
void zhuban(void)
{
      TRISC=0X00;
      
}

/***************************************************/
//写HT1621地址字节函数
/***************************************************/
void SendBit_1621(uchar data,uchar cnt)      //data 的高cnt 位写入HT1621,高位在前
{
uchar i;
for(i =0; i <cnt; i ++)
   {
    if((data&0x80)==0) dat=0;
    else dat=1;
   wr=0;
    nop();
    wr=1;
    data<<=1;
   }
}
/****************************************************/
//写HT1621地址内数据函数
/****************************************************/
void SendDataBit_1621(uchar data,uchar cnt)    //data 的低cnt 位写入HT1621,低位在前
{
uchar i;
for(i =0; i <cnt; i ++)
    {
    if((data&0x01)==0) dat=0;
    else dat=1;
   wr=0;
    nop();
   wr=1;
   data>>=1;
    }
}
/***************************************************/
//写HT1621命令模式函数,
/***************************************************/
void SendCmd(uchar command)
{
cs=0;
SendBit_1621(0x80,3);                            //写入标志码"100"
SendBit_1621(command,9);                         //写入9 位数据,其中前8 位为command 命令,最后1 位任意
cs=1;
}
/***************************************************/
//写HT1621地址与地址内数据函数
/***************************************************/

void Write_1621(uchar addr,uchar data)
{
cs=0;
SendBit_1621(0xa0,3);                            //写入标志码"101"
SendBit_1621(addr<<2,6);                         //写入6 位addr
SendDataBit_1621(data,4);                        //写入data 的低4 位
cs=1;
}
/***************************************************/
//写HT1621地址内连续写数据函数
/****************************************************/
void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
{
uchar i;
cs=0;
SendBit_1621(0xa0,3);                            //写入标志码"101"
SendBit_1621(addr<<2,6);                         //写入6 位addr
for(i =0; i <cnt; i ++,p++)                      //连续写入数据
    {
   SendDataBit_1621(*p,8);
    }
   cs=1;
}
/***************************************************/
//写ds1302单个地址函数
/***************************************************/
uchar write_8bits(uchar add)//单个字节写入
{
   uchar i;
   ioo=0;
   nop();
    for(i=0;i<8;i++)
   {
      sck=0;
      io=add&0x01;
      add=add>>1;
      sck=1;
      nop();
   }
}
/***************************************************/
//写ds1302地址数据函数
/***************************************************/
void write_shineng(uchar add,uchar date)
{
       rst=0;
       nop();
       sck=0;
       nop();
       rst=1;
       nop();
       write_8bits(add);
       write_8bits(date);
       rst=1;
       nop();
       io=1;
       sck=1;
}
/***************************************************/
//写ds1302地址数据函数,写入秒 分 时 日 星期 月 年
/***************************************************/
void write_ren()
{
       uchar j,i;
       write_shineng(0x8e,0x00);
       for(j=0;j<7;j++)
         {
         write_shineng(write_table,table1);
         }
         write_shineng(0x8e,0x80);
}
/***************************************************/
//读ds1302单个地址数据函数,带参数返回。秒 分 时 日 星期 月 年
/***************************************************/
uchar read_8bits(uchar add)
{
   uchar y,ass;
   
   sck=0;
   nop();
   rst=0;
   nop();
   rst=1;
   nop();
   write_8bits(add);
   ioo=1;
for(y=0;y<8;y++)
   {
      ass=ass>>1;
      sck=0;
      if(io)
      {
      ass=ass|0x80;
      }
      else ass=ass&0x7f;
      sck=1;
      nop();
    }
   rst=0;
   nop();
   sck=0;
   nop();
   sck=1;
   io=1;
   ioo=0;
    return(ass);
}
/***************************************************/
//延时函数ms
/***************************************************/

void delay(uint x)
{
      uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
/***************************************************/
//将LCD时间COL两点处理到HT1621上显示每秒闪烁一次函数
/***************************************************/
void COL()
{
    Write_1621(0x14,0x08);
    delay(500);
    Write_1621(0x14,0x00);
    delay(500);
}

nicksean 发表于 2011-10-11 15:47:58

STC 手册上有一个例子 STC12C5A60S2系列的

ylkq 发表于 2011-10-12 09:59:45

回复【2楼】kingwaykingway
-----------------------------------------------------------------------

是想要避开HT1621之类的驱动芯片,直接用单片机I/O口连接SEG、COM端实现笔段式液晶的显示。

BXAK 发表于 2011-10-12 10:06:04

普通51(准双向I/O)

直接驱动动态笔段式LCD及Proteus仿真 http://wenku.baidu.com/view/71714fee5ef7ba0d4a733be6.html



增强型51(I/O口有:准双向、推挽、高阻模式)

直接驱动段式LCD液晶最简单的方法 http://bbs.eetop.cn/thread-158504-1-1.html

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_684153XZ3HPA.gif
(原文件名:1.gif)



详细原理请看:
用Mega48直接驱动段式液晶屏http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=739682&bbs_page_no=1&search_mode=4&search_text=figoxwm&bbs_id=9999

ylkq 发表于 2011-10-13 11:26:58

回复【5楼】BXAK
-----------------------------------------------------------------------

很感谢5楼的帮助,论坛真的有很多热心人啊~~~~./emotion/em007.gif

现在还想问一个问题,不知道现在市面上小型电子产品(当然是带段码液晶屏的)上用的自带LCD驱动的芯片都是什么牌子的,型号?
拆了好多看到的除了那个“黑疙瘩”什么也不知道~~~
不知道有没有高手知道这方面的信息~~~~

jacky2011 发表于 2011-11-17 13:01:24

哈哈,人家用了DICE片,楼主要是原意尝试用I/O直接驱动,我手上刚好有2片这样的LCD,送给你一片玩玩,玩好了,别忘了开源给坛里兄弟们。
台湾产的有你说的“黑疙瘩”!!不过“黑疙瘩”要量才合算

studyqu309 发表于 2013-7-17 19:13:54

不知是否可行,学习了

小小单片机 发表于 2013-8-4 17:23:50

问什么直接下载源程序,改掉IO口不能直接用
页: [1]
查看完整版本: 求教用51单片机的普通I/0口驱动笔段式液晶屏的方法或实例