ht1621b通用程序集锦
- 格式:doc
- 大小:32.00 KB
- 文档页数:14
//#define RC256 0X30 //系统时钟选择为片内RC振荡器#define RC256 0X38#define WDTDIS1 0X0A //禁止WDT溢出标志输出#define TIMERDIS 0X08 //时基输出禁能#define SYSEN 0X02 //打开系统时钟#define LCDON 0X06 //打开偏压发生器#define SYSDIS 0X00 //关闭系统时钟和偏压发生器#define _NOP() _nop_()sbit LED=P2^0;sbit CS=P2^7;sbit WRD=P2^6;sbit DATA=P2^5;#define uchar unsigned char#define uint unsigned intvoid SENDBYTE (uchar dat);void SENDBIT (uchar dat,uchar bitcnt);/***************************延时子函数******************************/void delay1s() //延时1S {uchar i;uint j;for(i=0;i<10;i++)for(j=0;j<1300;j++);}/**************************HT1621B初始化****************************/void START_HT1621() //初始化HT1621 {CS=1;WRD=1;DATA=1;//delay();_NOP();CS=0;CS=0;WRD=0;WRD=0;}/*************************发送命令子函数A***************************/void SENDCOMA(uchar com) //发送命令A,ID=100+0 {START_HT1621();SENDBIT(0X80,4);SENDBYTE(com);}/*************************发送命令子函数B***************************/void SENDCOMB(uchar adr) //发送命令B,发送显示数据{START_HT1621(); //HT1621初始化SENDBIT(0XA0,4); //发送写数据I D:101+6位LCD之RAM地址第1位SENDBIT(adr,5); //然后发送地址后5位}/*************************发送命令子函数C***************************void SENDCOMC(uchar com) //发送命令C,ID=100+1 {START_HT1621();SENDBIT(0X90,4);SENDBYTE(com);}/***********************按位发送数据子函数**************************/void SENDBIT (uchar dat,uchar bitcnt) //按位发送数据{uchar i;for(i=0;i<bitcnt;i++){if((dat&0x80)==0X00) //从最高位发送 DATA=0;elseDATA=1;//delay();WRD=1; //在WRD的上升沿,数据写入HT1621B//delay();_NOP();WRD=0;dat=dat<<1;}}/*************************发送字节数据子函数************************/void SENDBYTE (uchar dat) //发送字节数据{SENDBIT(dat,8);}/***************************LCD显示子函数***************************/void display(uchar dat) //LCD显示{uchar i;SENDCOMB(0X00); //从RAM的0X0 0地址开始放入数据SENDBYTE(dat);SENDBYTE(dat);for (i=0;i<2;i++){SENDBYTE(dat); //从SEG0开始}}/*************************HT1621B初始化设置*************************/void SETUP_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 <>#define BIAS 0X52 //1/3偏压,4背极#define RC256K 0X30 //系统时钟选择为片内RC振荡器#define WDTDIS1 0X0A //禁止WDT溢出标志输出#define TIMERDIS 0X08 //时基输出禁止#define SYSEN 0X02 //打开系统时钟#define SYSDIS 0X00 //关闭系统时钟和偏压发生器#define LCDON 0X06 //打开LCD偏压发生器#define LCDOFF 0X04 //关闭LCD偏压发生器#define TONEON 0X12 //打开音频输出#define TONEOFF 0X10 //关闭音频输出#define CS P3_2#define WR P3_4#define DATA P3_5#define uchar unsigned char#define uint unsigned int/***************************延时子函数******************************/ void delay(uchar i) //j=12延时约{while(i--){uchar j=0;while(j<8)j++;}}void SendBit_1621(uchar dat ,uchar cnt){uchar i;for(i =0; i <cnt; i ++){if((dat&0x80)==0)DATA=0;else DATA=1;WR=0;delay(2);WR=1;dat=dat<<1;}}void SendDataBit_1621(uchar dat,uchar cnt) {uchar i;for(i =0; i <cnt; i ++){if((dat&0x01)==0) DATA=0;else DATA=1;WR=0;delay(2);WR=1;dat=dat>>1;}}void SendCmd(uchar command){CS=0;_nop_();_nop_();SendBit_1621(0x80,4);SendBit_1621(command,8);CS=1;}void Write_1621(uchar addr,uchar dat){CS=0;_nop_();_nop_();SendBit_1621(0xa0,3);SendBit_1621(addr,6);SendDataBit_1621(dat,4);CS=1;}void WriteAll_1621(uchar addr,uchar *p,uchar cnt){uchar i;CS=0;_nop_();_nop_();SendBit_1621(0xa0,3);SendBit_1621(addr,6);for(i =0; i <cnt; i ++,p++){SendDataBit_1621(*p,8);}CS=1;}/*******************************主函数******************************/ main(){uchar a[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//=================================================================== ==========#define Lcd_Delay _nop_();_nop_();_nop_();_nop_();_nop_();_nop_() void Lcd_Data(uchar Start,uchar cData)//将数据当中的字节与LCD上的进行同步// Start --要开始同页面地址,每个页面为4个有效位,总其为32X4字节// Length --要同步的页面数量{uchar i;LCD_CS=0;Lcd_Delay;Lcd_Delay;Lcd_Delay;//Send ID 101BLCD_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;//Send Address 6bitStart=Start*2;for(i=0;i<6;i++){if(Start&0x20) LCD_IO=1;else LCD_IO=0;Lcd_Delay;LCD_CLK=0;Lcd_Delay;Start=Start<<1;LCD_CLK=1;Lcd_Delay;}//Send data 8bitfor(i=0;i<8;i++){if(cData&0x01) LCD_IO=1;else LCD_IO=0;Lcd_Delay;LCD_CLK=0;Lcd_Delay;cData=cData>>1;LCD_CLK=1;Lcd_Delay;}LCD_CS=1;}//=================================================================== ==========void Lcd_Command(uchar Command)//向指定的LCD当中写入一个命令//每个命令应以100三个位为起始,命令长度为9位,实际有效位为8位,因此在最后补一个0// LcdSelect--LCD的片选确定,取值为0,1,2// Command----要写入的8位命令{uchar i;LCD_CS=0;Lcd_Delay;Lcd_Delay;Lcd_Delay;//Send ID 100BLCD_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;for(i=0;i<8;i++){LCD_CLK=0;Lcd_Delay;if(Command&0x80) LCD_IO=1;else LCD_IO=0;Command=Command<<1;Lcd_Delay;LCD_CLK=1;Lcd_Delay;}///最后补一个0LCD_CLK=0;Lcd_Delay;LCD_IO=0;Lcd_Delay;LCD_CLK=1;Lcd_Delay;LCD_CS=1;Lcd_Delay;}//=================================================================== ==========void Lcd_Refresh(void) //重新对LCD进行刷屏{uchar i;for(i=0;i<LCD_BUFF_MAX;i++)Lcd_Data(i,[i]);}//=================================================================== ==========void Lcd_Cls(void) //清空LCD显示区{//功能: 清空LCD显示区//返值: 无//入口: cSelectIc LCD的片选,取值为0,1,2uchar i;for(i=0;i<LCD_BUFF_MAX;i++)[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/3BAIS 1/4DUTY(控制字) Lcd_Cls();}。