谁帮我看看,我这个开源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);
} 附上合泰官网的HT1621程序:
点击此处下载 ourdev_492595.pdf(文件大小:122K) (原文件名:HT48 & HT46 MCU 对HT1621 的读写.pdf) 哦,MCU是M32,外部8M晶振,接在PORTD,已关闭JTAG。这么简单程序,搞几天搞不出,真要倒了! 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... 我操合泰,官方的程序也有问题!害我浪费了两天时间!真是打击啊!大家请看:
合泰官网的程序,在上面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一下! 我手上的文档没有问题啊,文件编码:HA0103S2006-7-11 问下楼主,我也用ht1621,我用的是STM32,在16M以上的时钟情况下,不管我延时怎么弄,液晶都点不亮。
知道这是为什么吗? TO 【5楼】 seti
这个文档刚从合泰官网下载,不会是我一说就改了吧?
TO 6楼
与官网的那个文档就是我上面指出的那个有问题了~~其他是正常的,你可以看看。我上面的程序是基于GCC的参考合泰官网的,应该很方便移植。 楼主,我觉得合泰的没有错误,只不过使用的方法不一样,给你看看我的子函数
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();
}
//====================================================== 我看出一点区别了,楼主用的4位数据,我的是8位数据格式,send_data_bit_HT1621(data,4); //写入data 的低4 位元 如果把这句改为8,不知道会怎样,好像这个就是写连续地址模式。 还有既然我的程序和楼主的 都能点亮,也能正常工作,说明写入3位标志码,4位标志码,还有8位命令码,9位命令码没有多大的区别,关键在于合泰别的子函数哪里有问题,哪位能够指教一下 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我还是没有看懂,欢迎拍砖。 先记录一下,回头再看 回复【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定义不同而已。 mark 马克 合泰LCD的HT1621程序调试 正在用HT1621B 合泰LCD的HT1621程序调试 我两天也是第一次搞HT1621,点亮倒是不费什么力气。但后面的显示就把我整个半死。到最后发现全是自己的问题。
1. 写入数据地址是6bits我只操作了5bits
2. 拿到一张真值表就以为万事大吉了。那只是屏的真值表,不代表人家画PCB接线的时候SEG从0按顺序开始。说不定SEG还有交错连接进玻璃的可能。点了两天就是点不中自己想亮的那个点。没办法,只好从地址0开始一笔一笔的传数据来破人家高头画的PCB.一个字,累! 不错的资源,谢谢分享。。。
页:
[1]