打印

STC单片机控制ht1621驱动段码液晶问题

[复制链接]
8961|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zigold|  楼主 | 2009-12-14 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大牛下午好,我用STC12C5204单片机控制1621驱动液晶
程序调了几天都没进展,显示的不知道什么乱七八糟的东西,好像命令根本写不进去,COM0和com1是个1v不到的电平,com3为3点几V的电平,com4有时有波形
刷我自己写的程序就是这个样子,SEGMENT一部分有波形,其余就是一个电平

打电话咨询合泰技术,让我搞他们的范例,于是我修改了下,还是老样子
大家帮我看看是什么问题,谢谢了
下面的就是从合泰网上下的范例,我稍微修改了下,基本是原封不动的

//STC12C5204AD单片机控制HT1621B驱动LCD
#include <STC12C52XXAD.h>
#include <stdio.h>
#include <intrins.h>
#define BIAS 0X52                         //1/3偏压,4背极
#define RC256K 0X30                       //系统时钟选择为片内RC振荡器
#define WDTDIS1 0X0A                      //禁止WDT溢出标志输出
#define TIMERDIS 0X08                     //时基输出禁止
#define SYSEN 0X02                        //打开系统时钟
#define SYSDIS 0X00                       //关闭系统时钟和偏压发生器
#define LCDON 0X06                        //打开LCD偏压发生器
#define LCDOFF 0X04        //关闭LCD偏压发生器
#define TONEON  0X12       //打开音频输出
#define TONEOFF 0X10       //关闭音频输出  
#define CS P3_2
#define WR P3_4
#define DATA P3_5

#define uchar unsigned char
#define uint unsigned int
/***************************延时子函数******************************/
void delay(uchar i)                              //j=12延时约4.3us
{

  while(i--)
  {
   uchar j=0;
   while(j<8)
   j++;
  }
}
void SendBit_1621(uchar dat ,uchar cnt)
{
uchar i;
for(i =0; i <cnt; i ++)
{
  if((dat&0x80)==0)
  DATA=0;
  else DATA=1;
  WR=0;
  delay(2);  
  WR=1;
        dat=dat<<1;
}
}

void SendDataBit_1621(uchar dat,uchar cnt)
{
uchar i;
for(i =0; i <cnt; i ++)
{
  if((dat&0x01)==0) DATA=0;
  else DATA=1;
  WR=0;
  delay(2);
  WR=1;
  dat=dat>>1;
}
}
void SendCmd(uchar command)
{
CS=0;
_nop_();
_nop_();
SendBit_1621(0x80,4);
SendBit_1621(command,8);
CS=1;
}
void Write_1621(uchar addr,uchar dat)
{
CS=0;
_nop_();
_nop_();
SendBit_1621(0xa0,3);
SendBit_1621(addr,6);
SendDataBit_1621(dat,4);
CS=1;
}
void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
{
uchar i;
CS=0;
_nop_();
_nop_();
SendBit_1621(0xa0,3);
SendBit_1621(addr,6);
for(i =0; i <cnt; i ++,p++)
{
  SendDataBit_1621(*p,8);
}
CS=1;
}
/*******************************主函数******************************/
main()                                    
{
uchar a[10];
a[0]=0xFF;a[1]=0xFF;a[2]=0xFF;a[3]=0xFF;a[4]=0xFF;
a[5]=0xFF;a[6]=0xFF;a[7]=0xFF;a[8]=0xFF;a[9]=0xFF;
a[10]=0xFF;a[11]=0xFF;a[12]=0xFF;a[13]=0xFF;a[14]=0xFF;
a[15]=0xFF;

SendCmd(BIAS);
SendCmd(SYSEN);
SendCmd(LCDON);
// SendCmd(RC256K);
WriteAll_1621(0,a,16);
// SendCmd(LCDOFF);  


}

相关帖子

