yuwangwangyu 发表于 2014-2-10 09:06:35

HT1622 驱动问题

HT1622 驱动断码屏只有com口有输出 段 驱动脚没有输出有谁碰到过{:sad:}

pxq8410 发表于 2014-2-10 09:31:40

从没遇到过:
1.确认HT1622驱动正常,SYS ON ,LCD ON
2.从新换一片IC
3.是不是测量有问题,实际能不能显示

yuwangwangyu 发表于 2014-2-14 11:27:24

移植了驱动但是总觉得这驱动有问题
/*****************************************************************
HT1622 底层驱动 Data 数据 Length 数据长度
*****************************************************************/
void Write_HT1622_Byte(unsigned char Data,unsigned char Length)
{
    unsigned char i,Temp=0x80;
    for (i=0;i<Length;i++)
    {   
      CLR_BIT ( HT1621_WR );   //“写”时钟置0
      if (Data&Temp)
          SET_BIT ( HT1621_DAT );//数据线置1
      else
          CLR_BIT ( HT1621_DAT );//数据线置0
      Temp>>=1;                //准备下一位
      SET_BIT ( HT1621_WR );   //“写”时钟置1
    }
}
/*****************************************************************
HT1622写入数据函数 Address 写数据地址Data 数据
*****************************************************************/
void Write_HT1622_Data(unsigned char Address,unsigned char Data)
{
    CLR_BIT ( HT1621_CS );       //片选置0
    Address <<= 2;               //将实际地址挪到高位
    Data <<= 4;                  //将实际数据挪到高位
    Write_HT1622_Byte(0xA0,3);   //写入写数据的ID 101 高3位有效
    Write_HT1622_Byte(Address,6);//写入6个位初始地址 高6位有效
    Write_HT1622_Byte(Data,4);   //写入4个位数据 高4位有效
    SET_BIT ( HT1621_CS );       //片选置1
}
/*****************************************************************
//HT1622写命令函数 Command 命令
*****************************************************************/
void Write_HT1622_Command(unsigned char Command)
{   
    CLR_BIT ( HT1621_CS );       //片选置0
    Write_HT1622_Byte(0x80,3);   //写入命令的ID:100
    Write_HT1622_Byte(Command,8);//写入实际命令的高8位(CMD.):C8-C1
    SET_BIT ( HT1621_DAT );      //|写入一个“1”即手册上所指“无关位”的那一个数据位
    CLR_BIT ( HT1621_WR );       //|
    _NOP();_NOP();_NOP();      //|
    SET_BIT ( HT1621_WR );       //|
    SET_BIT ( HT1621_CS );       //片选置1
}
/*****************************************************************
显示数字函数 *Data显示内容指针 Address 显示首位置   Length内容长度
*****************************************************************/
void Display(unsigned char *Data,unsigned char Address,unsigned char Length)
{
unsigned char i = 0,Temp=0x0F;
unsigned char ADDH,ADDL;
for(;i<Length;i++)
{
    Temp=DIS[*Data];                  //数据解析
    ADDL = Address*2;               //低4位地址解析
    ADDL = ADDL*2+2-(ADDL/31)*59;   //低4位地址解析
    Write_HT1622_Data(ADDL,Temp&0x0F);//写低4位数据
    ADDH = Address*2-1;               //高4位地址解析
    ADDH = ADDH*2+2-(ADDH/31)*59;   //高4位地址解析
    Temp>>=4;                         //高4位数据解析
    Write_HT1622_Data(ADDH,Temp&0x0F);//写高4位数据
    Data ++;                        //显示数据指针增一
    Address ++;                     //显示地址增一
}
}

在datasheet里面明明写的地址 和数据高低位不一致 地址高位在前数据低位在前

lzm2010 发表于 2014-2-14 13:15:14


/*---------    HT1622测试程式范例 -----*/

#include   "reg52M.h"

#define RD    P3_3
#define CS    P3_4
#define WR    P3_5

//------- DATA ---> P2.7

//--- MCU: AT89C52, clock: 12.0MHZ

/*------------------------ 标志定义 ----------*/


#define TT 5
#define FLASH 15000
#define FLASH2 40000



/* ----------延 时 ---------------------*/
voiddelay(uint n) { while(n)n--; }

/*------------------WRITE CODE-------------*/

void Wcode(uchar characer)
{
   uchar i;
   uchar ddd;
   CS=0;
   ddd=0x80;
   

for(i=1;i<=3;i++)   // Write: 100
{
   WR=0;
   P2=ddd;
   delay(TT);
   WR=1;
   delay(TT);
   
      ddd=ddd<<1;
   }
   
for(i=0;i<9;i++)   // write: Command
{
   WR=0;
   P2=characer;
   delay(TT);
   WR=1;
   delay(TT);

   characer=characer<<1;
   
                  }
CS=1;
WR=1;

}


/*------------------------ 字节转化 ----------------*/
uchar Fan(uchar ID)
{
   uchar x=0x0;
   uchar i;

    for(i=0;i<4;i++)
    {
      x=x<<1;
      x=x|(ID&0x1);
      ID=ID>>1;
                   }
      return(x);
}

/*------------------WRITE Address and Aata-------------*/

//--------Note: dat 的高四位无效

void Wdata(uchar address,uchar dat)
{
   uchar i;
   uchar eee;
   eee=0xa0;
   CS=0;
for(i=1;i<=3;i++)// write code: 101
{
   WR=0;
   P2=eee;
   delay(TT);
   WR=1;
   delay(TT);
             eee=eee<<1;
}
   

address=address<<2;//write address: A5 A4 A3 A2 A1 A0

for(i=0;i<6;i++)
{
   WR=0;
   P2=address;
   delay(TT);
   WR=1;
   delay(TT);
             address=address<<1;
}

i=Fan(dat);
i=i<<4;
dat=i;   

for(i=0;i<4;i++)//write data: D0 D1 D2 D3
{
   WR=0;
   P2=dat;
   delay(TT);
   WR=1;
   delay(TT);
          dat=dat<<1;
   }

CS=1;
WR=1;

}


/*--------------- Main ProgrammerHT-1621 -----------------*/



voidmain()
{

uchar ADR;



WR=1;
RD=1;
WR=1;
RD=1;
CS=1;

delay(6000);


   while(1)
{

/*------------------------------------ Init HT1621 --------*/

Wcode(0x18); // Choose Extenderal 32768 HZ OSCILLATOR
Wcode(0xE3); // Normal Mode
Wcode(0x01); // SYS EN
Wcode(0x03); // LCD ON



/* ---------------------- 清屏 --------------*/
for(ADR=0;ADR<63;ADR++) Wdata(ADR,0x00);
               
delay(60000);
delay(60000);

/* ---------------------- 全显 --------------*/
for(ADR=0;ADR<63;ADR++) {Wdata(ADR,0x0F);delay(6000); }


while(1);// stop;

}// --------------- End While ------------------

} //---------------- The END ---------------------

andy93762 发表于 2018-7-2 21:04:20

我碰到跟你一样的情况了,请问楼主怎么解决的呢?
页: [1]
查看完整版本: HT1622 驱动问题