想点亮一个LCD屏幕,折腾了好久都没弄好 每次都是一片白色,好郁闷啊
附上程序,高手看看到底是什么地方出了问题,
有用过的朋友帮忙看看了 没用过的看看也可以 谢谢了
用的HT1621LCD驱动芯片 单片机用的89C52 //********************************************************* //* 接口定义:DATA<--->P2.0; CS<--->P2.3; WR<--->P2.1 * //**********************************************************/
#include<reg52.h> #include<intrins.h> #include<absacc.h>
#define uchar unsigned char #define uint unsigned int
//********************************************************* //* 接口定义:DATA<--->P2.0; CS<--->P2.3; WR<--->P2.1 * //**********************************************************/
sbit HT1621_CS = P2^3; //lower enable //sbit HT1621_RD = P2^2; sbit HT1621_WR = P2^1; //rising edge sbit HT1621_DAT= P2^0;
#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 /*显示关闭*/
uchar code table[20]={0x07,0x0D,0x00,0x05,0x05,0x0B,0x01,0x0F,0x02,0x07,0x03,0x0E,0x07,0x0E,0x01,0x05,0x03,0x0F,0x0F,0x0F }; 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 dat); 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(0x01); /*把数据指针指回1接着写入数据*/ for(i=0;i<16;i++) /*写入16 字节数据*/ { SendByte(dat); /*写入数据*/ } }
/****************************************************** 全显示 ******************************************************/ void DISP_ALL(uchar dat) { SENDCOMA(BIAS); /*设置偏压,背极数*/ SENDCOMA(RC256); /*设为内晶振256K*/ SENDCOMA(SYSEN); /*启动振荡器*/
SENDCOMA(LCDON); /*显示使能*/ //SENDCOMA(TIMERDIS); /*禁止时基输出*/ disp(dat); /*输出全显数据*/ }
/********************************************************************* 主函数 *********************************************************************/ void main() {
uchar i,temp; //WDTCTL=WDTPW+WDTHOLD; //P2DIR|=BIT5+BIT6+BIT7; while(1) { for(i=0;i<1;i++) { temp=0x88;//table; DISP_ALL(temp); /*全显示测量*/ Delay1s(); } } }
/******************************************************************** 名称: 发送数据位 *********************************************************************/
void SendBit(uchar dat,uchar bitcnt) { uchar i; dat=dat<<3; for(i=0;i<bitcnt;i++) { if(( dat & 0X80 ) == 0)
HT1621_DAT = 0; else HT1621_DAT = 1; /*发送数据由高位到低位传送*/ Delay(); HT1621_CS = 1; /*置时钟线为高通知被控器开始接收数位*/ Delay(); HT1621_CS=0; /*钳住总线准备下一个数据位*/ dat=dat<<1; /*发送数据左移一位*/ } }
/********************************************************************** 起动ht1621 **********************************************************************/ void Start_spi(void) { HT1621_CS=1; HT1621_WR=1; HT1621_DAT=1; Delay(); HT1621_CS=0; HT1621_CS=0; HT1621_WR=0; HT1621_WR=0; }
/********************************************************************* *发送字节函数,向ht1621 发送字节数据数据单元dat *********************************************************************/ void SendByte(uchar dat) { SendBit(dat,8); /*发送字节*/ }
|