沙发
chenluck| | 2009-12-15 10:52 | 只看该作者
//=============================================================================
//                          LCD驱动程序 适用于HT1621
//=============================================================================
#define Lcd_Delay _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
void  Lcd_Data(uchar Start,uchar cData)//将数据当中的字节与LCD上的进行同步
// Start    --要开始同页面地址,每个页面为4个有效位,总其为32X4字节
// Length   --要同步的页面数量
{
        uchar i;
        LCD_CS=0;
        Lcd_Delay;
        Lcd_Delay;
        Lcd_Delay;
          //Send ID 101B
          LCD_CLK=0;
          Lcd_Delay;
          LCD_IO=1;
          Lcd_Delay;
          LCD_CLK=1;
          Lcd_Delay;
          LCD_CLK=0;
          Lcd_Delay;
          LCD_IO=0;
          Lcd_Delay;
          LCD_CLK=1;
          Lcd_Delay;
          LCD_CLK=0;
          Lcd_Delay;
          LCD_IO=1;
          Lcd_Delay;
          LCD_CLK=1;
          Lcd_Delay;
          //Send Address 6bit
          Start=Start*2;
          for(i=0;i<6;i++)
    {
              if(Start&0x20) LCD_IO=1;
              else LCD_IO=0;
              Lcd_Delay;
              LCD_CLK=0;
              Lcd_Delay;
              Start=Start<<1;
              LCD_CLK=1;
              Lcd_Delay;
    }
    //Send data 8bit
    for(i=0;i<8;i++)
    {
              if(cData&0x01) LCD_IO=1;
              else LCD_IO=0;
              Lcd_Delay;
              LCD_CLK=0;
              Lcd_Delay;
              cData=cData>>1;
              LCD_CLK=1;
              Lcd_Delay;
    }
        LCD_CS=1;
        Lcd_Delay;
}
//=============================================================================
void  Lcd_Command(uchar Command) //向指定的LCD当中写入一个命令
//每个命令应以100三个位为起始,命令长度为9位,实际有效位为8位,因此在最后补一个0
// LcdSelect--LCD的片选确定,取值为0,1,2
// Command----要写入的8位命令
{
        uchar i;
        LCD_CS=0;
        Lcd_Delay;
        Lcd_Delay;
        Lcd_Delay;
          //Send ID 100B
          LCD_CLK=0;
          Lcd_Delay;
          LCD_IO=1;
          Lcd_Delay;
          LCD_CLK=1;
          Lcd_Delay;
          LCD_CLK=0;
          Lcd_Delay;
          LCD_IO=0;
          Lcd_Delay;
          LCD_CLK=1;
          Lcd_Delay;
          LCD_CLK=0;
          Lcd_Delay;
          LCD_IO=0;
          Lcd_Delay;
          LCD_CLK=1;
        Lcd_Delay;
          for(i=0;i<8;i++)
    {
            LCD_CLK=0;
            Lcd_Delay;
              if(Command&0x80) LCD_IO=1;
              else LCD_IO=0;
              Command=Command<<1;
              Lcd_Delay;
              LCD_CLK=1;
              Lcd_Delay;
    }
    ///最后补一个0
           LCD_CLK=0;
           Lcd_Delay;
          LCD_IO=0;
          Lcd_Delay;
          LCD_CLK=1;
          Lcd_Delay;
        LCD_CS=1;
        Lcd_Delay;
}
//=============================================================================
void  Lcd_Refresh(void)        //重新对LCD进行刷屏
{
        uchar i;
        for(i=0;i<LCD_BUFF_MAX;i++)
                Lcd_Data(i,lcd.buff[i]);
}
//=============================================================================
void  Lcd_Cls(void) //清空LCD显示区
{
//功能: 清空LCD显示区
//返值: 无
//入口: cSelectIc LCD的片选,取值为0,1,2
        uchar i;
        for(i=0;i<LCD_BUFF_MAX;i++)
                lcd.buff[i]=0;
        Lcd_Refresh();
}

//=============================================================================
void  Lcd_Init(void)//初始化LCD,二个屏都进行处理,同时进行清屏
{
           LCD_CLK=1;
           Lcd_Delay;
           LCD_IO=1;
           Lcd_Delay;
    Lcd_Command(0x00);                //控制器掉电(控制字)
    Lcd_Command(0x02);                //控制器液晶关闭(控制字)
    Lcd_Command(0x18);      //初始化LCD控制器
    Lcd_Command(0x01);      //控制器上电(控制字)
    Lcd_Command(0x03);      //控制器液晶显示(控制字)
    Lcd_Command(0x29);      //控制器液晶模式1/3BAIS 1/4DUTY(控制字)
           Lcd_Cls();
}

使用特权

评论回复
板凳
我爱喝水| | 2009-12-15 20:27 | 只看该作者
本帖最后由 我爱喝水 于 2009-12-15 20:28 编辑

看lz的代码,没有设置IO口模式的语句。
正巧最近用STC12c5410ad驱动1621,把驱动1621的IO口设置成推挽模式。就好了。楼主可以试试。

使用特权

评论回复
地板
zigold|  楼主 | 2009-12-16 08:39 | 只看该作者
3# 我爱喝水

设成推挽电流很大会不会把ht1621搞坏,加了限流电阻又怕电萍上不去

使用特权

评论回复
5
zigold|  楼主 | 2009-12-16 08:49 | 只看该作者
3# 我爱喝水

我现在用的是默认的准双向模式,加了个680欧的上拉电阻

使用特权

评论回复
6
zigold|  楼主 | 2010-4-23 21:17 | 只看该作者
忘记结贴了,项目已经完成,后来由于价格上的原因,以及供应商的推荐,用了ST的STM8系列片子,还不错,原来那个问题是由于画板子的时候画板人员粗心把封装搞错了,比较低级的错误,我们后面核对时也没注意,疏忽了,以后得注意

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

9

帖子

0

粉丝