HT1622 驱动问题
HT1622 驱动断码屏只有com口有输出 段 驱动脚没有输出有谁碰到过{:sad:} 从没遇到过:1.确认HT1622驱动正常,SYS ON ,LCD ON
2.从新换一片IC
3.是不是测量有问题,实际能不能显示 移植了驱动但是总觉得这驱动有问题
/*****************************************************************
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里面明明写的地址 和数据高低位不一致 地址高位在前数据低位在前
/*--------- 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 --------------------- 我碰到跟你一样的情况了,请问楼主怎么解决的呢?
页:
[1]