新手求助 快疯了1602搞了一天
买了一个1602液晶屏想显示点东西玩 但是接上怎么都不现实用的程序是 郭天祥的那个,我就把里面的 RW RS和EN改了一下但是总是失败 一直是方块
我得 数据是接的P1然后 RS是P3.4RW 3.5EN 3.6
线没有问题开始用的杜邦线 后来直接焊接的都不行求教各位大神
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";
uchar code table1[]="WWW.TXMCU.COM";
sbit lcden=P3^6;
sbit lcdrw=P3^5;
sbit lcdrs=P3^4;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcdrw=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
}
void main()
{
init();
for(num=0;num<11;num++)
{
write_data(table);
delay(20);
}
// write_com(1);
write_com(0x80+0x53);
for(num=0;num<13;num++)
{
write_data(table1);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18);
delay(20);
}
while(1);
}
好像是时钟问题,STC1T和传统的51有区别的。不知道你用的是什么CPU 1602上电复位慢,初始化前的延时弄长点看看。 也有可能是液晶屏的对比度没调好??被盖住了!!! 初始化前,加毫秒級延時 {:smile:}看你这凌乱的走线。。。。人家的程序在人家的板子上完全可以用,你最好再想想哪里和人家不同 呵呵,还是看看数据手册把,比你看别人的程序要好的很多。 其实1602的数据手册并不难,可以说非常的简单。 LM1876 发表于 2012-9-5 17:24 static/image/common/back.gif
好像是时钟问题,STC1T和传统的51有区别的。不知道你用的是什么CPU
SCT89c51这个 第一行是这个样子,说明初始化没有成功呢。慢慢调先。我回去了给你程序你自己对照下。 时序的问题,要有耐心哦 1602是液晶入门初级产品,自己按照时序研究。不要指望大家指点你,等你自己搞懂了,接下来其他的液晶就手到擒来了。
祝你好运!! rundll32 发表于 2012-9-5 18:09 static/image/common/back.gif
SCT89c51这个
#include "lcd1602.h"
#include "..\main\ext_reg.h"
#include "..\main\port.h"
#include <intrins.h>
#defineNOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();}
#define_nop_() {;}
/*****************LCD初始化设定****************/
void lcd_init()
{
uchar i;
mDisplay_count=0;
lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据接口00111000
for (i=0;i<125;i++){NOP();NOP();}
lcd_wcmd(0x38);
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"-")
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x01); //清除LCD的显示内容
for (i=0;i<125;i++){NOP();}
}
void LCD_Update()
{
if(mDisplay_count)
{
mDisplay_count--;
return;
}
LCD_DisPosCode();
mDisplay_count = 5;
}
void LCD_DisPosCode()
{
dis_buf1='1';
dis_buf1='2';
dis_buf1='3';
dis_buf1='4';
dis_buf1=' ';
dis_buf1=32;
dis_buf1=53;
dis_buf1=13;
dis_buf1=23;
dis_buf1=' ';
dis_buf1=' ';
dis_buf1=' ';
dis_buf1=' ';
dis_buf1=5+48;
dis_buf1=6+48;
dis_buf1=' ';
dis_buf2=' ';
dis_buf2=' ';
dis_buf2=8+48;
dis_buf2=8+48;
dis_buf2=8+48;
dis_buf2=9+48;
dis_buf2=9+48;
dis_buf2=' ';
dis_buf2='F';
dis_buf2='C';
dis_buf2=1+48;
dis_buf2=1+48;
dis_buf2=1+48;
dis_buf2=1+48;
dis_buf2='A';
dis_buf2=' ';
pro_display();
}
/**********************LCD显示处理程序********************/
void pro_display()
{ uchar i;
lcd_pos(0x00); //第一行
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf1);}
lcd_pos(0x40);//第二行
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf2);}
}
/**************检测LCD忙**********************/
bit lcd_busy()
{ uint i,j;
bit result;
RS = 0;
RW = 1;
EN = 1;
i = 30;
while(i>0) i--;
j=P2;
result =j & 0x80; //D7=1为忙碌,D7=0为空闲
EN = 0;
return result;
}
/**************写入指令到LCD**********************/
void lcd_wcmd(uchar cmd)
{
if(lcd_busy()){return;}; //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
RS = 0; //RS=0,即是选择1602LCD的指令寄存器
RW = 0; //低电平为写操作
EN = 0;
NOP();
P2 = cmd; //送命令到P0口,即送一个字节的数据到LCD1602的指令寄存器中
NOP();
EN = 0;
EN = 1; //ep即使能端,由高电平跳变到低电平时,执行命令
NOP();
EN = 0;
}
/****************写入数据到LCD*******************/
void lcd_wdat(char dat)
{
while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
RS = 1;
RW = 0;
EN = 0;
P2 = dat;
NOP();
EN = 1; //ep即使能端,由高电平跳变到低电平时,执行命令
EN = 1;
EN = 0;
NOP();
}
//LCD数据指针位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}
你用这个参考下看看,这个我是用STC12C5A48S2通过的 楼主加油,论坛有牛人手拨都能显示,相信应该不难的。 上面都说了,调一调对比度试试~ 对比度 没调好吧 都出现那么严重的鬼影了 本帖最后由 chengzepeng 于 2012-9-5 22:04 编辑
1602参考连接电路,IO建议都接在P0外的非共用IO上。
看手册的写周期可以允许小于1uS,也就是说普通的51如AT89x51(C或者S系列)延不延照样显示的!
国产的液晶可能因为生产厂家会有有个别不同!
所以测试的时候加大延时都不行那就要换个液晶或者检测线路了,比如把数据线接到了P0上了,这组IO要加上拉电阻!
给个测试代码如下!#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; //LCD1602控制端与单片机的连接,P1接数据线
sbit EN=P2^1;
sbit TP=P3^0;
void delay_us(uint xus) // AT89C51实测约循环一次延时8uS秒
{
while(--xus);
}
void wr_dat(uchar com,dat) // 1602写指令,com=0为写入指令,com=1为写入数据
{
RS=com;
delay_us(12);
EN=1;
delay_us(120);
P1=dat;
delay_us(120);
EN=0;
delay_us(120);
}
void lcd_init()//1602初始化设置
{
wr_dat(0,0x38); //设置16*2显示,5*7点阵,8位数据接口
wr_dat(0,0x08); //设置关显示,光标不显示,光标不闪烁
wr_dat(0,0x01); //设置显示清屏
wr_dat(0,0x06); //设置显示光标移动位置
wr_dat(0,0x0c); //设置显示开及光标设置
}
void display(uchar *p)//显示子程序
{
while(*p!='\0')
{
wr_dat(1,*p);
p++;
}
}
void init_play()//1602初始化显示
{
lcd_init();
wr_dat(0,0x80); // 设置地址为第一行首
display("0123456789"); // 写字符串到第一行
wr_dat(0,0xc0); // 设置地址为第二行首
display("abcdefghijk"); // 写字符串到第二行
}
void main()
{
init_play();//1602初始化显示
while(1)
{
TP = 0;
delay_us(100); // 100 x uS延时测试(AT89C51实测807uS)
TP = 1;
}
}
加油,这个太初级,想进步就得自己战胜自己。 对比度没调好吧 楼上各位,对比度没调好第一行的方块是看不见的
如果硬件没问题楼主看看软件吧,另外液晶的IO口不要接其他的器件 关注,学习一下。。。。 楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序里面的P0改成P1应该可以了的,
那个程序我仿真是有显示的,
虽然显示不全! 我用stm32搞1602的4位总线模式驱动,花了3天。
走了一些弯路,主要是因为不小心使用了stm32的PB4管脚,
这个PB4管脚比较特殊一点,要把它的Jtag功能屏蔽掉才能当普通IO口用 调时序还是有示波器好啊 上电复位后,延时几十毫秒到一百多毫秒后再初始化LCD Most of the issues are due to inability to read and understand the datasheet.
chengzepeng 发表于 2012-9-5 23:00 static/image/common/back.gif
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...
多谢 我正想仿真嗯 chengzepeng 发表于 2012-9-5 23:00 static/image/common/back.gif
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...
程序里面就是P1 chengzepeng 发表于 2012-9-5 23:00 static/image/common/back.gif
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...
哦哦哦对不起 看错 来 不好意思 初始化不成功! 对比度问题吧看看象 出现方块???
快去调调对比度!!!对比度调好了,1602复位是看不到的!
还有,也可能是烧掉了!!我之前烧过1602,之后就是出现方块! boostchopper 发表于 2012-9-6 09:20 static/image/common/back.gif
出现方块???
快去调调对比度!!!对比度调好了,1602复位是看不到的!
还有,也可能是烧掉了!!我之前 ...
对比度调好了才能看见方块 楼上各位 问题已经解决了
呵呵,恭喜 怎么好的,我遇到同样的问题,怎么调都不好
楼主是对比度每调,我以前自己画板子的时候直接把1602三脚接地就是这个情况 1602是很简单的。楼主先查一下硬件电路,确保没问题的话再看看程序 看楼主搞定了,恭喜了, 目测楼主里面的端口错了,你接的是P1,代码里定义的是P0??? rundll32 发表于 2012-9-5 18:09 static/image/common/back.gif
SCT89c51这个
修改延迟就可正常,话说1602真的很慢,还不如用5110一点都不用延迟 楼主都没说是什么问题搞好的?初学者想知道? 我也正在搞,MARK一下,LZ加油啊 jinmailang 发表于 2013-5-30 22:26
怎么好的,我遇到同样的问题,怎么调都不好
这情况我碰到过
那是因为读写时序不对早成的
请修改读写的时序就可以解决
页:
[1]