打印

为什么不出字呢(HT1621)

[复制链接]
2531|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuzq2001|  楼主 | 2007-3-15 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想点亮一个LCD屏幕,折腾了好久都没弄好
每次都是一片白色,好郁闷啊

附上程序,高手看看到底是什么地方出了问题,

有用过的朋友帮忙看看了
没用过的看看也可以
谢谢了

用的HT1621LCD驱动芯片
单片机用的89C52
//*********************************************************
//*   接口定义:DATA<--->P2.0; CS<--->P2.3; WR<--->P2.1    *
//**********************************************************/

#include<reg52.h>
#include<intrins.h>
#include<absacc.h>

#define uchar unsigned char                                                                   
#define uint  unsigned int

//*********************************************************
//*   接口定义:DATA<--->P2.0; CS<--->P2.3; WR<--->P2.1    *
//**********************************************************/

sbit HT1621_CS = P2^3;  //lower enable
//sbit HT1621_RD = P2^2;
sbit HT1621_WR = P2^1;  //rising edge   
sbit HT1621_DAT= P2^0;


#define BIAS 0X52 /*定义1/3 偏压4 背极*/
//#define XTAL32 0X28 /*使用外部晶振*/
#define RC256 0X30 /*使用内部256KRC 振荡器*/
#define SYSEN 0X02 /*打开振荡发生器*/
#define LCDON 0X06 /*打开LCD*/
#define SYSDIS 0X00 /*关闭振荡发生器*/
//#define LCDOFF 0X04 /*显示关闭*/

uchar code table[20]={0x07,0x0D,0x00,0x05,0x05,0x0B,0x01,0x0F,0x02,0x07,0x03,0x0E,0x07,0x0E,0x01,0x05,0x03,0x0F,0x0F,0x0F };
void Start_spi(void);
void Delay(void);
void Delay1s(void);                                                             
void SENDCOMA(uchar com);
void SENDCOMB(uchar adr);
//void SENDCOMC(uchar com);
void disp(uchar dat);
void DISP_ALL(uchar dat);
void SendByte(uchar dat);
void SendBit(uchar dat,uchar bitcnt);


/*********************************************************************
延时函数
*********************************************************************/
void Delay(void)
{
uchar i;
for(i=0;i<10;i++); /*用于调整CLK 脉冲宽度*/
}

/*********************************************************************
长延时函数
*********************************************************************/
void Delay1s(void)
{
uchar i;
uint j;

for(i=0;i<100;i++)
for(j=0;j<1300;j++);
}

/*********************************************************************
发送命令函数A类
发送HT1621 命令时要先发送ID 值,及命令字用于设置HT1621.
*********************************************************************/
void SENDCOMA(uchar com)
{
Start_spi();
SendBit(0X80,4); /*发送设置命令ID=100 0*/
SendByte(com); /*发送命令字*/
}

/*********************************************************************
发送命令函数B 类
发送HT1621 命令时要先发送ID 值,后发送要写入数据起始地址,
用于对RAM 写操作(调用此函数后即可发送数据) adr 是高5 位有效
*********************************************************************/
void SENDCOMB(uchar adr)
{
Start_spi();
SendBit(0XA0,4); /*发送写显示RAM 命令ID=101 0*/
SendBit(adr,5); /*指定写入地址*/
}


//********************************************************************
//发送命令函数(C 类)
//发送HT1621 命令时要先发送ID 值.然后发送C 类的命令字
//********************************************************************
//void SENDCOMC(uchar com)
//{
//Start_spi();
//SendBit(0X90,4); /*发送命令ID=100 1*/
//SendByte(com); /*发送命令字*/
//}
//********************************************************************
//向显示缓冲区填充,以最简便的形式显示数据
//*******************************************************************/
void disp(uchar dat)
{
uchar i;
SENDCOMB(0x01); /*把数据指针指回1接着写入数据*/
for(i=0;i<16;i++) /*写入16 字节数据*/
{
SendByte(dat); /*写入数据*/
}
}

/******************************************************
全显示
******************************************************/
void DISP_ALL(uchar dat)
{
SENDCOMA(BIAS); /*设置偏压,背极数*/
SENDCOMA(RC256); /*设为内晶振256K*/
SENDCOMA(SYSEN); /*启动振荡器*/

SENDCOMA(LCDON); /*显示使能*/
//SENDCOMA(TIMERDIS); /*禁止时基输出*/
disp(dat); /*输出全显数据*/
}


