完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
路过的大神们,望帮小弟支支招! 我的程序在proteus里能仿真显示,但是下载到板上后一只显示第一行的黑块了!为什么啊! 检查过连接线了,没问题。 也修改过程序,换引脚 ,还是黑块。 程序和仿真已经打包上传了!望解决!
LCD1602.zip
(66.84 KB, 下载次数: 138
)
上原理图: 仿真图: 硬件图: 程序如下: /********************************************************************************************/ 找不到原因,我和小伙伴们都惊呆了! |
|
相关推荐
24个回答
|
|
你用螺丝刀调一下滑动变阻器
|
|
|
|
调节你原理图中滑动变阻器R0,可能是背光原因
|
|
|
|
我觉得仿真能显示了说明程序没有问题。LCD1602第一行全部黑格是上电之后正常显示现象,因为上电后LCD的DDRAM被复位了,显示也就同DDRAM的内容。
你这块板子的LCD1602插座应该是连接好线置单片机引脚上的,看哪些引脚连接在LCD哪些控制位上再修改程序上的引脚声明。没发现其他原因。 |
|
|
|
|
|
|
|
/********************************************************************************************
//主程序 /********************************************************************************************/ void main() { delay_ms(500); LCD1602_Init(); // LCD1602初始化 while(1){ LCD1602_Display(); // LCD1602显示程序 } } |
|
|
|
|
|
|
|
那低头一笑的温 发表于 2013-7-25 21:18 还是不行。。。 |
|
|
|
我用开发板配套的程序试了,能仿真,硬件也可以实现。 但我用我自己的程序就只能仿真,硬件却第一行显示黑色方块 同样的接法。 |
|
|
|
延时够500毫秒了吗
|
|
|
|
我不懂你是怎么仿真出来的。我试了哈,你程序错了。在显示那里错了。table1和table是数组,怎么能直接拿来使用,你都定义i了。怎么不用呢??
void LCD1602_Display(void){ LCD1602_WriteCMD(0x80); //写指令第一行显示 for(i=0;i<16;i++) { LCD1602_WriteData(table1[i]); delay(10);//写第一行显示数据 } LCD1602_WriteCMD(0x80+0x40); //写指令第二行显示 for(i=0;i<14;i++) { LCD1602_WriteData(table2[i]); delay(10); //写第一行显示数据 } } |
|
|
|
额,哥们真不好意思,我觉得你程序那里还要个错,就是在写命令和数据函数时得有一小段延时。你看它的时序就明白了。我的程序:
/********************************************************************************************/ #include /******************************************************************************************** // 引脚定义 // (使用者根据实际更改) /********************************************************************************************/ #define DB0_DB7 P0 ***it LCD1602_RS = P2^4; ***it LCD1602_RW = P2^5; ***it LCD1602_E = P2^6; unsigned char i; unsigned char code table1[] = {" Please open the"}; unsigned char code table2[] = {" door! Thanks!"}; /******************************************************************************************** // 定义LCD1602指令集 // (详细请见威廉希尔官方网站 手册) /********************************************************************************************/ #define LCD1602_set 0x38 // 8位总线_2行显示 #define LCD1602_light 0x0c // 开显示_关光标_关光标闪烁 #define LCD1602_add 0x06 // 读入后AC(指针)加1,向右写 #define LCD1602_sub 0x04 // 读入后AC(指针)减1,向左写 #define LCD1602_clear 0x01 // 清除屏幕 #define LCD1602_CMD_back 0x02 // DDRAM回零位 /******************************************************************************************** //延时函数 /********************************************************************************************/ void delay(unsigned char z) { unsigned char x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************************************************************************************** // 写指令程序 // // 向LCD1602写命令 本函数需要1个指令集的入口参数 // /********************************************************************************************/ void LCD1602_WriteCMD(unsigned int command){ DB0_DB7 = command; LCD1602_RS = 0; LCD1602_RW = 0; //delay(5); LCD1602_E = 1; // delay(5); LCD1602_E = 0; } /******************************************************************************************** // 写数据程序 // // 向LCD1602写数据 // /********************************************************************************************/ void LCD1602_WriteData(unsigned int dat){ DB0_DB7 = dat; LCD1602_RS = 1; LCD1602_RW = 0; delay(5); LCD1602_E = 1; delay(5); LCD1602_E = 0; } /******************************************************************************************** // LCD1602初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改) /********************************************************************************************/ void LCD1602_Init(){ LCD1602_E = 0; LCD1602_WriteCMD(LCD1602_set); //* 显示模式设置:显示2行,每个字符为5*7个像素 LCD1602_WriteCMD(LCD1602_clear); // 显示清屏 LCD1602_WriteCMD(LCD1602_CMD_back); //* 数据指针指向第1行第1个字符位置 LCD1602_WriteCMD(LCD1602_add); // 显示光标移动设置:文字不动,光标右移 LCD1602_WriteCMD(LCD1602_light); // 显示开及光标设置:显示开,光标开,闪烁开 } /******************************************************************************************** // LCD1602显示程序 //调用LCD1602_Display(); /********************************************************************************************/ void LCD1602_Display(void){ LCD1602_WriteCMD(0x80); //写指令第一行显示 for(i=0;i<16;i++){ LCD1602_WriteData(table1[i]);delay(5);//写第一行显示数据 } LCD1602_WriteCMD(0x80+0x40); //写指令第二行显示 for(i=0;i<14;i++){ LCD1602_WriteData(table2[i]);delay(5); //写第一行显示数据 } } /******************************************************************************************** //主程序 /********************************************************************************************/ void main(){ LCD1602_Init(); // LCD1602初始化 while(1){ LCD1602_Display(); // LCD1602显示程序 } } 仅供参考,我的1602的RS,RW,E三个接口接的是P2口的4,5,6。你程序换回去就行了。 |
|
|
|
额,不好意思,刚才的没改,现在我试了是可以成功的
/********************************************************************************************/ #include /******************************************************************************************** // 引脚定义 // (使用者根据实际更改) /********************************************************************************************/ #define DB0_DB7 P0 ***it LCD1602_RS = P2^4; ***it LCD1602_RW = P2^5; ***it LCD1602_E = P2^6; unsigned char i; unsigned char code table1[] = {" Please open the"}; unsigned char code table2[] = {" door! Thanks!"}; /******************************************************************************************** // 定义LCD1602指令集 // (详细请见威廉希尔官方网站 手册) /********************************************************************************************/ #define LCD1602_set 0x38 // 8位总线_2行显示 #define LCD1602_light 0x0c // 开显示_关光标_关光标闪烁 #define LCD1602_add 0x06 // 读入后AC(指针)加1,向右写 #define LCD1602_sub 0x04 // 读入后AC(指针)减1,向左写 #define LCD1602_clear 0x01 // 清除屏幕 #define LCD1602_CMD_back 0x02 // DDRAM回零位 /******************************************************************************************** //延时函数 /********************************************************************************************/ void delay(unsigned char z) { unsigned char x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /******************************************************************************************** // 写指令程序 // // 向LCD1602写命令 本函数需要1个指令集的入口参数 // /********************************************************************************************/ void LCD1602_WriteCMD(unsigned int command){ DB0_DB7 = command; LCD1602_RS = 0; LCD1602_RW = 0; delay(5); LCD1602_E = 1; delay(5); LCD1602_E = 0; } /******************************************************************************************** // 写数据程序 // // 向LCD1602写数据 // /********************************************************************************************/ void LCD1602_WriteData(unsigned int dat){ DB0_DB7 = dat; LCD1602_RS = 1; LCD1602_RW = 0; delay(5); LCD1602_E = 1; delay(5); LCD1602_E = 0; } /******************************************************************************************** // LCD1602初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改) /********************************************************************************************/ void LCD1602_Init(){ LCD1602_E = 0; LCD1602_WriteCMD(LCD1602_set); //* 显示模式设置:显示2行,每个字符为5*7个像素 LCD1602_WriteCMD(LCD1602_clear); // 显示清屏 LCD1602_WriteCMD(LCD1602_CMD_back); //* 数据指针指向第1行第1个字符位置 LCD1602_WriteCMD(LCD1602_add); // 显示光标移动设置:文字不动,光标右移 LCD1602_WriteCMD(LCD1602_light); // 显示开及光标设置:显示开,光标开,闪烁开 } /******************************************************************************************** // LCD1602显示程序 //调用LCD1602_Display(); /********************************************************************************************/ void LCD1602_Display(void){ LCD1602_WriteCMD(0x80); //写指令第一行显示 for(i=0;i<16;i++){ LCD1602_WriteData(table1[i]);delay(5);//写第一行显示数据 } LCD1602_WriteCMD(0x80+0x40); //写指令第二行显示 for(i=0;i<14;i++){ LCD1602_WriteData(table2[i]);delay(5); //写第一行显示数据 } } /******************************************************************************************** //主程序 /********************************************************************************************/ void main(){ LCD1602_Init(); // LCD1602初始化 while(1){ LCD1602_Display(); // LCD1602显示程序 } } |
|
|
|
|
|
|
|
liqianglq90 发表于 2013-7-25 22:53 兄弟,用你的方法试了,仿真同样可以,硬件情况:显示两行黑格了,只是分压后黑格没那么清晰了(灰度已经调最大了)。 评分 |
|
|
|
用我加了延时的程序试了哈,是可以了。而用你的程序只显示黑格,
|
|
|
|
我用仿真成功了。但是用开发板出现了一行黑色字幕。。
|
|
|
|
你确定单片机和显示屏都和仿真的一样
|
|
|
|
检查程序,一般能够显示第一行问题都不大。你看其他c文件时不是也使用了这些io口,使用了时会干扰的。
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
503 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1756 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1183 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1053 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1287 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12020 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 17:30 , Processed in 1.587034 second(s), Total 78, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号