打印

关于c8051f020驱动LCD1602的问题

[复制链接]
4448|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
心随愿飞|  楼主 | 2010-10-18 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是初学者,想请高手指点一下,下面的这段程序问题出在哪里。自己尝试这调试了几天,将程序下载到单片机后液晶屏上只有16个黑色的小方块,并不显示指定的字符。小弟急求,烦请高手指点,在线等!!这是用c8051f020驱动1602LCD的一段测试程序:

#include <c8051f020.h>
#include <intrins.h>
  
sbit rs= P2^0;       //数据命令选择位
sbit rw = P2^1;       //读写信号控制端
sbit ep = P2^2;      //使能信号控制端
unsigned char code dis1[] = {"www.hificat.com"};
unsigned char code dis2[] = {"0571-85956028"};
void delay(unsigned char ms)       //延时多长时间???
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
unsigned char lcd_bz(void)        //LCD“忙”判断函数
{
  P0=0xff;    //此时不接受外来指令???
  rs=0;   
  rw=1;   //读指令模式
  ep=0; //若晶振速度太高可以在这后加小的延时   
  _nop_();
  _nop_();
  _nop_();
  ep=1;     
  while(P0 & 0x80) //检测忙信号      ????  
  return(P0);

}
void lcd_wcmd(unsigned char cmd)
{
lcd_bz();  //判断LCD是否忙碌
rs = 0;         //选择指令寄存器
rw = 0;         //写命令
ep = 0;         //使能信号控制端
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}


