kyughanum 发表于 2009-10-17 16:10:38

谁帮我看看,我这个开源LCD的HT1621程序调几天了都调不出来,程序是根据合泰的程序改的,

#define F_CPU8000000UL
#include <avr/io.h>
#include <util/delay.h>
//#include "HT1621.h"

#define    CONPORT   PORTD
#define    CONDDR    DDRD
#define    CS      3
#define    RD      2
#define    WR      1
#define    DATA      0

#define CS_H      CONPORT |= (1<<CS)
#define CS_L      CONPORT &= ~(1<<CS)
#define WR_H      CONPORT |= (1<<WR)
#define WR_L      CONPORT &= ~(1<<WR)
#define RD_H      CONPORT |= (1<<RD)
#define RD_L      CONPORT &= ~(1<<RD)
#define DATA_H    CONPORT |= (1<<DATA)
#define DATA_L    CONPORT &= ~(1<<DATA)

#define CS_O      CONDDR |= (1<<CS)
#define WR_O      CONDDR |= (1<<WR)
#define RD_O      CONDDR |= (1<<RD)
#define DATA_O    CONDDR |= (1<<DATA)

#define _CMD_SYS_DIS    0X0
#define _CMD_SYS_EN   0X1
#define _CMD_LCD_OFF    0X2
#define _CMD_LCD_ON   0X3
#define _CMD_TIMER_DIS0X4
#define _CMD_WDT_DIS    0X5
#define _CMD_TIMER_EN   0X6
#define _CMD_WDT_EN   0X7
#define _CMD_TONF_OFF   0X8
#define _CMD_TONF_ON    0X9
#define _CMD_CLR_TIMER0XD
#define _CMD_CLR_WDT    0XF
#define _CMD_XTAL_32K   0X14
#define _CMD_RC_256K    0X18
#define _CMD_EXT_256K   0X1C
#define _CMD_2_BIAS   0X28
#define _CMD_3_BIAS   0X29
#define _CMD_TONE_4K    0X40
#define _CMD_TONE_2K    0X60
#define _CMD_IRQ_DIS    0X80
#define _CMD_IRQ_EN   0X88

#define _CMD_F1         0XA0
#define _CMD_F2         0XA1
#define _CMD_F4         0XA2
#define _CMD_F8         0XA3
#define _CMD_F16      0XA4
#define _CMD_F32      0XA5
#define _CMD_F64      0XA6
#define _CMD_F128       0XA7
#define _CMD_TEST       0XE0
#define _CMD_NORMAL   0XE3

#define                        _lcd_BUSY                               0      
#define                        _lcd_AC                                        1             
#define                        _lcd_PLUS                                2      
#define                        _lcd_F1                                        3
#define                        _lcd_ERROR                          4
#define                        _lcd_DC                                        5
#define                        _lcd_MINUS                                6
#define                        _lcd_F2                                        7
#define                        _lcd_DOT0                                12
#define                        _lcd_AUTO                                20
#define                        _lcd_RUN                                24
#define                        _lcd_PAUSE                                25
#define                        _lcd_DOT1                                26
#define                        _lcd_COLON0                          27
#define                        _lcd_DOT2                                32
#define                        _lcd_STOP                                40
#define                        _lcd_KPA                                44
#define                        _lcd_SETUP                                45
#define                        _lcd_DOT3                                46
#define                        _lcd_COLON1                          47
#define                        _lcd_DOT4                                52
#define                        _lcd_KG                                        60
#define                        _lcd_MM                                        64
#define                        _lcd_KM                                        65
#define                        _lcd_L                                        66
#define                        _lcd_M3                                        67
#define                        _lcd_DB                                        68
#define                        _lcd_PERCENT                  69
#define                        _lcd_OHOM                                70
#define                        _lcd_DEGREE                          71
#define                        _lcd_A                                        72
#define                        _lcd_V                                        73
#define                        _lcd_MHZ                                74
#define                        _lcd_KW                                75
#define                        _lcd_MA                                76
#define                        _lcd_MV                                77
#define                        _lcd_KHZ                          78
#define                        _lcd_W                                  79
#define                        _lcd_NG                                80
#define                        _lcd_OK                                81
#define                        _lcd_RX                                82
#define                        _lcd_TX                                83
#define                        _lcd_FM                                84
#define                        _lcd_PM                                85
#define                        _lcd_AM                                86
#define                        _lcd_CARD                        87
#define                        _lcd_AT3                          88
#define                        _lcd_AT2                          89
#define                        _lcd_AT1                          90
#define                        _lcd_AT0                          91
#define                        _lcd_LOCK                        95
#define                        _lcd_BELL                        103
#define                        _lcd_COLON2                        111
#define                        _lcd_BAT                          119
#define                        _lcd_MAX                          124
#define                        _lcd_MIN                          125
#define                        _lcd_CH                                126
#define                        _lcd_FAULT                        127

