搜索
bottom↓
回复: 21

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

[复制链接]

出0入0汤圆

发表于 2009-10-17 16:10:38 | 显示全部楼层 |阅读模式
#define F_CPU  8000000UL
#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_DIS  0X4
#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_TIMER  0XD
#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[10];
        a[0]=0x21;a[1]=0x43;a[2]=0x65;a[3]=0x87;a[4]=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);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

 楼主| 发表于 2009-10-17 16:12:07 | 显示全部楼层
附上合泰官网的HT1621程序:
点击此处下载 ourdev_492595.pdf(文件大小:122K) (原文件名:HT48 & HT46 MCU 对HT1621 的读写.pdf)

出0入0汤圆

 楼主| 发表于 2009-10-17 16:19:30 | 显示全部楼层
哦,MCU是M32,外部8M晶振,接在PORTD,已关闭JTAG。这么简单程序,搞几天搞不出,真要倒了!

出0入0汤圆

 楼主| 发表于 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 .eeprom  HT1621.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...

出0入0汤圆

 楼主| 发表于 2009-10-17 19:11:09 | 显示全部楼层
我操合泰,官方的程序也有问题!害我浪费了两天时间!真是打击啊!大家请看:
合泰官网的程序,在上面1楼,其中发送命令如下图:

(原文件名: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一下!

出0入0汤圆

发表于 2009-10-17 21:21:38 | 显示全部楼层
我手上的文档没有问题啊,文件编码:HA0103S  2006-7-11

出0入0汤圆

发表于 2009-10-17 22:56:30 | 显示全部楼层
问下楼主,我也用ht1621,我用的是STM32,在16M以上的时钟情况下,不管我延时怎么弄,液晶都点不亮。
知道这是为什么吗?

出0入0汤圆

 楼主| 发表于 2009-10-17 22:58:50 | 显示全部楼层
TO 【5楼】 seti
这个文档刚从合泰官网下载,不会是我一说就改了吧?

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

出0入0汤圆

发表于 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);//ComMode  4COM,1/3bias  1000 0101 0010
        write_1621cmd(0x06);//LCD_on 打开LCD 偏压发生器1000     0000 0110
        //LCDon();
}
//======================================================

出0入0汤圆

发表于 2009-10-18 07:45:57 | 显示全部楼层
我看出一点区别了,楼主用的4位数据,我的是8位数据格式,send_data_bit_HT1621(data,4); //写入data 的低4 位元 如果把这句改为8,不知道会怎样,好像这个就是写连续地址模式。

出0入0汤圆

发表于 2009-10-18 08:43:15 | 显示全部楼层
还有既然我的程序和楼主的 都能点亮,也能正常工作,说明写入3位标志码,4位标志码,还有8位命令码,9位命令码没有多大的区别,关键在于合泰别的子函数哪里有问题,哪位能够指教一下

出0入0汤圆

发表于 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;  我的是做过移位处理的,看官方资料

这个是A0-A5,应该是低6位才对 (原文件名:1.jpg)
但是楼主这样改一下就ok我还是没有看懂,欢迎拍砖。

出0入0汤圆

发表于 2009-10-19 23:04:58 | 显示全部楼层
先记录一下,回头再看

出0入97汤圆

发表于 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定义不同而已。

出0入0汤圆

发表于 2010-11-22 15:29:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-16 22:01:15 | 显示全部楼层
马克

出0入0汤圆

发表于 2012-6-13 13:06:49 | 显示全部楼层
合泰LCD的HT1621程序调试

出0入0汤圆

发表于 2012-8-16 11:46:59 | 显示全部楼层
正在用HT1621B

出0入0汤圆

发表于 2012-8-17 08:23:07 | 显示全部楼层
合泰LCD的HT1621程序调试

出0入0汤圆

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

出0入0汤圆

发表于 2015-8-12 08:07:03 | 显示全部楼层
不错的资源,谢谢分享。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 19:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表