HT1621B通用程序集锦.docx
《HT1621B通用程序集锦.docx》由会员分享,可在线阅读,更多相关《HT1621B通用程序集锦.docx(9页珍藏版)》请在冰豆网上搜索。
HT1621B通用程序集锦
/*********************************************************************
*****************AT89C51单片机控制HT1621B驱动LCD*********************
***************** (全显示程序) *********************
*********************************************************************/
#include
#include
#defineBIAS0X50 //1/2偏压,4背极
//#defineRC2560X30 //系统时钟选择为片内RC振荡器
#defineRC256 0X38
#defineWDTDIS10X0A //禁止WDT溢出标志输出
#defineTIMERDIS0X08 //时基输出禁能
#defineSYSEN0X02 //打开系统时钟
#defineLCDON0X06 //打开偏压发生器
#defineSYSDIS0X00 //关闭系统时钟和偏压发生器
#define_NOP()_nop_()
sbitLED=P2^0;
sbitCS=P2^7;
sbitWRD=P2^6;
sbitDATA=P2^5;
#defineucharunsignedchar
#defineuintunsignedint
voidSENDBYTE(uchardat);
voidSENDBIT(uchardat,ucharbitcnt);
/***************************延时子函数******************************/
voiddelay1s() //延时1S
{
uchari;
uintj;
for(i=0;i<10;i++)
for(j=0;j<1300;j++);
}
/**************************HT1621B初始化****************************/
voidSTART_HT1621() //初始化HT1621
{
CS=1;
WRD=1;
DATA=1;
//delay();
_NOP();
CS=0;
CS=0;
WRD=0;
WRD=0;
}
/*************************发送命令子函数A***************************/
voidSENDCOMA(uchar) //发送命令A,ID=100+0
{
START_HT1621();
SENDBIT(0X80,4);
SENDBYTE();
}
/*************************发送命令子函数B***************************/
voidSENDCOMB(ucharadr) //发送命令B,发送显示数据
{
START_HT1621(); //HT1621初始化
SENDBIT(0XA0,4); //发送写数据ID:
101+6位LCD之RAM地址第1位
SENDBIT(adr,5); //然后发送地址后5位
}
/*************************发送命令子函数C***************************
voidSENDCOMC(uchar) //发送命令C,ID=100+1
{
START_HT1621();
SENDBIT(0X90,4);
SENDBYTE();
}
/***********************按位发送数据子函数**************************/
voidSENDBIT(uchardat,ucharbitcnt) //按位发送数据
{
uchari;
for(i=0;i {
if((dat&0x80)==0X00) //从最高位发送
DATA=0;
else
DATA=1;
//delay();
_NOP();
WRD=1; //在WRD的上升沿,数据写入HT1621B
//delay();
_NOP();
WRD=0;
dat=dat<<1;
}
}
/*************************发送字节数据子函数************************/
voidSENDBYTE(uchardat) //发送字节数据
{
SENDBIT(dat,8);
}
/***************************LCD显示子函数***************************/
voiddisplay(uchardat) //LCD显示
{
uchari;
SENDCOMB(0X00); //从RAM的0X00地址开始放入数据
SENDBYTE(dat);
SENDBYTE(dat);
for(i=0;i<2;i++)
{
SENDBYTE(dat); //从SEG0开始显示数据
}
}
/*************************HT1621B初始化设置*************************/
voidSETUP_HT1621() //HT1621偏压、背极、工作方式设置
{
SENDCOMA(BIAS);
SENDCOMA(RC256);
SENDCOMA(SYSEN);
delay1s();
SENDCOMA(LCDON);
SENDCOMA(WDTDIS1);
SENDCOMA(TIMERDIS);
}
/*******************************主函数******************************/
main() //主函数
{
LED=1;
SETUP_HT1621();
while
(1)
{
display(0XFF); //全显示
}
}
各位大牛下午好,我用STC12C5204单片机控制1621驱动液晶
程序调了几天都没进展,显示的不知道什么乱七八糟的东西,好像命令根本写不进去,COM0和com1是个1v不到的电平,com3为3点几V的电平,com4有时有波形
刷我自己写的程序就是这个样子,SEGMENT一部分有波形,其余就是一个电平
打电话咨询合泰技术,让我搞他们的范例,于是我修改了下,还是老样子
大家帮我看看是什么问题,谢谢了
下面的就是从合泰网上下的范例,我稍微修改了下,基本是原封不动的
//STC12C5204AD单片机控制HT1621B驱动LCD
#include
#include
#include
#defineBIAS0X52 //1/3偏压,4背极
#defineRC256K0X30 //系统时钟选择为片内RC振荡器
#defineWDTDIS10X0A //禁止WDT溢出标志输出
#defineTIMERDIS0X08 //时基输出禁止
#defineSYSEN0X02 //打开系统时钟
#defineSYSDIS0X00 //关闭系统时钟和偏压发生器
#defineLCDON0X06 //打开LCD偏压发生器
#defineLCDOFF0X04 //关闭LCD偏压发生器
#defineTONEON 0X12 //打开音频输出
#defineTONEOFF0X10 //关闭音频输出
#defineCSP3_2
#defineWRP3_4
#defineDATAP3_5
#defineucharunsignedchar
#defineuintunsignedint
/***************************延时子函数******************************/
voiddelay(uchari) //j=12延时约4.3us
{
while(i--)
{
ucharj=0;
while(j<8)
j++;
}
}
voidSendBit_1621(uchardat,uchart)
{
uchari;
for(i=0;i{
if((dat&0x80)==0)
DATA=0;
elseDATA=1;
WR=0;
delay
(2);
WR=1;
dat=dat<<1;
}
}
voidSendDataBit_1621(uchardat,uchart)
{
uchari;
for(i=0;i{
if((dat&0x01)==0)DATA=0;
elseDATA=1;
WR=0;
delay
(2);
WR=1;
dat=dat>>1;
}
}
voidSendCmd(ucharcommand)
{
CS=0;
_nop_();
_nop_();
SendBit_1621(0x80,4);
SendBit_1621(command,8);
CS=1;
}
voidWrite_1621(ucharaddr,uchardat)
{
CS=0;
_nop_();
_nop_();
SendBit_1621(0xa0,3);
SendBit_1621(addr,6);
SendDataBit_1621(dat,4);
CS=1;
}
voidWriteAll_1621(ucharaddr,uchar*p,uchart)
{
uchari;
CS=0;
_nop_();
_nop_();
SendBit_1621(0xa0,3);
SendBit_1621(addr,6);
for(i=0;i{
SendDataBit_1621(*p,8);
}
CS=1;
}
/*******************************主函数******************************/
main()
{
uchara[10];
a[0]=0xFF;a[1]=0xFF;a[2]=0xFF;a[3]=0xFF;a[4]=0xFF;
a[5]=0xFF;a[6]=0xFF;a[7]=0xFF;a[8]=0xFF;a[9]=0xFF;
a[10]=0xFF;a[11]=0xFF;a[12]=0xFF;a[13]=0xFF;a[14]=0xFF;
a[15]=0xFF;
SendCmd(BIAS);
SendCmd(SYSEN);
SendCmd(LCDON);
//SendCmd(RC256K);
WriteAll_1621(0,a,16);
//SendCmd(LCDOFF);
}
LCD驱动程序适用于HT1621
//=============================================================================
#defineLcd_Delay_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
void Lcd_Data(ucharStart,ucharcData)
//将数据当中的字节与LCD上的进行同步
//Start --要开始同页面地址,每个页面为4个有效位,总其为32X4字节
//Length --要同步的页面数量
{
uchari;
LCD_CS=0;
Lcd_Delay;
Lcd_Delay;
Lcd_Delay;
//SendID101B
LCD_CLK=0;
Lcd_Delay;
LCD_IO=1;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
LCD_CLK=0;
Lcd_Delay;
LCD_IO=0;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
LCD_CLK=0;
Lcd_Delay;
LCD_IO=1;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
//SendAddress6bit
Start=Start*2;
for(i=0;i<6;i++)
{
if(Start&0x20)LCD_IO=1;
elseLCD_IO=0;
Lcd_Delay;
LCD_CLK=0;
Lcd_Delay;
Start=Start<<1;
LCD_CLK=1;
Lcd_Delay;
}
//Senddata8bit
for(i=0;i<8;i++)
{
if(cData&0x01)LCD_IO=1;
elseLCD_IO=0;
Lcd_Delay;
LCD_CLK=0;
Lcd_Delay;
cData=cData>>1;
LCD_CLK=1;
Lcd_Delay;
}
LCD_CS=1;
Lcd_Delay;
}
//=============================================================================
void Lcd_Command(ucharCommand)
//向指定的LCD当中写入一个命令
//每个命令应以100三个位为起始,命令长度为9位,实际有效位为8位,因此在最后补一个0
//LcdSelect--LCD的片选确定,取值为0,1,2
//Command----要写入的8位命令
{
uchari;
LCD_CS=0;
Lcd_Delay;
Lcd_Delay;
Lcd_Delay;
//SendID100B
LCD_CLK=0;
Lcd_Delay;
LCD_IO=1;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
LCD_CLK=0;
Lcd_Delay;
LCD_IO=0;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
LCD_CLK=0;
Lcd_Delay;
LCD_IO=0;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
for(i=0;i<8;i++)
{
LCD_CLK=0;
Lcd_Delay;
if(Command&0x80)LCD_IO=1;
elseLCD_IO=0;
Command=Command<<1;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
}
///最后补一个0
LCD_CLK=0;
Lcd_Delay;
LCD_IO=0;
Lcd_Delay;
LCD_CLK=1;
Lcd_Delay;
LCD_CS=1;
Lcd_Delay;
}
//=============================================================================
void Lcd_Refresh(void) //重新对LCD进行刷屏
{
uchari;
for(i=0;i Lcd_Data(i,lcd.buff[i]);
}
//=============================================================================
void Lcd_Cls(void)//清空LCD显示区
{
//功能:
清空LCD显示区
//返值:
无
//入口:
cSelectIcLCD的片选,取值为0,1,2
uchari;
for(i=0;i lcd.buff[i]=0;
Lcd_Refresh();
}
//=============================================================================
void Lcd_Init(void)//初始化LCD,二个屏都进行处理,同时进行清屏
{
LCD_CLK=1;
Lcd_Delay;
LCD_IO=1;
Lcd_Delay;
Lcd_Command(0x00); //控制器掉电(控制字)
Lcd_Command(0x02); //控制器液晶关闭(控制字)
Lcd_Command(0x18); //初始化LCD控制器
Lcd_Command(0x01); //控制器上电(控制字)
Lcd_Command(0x03); //控制器液晶显示(控制字)
Lcd_Command(0x29); //控制器液晶模式1/3BAIS1/4DUTY(控制字)
Lcd_Cls();
}