HT1621B通用程序集锦.docx
《HT1621B通用程序集锦.docx》由会员分享,可在线阅读,更多相关《HT1621B通用程序集锦.docx(13页珍藏版)》请在冰豆网上搜索。
HT1621B通用程序集锦
*****************AT89C51
单片机控制HT1621B驱动LCD*********************
全显示程序)
**/
#include
#include
#define
BIAS0X50
//1/2偏压,4背极
//#define
RC2560X30
//系统时钟选择为片内RC振荡器
#define
RC2560X38
#define
WDTDIS10X0A
//禁止WDT溢出标志输出
#define
TIMERDIS0X08
//时基输出禁能
#define
SYSEN0X02
//打开系统时钟
#define
LCDON0X06
//打开偏压发生器
#define
SYSDIS0X00
//关闭系统时钟和偏压发生器
#define_NOP()_nop_()sbitLED=P2^0;
sbitCS=P2^7;
sbitWRD=P2^6;
sbitDATA=P2^5;
#defineucharunsignedchar
#defineuintunsignedintvoidSENDBYTE(uchardat);
voidSENDBIT(uchardat,ucharbitcnt);
voiddelay1s()
//延时1S
{
uchari;
uintj;
for(i=0;i<10;i++)
}
for(j=0;j<1300;j++);
{
CS=1;
WRD=1;
DATA=1;//delay();_NOP();
CS=0;
CS=0;
WRD=0;
WRD=0;
START_HT1621();
SENDBIT(0X80,4);
SENDBYTE(com);
}
发送命令子函数
B*************************
**/
voidSENDCOMB(ucharadr)
//发送命令B,发送显示数据
START_HT1621();
//HT1621初始化
SENDBIT(0XA0,4);
//发送写数据ID:
101+6位LCD之RAM地址第1位
SENDBIT(adr,5);
//然后发送地址后5位
/**
{
START_HT1621();
SENDBIT(0X90,4);
SENDBYTE(com);
}
voidSENDBIT(uchardat,ucharbitcnt)//按位发送数据
{
uchari;
dat=dat<<1;
}
SENDBIT(dat,8);
uchari;
SENDBYTE(dat);
SENDBYTE(dat);
}
//HT1621偏压、背极、工作方式设置
voidSETUP_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有时有波形
刷我自己写的程序就是这个样子,SEGMEN一T部分有波形,其余就是一个电平打电话咨询合泰技术,让我搞他们的范例,于是我修改了下,还是老样子大家帮我看看是什么问题,谢谢了下面的就是从合泰网上下的范例,我稍微修改了下,基本是原封不动的
//STC12C5204AD单片机控制HT1621B驱动LCD
//关闭LCD偏压发生器
//打开音频输出
//关闭音频输出
延时子函数
#include#include#include
#defineBIAS0X52#defineRC256K0X30#defineWDTDIS10X0A#defineTIMERDIS0X08#defineSYSEN0X02#defineSYSDIS0X00#defineLCDON0X06#defineLCDOFF0X04#defineTONEON0X12#defineTONEOFF0X10#defineCSP3_2
#defineWRP3_4
#defineDATAP3_5
#defineucharunsignedchar#defineuintunsignedint/***************************voiddelay(uchari){
while(i--)
{ucharj=0;while(j<8)
//1/3偏压,4背极
//系统时钟选择为片内RC振荡器//禁止WDT溢出标志输出
//时基输出禁止
//打开系统时钟
//关闭系统时钟和偏压发生器//打开LCD偏压发生器
//j=12延时约4.3us
j++;
}
}
voidSendBit_1621(uchardat,ucharcnt)
{
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,ucharcnt){
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,ucharcnt)
{
uchari;
CS=0;
_nop_();
_nop_();
SendBit_1621(0xa0,3);
SendBit_1621(addr,6);for(i=0;iSendDataBit_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_()voidLcd_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;
//SendAddress6bitStart=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;
}
//===================================================================voidLcd_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;iLcd_Data(i,lcd.buff[i]);
}//
voidLcd_Cls(void)//清空LCD显示区
{
//功能:
清空LCD显示区
//返值:
无
//入口:
cSelectIcLCD的片选,取值为0,1,2
uchari;for(i=0;ilcd.buff[i]=0;
Lcd_Refresh();
}
//===================================================================
voidLcd_Init(void)//初始化LCD,二个屏都进行处理,同时进行清屏
{
LCD_CLK=1;
Lcd_Delay;
LCD_IO=1;
Lcd_Delay;Lcd_Command(0x00);Lcd_Command(0x02);Lcd_Command(0x18);Lcd_Command(0x01);Lcd_Command(0x03);Lcd_Command(0x29);
//控制器掉电(控制字)
//控制器液晶关闭(控制字)
//初始化LCD控制器
//控制器上电(控制字)
//控制器液晶显示(控制字)
//控制器液晶模式1/3BAIS1/4DUTY(控制字)
Lcd_Cls();