void send_bit_HT1621(unsigned char data,unsigned char cnt) //data 的高cnt 位元写入HT1621,高位在前
{
        unsigned char i;
        for(i =0; i <cnt; i ++)
        {
                if((data&0x80)==0) DATA_L;
                        else DATA_H;
                WR_L;
                _delay_us(1);
                WR_H;
                data<<=1;
        }
}

void send_data_bit_HT1621(unsigned char data,unsigned char cnt) //data 的低cnt 位写入HT1621,低位在前
{
        unsigned char i;
        for(i =0; i <cnt; i ++)
        {
                if((data&0x01)==0) DATA_L;
                        else DATA_H;
                WR_L;
                _delay_us(1);
                WR_H;
                data>>=1;
        }
}

void write_CMD_HT1621(unsigned char command)
{
//        CS_O;
//        WR_O;
//        DATA_O;
        CS_L;
        send_bit_HT1621(0x80,4); //写入模式码“100”和9 位command 命令,由于
        send_bit_HT1621(command,8); //没有使有到更改时钟输出等命令,為了编程方便
        CS_H; //直接将command 的最高位写“0”
}

void write_data_HT1621(unsigned char addr,unsigned char data)
{
//        CS_O;
//        WR_O;
//        DATA_O;
        CS_L;
        send_bit_HT1621(0xa0,3); //写入模式码“101”
        send_bit_HT1621(addr,6); //写addr 的高6 位元
        send_data_bit_HT1621(data,4); //写入data 的低4 位元
        CS_H;
}

void write_ht1621_to(unsigned char addr,unsigned char *p,unsigned char cnt)
{
        unsigned char i;
//        CS_O;
//        WR_O;
//        DATA_O;
        CS_L;
        send_bit_HT1621(0xa0,3); //写入模式码“101”
        send_bit_HT1621(addr,6); //写addr 的高6 位元
        for(i =0; i <cnt; i ++,p++) //连续写入资料
        {
                send_data_bit_HT1621(*p,8);
        }
        CS_H;
}

void HT1621_init(void)
{
        write_CMD_HT1621(_CMD_2_BIAS);//设置偏压和公共口
        write_CMD_HT1621(_CMD_RC_256K); //系统时钟源,片内RC256K 振荡器
        write_CMD_HT1621(_CMD_SYS_EN);//打开系统振荡器
        write_CMD_HT1621(_CMD_LCD_ON);//打开LCD 偏压发生器
}

int main(void)
{
        unsigned char a;
        a=0x21;a=0x43;a=0x65;a=0x87;a=0xa9;
        CONDDR=0xff; //將口設為輸出
        _delay_ms(100);
        HT1621_init();
        write_data_HT1621(0x24,0x01); //0x24: (位址)的高6 位有效,
        //0x01: (資料)的低4 位元有效
        write_ht1621_to(0,a,5); //0:(起始位址)高6 位有效,
        //a:(寫入資料的起始位址)8 位元都有效,
        //6:為寫入的位元組數。連續寫入”123456789a”
        //SendCmd(LCDOFF); //關閉LCD 顯示
        while(1);
}

kyughanum 发表于 2009-10-17 16:12:07

