/********************************************************************************
*program name:lcdht1621.c
*function: TEST TO HT1621(drive)
*Design: Zhengyingjun
*Date:2005-06-28
*********************************************************************************/
#include<msp430x14x.h>
#include<intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
/*********************************************************
* 接口定义:DATA<--->P2.5; CS<--->P2.6; WR<--->P2.7 *
**********************************************************/
#define BIAS 0X52 /*定义1 3 偏压4 背极*/
#define XTAL32 0X28 /*使用外部晶振*/
#define RC256 0X30 /*使用内部256KRC 振荡器*/
#define SYSEN 0X02 /*打开振荡发生器*/
#define LCDON 0X06 /*打开LCD*/
#define SYSDIS 0X00 /*关闭振荡发生器*/
#define LCDOFF 0X04 /*显示关闭*/
#define TONE4 0X80 /*设置BZ 输出频率为4K*/
#define TONEON 0X12 /*打开BZ 音频输出*/
#define TONEOFF 0X10 /*关闭BZ 音频输出*/
#define CLRWDT 0X1c /*清零WDT*/
#define F1 0X40 /*WDT设置为4 秒溢出*/
#define IRQEN 0X10 /*IRQ 输出禁止*/
#define IRQDIS 0X00 /*IRQ 输出允许*/
#define WDTEN 0X0e /*打开WDT*/
#define WDTDIS 0X0a /*关闭WDT*/
#define TIMERDIS 0X08 /*关闭时基输出*/
uchar table[32]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0xbf,0x86,0xdb,0xcf,0xe6,0xed,
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0xbf,0x86,0xdb,0xcf,0xe6,0xed };
void Start_spi(void);
void Delay(void);
void Delay1s(void);
void SENDCOMA(uchar com);
void SENDCOMB(uchar adr);
void SENDCOMC(uchar com);
void disp(uchar dat);
void DISP_ALL(uchar data);
void SendByte(uchar dat);
void SendBit(uchar dat,uchar bitcnt);
/**********************************************************************
延时函数
***********************************************************************/
void Delay(void)
{
uchar i;
for(i=0;i<10;i++); /*用于调整CLK 脉冲宽度*/
}
/**********************************************************************
长延时函数
***********************************************************************/
void Delay1s(void)
{
uchar i;
uint j;
for(i=0;i<100;i++)
for(j=0;j<1300;j++);
}
/*********************************************************************
发送命令函数A类
发送HT1621 命令时要先发送ID 值,及命令字用于设置HT1621.
*********************************************************************/
void SENDCOMA(uchar com)
{
Start_spi();
SendBit(0X80,4); /*发送设置命令ID=100 0*/
SendByte(com); /*发送命令字*/
}
/*********************************************************************
发送命令函数B 类
发送HT1621 命令时要先发送ID 值,后发送要写入数据起始地址,
用于对RAM 写操作(调用此函数后即可发送数据) adr 是高5 位有效
*********************************************************************/
void SENDCOMB(uchar adr)
{
Start_spi();
SendBit(0XA0,4); /*发送写显示RAM 命令ID=101 0*/
SendBit(adr,5); /*指定写入地址*/
}
/*********************************************************************
发送命令函数(C 类)
发送HT1621 命令时要先发送ID 值.然后发送C 类的命令字
*********************************************************************/
void SENDCOMC(uchar com)
{
Start_spi();
SendBit(0X90,4); /*发送命令ID=100 1*/
SendByte(com); /*发送命令字*/
}
/**********************************************************************
向显示缓冲区填充,以最简便的形式显示数据
**********************************************************************/
void disp(uchar dat)
{
uchar i;
SENDCOMB(0x00); /*把数据指针指回0 接着写入数据*/
for(i=0;i<16;i++) /*写入16 字节数据*/
{
SendByte(dat); /*写入数据*/
}
}
/******************************************************
全显示
******************************************************/
void DISP_ALL(uchar data)
{
SENDCOMA(BIAS); /*设置偏压,背极数*/
SENDCOMA(RC256); /*设为内晶振256K*/
SENDCOMA(SYSEN); /*启动振荡器*/
SENDCOMA(LCDON); /*显示使能*/
SENDCOMA(TIMERDIS); /*禁止时基输出*/
disp(data); /*输出全显数据*/
}
/**********************************************************************
主函数
**********************************************************************/
void main()
{
uchar i,temp;
WDTCTL=WDTPW+WDTHOLD;
P2DIR|=BIT5+BIT6+BIT7;
while(1)
{
for(i=0;i<1;i++)
{
temp=0x88;//table[i];
DISP_ALL(temp); /*全显示测量*/
// Delay1s();
}
}
}
/************************************************************************
名称: 发送数据位
************************************************************************/
void SendBit(uchar dat,uchar bitcnt)
{
uchar i;
for(i=0;i<bitcnt;i++)
{
if(( dat & 0X80 ) == 0)
P2OUT&=~BIT5;//SDA_PORT = 0;
else
P2OUT|=BIT5;//SDA_PORT = 1; /*发送数据由高位到低位传送*/
Delay();
P2OUT|=BIT7;//CLK_PORT = 1; /*置时钟线为高通知被控器开始接收数位*/
Delay();
P2OUT&=~BIT7;//CLK_PORT = 0; /*钳住总线准备下一个数据位*/
dat=dat<<1; /*发送数据左移一位*/
}
}
/**********************************************************************
起动ht1621
**********************************************************************/
void Start_spi(void)
{
P1OUT|=BIT6;//CS_PORT=1;
P1OUT|=BIT7;//CLK_PORT=1;
P1OUT|=BIT5;//SDA_PORT=1;
Delay();
P1OUT&=~BIT6;//CS_PORT=0;
P1OUT&=~BIT6;//CS_PORT=0;
P1OUT&=~BIT7;//CLK_PORT=0;
P1OUT&=~BIT7;//CLK_PORT=0;
}
/************************************************************************
发送字节函数,向ht1621 发送字节数据数据单元dat
************************************************************************/
void SendByte(uchar dat)
{
SendBit(dat,8); /*发送字节*/
}