搜索
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);
}

出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 22:58:50 | 显示全部楼层
TO 【5楼】 seti
这个文档刚从合泰官网下载,不会是我一说就改了吧?

TO 6楼
与官网的那个文档就是我上面指出的那个有问题了~~其他是正常的,你可以看看。我上面的程序是基于GCC的参考合泰官网的,应该很方便移植。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 12:10

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

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