/*********************************************************************
主函数
*********************************************************************/
void main()
{

uchar i,temp;
//WDTCTL=WDTPW+WDTHOLD;
//P2DIR|=BIT5+BIT6+BIT7;
while(1)
{
    for(i=0;i<1;i++)
    {
        temp=0x88;//table;
        DISP_ALL(temp); /*全显示测量*/
        Delay1s();    
    }
 }
}


/********************************************************************
名称: 发送数据位
*********************************************************************/


void SendBit(uchar dat,uchar bitcnt)
{
uchar i;
dat=dat<<3;
for(i=0;i<bitcnt;i++)
{
if(( dat & 0X80 ) == 0)

HT1621_DAT = 0;
else
HT1621_DAT = 1; /*发送数据由高位到低位传送*/
Delay();
HT1621_CS = 1; /*置时钟线为高通知被控器开始接收数位*/
Delay();
HT1621_CS=0; /*钳住总线准备下一个数据位*/
dat=dat<<1; /*发送数据左移一位*/
}
}

/**********************************************************************
起动ht1621
**********************************************************************/
void Start_spi(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
Delay();
HT1621_CS=0; 
HT1621_CS=0; 
HT1621_WR=0; 
HT1621_WR=0; 
}

/*********************************************************************
*发送字节函数,向ht1621 发送字节数据数据单元dat
*********************************************************************/
void SendByte(uchar dat)
{
SendBit(dat,8); /*发送字节*/
}

相关帖子

沙发
ayb_ice| | 2007-3-15 11:21 | 只看该作者

上传一个

以下是我在项目中使用的,只有2个函数就搞定了.

/*----------------------------------------------------
 * 功 能: ht1621_dis_all
 *----------------------------------------------------
 * 描 述: 连续写
 * 参 数: <add6=>目标首地址 <byte_len=>长度 <p_u8i=>待写数据指针
 * 返 回: None
 * 备 注: None
 *---------------------------------------------------*/
void ht1621_dis_all (void)
{
    U8 i;
    U8 add6;
    U8 byte_len;
    U8I *p_u8i;

    add6 = (1<<6);
    HT1621_DA = 1;                      // SB=1
    HT1621_CS = 0;

    ht1621_dly();
    HT1621_WR = 0;
    ht1621_dly();
    HT1621_WR = 1;

    for(i=8; i; i--){                   // 写add+ID
        add6 <<= 1;
        HT1621_DA = CY;
        ht1621_dly();
        HT1621_WR = 0;                  // 写时钟
        ht1621_dly();
        HT1621_WR = 1;
    }

    for(byte_len=sizeof(lcd_ram),p_u8i=lcd_ram; byte_len; byte_len--){
        add6 = *p_u8i;
        p_u8i++;
        for(i=8; i; i--){               // 写data4
            add6 <<= 1;
            HT1621_DA = CY;
            ht1621_dly();
            HT1621_WR = 0;
            ht1621_dly();
            HT1621_WR = 1;
        }
    }
    HT1621_CS = 1;
    HT1621_DA = 1;
}

/*----------------------------------------------------
 * 功 能: ht1621_cmd
 *----------------------------------------------------
 * 描 述: LCD命令函数
 * 参 数: <cmd=>命令
 * 返 回: None
 * 备 注: None
 *---------------------------------------------------*/
void ht1621_cmd (U16 cmd)
{
    U8 i;

    HT1621_CS = 0;
    for(i=12; i; i--){          // 直接发送12位命令代码
        cmd <<= 1;
        HT1621_DA = CY;
        ht1621_dly();
        HT1621_WR = 0;
        ht1621_dly();
        HT1621_WR = 1;
    }

    HT1621_CS = 1;
    HT1621_DA = 1;
}

void ht1621_init(void)
{
    HT1621_CS = 1;         // Ht1621必须的初始化(CPU复位已完成)
    HT1621_DA = 1;
    HT1621_WR = 1;
    HT1621_RD = 1;

    ht1621_cmd(SYS_EN);  // 根据需要的初始化
    ht1621_cmd(RC_256K);                // 选择片内时钟源
    ht1621_cmd(NORMAL);                 // 标准工作方式
    ht1621_cmd(HT1621_CFG);             // 配置LCD
    ht1621_cmd(LCD_ON);
}

使用特权

评论回复
板凳
sio4| | 2007-3-16 20:33 | 只看该作者

楼上写的不错!

使用特权

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

本版积分规则

12

主题

59

帖子

0

粉丝