附上合泰官网的HT1621程序:
点击此处下载 ourdev_492595.pdf(文件大小:122K) (原文件名:HT48 & HT46 MCU 对HT1621 的读写.pdf)

kyughanum 发表于 2009-10-17 16:19:30

哦,MCU是M32,外部8M晶振,接在PORTD,已关闭JTAG。这么简单程序,搞几天搞不出,真要倒了!

kyughanum 发表于 2009-10-17 16:24:14

GCC的写的,编译无任何错误,不启用优化,编译信息如下:

Build started 17.10.2009 at 16:09:38
avr-gcc.exe-mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d-c../main.c
avr-gcc.exe -mmcu=atmega32 -Wl,-Map=HT1621.map main.o   -o HT1621.elf
avr-objcopy -O ihex -R .eepromHT1621.elf HT1621.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex HT1621.elf HT1621.eep || exit 0
avr-objdump -h -S HT1621.elf > HT1621.lss
AVR Memory Usage
----------------
Device: atmega32
Program:   450 bytes (1.4% Full)
(.text + .data + .bootloader)
Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...

kyughanum 发表于 2009-10-17 19:11:09

我操合泰,官方的程序也有问题!害我浪费了两天时间!真是打击啊!大家请看:
合泰官网的程序,在上面1楼,其中发送命令如下图:
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492644.JPG
(原文件名:sendCMD.JPG)
而这个是错误的,应该如下才对:

void write_CMD_HT1621(unsigned char command)
{
// CS_O;
// WR_O;
// DATA_O;
CS_L;
send_bit_HT1621(0x80,3); //写入模式码“100”和9 位command 命令,由于
send_bit_HT1621(command,9); //没有使有到更改时钟输出等命令,為了编程方便
CS_H; //直接将command 的最高位写“0”
}

真是的,一个程序没调好也敢放官方网站!希望以后有人碰到了也随便CAO一下!

seti 发表于 2009-10-17 21:21:38

我手上的文档没有问题啊,文件编码:HA0103S2006-7-11

yanxiao1227 发表于 2009-10-17 22:56:30

问下楼主,我也用ht1621,我用的是STM32,在16M以上的时钟情况下,不管我延时怎么弄,液晶都点不亮。
知道这是为什么吗?

kyughanum 发表于 2009-10-17 22:58:50

TO 【5楼】 seti
这个文档刚从合泰官网下载,不会是我一说就改了吧?

TO 6楼
与官网的那个文档就是我上面指出的那个有问题了~~其他是正常的,你可以看看。我上面的程序是基于GCC的参考合泰官网的,应该很方便移植。

xiaojian 发表于 2009-10-18 07:15:29

楼主,我觉得合泰的没有错误,只不过使用的方法不一样,给你看看我的子函数

void write_1621data(uchar sdata,uchar cnt)//写数据
{
        for(;cnt;cnt--)
        {
                WR_1621 = 0;
                delay_5us();
                if(sdata&0x80)
          DI_1621 = 1;
                else
                DI_1621 = 0;
                WR_1621 = 1;
                delay_5us();
                sdata<<= 1;
        }
}
//==========================================
void write_1621cmd(uchar command)//写命令
{
        CS_1621=0;
        delay_5us();
        write_1621data(0x80,4);
        write_1621data(command,8);
        CS_1621=1;
}
//==========================
void Write_1621(uchar addr,uchar sdata) //写数据和命令
{
        addr<<=2;
        CS_1621=0;
        delay_5us();
        write_1621data(0xa0,3);   //写入标志码“101?
        write_1621data(addr,6);   //写入addr 的高6位
        write_1621data(sdata,8);    //写入data 的8位
        CS_1621=1;
}

//==============================
void init_1621(void) //1621初始化
{
    write_1621cmd(0x02); //Sys_en
        write_1621cmd(0x30);//RCosc 系统时钟源片内RC 振荡器
        write_1621cmd(0x52);//ComMode4COM,1/3bias1000 0101 0010
        write_1621cmd(0x06);//LCD_on 打开LCD 偏压发生器1000   0000 0110
        //LCDon();
}
//======================================================

