hym8877 发表于 2009-10-1 09:09:47

C8051f020液晶问题,真的救救我,没时间了

请帮我,我用的是C8051F020的单片机 想驱动1602的液晶屏显示时钟。连接通电之后液晶屏就只有背光其他的什么都没有,请帮我看看程序哪有问题,F020初始化真麻烦,帮我看看是不是哪漏了。谢谢大家

#include<C8051f020.h>
#define uchar unsigned char
#define uint unsigned int

sbit rs=P2^5;
sbit lcden=P2^3;

sbit rd=P2^7;
uchar count;
char miao,shi,fen;
uchar code table[]="2009-9-30 Wed";
uchar code table1[]="    00:00:00";
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void write_com(uchar com)
{   
    rd=0;
        rs=0;
        lcden=0;
        P1=com;
        delay(12);
        lcden=1;
        delay(12);
        lcden=0;       
}

void write_date(uchar date)
{   
    rd=0;
        rs=1;
        lcden=0;
        P1=date;
        delay(12);
        lcden=1;
        delay(12);
        lcden=0;       
}

void init()
{   
    uchar num;
    WDTCN=0xDE;
        WDTCN=0xAD;
        XBR2=0x40;
        P1MDIN=0xFF;
        P1MDOUT=0xFF;
    rd=0;
        lcden=0;
//        fen=59;
//        miao=53;
//        shi=23;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        for(num=0;num<15;num++)
                {
                        write_date(table);
                        delay(12);
                }
        write_com(0x80+0x40);
        for(num=0;num<12;num++)
                {
                        write_date(table1);
                        delay(12);
                }
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void write_sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        write_com(0x80+0x40+add);
        write_date(0x30+shi);
        write_date(0x30+ge);
}


void main()
{
        init();
       
}

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
if(count==41)
                {
                        count=0;
                        miao++;
                        if(miao==60)
                        {
                                miao=0;
                                fen++;
                                if(fen==60)
                                {
                                        fen=0;
                                        shi++;
                                        if(shi==24)
                                        {
                                                shi=0;
                                        }
                                        write_sfm(4,shi);
                                }
                                write_sfm(7,fen);
                        }
                        write_sfm(10,miao);
                       
                }       
}

zydk1447 发表于 2009-10-1 09:19:37

先检查接线,有没有对比度调节电位器?最好把你的接线图发上来

hym8877 发表于 2009-10-1 10:48:55

连线没问题,对比度的可变电阻接了,我觉得初始化少东西了,但不知道

longpep 发表于 2009-10-1 11:55:19

rw位好像要用到吧

maomao2126 发表于 2009-10-2 11:10:55

可以参考一下我以前写的初始化部分
void LCD_1602_initial()
{
unsigned int i;
write_command(0x38);
delay();
write_command(0x38);
delay();
write_command(0x38);
delay();
write_command(0x06);
write_command(0x0c);

for(i=0;i<84;i++)
{
   write_command(0x80+i);
   write_data(0x41);
}

}

wherethriving 发表于 2009-10-2 13:19:46

把你的init_device发上来 看配置对不对这个只是程序 看不出错

ZWzw007aa 发表于 2012-2-20 20:49:29

我之前也遇到过这样的问题,

#include <c8051f020.h>
#include <intrins.h>
#include <absacc.h>
#include <stdlib.h>    //标准函数
#include <stdio.h>    //I/O口函数

#define _Nop() _nop_()

#define uchar unsigned char
#define uint unsigned int






//--------------------------------------------------------------------
//全局变量
//--------------------------------------------------------------------

//--------------------------------------------------------------------
//函数声明
//--------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init(void);
void Delay( uint );                      //延时子程序

//--------------------------------------------------------------------
// 主函数
//--------------------------------------------------------------------
void main (void)
{
        WDTCN = 0xde;                       
           WDTCN = 0xad;                        //关闭WDT
        SYSCLK_Init ();       
           PORT_Init();                       



   

}
//-----------------------------------------------------------------------------
// 系统时钟配置
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{

// OSCICN =0x87; //使用内部时钟16M
// while((OSCICN & 0x10)==0);//内部时钟按设定频率运行


   int i;                           // delay counter
   OSCXCN = 0x67;                   // start external oscillator with
                                    // 22.1184MHz crystal
   for (i=0; i < 256; i++) ;      // Wait for osc. to start up   
   while (!(OSCXCN & 0x80)) ;       // Wait for crystal osc. to settle
   OSCICN = 0x88;                   // select external oscillator as SYSCLK
                                    // source and enable missing clock
                                    // detector

}
//-----------------------------------------------------------------------------
// I/O配置
//-----------------------------------------------------------------------------
void PORT_Init()
{
   XBR2    = 0x40;          // 交叉开关使能

//P74OUT= 0x3f;                        //P7open drain,P6、5、P4的高4位为推挽输出
P74OUT= 0xff;                        //推挽输出

}

/*******************************************************************************
延时子程序
********************************************************************************/

void Delay( uint tt )
{
   while( tt-- );
}
页: [1]
查看完整版本: C8051f020液晶问题,真的救救我,没时间了