xky183 发表于 2005-3-4 13:32:38

[求助]HT1621为何点不亮(附程序、资料)

HT1621接在ATmega8B口

下面的程序是从PIC上移植过来的

请高手指教



*******************************************************************

公司名称:

模块名称:

功    能:液晶驱动模块         芯片型号:HT1621

说    明:

程序设计:   

设计时间:      

版 本 号:

*******************************************************************/

#include <iom8v.h>



#include <math.h>

#include <stdio.h>

#define WR      0B00100000//时钟线

#define DATA    0B00001000//数据线

#define CS      0b00010000//片选线

#define word_long 8

unsigned char   TAB_DISPLAY ={1,2};

/*1621的显存是4位*32的,故用16*8位的寄存器

就能满足要求奇数显存放高4位,偶数放低4位*/

/*****************************************************************/

   /*LCD系统命令(可选)*/

const char TAB_REST={0b00000001,/*打开系统振荡器命令*/

    0b00000011,/*打开LCD 偏压发生器命令*/

    0b00000101,/*WDT 溢出标志输出失效命令*/

    0b00000110,/*时基输出使能命令*/

    0b00011000,/*系统时钟源片内RC振荡器命令*/

    0b00101001,/*LCD1/3偏压选项4个公共口命令*/

    0b01000000,/*声音频率4KHz命令*/

    0b00001001,/*打开声音输出命令*/

    0b10100000,/*时基/WDT 时钟输出1Hz命令*/

    0b10001000};/*使/IRQ 输出有效命令*/

       

       

void send_data(unsigned char data_bus,unsigned char loop);

/********************************************************************

函 数 名:delay( )

功    能:延时

说    明 (内部函数)

入口参数:无

返 回 值:无

设    计:         日    期:

修    改:                      日    期:

***********************************************************************/

void delay(void)

{

asm("nop");

asm("nop");

asm("nop");

asm("nop");

asm("nop");

asm("nop");

}

/********************************************************************

函 数 名:display_start( )

功    能:LCD系统初始化

说    明 启动1621

入口参数:无

返 回 值:无

设    计:                      日    期:

修    改:                      日    期:

***********************************************************************/

void display_start(void)

{

unsigned char t;

PORTB &=~CS;

send_data(0b10000000,3);/*送3位命令模式代码100*/

for(t=0;t<=9;t++)

{

   send_data(TAB_REST,9);/*送9位命令代码*/

}

PORTB |=CS;

PORTB |=WR;

}

/********************************************************************

函 数 名:display( )

功    能:写显存

说    明 连续地址写模式

入口参数:无

返 回 值:无

设    计:                      日    期:

修    改:                      日    期:

***********************************************************************/

void display(void)

{

unsigned char t;

PORTB &=~CS;

PORTB &=~WR;

send_data(0b10100000,3);/*送3位WRITE 模式命令代码101*/

send_data(0,6);/*送6位首地址00h*/

for(t=0;t<=15;t++)

{

   send_data(TAB_DISPLAY,word_long);/*送16*8显存数据*/

}

PORTB |=CS;

PORTB |=WR;

}

/********************************************************************

函 数 名:send_data(data_bus,loop)

功    能:数据传送

说    明(内部函数)

入口参数:待传数,待传数的位数

返 回 值:无

设    计:                      日    期:

修    改:                      日    期:

***********************************************************************/

void send_data(unsigned char data_bus,unsigned char loop)



{

for(;loop!=0;loop--)

{

   delay();

   PORTB &=WR;

   if((data_bus&0b10000000)==0)

   {

    PORTB &=~DATA;

   }

   else

   {

    PORTB |=DATA;

   }

   data_bus=data_bus<<1;

   PORTB |=WR;

}



}

//****************************************************************

void main(void)

{

DDRB =0XFF;

PORTB =0XFF;

display_start( );

while(1)

{

   display( );

}

}

//****************************************************************/
-----此内容被xky183于2005-03-04,20:03:35编辑过

xky183 发表于 2005-3-4 13:34:42

HT1621的datasheet,和网上找的一个应用例子



点击此处打开armok0139902.pdf

点击此处打开armok0139903.pdf

jeiboy 发表于 2005-3-4 15:25:33

void send_data(unsigned char data_bus,unsigned char loop)