xiaojian 发表于 2009-10-18 07:45:57

我看出一点区别了,楼主用的4位数据,我的是8位数据格式,send_data_bit_HT1621(data,4); //写入data 的低4 位元 如果把这句改为8,不知道会怎样,好像这个就是写连续地址模式。

xiaojian 发表于 2009-10-18 08:43:15

还有既然我的程序和楼主的 都能点亮,也能正常工作,说明写入3位标志码,4位标志码,还有8位命令码,9位命令码没有多大的区别,关键在于合泰别的子函数哪里有问题,哪位能够指教一下

xiaojian 发表于 2009-10-18 08:55:34

void write_data_HT1621(unsigned char addr,unsigned char data)
{
// CS_O;
// WR_O;
// DATA_O;
CS_L;
send_bit_HT1621(0xa0,3); //写入模式码“101”
send_bit_HT1621(addr,6); //写addr 的高6 位元
send_data_bit_HT1621(data,4); //写入data 的低4 位元
CS_H;
}
会不会是这里的问题,addr应该是低6位才对,addr<<=2;我的是做过移位处理的,看官方资料
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492931.jpg
这个是A0-A5,应该是低6位才对 (原文件名:1.jpg)
但是楼主这样改一下就ok我还是没有看懂,欢迎拍砖。

oufuqiang 发表于 2009-10-19 23:04:58

先记录一下,回头再看

hero245 发表于 2010-11-17 14:29:43

回复【4楼】kyughanum 初级玩家
我操合泰,官方的程序也有问题!害我浪费了两天时间!真是打击啊!大家请看:
合泰官网的程序,在上面1楼,其中发送命令如下图:


(原文件名:sendcmd.jpg)
引用图片
而这个是错误的,应该如下才对:
void write_cmd_ht1621(unsigned char command)
{
// cs_o;
// wr_o;
// data_o;
cs_l;
send_bit_ht1621(0x80,3);......
-----------------------------------------------------------------------
楼主好像操错了吧?!最近也在写HT1621B。合泰的没错吧,只是写法不同而已。

#define BIAS 0X52                         //1/3偏压,4个公共口
void SendCmd(uchar command)
{
CS=0;
delay(3);
SendBit_1621(0x80,4);
SendBit_1621(command,8);
CS=1;
delay(2);
}

同样的,1/3偏压,4个公共口

#define BIAS 0X29
void SendCmd(uchar command)
{
        cs=0;
        SendBit_1621(0x80,3); //写入标志码"100"
        SendBit_1621(command,9); //写入9 位数据,其中前8 位为command 命令,最后1 位任意
        cs=1;
}

两个写法,只是前面的 BIAS定义不同而已。

sunnyAVR 发表于 2010-11-22 15:29:21

mark

zucc508 发表于 2011-10-16 22:01:15

马克

破风 发表于 2012-6-13 13:06:49

合泰LCD的HT1621程序调试

zhouzmt 发表于 2012-8-16 11:46:59

正在用HT1621B

dianzichina 发表于 2012-8-17 08:23:07

合泰LCD的HT1621程序调试

mmy168 发表于 2012-11-25 02:47:02

我两天也是第一次搞HT1621,点亮倒是不费什么力气。但后面的显示就把我整个半死。到最后发现全是自己的问题。
1. 写入数据地址是6bits我只操作了5bits
2. 拿到一张真值表就以为万事大吉了。那只是屏的真值表,不代表人家画PCB接线的时候SEG从0按顺序开始。说不定SEG还有交错连接进玻璃的可能。点了两天就是点不中自己想亮的那个点。没办法,只好从地址0开始一笔一笔的传数据来破人家高头画的PCB.一个字,累!

trm99999 发表于 2015-8-12 08:07:03

不错的资源,谢谢分享。。。
页: [1]
查看完整版本: 谁帮我看看,我这个开源LCD的HT1621程序调几天了都调不出来,程序是根据合泰的程序改的,