|
发表于 2006-6-2 09:22:00
|
显示全部楼层
我现在用89C2051驱动HT1621B,怎么老是没有显示,都说是程序原因?各位看看是不是初始化程度不够啊!
#include <reg51.h>
#include<intrins.h>
#define unit unsigned int
#define uchar unsigned char
#define CMDoFF 0x00 //控制器掉电
#define CMDoN 0x01 //控制器上电
#define CMDLCDoFF 0x02 // 液晶显示关
#define CMDLCDoN 0x03 //液晶显示开
#define CMDB3C4 0x29 //液晶模式设置
#define time_1 3000 //自定义延时常数
sbit CSPIN=P1^7; //片选信号
sbit CLKPIN=P1^6; // 时钟
sbit DIPIN=P1^5; //数据
unsigned char data lcd_data[8]; //自定义缓冲区
void delay(unit t){ // 延时
unit i, j;
for(i=0;i<t;i++){
for(j=0;j<10;j++)
{;}
}
}
void lcdwbit(bit n){ //时序
DIPIN=n;
_nop_();
_nop_();
CLKPIN=1;
_nop_();
_nop_();
CLKPIN=0;
_nop_();
_nop_();
CLKPIN=1;
}
void lcdwc( unsigned char cmdcode) //送控制字
{ unsigned char i;
CSPIN=1;
CSPIN=0;
lcdwbit(1);
lcdwbit(0);
lcdwbit(0);
for(i=0;i<8;i++){
if((cmdcode&0x80)==0x80)
lcdwbit(1);
else
lcdwbit(0);
cmdcode<<=1;
}
lcdwbit(0);
DIPIN=1;
CSPIN=1;
}
void lcdwd(unsigned char address ,unsigned char data1){ //送6位地址和8位数据
unsigned char i;
CSPIN=1;
CSPIN=0;
lcdwbit(1);
lcdwbit(0);
lcdwbit(1);
address<<=2;
for(i=0;i<6;i++){
if((address&0x80)==0x80)
lcdwbit(1);
else
lcdwbit(0);
address<<=1;
}
for(i=0;i<8;i++){
if((data1&0x01)==0x01)
lcdwbit(1);
else
lcdwbit(0);
}
DIPIN=1;
CSPIN=1;
}
lcd_init() //初始化
{
lcdwc(CMDoFF); //掉电
lcdwc(CMDLCDoFF); //关闭
lcdwc(CMDoN); //上电
lcdwc(CMDLCDoN); //显示
lcdwc(CMDB3C4); //模式
}
void lcdwdl(void){ //送数,从第一个地址起
uchar j;
for(j=0;j<8;j++)
{ lcdwd(j+j,lcd_data[j+1]);
}
}
void transram(){
unsigned int i;
for(i=0;i<8;i++){
lcd_data=DIPIN;
lcdwdl();
}
}
main(){
for(;;)
{lcd_init();
delay(1000);
transram();
}
} |
|