void lcd_pos(unsigned char pos)     //显示存储器的地址
{
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(unsigned char dat)
{
lcd_bz();//判断LCD是否忙碌
rs = 1;       //选择数据寄存器
rw = 0;       //写命令
ep = 0;       //使能信号控制端
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init()
{
delay(50);
lcd_wcmd(0x28);
delay(50);
lcd_wcmd(0x0c);
delay(50);
lcd_wcmd(0x06);
delay(50);
lcd_wcmd(0x01);
delay(50);
lcd_wcmd(0x01);
delay(50);
}
void PORT_Init(void)
{
  XBR0 = 0x00;
    XBR1 = 0x00;
    XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出   
    P0MDOUT = 0x00;
    P1MDOUT = 0x00;
P2MDOUT = 0x07;

  P74OUT =0x00;
}
void OSCILLATOR_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal
   for (i=0; i < 256; i++) ;           // wait for oscillator to start
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
}
void main(void)
{
unsigned char i;
WDTCN = 0xde;                       // Disable watchdog timer
WDTCN = 0xad;
OSCILLATOR_Init ();
PORT_Init();
lcd_init();// 初始化LCD
delay(250);
lcd_pos(0x01);//设置显示位置
i = 0;
while(dis1 != '\0')
{
lcd_wdat(dis1);//显示字符
i++;
}
lcd_pos(0x42);// 设置显示位置
i = 0;
while(dis2 != '\0')
{
lcd_wdat(dis2);// 显示字符
i++;
}
}

相关帖子

沙发
zdhlixiang2006| | 2010-10-18 18:49 | 只看该作者
如果是从51那里借鉴过来的思路,你就主要看一下时序满足了没有,因为C8051的速度要比51快

使用特权

评论回复
板凳
心随愿飞|  楼主 | 2010-10-18 19:31 | 只看该作者
时序我是改过的啊 好像还是不行
请问c8051f020的P0到P3口的输出方式对这里有没有影响
我主要是不明白推挽输出和漏极开路有什么区别 小弟初学,见笑了

使用特权

评论回复
地板
ayb_ice| | 2010-10-19 08:30 | 只看该作者
推挽输出能力很强,IO不能直接接VCC或GND(或通过外围电路间接接VCC或GND),否则会损坏MCU或外围电路,
漏极开路就是没有上拉电路

使用特权

评论回复
5
心随愿飞|  楼主 | 2010-10-19 16:02 | 只看该作者
有没有哪位朋友有这方面的程序调试成功过的,并且能驱动1602的C源代码可以分享一下吗?

使用特权

评论回复
6
liuyuxiier| | 2010-10-19 16:25 | 只看该作者
延时时间可能不够,C8051比51的速度快很多
再就是不知道你有没有调试过液晶的对比度
偶当年也是调程序调了N天,一直显示黑块
后来被学长用一个小螺丝刀调了下对比度就看见字了

使用特权

评论回复
7
心随愿飞|  楼主 | 2010-10-19 16:51 | 只看该作者
我想请问一下楼上的调对比度用的是多大的电阻?

使用特权

评论回复
8
zhaoyu2005| | 2010-10-19 17:29 | 只看该作者
1602好像不用调对比度,单步执行或者自己模拟程序运行(在纸上一点一点写、画),核对下时序,如果时序对了,就简单送个数据看下,1602还是比较好弄的

使用特权

评论回复
9
心随愿飞|  楼主 | 2010-10-19 17:34 | 只看该作者
1602的数据口可以用3.3v直接驱动吗?

使用特权

评论回复
10
liuyuxiier| | 2010-10-19 17:50 | 只看该作者
7# 心随愿飞

刚才发帖太多不让发了,时间过去太久了好几年了,不记得当时的电阻式多大的了,只记得是个精密电位器,你看看资料上写的是多少吧

使用特权

评论回复
11
心随愿飞|  楼主 | 2010-10-19 17:55 | 只看该作者
那你那里还有没有当时用的源程序
跟我发一份?

使用特权

评论回复
12
jackdauson| | 2010-10-19 18:09 | 只看该作者
10k的电位器调对比度。液晶不能显示,除了对比度的原因外,可能是你初始化写指令没弄好

使用特权

评论回复
13
Oscar.jie| | 2010-10-19 20:53 | 只看该作者
#include<reg52.h>
#include<string.h>
sbit RS=P2^3;
sbit RW=P2^4;
sbit EN=P2^5;
#define uchar unsigned char
#define uint unsigned int
void init(void);
void write_com(uchar com);
void write_dat(uchar dat);
void delay_5ms(void);
void message(uchar *p);
void left(void);
uchar code table1[]="  FAIRNESS";
uchar code table2[]="  VIRTUOUS";
uchar code table3[]="ZHENGZHIMIN";
uchar code table4[]="I LOVE YOU!";
void main(void)
{
        init();
        message(table1);
        write_com(0x80+0x42);
        message(table2);
        write_com(0x80+0x03+0x10);
        message(table3);
        write_com(0x80+0x43+0x10);
        message(table4);
        left();
        while(1);
}
void left(void)
{
        uchar j;
        for(j=0;j<16;j++)
        {
                write_com(0x18);
                delay_5ms();
        }
}
void message(uchar *p)
{
        uchar num,i;
        num=strlen(p);
        for(i=0;i<num;i++)
        {
                write_dat(p[i]);
                delay_5ms();
        }
}
void init(void)
{
        RW=0;
        EN=0;
        write_com(0x38);
        write_com(0x01);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x80+0x02);
       
}
void write_com(uchar com)
{
        RS=0;
        P0=com;
        delay_5ms();
        EN=1;
        delay_5ms();
        EN=0;
}
void write_dat(uchar dat)
{
        RS=1;
        P0=dat;
        delay_5ms();
        EN=1;
        delay_5ms();
        EN=0;
}
void delay_5ms(void)   //误差 -0.000000000011us
{
    unsigned char a,b,c;
    for(c=3;c>0;c--)
        for(b=44;b>0;b--)
            for(a=173;a>0;a--);
}

这个你看看吧!是我原来做的简单的LCD1602程序,IO口不同而已。

使用特权

评论回复
14
心随愿飞|  楼主 | 2010-10-19 22:35 | 只看该作者
我用的是c8051f020,和你的片子不同啊

使用特权

评论回复
15
心随愿飞|  楼主 | 2010-10-20 09:31 | 只看该作者
请问谁有测试成功的c8051f020驱动1602的接线图和C源程序的,能跟我发一份吗?急用,谢谢。
我的邮箱是mdmxm_2006@126.com

使用特权

评论回复
16
zdhlixiang2006| | 2010-10-22 17:57 | 只看该作者
。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

0

粉丝