{

for(;loop!=0;loop--)

{

   dlay();

   PORTB &=WR;   //是不是要改成 =>PORTB &=~WR;   

                   //

//没详细看程序,再PIC上可以的,再M8上一定可以的.

xky183 发表于 2005-3-4 18:56:06

谢谢楼上的指教

这里确实是我移植的时候的失误,但是修改后还是有问题,还是不显示

xky183 发表于 2005-3-4 20:01:02

问题解决了

等我整理好了就上传详细的资料和调试过程

希望对别人用到的时候少走弯路
-----此内容被xky183于2005-03-04,20:04:51编辑过

armok 发表于 2005-3-4 20:32:15

phantompaul 发表于 2005-3-5 15:47:45

检查一下管脚定义,我的HT1621可以正常工作!

hedi 发表于 2005-4-22 15:56:30

phantompaul 能否把你的HT1621的程序贴出来呀,谢谢

xky183 现在的这个程序是否是测试好使的程序呀 谢谢

josn-lu 发表于 2005-4-22 16:19:15

注意硬件时序的时间要求,如建立时间 保持时间

avr速度比较快

korren 发表于 2005-4-22 16:23:16

这是我写的,在HOLTEK ht49r30a-1调试通过.



//THIS PROGRAM IS HT1621 (32*4)LCD DISPLAY

#ifndef _HT1621_H

#define _HT1621_H



/* HT1621 mode */



#define         READ                 0xC0        // Read operation --110

#define         WRITE                 0xA0        // Write operation -- 101

#define         R_M_W                0xA0         // Read-modify-write operation -- 101

#define         COMMAND                0x80         // Command operation -- 100



#define         MODE                 3

#define         CMD                        9

#define         ADDR                6





/* HT1621 command definiton */

#define         SYS_DIS         0x00         // Turn off both system oscillatior and LCD bias generator. default

#define         SYS_EN                 0x01         // Turn on system oscillator

#define         LCD_OFF         0x02         // Turn off LCD bias generator. default

#define         LCD_ON                 0x03         // Turn on LCD bias generator

#define         TIMER_DIS         0x04         // Disable time base output

#define         WDT_DIS         0x05         // Disable WDT time-out flag output

#define         TIMER_EN         0x06         // Enable time base output

#define         WDT_EN                 0x07         // Enable WDT time-out flag output

#define         TONE_OFF         0x08         // Turn off tone outputs. default

#define         TONE_ON         0x09         // Turn on tone output

#define         CLR_TIMER         0x0C         // Clear the contents of time base generator

#define         CLR_WDT         0x0E         // Clear the contents of WDT stage

#define         XTAL_32K         0x14         // System clock source, crystal oscillator

#define         RC_256K         0x18         // System clock source, on-chip RC oscillator. default

#define         EXT_256K         0x1C         // System clock source, external clock source

#define         BIAS22                 0x20         // LCD 1/2 bias, 2 commons option

#define         BIAS23                 0x24         // LCD 1/2 bias, 3 commons option

#define         BIAS24                 0x28         // LCD 1/2 bias, 4 commons option

#define         BIAS32                 0x21         // LCD 1/3 bias, 2 commons option

#define         BIAS33                 0x25         // LCD 1/3 bias, 3 commons option

#define         BIAS34                 0x29         // LCD 1/3 bias, 4 commons option

#define         TONE_4K         0x40         // Tone frequency, 4KHZ

#define         TONE_2K         0x60         // Tone frequency, 2KHz

#define         IRQ_DIS         0x80         // Disable IRQ output. default

#define         IRQ_EN                 0x88         // Enable IRQ output

#define         F1                 0xA0         // Time base/WDT clock output:1Hz, The WDT time-out flag after:4s

#define         F2                 0xA1         // Time base/WDT clock output:2Hz, The WDT time-out flag after:2s

#define         F4                 0xA2         // Time base/WDT clock output:4Hz, The WDT time-out flag after:1s

#define         F8                 0xA3         // Time base/WDT clock output:8Hz, The WDT time-out flag after:1/2s

#define         F16                0xA4         // Time base/WDT clock output:16Hz, The WDT time-out flag after:1/4s

#define         F32                0xA5         // Time base/WDT clock output:32Hz, The WDT time-out flag after:1/8s

#define         F64                0xA6         // Time base/WDT clock output:64Hz, The WDT time-out flag after:1/16s

#define         F128                0xA7         // Time base/WDT clock output:128Hz, The WDT time-out flag after:1/32s. default

#define         NORMAL                 0xE3         // Normal mode. default





/* I/O definition for HT1621 */

/*

#ifdef HT1621

#define         HT1621_CS         RB1        

#define         HT1621_RD         RB2

#define         HT1621_WR        RB3

#define         HT1621_DATA         RB4

#endif

*/



/*

//================================================================

void WriteMode(unsigned char mode)

{

        unsigned char i;

       

        for(i=3; i>0; i--)

        {

                HT1621_WR=0;

                if(mode & 0x80) HT1621_DATA=1;

                else HT1621_DATA=0;

                mode <<=1;                 //MSB first

                NOP();

                HT1621_WR=1;

                NOP();

                NOP();

                NOP();

                NOP();

                }

       

        }



//================================================================

void WriteCmd(unsigned char cmd)

{

        unsigned char i;

        for(i=9; i>0; i--)

        {

                HT1621_WR=0;

                if(cmd & 0x80) HT1621_DATA=1;

                else HT1621_DATA=0;

                cmd <<=1;                 //MSB first

                NOP();

                HT1621_WR=1;

                NOP();

                NOP();

                NOP();

                NOP();

                }

       

        }



//================================================================

void WriteAdr(unsigned char adr)

{

        unsigned char i;

        for(i=6; i>0; i--)

        {

                HT1621_WR=0;

                if(adr & 0x80) HT1621_DATA=1;

                else HT1621_DATA=0;

                adr <<=1;                 //MSB first

                NOP();

                HT1621_WR=1;

                NOP();

                NOP();

                NOP();

                NOP();               

                }

        }

*/

//================================================================

void _1621Write(unsigned char value,unsigned char TYPE)

{

        unsigned char i;

        for(i=TYPE; i>0; i--)

        {

                HT1621_WR=0;

                if(value & 0x80) HT1621_DATA=1;

                else HT1621_DATA=0;

                value <<=1;                 //MSB first

                NOP();

                HT1621_WR=1;

                NOP();

                NOP();

                NOP();

                NOP();               

                }

        }

//================================================================

void WriteData(unsigned char dat)

{

        unsigned char i;

       

        for(i=4; i>0; i--)

        {

                HT1621_WR=0;

                if(dat & 0x01) HT1621_DATA=1;

                else HT1621_DATA=0;

                dat >>=1;                 //MSL first

                NOP();

                HT1621_WR=1;

                NOP();

                NOP();

                NOP();

                NOP();       

                }

        }       



//================================================================

unsigned char ReadByte(void)

{

        unsigned char i;

        unsigned char value;

       

        for(i=4; i>0; i--)

        {

                HT1621_RD=0;

                value >>=1;         //MSL first

                if(HT1621_DATA) value |= 0x80;

                NOP();

                HT1621_RD=1;

                NOP();

                NOP();

                NOP();

                NOP();

                }

        value = (value >>4) & 0x0f;

        return (value);

        }



//==================================================================

unsigned char HT1621Read(unsigned char adr)

{

        unsigned char dt;

       

        _1621Write(READ,MODE);

        _1621Write(adr,ADDR);

        //HT1621_WR=1;

        dt=ReadByte();

        return dt;

        }

//==================================================================

void HT1621ReadN(unsigned char StartAdr, unsigned char        *p, unsigned char n)

{

        unsigned char i;

       

        HT1621_CS=0;

        _1621Write(READ,MODE);

        _1621Write(StartAdr,ADDR);

        for(i=n; i>0; i--)

        {

                p=ReadByte();                                      

                }

        HT1621_CS=1;

       

        }

//==================================================================

void HT1621Write(unsigned char adr, unsigned char dat)

{

        _1621Write(WRITE,MODE);

        _1621Write(adr,ADDR);

        WriteData(dat);

        }



//===================================================================



void HT1621WriteN(unsigned char StartAdr, unsigned char *p, unsigned char n)

{

        unsigned char i;

       

        HT1621_CS=0;

        _1621Write(WRITE,MODE);

        _1621Write(StartAdr,ADDR);

        for(i=n; i>0; i--)

        {

                WriteData(p);

                }

        HT1621_CS=1;

        }



void HT1621Init(unsigned char StartAdr, unsigned char n)

{

        unsigned char i;

       

        HT1621_CS=0;

        _1621Write(WRITE,MODE);

        _1621Write(StartAdr,ADDR);

        for(i=n; i>0; i--)

        {

                WriteData(0x00);

                }

        HT1621_CS=1;



}

//====================================================================

void Read_Mod_Write(unsigned char adr,unsigned char dt)

{

        unsigned char value;

       

        _1621Write(WRITE,MODE);

        _1621Write(adr,ADDR);

        value=ReadByte();

        if(value != dt)

        {

                WriteData(dt);

                }

        }



//=====================================================================

void HT1621Comm(unsigned char cmd)

{

        _1621Write(COMMAND,MODE);

        _1621Write(cmd,CMD);

        }



#endif

//End define _HT1621_H







#include "ht49r30a-1.h"

//#include <pic.h>



#define         HT1621_CS                 _pa0       

#define         HT1621_RD                 _pa1

#define         HT1621_WR                _pa2

#define         HT1621_DATA         _pa3



#define         NOP()                        _nop()



#include "HT1621.h"



const unsigned char LcdDig[]={0xf3, 0x60, 0xb5, 0xf4, 0x66, 0xd6, 0xd7, 0x72, 0xF7, 0xF6};

                              //0,1,   2,    3,    4,    5,   6,   7,    8,   9

const unsigned char Fan_Led[]={0x01, 0x03, 0x07, 0x0f};

                              //Low,Mid,High, Auot

                              //STB,OPER, ESF,Backlight_Green ;address at 0x08-0x0b

                              //BK_Red, Timer, Filter             ;address at 0x0C-0x0e

                                     

#define         LOW_FAN                0x7F                //Display Lowfan constant

#define         MID_FAN                0xBF                //Display Mid fan constant

#define         HIGH_FAN        0xDF                //Display Hiht fan constant

#define         AUTO_FAN         0xEF                //Display Auto fan constant



#define         DISP_C                 0xEF                //Temperature display constant



#define         STB_LED                0x7F

#define         OPER_LED        0xBF

#define         ESF_LED         0xDF

#define         BK_GREEN         0xEF

#define         BK_RED                0x7F

#define         TIMER_LED        0xBF

#define         FILTER_LED         0xDF





#define         Dig0_StartAdr         (0x02<<2)                //Address from 0x02 to 0x03

#define         Dig1_StartAdr         (0x04<<2)                //Address from 0x04 to 0x05

#define         Fan_Adr                 (0x00<<2)                //Address at 0x00

#define         F_Adr                         (0x00)

#define         Disp_C_Adr                (0x04<<2)

#define         Led_Start_Adr         (0x08<<2)                //







void delayms(unsigned int n)

{

        unsigned int i,j;

        for(i=65000; i>0; i--)

        {

                for(j=65000; j>0; j--)

                {

                for(; n>0; n--)

                ;

                }

        }



}

void IOInit(void)

{

       

        }

       





void main(void)

{

               

        IOInit();

        delayms(1000);

        HT1621_CS=0;

        _1621Write(COMMAND,MODE);

        _1621Write(SYS_DIS,CMD);

        _1621Write(LCD_OFF,CMD);

        HT1621_CS=1;

        delayms(1000);

        HT1621Init(0, 15);

        HT1621_CS=0;

        _1621Write(COMMAND,MODE);

        _1621Write(SYS_EN,CMD);

        _1621Write(LCD_ON,CMD);

        _1621Write(RC_256K,CMD);

        _1621Write(BIAS34,CMD);

        HT1621_CS=1;

        while(1)

        {

                unsigned char i,j;

                unsigned char temp;

                HT1621_CS=0;

                for(j=0,i=0; i<10; i++)

                {

                        HT1621_CS=0;

                        HT1621Write(Dig0_StartAdr,LcdDig);

                        HT1621_CS=1;

                        temp = LcdDig>>4;

                        HT1621_CS=0;

                        HT1621Write((Dig0_StartAdr+(1<<2)),temp);

                        HT1621_CS=1;

                       

                        NOP();

                        HT1621_CS=0;

                        HT1621Write(Dig1_StartAdr,LcdDig);

                        HT1621_CS=1;

                        temp = LcdDig>>4;

                        HT1621_CS=0;

                        HT1621Write((Dig1_StartAdr+(1<<2)),temp);

                        HT1621_CS=1;

                       

                        if(i >4) j=0;

                        if(j > 4) j=0;

                        HT1621_CS=0;

                        //HT1621Write((Led_Start_Adr+(i<<2)),Fan_Led);

                        HT1621Write(Fan_Adr,Fan_Led);

                       

                        HT1621_CS=1;

                        j++;

                        delayms(65000);

                        }

                HT1621_CS=0;       

                HT1621Write(Disp_C_Adr, DISP_C);

                HT1621_CS=1;

                }

        }

deepin 发表于 2009-2-23 17:10:19

MARK,学习了!!!

psbhero 发表于 2012-5-24 14:48:56

MARK MARK MARK

xqn2012 发表于 2012-12-17 20:13:52

MARK一下,明天再继续研究

RainKing 发表于 2013-9-12 17:46:54

正需要..............

qwerwe 发表于 2013-9-22 10:42:36

看看……

1633994509 发表于 2013-9-22 11:12:43

同样想知道这个怎么实现,有经验的给介绍下 给个思路也可以

feezai 发表于 2013-12-24 15:51:12

学习了,但是俺的ht1621死活读不出数据。

a515509429 发表于 2015-9-23 15:39:42

标记,准备学习~

1125526801 发表于 2017-9-14 23:07:59

korren 发表于 2005-4-22 16:23
这是我写的,在HOLTEK ht49r30a-1调试通过.



//THIS PROGRAM IS HT1621 (32*4)LCD DISPLAY



参考一下。谢谢分享
页: [1]
查看完整版本: [求助]HT1621为何点不亮(附程序、资料)