一块段显小屏,LCM046 一个单片机STC89C58RD+,一个串口下载器。
要完成一个大任务的一个小部分-----------点亮段式LCD。
呵呵,这个对我来说小菜一盘,没太在意。
因为我以前就点亮过只不过那个东东存在(对人)安全的问题,木有投产。
喝一会儿荼,看了一会网,拿起电烙焍开干哈。
不到20分实验板搭完,下载很顺利。
可是一加电,我的天啊,不显示。
由于这个程序是我以前调通的,所以很是吃惊。查了下资料又查了下程序,到晚上还是没搞定。
第二天,我查了管脚波形都有啊,娘地。我又从网上找来例程下了,还是不显,我又换了一块屏,由于这个屏,我手
里有一块,换上去还不显示。我晕。。。。就这样第二天在欲闷中度过。
第三天来了,我在网上买的东东到,是个大东东,检查了一天,没事,我又点了下屏还是不亮。我要极度闷了。
今天来了,我发动总攻。用示波仔细观察,见CS和WR都一样,但我单片机就只有一片,因为这个是实验电路。
莫非是片子??????
我就一片啊,且下载完好。
聪明人总是有办法地,你看那个聪字,就是说耳朵总是明地。
我把以前的CS WR DA换到了P0.0 P0.1 P0.2,以前为P1.0 P1.1 P1.2 我把程序下进。
你猜怎么着。。。。。
清清楚楚地显示着1234。
附程序
#include <reg51.H>
/*cs=p0.7 WRPort=p0.5 data=p0.4*/
sbit CS=P0^0;//P0^7 ;
sbit WRPort=P0^1;//P0^5;
sbit DA=P0^2;//P0^4;
///////////////////////////////////////////////////////////
void timedelay(unsigned int time);
void WRPortcom(unsigned char *p);
void WRPortdd(unsigned char *p);
void WRPortda(unsigned char *p);
void walp(unsigned char *p);
void clearLCD();
void Set1(unsigned char wei,unsigned char n);
void SetNum(unsigned int num);
///////////////////////////////////////////////////////////
unsigned char command;
unsigned char lcdaddr;
unsigned char lcddata;
const unsigned char nums[10]={0xEB,0x60,0xAD,0x8F,0x4E,0xC7,0xE7,0x8A,0xEF,0xCF}; // 0--9 数字对应表
///////////////////////////////////////////////////////////
void main(void)
{
unsigned char *p;
p=&command;
CS=1;
WRPort=1;
DA=1;
timedelay(500);
*p=0x29; WRPortcom(p); //initialize
*p=0x18; WRPortcom(p); //rc
*p=0x01; WRPortcom(p); //sys en
*p=0x03; WRPortcom(p); //lcd on
*p=0x05; WRPortcom(p); //close WDT
clearLCD();
while(1)
{
SetNum(1234);
}
}
///////////////////////////////////////////////////////////
// 基本硬件操作 ///
///////////////////////////////////////////////////////////
void WRPortcom(unsigned char *p)
{
unsigned char i;
CS=1; timedelay(3); CS=0; timedelay(3);
WRPort=0; timedelay(3); DA=1; timedelay(3); WRPort=1; timedelay(3);
WRPort=0; timedelay(3); DA=0; timedelay(3); WRPort=1; timedelay(3);
WRPort=0; timedelay(3); DA=0; timedelay(3); WRPort=1; timedelay(3);
for(i=8;i>0;i--)
{
timedelay(3);
if(*p&0x80)
{
DA=1;timedelay(3);
}
else
{
DA=0;timedelay(3);
}
WRPort=0;timedelay(5);
WRPort=1;timedelay(5);
*p=(*p)<<1;
}
DA=0;timedelay(3);
WRPort=0;timedelay(5);
WRPort=1;timedelay(5);
CS=1;timedelay(3);
DA=1;timedelay(3);
}
///////////////////////////////////////////////////////////
void WRPortdd(unsigned char *p)
{
unsigned char i;
CS=1; timedelay(10); CS=0; timedelay(10);
WRPort=0; timedelay(3); DA=1; timedelay(3); WRPort=1; timedelay(3);
WRPort=0; timedelay(3); DA=0; timedelay(3); WRPort=1; timedelay(3);
WRPort=0; timedelay(3); DA=1; timedelay(3); WRPort=1; timedelay(3);
WRPort=0; timedelay(3); DA=0; timedelay(3); WRPort=1; timedelay(3);
for(i=5;i>0;i--)
{
if(*p&0x80)
{
DA=1;timedelay(3);
}
else
{
DA=0;timedelay(3);
}
WRPort=0;timedelay(5);
WRPort=1;timedelay(5);
*p=(*p)<<1;
}
}
///////////////////////////////////////////////////////////
void WRPortda(unsigned char *p)
{
unsigned char i;
for(i=4;i>0;i--)
{
if(*p&0x01)
{
DA=1;timedelay(3);
}
else
{
DA=0;timedelay(3);
}
WRPort=0;timedelay(5);
WRPort=1;timedelay(5);
*p=(*p)>>1;
}
}
///////////////////////////////////////////////////////////
void timedelay(unsigned int s) // s*10 (us)
{
int i,j;
for(i=0;i<10;i++)
for (j=0;j<s;j++);
}
///////////////////////////////////////////////////////////
void clearLCD() //清LCD屏
{
unsigned char i;
CS=1; timedelay(3); CS=0; timedelay(3);
lcdaddr=0x00; //地址开始
for (i=0;i<8;i++)
{
lcddata=0x00;
WRPortdd(&lcdaddr);
WRPortda(&lcddata);
WRPort=1;
DA=1;
CS=1; //写一个地址结束(一条数据4位)
timedelay(10);
lcdaddr=lcdaddr+0x08*(i+1); //清屏data
}
}
///////////////////////////////////////////////////////////
// 数据显示 //
///////////////////////////////////////////////////////////
void Set1(unsigned char wei,unsigned char n)
{
unsigned char i;
CS=1; timedelay(3);
CS=0; timedelay(3);
lcdaddr=0x00+(wei-1)*2*8; //取前5位作为A0--A4
lcddata=nums[n];
WRPortdd(&lcdaddr);
for(i=8;i>0;i--)
{
if(lcddata&0x80)
{
DA=1;timedelay(3);
}
else
{
DA=0;timedelay(3);
}
WRPort=0;timedelay(5);
WRPort=1;timedelay(5);
lcddata=(lcddata)<<1;
}
}
///////////////////////////////////////////////////////////
void SetNum(unsigned int num)
{
Set1( 1,(num/1000) );
Set1( 2,(num/100)%10 );
Set1( 3,(num/10)%10 );
Set1( 4,num%10 );
}
原来是P1.1同P1.0管脚坏了,他俩谁变都根着变。不敢保留写出分享,呵呵
[ 本帖最后由 ddllxxrr 于 2011-7-15 10:28 编辑 ]