[求助]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编辑过 HT1621的datasheet,和网上找的一个应用例子
点击此处打开armok0139902.pdf
点击此处打开armok0139903.pdf void send_data(unsigned char data_bus,unsigned char loop)
{
for(;loop!=0;loop--)
{
dlay();
PORTB &=WR; //是不是要改成 =>PORTB &=~WR;
//
//没详细看程序,再PIC上可以的,再M8上一定可以的. 谢谢楼上的指教
这里确实是我移植的时候的失误,但是修改后还是有问题,还是不显示 问题解决了
等我整理好了就上传详细的资料和调试过程
希望对别人用到的时候少走弯路
-----此内容被xky183于2005-03-04,20:04:51编辑过 检查一下管脚定义,我的HT1621可以正常工作! phantompaul 能否把你的HT1621的程序贴出来呀,谢谢
xky183 现在的这个程序是否是测试好使的程序呀 谢谢 注意硬件时序的时间要求,如建立时间 保持时间
avr速度比较快 这是我写的,在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;
}
} MARK,学习了!!! MARK MARK MARK MARK一下,明天再继续研究 正需要.............. 看看…… 同样想知道这个怎么实现,有经验的给介绍下 给个思路也可以 学习了,但是俺的ht1621死活读不出数据。 标记,准备学习~ korren 发表于 2005-4-22 16:23
这是我写的,在HOLTEK ht49r30a-1调试通过.
//THIS PROGRAM IS HT1621 (32*4)LCD DISPLAY
参考一下。谢谢分享
页:
[1]