lcd1602怎么接单片机机1602显示的问题

后使用快捷导航没有帐号?
请完成以下验证码
查看: 7120|回复: 6
求助1602液晶的显示问题 如何显示一个变量
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
& && &sprintf(Data,&%d&,temp);
& && &LCD_Write_String(0,0,Data);
& && & DelayMs(200);
但是在机器上显示不出来,Data是一个数组,temp是char型变量,我想做的是在1602上显示出temp的值来,但是这样却做不到。
求教高手们!谢谢!
在线时间45 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 36, 距离下一级还需 164 积分
一粒金砂(中级), 积分 36, 距离下一级还需 164 积分
亲,你可以尝试用write_com()和write_data()来写
一般写单片机的话还是不怎么用c的规矩格式的
好的,好的,我试一试。&
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
亲,你可以尝试用write_com()和write_data()来写
好的,好的,我试一试。
您好,您那个显示问题解决没?楼主&
在线时间194 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 97, 距离下一级还需 103 积分
一粒金砂(中级), 积分 97, 距离下一级还需 103 积分
好的,好的,我试一试。
您好,您那个显示问题解决没?楼主
在线时间194 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 97, 距离下一级还需 103 积分
一粒金砂(中级), 积分 97, 距离下一级还需 103 积分
楼主急救!!!
在线时间629 小时
威望1107分
芯币7976枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1107, 距离下一级还需 93 积分
纯净的硅(中级), 积分 1107, 距离下一级还需 93 积分
虽然不知道楼主解决问题没有,还是想说下& &用1602显示数据,比如 102& &你得把 102 一个一个拆开,以ASCII吗的形式写入1602
dj的世界一直很好
在线时间38 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
显示是字符,数字无法在LCD1602显示,可以将数字转换为字符显示。
专业电子方案/zigbee方案设计,毕业设计。QQ:
EEWORLD 官方微信
Powered by21ic官方微信-->
stc单片机1602液晶显示的奇怪问题
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
各位大侠,我编了个1602液晶显示的程序,用ATMEL89S52工作正常,换成STC12C5A08S2就无法工作。很奇怪,求解。有图有真相,谢谢!!
程序附上:
#include &AT89X52.H&
#define uchar unsigned char
#define uint unsigned int
#define dat_delay 200
#define dat_port&&P0&&//1602液晶数据接口,由跳线跳接
#define com_port&&P2&&//1602液晶控制接口,由跳线跳接
sbit led=P1^3;
sbit rs=com_port^6;& &
sbit rw=com_port^5;
sbit lcden=com_port^4;
uchar table1[]=&SIMPLE SN51A_1.1&;
uchar table2[]=&GOOD LUCK TO YOU&;
void delay(uint x)
for(a=x;a&0;a--)
&&for(b=10;b&0;b--);
void delay1(uint x)
for(a=x;a&0;a--)
&&for(b=600;b&0;b--);
void write_com(uchar com) ////1602液晶控制函数
// lcden=0;
delay(dat_delay );
delay(dat_delay );
void write_date(uchar dat) ////1602液晶写数据函数
// lcden=0;
delay(dat_delay );
delay(dat_delay );
void init1602()& &//1602液晶初始化函数
write_com(0x38); //液晶显示方式设置
delay(dat_delay );
// write_com(0x0f); //光标开 闪烁
write_com(0x0c); //光标不开 不闪烁
delay(dat_delay );
write_com(0x06); //数据指针顺序设置
delay(dat_delay );
write_com(0x01); //液晶屏幕清屏命令
delay(dat_delay );
void main()
uchar a=0;
init1602();&&//初始化1602液晶
//1602液晶显示器地址:第一行从0X80开始--0X81-0X82---...0X8F
//& &&&:第二行从0XC0开始--0XC1-0XC2---...0XCF
write_com(0x80);//从第一行第一个字符显示&IMPLE SN51A_1.1&
delay(dat_delay );//#define dat_delay 200
for(a=0;a&16;a++)
write_date(table1[a]);
delay(dat_delay );&&
write_com(0xc0);//从第二行第一个字符显示&GOOD LUCK TO YOU&
delay(dat_delay );
for(a=0;a&16;a++)
write_date(table2[a]);
delay(dat_delay );&&
delay1(300);
for(a=0;a&40;a++)&&//循环移位//左移16之后再移3个空位从右边出来
&&write_com(0x18); //左移位指令
&&delay1(20);
满意回复+10
延时太长好像也不行的,我之前做的时候从AT换STC的话对外部操作的时候都是加1us的延时,或者五六个nop吧
初始化没有写好
你再仔细看看两中IC规格书,STC的有IO口方向控制寄存器的,它比AT的多了很多控制寄存器
这就是“山寨”的“优点”。
悲哀的天朝专用名词啊..... ...
检查一下LCD的控制时序吧!用AT的芯片没有问题,说明程序逻辑应该没问题,换成STC的不行,是两个芯片的运行速率不同,可能会导致时序不同,引起运行结果不同 ...
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
有的说延时不够,stc的单片机比at单片机运行得快,可是我把 dat_delay 调成20000都没有效果
资深技术员, 积分 361, 距离下一级还需 139 积分
资深技术员, 积分 361, 距离下一级还需 139 积分
资深技术员, 积分 361, 距离下一级还需 139 积分
资深技术员, 积分 361, 距离下一级还需 139 积分
都是51内核,晶振一样,延时不会变的,那个STC的IO口是不是带第二功能的?
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
1602的控制是用P2口,数据P0口,说明书上均无第二功能,如图
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
很困扰啊,我搞了两天了,同样的板子同样的程序,换上AT的单片机就好了,stc的就不行
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
这个单片机是stc的所谓1T单片机,对时序有影响吗?
这么大的延时,肯定够了。
IO口都加上上拉电阻试试
初级工程师, 积分 2680, 距离下一级还需 320 积分
初级工程师, 积分 2680, 距离下一级还需 320 积分
初级工程师, 积分 2680, 距离下一级还需 320 积分
初级工程师, 积分 2680, 距离下一级还需 320 积分
还是仔细对照下那两块MCU的手册吧,看你遗漏了什么没?
还有,1602的初始化还是按手册说的那样去初始化比较好点:
void init(void)
& & & & delay_50us(300);& & & & & & & & //& & & & 延时15ms
& & & & write_command(0x38);& & & & & & & & //& & & & 8为并行 显示2行 5*7点阵显示
& & & & delay_50us(100);& & & & & & & & //& & & & 延时5ms
& & & & write_command(0x38);
& & & & delay_50us(100);& & & & & & & & //& & & & 延时5ms
& & & & write_command(0x38);
& & & & check_busy();
& & & & write_command(0x38);
& & & & check_busy();
& & & & write_command(0x08);& & & & & & & & //关闭显示
& & & & check_busy();
& & & & write_command(0x01);& & & & & & & & //& & & & 清屏指令& & & &
& & & & check_busy();
& & & & write_command(0x06);& & & & & & & & //& & & & AC+1模式 显示不移动
& & & & check_busy();
& & & & write_command(0x0c);& & & & & & & & //& & & & 显示功能开 无光标 光标不闪烁
我前几天也焊了块1602,不带背光的,当时由于与带背光的引脚搞混了,把接地与电源接反了,也不正常显示,还是仔细检查下为好。
初级技术员, 积分 60, 距离下一级还需 40 积分
初级技术员, 积分 60, 距离下一级还需 40 积分
初级技术员, 积分 60, 距离下一级还需 40 积分
初级技术员, 积分 60, 距离下一级还需 40 积分
延时太长好像也不行的,我之前做的时候从AT换STC的话对外部操作的时候都是加1us的延时,或者五六个nop吧
高级技术员, 积分 780, 距离下一级还需 220 积分
高级技术员, 积分 780, 距离下一级还需 220 积分
高级技术员, 积分 780, 距离下一级还需 220 积分
高级技术员, 积分 780, 距离下一级还需 220 积分
我知道是为什么,我以前也出现过这种情况。不是延时问题。
你仔细看一下1602说明书,有个引脚要接可调电阻的,你的程序没错的,调节那个电阻到合适就可以显示了。
不加那个电阻的话,就会出现“鬼影”就是上面你发的图片那样子。
初级工程师, 积分 2001, 距离下一级还需 999 积分
初级工程师, 积分 2001, 距离下一级还需 999 积分
初级工程师, 积分 2001, 距离下一级还需 999 积分
初级工程师, 积分 2001, 距离下一级还需 999 积分
LS说的是第3脚VL,液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,一般都是通过一个10K的电位器调整对比度。
初级工程师, 积分 2555, 距离下一级还需 445 积分
初级工程师, 积分 2555, 距离下一级还需 445 积分
初级工程师, 积分 2555, 距离下一级还需 445 积分
初级工程师, 积分 2555, 距离下一级还需 445 积分
P0口的上拉呢?
资深工程师, 积分 11062, 距离下一级还需 8938 积分
资深工程师, 积分 11062, 距离下一级还需 8938 积分
资深工程师, 积分 11062, 距离下一级还需 8938 积分
资深工程师, 积分 11062, 距离下一级还需 8938 积分
这个好像是没初始化好
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
你说的我试了,加了10K可调电阻,调节的只是黑方块格子颜色的深浅,同样还是不正常的状态,不过还是谢谢,我现在试试8楼说的
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
延时我加了几个空指令,好像还是老样子,再试试上拉
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
我测了at单片机和STC单片机时各管脚电平,不同的是at正常工作时RS为低,而stc的为高,问题可能出在两点吧,1上拉,2初始化,各位高手有建议吗?一起来帮忙吧
初级工程师, 积分 2555, 距离下一级还需 445 积分
初级工程师, 积分 2555, 距离下一级还需 445 积分
初级工程师, 积分 2555, 距离下一级还需 445 积分
初级工程师, 积分 2555, 距离下一级还需 445 积分
先给P0口上拉吧,没上拉P0口怎么输出高?
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
p加了上拉无效啊,郁闷!!!!!!!!
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
资深技术员, 积分 304, 距离下一级还需 196 积分
怀疑晶振没有起振,和晶振一起的两个电容是多少?
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
中级技术员, 积分 198, 距离下一级还需 102 积分
30PF,应该起振了,指示灯工作正常
扫描二维码,随时随地手机跟帖
终身成就奖章
等级类勋章
坚毅之洋流
发帖类勋章
技术领袖奖章
人才类勋章
时间类勋章
精华达人奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
时间类勋章
技术高手奖章
人才类勋章
甘甜之泉水
发帖类勋章
社区建设奖章
等级类勋章
时间类勋章
技术导师奖章
人才类勋章
您需要登录后才可以回帖
热门推荐 /7
MACOM在线研讨会正在召开~51单片机 1602液晶显示控制代码
引脚的连接方式
&_&:下面是对其各个引脚进行说明:
1 /*-- 2 REG52.H 3 4 Header file for generic 80C52 and 80C32 microcontroller. 5 Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc. 6 All rights reserved. 7 --*/ 8 9 #ifndef __REG52_H__ 10 #define __REG52_H__ 11 12 /* BYTE Registers */ 13 P0 = 0x80; 14 sfr P1 = 0x90; 15 sfr P2 = 0xA0; 16 sfr P3 = 0xB0; 17 sfr PSW = 0xD0; 18 sfr ACC = 0xE0; 19 sfr B = 0xF0; 20 sfr SP = 0x81; 21 sfr DPL = 0x82; 22 sfr DPH = 0x83; 23 sfr PCON = 0x87; 24 sfr TCON = 0x88; 25 sfr TMOD = 0x89; 26 sfr TL0 = 0x8A; 27 sfr TL1 = 0x8B; 28 sfr TH0 = 0x8C; 29 sfr TH1 = 0x8D; 30 sfr IE = 0xA8; 31 sfr IP = 0xB8; 32 sfr SCON = 0x98; 33 sfr SBUF = 0x99; 34 35 /* 8052 Extensions */ 36 sfr T2CON = 0xC8; 37 sfr RCAP2L = 0xCA; 38 sfr RCAP2H = 0xCB; 39 sfr TL2 = 0xCC; 40 sfr TH2 = 0xCD; 41 42 43 /* BIT Registers */ 44 /* PSW */ 45 sbit CY = PSW^7; 46 sbit AC = PSW^6; 47 sbit F0 = PSW^5; 48 sbit RS1 = PSW^4; 49 sbit RS0 = PSW^3; 50 sbit OV = PSW^2; 51 sbit P = PSW^0; //8052 only 52 53 /* TCON */ 54 sbit TF1 = TCON^7; 55 sbit TR1 = TCON^6; 56 sbit TF0 = TCON^5; 57 sbit TR0 = TCON^4; 58 sbit IE1 = TCON^3; 59 sbit IT1 = TCON^2; 60 sbit IE0 = TCON^1; 61 sbit IT0 = TCON^0; 62 63 /* IE */ 64 sbit EA = IE^7; 65 sbit ET2 = IE^5; //8052 only 66 sbit ES = IE^4; 67 sbit ET1 = IE^3; 68 sbit EX1 = IE^2; 69 sbit ET0 = IE^1; 70 sbit EX0 = IE^0; 71 72 /* IP */ 73 sbit PT2 = IP^5; 74 sbit PS = IP^4; 75 sbit PT1 = IP^3; 76 sbit PX1 = IP^2; 77 sbit PT0 = IP^1; 78 sbit PX0 = IP^0; 79 80 /* P3 */ 81 sbit RD = P3^7; 82 sbit WR = P3^6; 83 sbit T1 = P3^5; 84 sbit T0 = P3^4; 85 sbit INT1 = P3^3; 86 sbit INT0 = P3^2; 87 sbit TXD = P3^1; 88 sbit RXD = P3^0; 89 90 /* SCON */ 91 sbit SM0 = SCON^7; 92 sbit SM1 = SCON^6; 93 sbit SM2 = SCON^5; 94 sbit REN = SCON^4; 95 sbit TB8 = SCON^3; 96 sbit RB8 = SCON^2; 97 sbit TI = SCON^1; 98 sbit RI = SCON^0; 99 100 /* P1 */ 101 sbit T2EX = P1^1; // 8052 only 102 sbit T2 = P1^0; // 8052 only 103 104 /* T2CON */ 105 sbit TF2 = T2CON^7; 106 sbit EXF2 = T2CON^6; 107 sbit RCLK = T2CON^5; 108 sbit TCLK = T2CON^4; 109 sbit EXEN2 = T2CON^3; 110 sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; 112 sbit CP_RL2 = T2CON^0; 113 114 #endif
reg52.h 一般自带直接引用就含有这个文件啦
1 /*-- 2 INTRINS.H 3 4 Intrinsic functions for C51. 5 Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc. 6 All rights reserved. 7 --*/ 8 9 #ifndef __INTRINS_H__ 10 #define __INTRINS_H__ 11 12 extern void _nop_ (void); 13 extern bit _testbit_ (bit); 14 extern unsigned char _cror_ (unsigned char, unsigned char); 15 extern unsigned int _iror_ (unsigned int, unsigned char); 16 extern unsigned long _lror_ (unsigned long, unsigned char); 17 extern unsigned char _crol_ (unsigned char, unsigned char); 18 extern unsigned int _irol_ (unsigned int, unsigned char); 19 extern unsigned long _lrol_ (unsigned long, unsigned char); 20 extern unsigned char _chkfloat_(float); 21 extern void _push_ (unsigned char _sfr); 22 extern void _pop_ (unsigned char _sfr); 23 24 #endif
intrins.h 一般自带
1 /*-- 2 名称:LCD 3 论坛:www.doflye.net 4 编写:shifang 5 内容:通过标准程序静态显示字符 6 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK 7 */ 8 #include&reg52.h& //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 9 #include&intrins.h& 10 11 sbit RS = P2^4; //定义端口 12 sbit RW = P2^5; 13 sbit EN = P2^6; 14 15 #define RS_CLR RS=0 16 #define RS_SET RS=1 17 18 #define RW_CLR RW=0 19 #define RW_SET RW=1 20 21 #define EN_CLR EN=0 22 #define EN_SET EN=1 23 24 #define DataPort P0 25 /* 26 uS延时函数,含有输入参数 unsigned char t,无返回值 27 unsigned char 是定义无符号字符变量,其值的范围是 28 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 29 长度如下 T=tx2+5 uS 30 */ 31 void DelayUs2x(unsigned char t) 32 { 33 while(--t); 34 } 35 /* 36 mS延时函数,含有输入参数 unsigned char t,无返回值 37 unsigned char 是定义无符号字符变量,其值的范围是 38 0~255 这里使用晶振12M,精确延时请使用汇编 39 */ 40 void DelayMs(unsigned char t) 41 { 42 while(t--) 43 { 44 //大致延时1mS 45 DelayUs2x(245); 46 DelayUs2x(245); 47 } 48 } 49 /* 50 判忙函数 51 */ 52 bit LCD_Check_Busy(void) 53 { 54 DataPort= 0xFF; 55 RS_CLR; 56 RW_SET; 57 EN_CLR; 58 _nop_(); 59 EN_SET; 60 return (bit)(DataPort & 0x80); 61 } 62 /* 63 写入命令函数 64 */ 65 void LCD_Write_Com(unsigned char com) 66 { 67 // while(LCD_Check_Busy()); //忙则等待 68 DelayMs(5); 69 RS_CLR; 70 RW_CLR; 71 EN_SET; 72 DataPort= 73 _nop_(); 74 EN_CLR; 75 } 76 /* 77 写入数据函数 78 */ 79 void LCD_Write_Data(unsigned char Data) 80 { 81 //while(LCD_Check_Busy()); //忙则等待 82 DelayMs(5); 83 RS_SET; 84 RW_CLR; 85 EN_SET; 86 DataPort= D 87 _nop_(); 88 EN_CLR; 89 } 90 91 /* 92 清屏函数 93 */ 94 void LCD_Clear(void) 95 { 96 LCD_Write_Com(0x01); 97 DelayMs(5); 98 } 99 /* 100 写入字符串函数 101 */ 102 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 103 { 104 if (y == 0) 105 { 106 LCD_Write_Com(0x80 + x); //表示第一行 107 } 108 else 109 { 110 LCD_Write_Com(0xC0 + x); //表示第二行 } 112 while (*s) 113 { 114 LCD_Write_Data( *s); 115 s ++; 116 } 117 } 118 /* 119 写入字符函数 120 */ 121 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 122 { 123 if (y == 0) 124 { 125 LCD_Write_Com(0x80 + x); 126 } 127 else 128 { 129 LCD_Write_Com(0xC0 + x); 130 } 131 LCD_Write_Data( Data); 132 } 133 /* 134 初始化函数 135 */ 136 void LCD_Init(void) 137 { 138 LCD_Write_Com(0x38); /*显示模式设置*/ 139 DelayMs(5); 140 LCD_Write_Com(0x38); 141 DelayMs(5); 142 LCD_Write_Com(0x38); 143 DelayMs(5); 144 LCD_Write_Com(0x38); 145 LCD_Write_Com(0x08); /*显示关闭*/ 146 LCD_Write_Com(0x01); /*显示清屏*/ 147 LCD_Write_Com(0x06); /*显示光标移动设置*/ 148 DelayMs(5); 149 LCD_Write_Com(0x0C); /*显示开及光标设置*/ 150 } 151 152 /* 153 主函数[上面已经把显示功能 好了,今后再写其他显示就直接调用] 154 */ 155 void main(void) 156 { 157 LCD_Init(); 158 LCD_Clear();//清屏 159 while (1) 160 { 161 LCD_Write_Char(7,0,'o'); 162 LCD_Write_Char(8,0,'k'); 163 LCD_Write_String(1,1,"www.doflye.net"); 164 while(1); 165 } 166 }
原文链接:
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点查看: 3413|回复: 36
求助:1602屏显示问题
734.jpg (187.31 KB, 下载次数: 47)
14:13 上传
想做个PM2.5检测仪,夏普的传感器也已经购得,随即做了一块ATMEGA329P的最小系统版如图:
本帖最后由 yjx189 于
14:27 编辑
这张图是写入“欢迎,,,”程序,不显示的,只有两行灰色方块
317.jpg (176.5 KB, 下载次数: 45)
14:25 上传
下面两张图是有时候正常显示的,
203.jpg (130.29 KB, 下载次数: 51)
14:26 上传
200.jpg (151.62 KB, 下载次数: 50)
14:27 上传
&&现在的现象是:
& &一,把ATMEGA328P芯片写入“点亮一盏灯”程序,在相当于UNO板的13脚的引脚接上LED和电阻,LED闪烁正常。
& &二,写入“欢迎,,,,,”程序,有时1602屏能正常显示“欢迎,,”的英文,有时则只显示两行灰色的方块。
& &三,写入“简单时钟电路”程序,1602屏两行乱码,并且随着时钟的秒的节奏,从屏左面向平右面滚动。
& &四,换其他的1602屏插上,情况一样。这两个程序的芯片,插在UNO板子上,都显示正常。
&&请问各位高手,这是什么问题?怎样解决?
& &我用stc12c5410ad单片机驱动1602,也有过类似于你遇到的这种情况。
1.显示方框不显示文字,基本上是两种原因:第一种是对比度调整不当,在我的屏上,就是1602的V0管脚电压不合适;你的已经正常显示过,这个可以排除。第二种是管脚接触不良,我用杜邦线连接,很容易出现连接不可靠,动动连接线就好了。
2.显示内容不对,且字符自动移动。这个多数是对1602的初始化不合适或者“忙”处理不当所致。特别是当给1602供电的电源偏低的时候,往往会导致1602初始化失败。
& &由于硬件不同,仅供参考。
本帖最后由 yjx189 于
19:47 编辑
我用stc12c5410ad单片机驱动1602,也有过类似于你遇到的这种情况。
1.显示方框不显示文字,基本上是两 ...
谢谢回复!电源是稳压供电5V。那请问:初始化不合适,怎么操作,就能合适了呢?
主要是上电后一开始就执行置显示模式命令(我的是写入0x38),至少要重复4次,且每次之间加1ms到5ms的延时(用延时就不再查询忙否了),我的实践证明,这很关键。
& &但平台硬件都不同,只能供你参考。
主要是上电后一开始就执行置显示模式命令(我的是写入0x38),至少要重复4次,且每次之间加1ms到5ms的延时 ...
我是个小白,哈哈,学单片机也就才20天,并且大学的专业也是汽车,请问,是要上电前,先找个1602的初始化的程序,写进ATMEGA329P的芯片里吗?
本帖最后由 yjx189 于
20:21 编辑
主要是上电后一开始就执行置显示模式命令(我的是写入0x38),至少要重复4次,且每次之间加1ms到5ms的延时 ...
估计就是你说的初始化的问题了!那请问:0X38要往哪里面写?怎么写呢?请明示,多谢了!(实在不好意思!我学单片机也就才20天,大学的专业也是汽车,不是电)
就是往,实际就是写设置显示模式的命令(注意模式不同,命令不一样),关键是多重复几次,且每次之间延时就行了。
本帖最后由 yjx189 于
08:06 编辑
怎么往1602里面写东西啊?在一个是:为什么我的1602和写好程序的ATMEGA328P芯片,在UNO板上,就都一切正常,到了我做的ATMEGA328P芯片消息同伴上,就都不正常了呢?
本帖最后由 yjx189 于
07:20 编辑
就是往,实际就是写设置显示模式的命令(注意模式不同,命令不一样),关键是多重复几次,且每次 ...
本帖最后由 yjx189 于
20:35 编辑
怎么往1602里面写东西啊?在一个是:为什么我的1602和写好程序的ATMEGA328P芯片,在UNO板上,就都一切正常,到了我做的ATMEGA328P芯片小系统上,就都不正常了呢?
具体对1602的操作函数,网上可以查到很多例子。
你说的UNO板子,我确实不熟悉。
& && &从你说的看,像是自己又做了一个板子?如果你自己做的板子是模仿UNO而不成功,则可能你自制的板子有问题。
本帖最后由 yjx189 于
10:05 编辑
UNO是Arduino UNO开发板(相当于51单片机的开发板,这个我也有) 的简称,我是在UNO板上写好了程序,把写好程序的芯片拿下来(比如单片机的STC89C52),做了一个最小系统板,接上1602屏,传感器,做一个PM2.5的检测仪!
本帖最后由 yjx189 于
21:41 编辑
具体对1602的操作函数,网上可以查到很多例子。
你说的UNO板子,我确实不熟悉。
& && &从你说的看,像是 ...
UNO是Arduino UNO开发板(相当于51单片机的开发板,这个我也有) 的简称,我是在UNO板上写好了程序,把写好程序的芯片拿下来(相当于单片机的STC89C52),做了一个最小系统板,一边接上v,传感器,做一个PM2.5的检测仪!
&&不过,上面说了,我也有STC89C52的开发板,可以写程序,要往1602里面写程序,是不是就是通过89C52的开发板(插上1602屏)往里面写初始化的程序啊?
是往目标单片机里烧写程序而非往1602。
是往目标单片机里烧写程序而非往1602。
明白了,谢谢!我正在网上找有关资料,学习烧写1602初始化函数的问题!
1602里面主要是液晶点阵,这些点阵受控制器的指挥,而控制器又受单片机的指挥。单片机对控制器只有三种操作:查忙;写命令;写数据;所有的这些都是单片机对1602的操作,所以不用往1602写程序,也写不进去。
& &查忙:控制器工作比单片机慢,操作前先查忙,答复有空闲才能真的操作。为了简单,往往就用延时取代了。
& &写命令:所有的命令都是十六进制数,具体含义要查厂方的文档。比如上述写0x38,是设置显示模式命令。
& &写数据:写入要显示的内容。
不是往1602里面写程序,它也不能接收。1602只能与单片机之间交换数据。初始化也是单片机对1602操作才能完成。
UNO是Arduino UNO开发板(相当于51单片机的开发板,这个我也有) 的简称,我是在UNO板上写好了程序,把 ...
1602自己不能接受写入程序,也写不进去,只能用单片机对1602进行写命令或写数据。
主要是上电后一开始就执行置显示模式命令(我的是写入0x38),至少要重复4次,且每次之间加1ms到5ms的延时 ...
能否把你写的初始化程序给我复制一份,我参考一下使用?谢谢了!
本帖最后由 yjx189 于
08:14 编辑
1602自己不能接受写入程序,也写不进去,只能用单片机对1602进行写命令或写数据。请把你写的初始化文件给我好吗?这里若不行,就发我邮箱,,我也参考学习一下,给我HEX文件最好,我用单片机开发板就能直接往里写,多谢了!
网上看看1602的历程,对比看看
我已经用单片机往1602里写了,但还是那样,问题还是没得到解决!
看看大神如何解决
第三个问题,可以用定时
给我邮箱&&我给你发程序&&你这个的主要原因是&&需要把vee接到滑动变阻器的滑动脚&&滑动变阻器其他两个脚接电源跟地&&调节滑动变阻器就可以了
本帖最后由 baofu 于
20:01 编辑
我用的单片机与你不一样,管脚什么都不一致,HEX文件给你也无法用。比较合适的办法是你把你的初始化部分的代码贴在这里,大家共同找找问题。我的代码很简单:
void LCD_init()
LCD_delay_50us(20);
& & LCD_RS=0; // - - 指令
& & LCD_RW=0; // - - 写入
& & LCD_E=0; // - - 使能
& & LCD_write_L4bit_command(0x38); //写0x38
& & LCD_delay_50us(2);& && && && && && && &&&//延时
& & LCD_write_L4bit_command(0x38); //重复写
& & LCD_delay_50us(10);& &&&//延时
& & LCD_write_L4bit_command(0x38); // 重复写
& & LCD_delay_50us(5);&&延时
& & LCD_write_L4bit_command(0x38); //
& &LCD_delay_50us(10);
& &//可靠的初始化主要就是上面几行& &
LCD_write_L4bit_command(0x02); //&&
& & LCD_delay_50us(2);
& & LCD_write_4bit_command(0x28); // - -
& & LCD_delay_10us(10);
& & LCD_write_4bit_command(0x0c); // - - 整体显示,关光标,不闪烁
& & LCD_delay_10us(10);
& & LCD_write_4bit_command(0x06); // - - 设定输入方式,增量不移位
& & LCD_delay_10us(10);
& & LCD_write_4bit_command(0x01); // - - 清除屏幕显示
& & LCD_delay_50us(40);
给我邮箱&&我给你发程序&&你这个的主要原因是&&需要把vee接到滑动变阻器的滑动脚&&滑动变阻器其他两个脚接 ...
我邮箱,,谢谢!
我用的单片机与你不一样,管脚什么都不一致,HEX文件给你也无法用。比较合适的办法是你把你的初始化部分的 ...
谢谢你的热心帮助!我的写的代码如下(在网上搜到的),有空请帮我找找问题!
int LCD1602_RS=12;& &
& & int LCD1602_RW=11;& &
& & int LCD1602_EN=10;& &
& & int DB[] = { 6, 7, 8, 9};
& & char logtxt[]=&Local Time&;
& & char *sec[60]={&00&,&01&,&02&,&03&,&04&,&05&,&06&,&07&,&08&,&09&,&10&,&11&,&12&,&13&,&14&,&15&,&16&,&17&,&18&,&19&,&20&,&21&,&22&,&23&,&24&,&25&,&26&,&27&,&28&,&29&,&30&,&31&,&32&,&33&,&34&,&35&,&36&,&37&,&38&,&39&,&40&,&41&,&42&,&43&,&44&,&45&,&46&,&47&,&48&,&49&,&50&,&51&,&52&,&53&,&54&,&55&,&56&,&57&,&58&,&59&};
& & void LCD_Command_Write(int command)
& & int i,
& & digitalWrite( LCD1602_RS,LOW);
& & digitalWrite( LCD1602_RW,LOW);
& & digitalWrite( LCD1602_EN,LOW);
& & temp=command & 0xf0;
& & for (i=DB[0]; i &= 9; i++)
& && & digitalWrite(i,temp & 0x80);
& && & temp &&= 1;
& & digitalWrite( LCD1602_EN,HIGH);
& & delayMicroseconds(1);
& & digitalWrite( LCD1602_EN,LOW);
& & temp=(command & 0x0f)&&4;
& & for (i=DB[0]; i &= 9; i++)
& && & digitalWrite(i,temp & 0x80);
& && & temp &&= 1;
& & digitalWrite( LCD1602_EN,HIGH);
& & delayMicroseconds(1);
& & digitalWrite( LCD1602_EN,LOW);
& & void LCD_Data_Write(int dat)
& & int i=0,
& & digitalWrite( LCD1602_RS,HIGH);
& & digitalWrite( LCD1602_RW,LOW);
& & digitalWrite( LCD1602_EN,LOW);
& & temp=dat & 0xf0;
& & for (i=DB[0]; i &= 9; i++)
& && & digitalWrite(i,temp & 0x80);
& && & temp &&= 1;
& & digitalWrite( LCD1602_EN,HIGH);
& & delayMicroseconds(1);
& & digitalWrite( LCD1602_EN,LOW);
& & temp=(dat & 0x0f)&&4;
& & for (i=DB[0]; i &= 9; i++)
& && & digitalWrite(i,temp & 0x80);
& && & temp &&= 1;
& & digitalWrite( LCD1602_EN,HIGH);
& & delayMicroseconds(1);
& & digitalWrite( LCD1602_EN,LOW);
& & void LCD_SET_XY( int x, int y )
& && &if (y ==0)& & address = 0x80 +
& && &else& && && & address = 0xC0 +
& && &LCD_Command_Write(address);
& & void LCD_Write_Char( int x,int y,int dat)
& && &LCD_SET_XY( x, y );
& && &LCD_Data_Write(dat);
& & void LCD_Write_String(int X,int Y,char *s)
& && &&&LCD_SET_XY( X, Y );& & //设置地址
& && &&&while (*s)& && && && & //写字符串
& && && & LCD_Data_Write(*s);& &
& && && & s ++;
& & void setup (void)
& && &int i = 0;
& && &for (i=6; i &= 12; i++)
& && && &pinMode(i,OUTPUT);
& && &delay(100);
& && &LCD_Command_Write(0x28);//4线 2行 5x7
& && &delay(50);
& && &LCD_Command_Write(0x06);
& && &delay(50);
& && &LCD_Command_Write(0x0c);
& && &delay(50);
& && &LCD_Command_Write(0x80);
& && &delay(50);
& && &LCD_Command_Write(0x01);
& && &delay(50);
& & void loop (void)
& && & for(int index=0,minindex=59,hourindex=12;index&60;index++)& &//这里来设定现在时间,目前设定为12:59:00
& && && &LCD_Command_Write(0x01);
& && && &delay(50);
& && && &LCD_Write_String(3,0,logtxt);
& && && &LCD_Write_String(3,1,sec[hourindex]);
& && && &LCD_Write_Char(6,1,0x3a);//显示:
& && && &LCD_Write_String(7,1,sec[minindex]);
& && && &LCD_Write_Char(10,1,0x3a);
& && && &LCD_Write_String(11,1,sec[index]);
& && && &delay(950);
& && && &if (index==59)
& && && &{
& && && &&&index=-1;
& && && &&&minindex++;
& && && &&&if (minindex==60)
& && && &&&{
& && && && & minindex=0;
& && && && & hourindex++;
& && && && & if (hourindex==24)
& && && && & {
& && && && && &hourindex=0;
& && && && & }
& && && &&&}
& && && &}
这个也写进去过:
# define LCD_DB& &P0&&// - - P0& &= DB0~DB7
sbit& &&&LCD_RS=P2^0; // - - p2.0 = RS
sbit& &&&LCD_RW=P2^1; // - - p2.1 = RW
sbit& &&&LCD_E=P2^2;&&// - - p2.2 = E
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - 定义函数
# define uchar unsigned char
# define uint unsigned int
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - 定义子程序函数
void LCD_init(void); // - - 初始化LCD1602函数
void LCD_write_command(uchar command); // - - 向LCD1602写指令函数
void LCD_write_data(uchar dat); // - - 向LCD1602写数据函数
void LCD_set_xy(uchar x,uchar y); // - - 设置LCD1602显示位置 X(0-16),y(1-2)
void LCD_disp_char(uchar x,uchar y,uchar dat); // - - 在LCD1602上显示一个字符
void LCD_disp_string(uchar X,uchar Y,uchar *s); // - - 在LCD1602上显示一个字符串
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
void LCD_delay_10us(uint n); // - - 10微秒的延时子程序
void LCD_delay_50us(uint n); // - - 50微秒的延时子程序
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - 初始化LCD1602
void LCD_init(void)
LCD_delay_10us(20);
LCD_write_command(0x38); // - - 设置8位格式,2行,5x7
LCD_delay_10us(5);
LCD_write_command(0x0c); // - - 整体显示,关光标,不闪烁
LCD_delay_10us(5);
LCD_write_command(0x06); // - - 设定输入方式,增量不移位
LCD_delay_10us(5);
LCD_write_command(0x01); // - - 清除屏幕显示
LCD_delay_50us(40);
//********************************
// - - 向LCD1602写指令
void LCD_write_command(uchar dat)
LCD_delay_10us(5);
LCD_RS=0; // - - 指令
LCD_RW=0; // - - 写入
LCD_delay_10us(5);
LCD_E=1; // - - 允许
LCD_delay_10us(5);
// - - 向LCD1602写数据
void LCD_write_data(uchar dat)
LCD_delay_10us(5);
LCD_RS=1;// - - 数据
LCD_RW=0;// - - 写入
LCD_delay_10us(5);
LCD_E=1;// - - 允许
LCD_delay_10us(5);
// - - 设置显示位置
void LCD_set_xy(uchar x,uchar y)
&&if(y==1)
& & address=0x80+x; // - - 第一行位置
&&} else {
& & address=0xc0+x; // - - 第二行位置
& & LCD_delay_10us(5);
& & LCD_write_command(address);
// - - 显示一个字符函数
void LCD_disp_char(uchar x,uchar y,uchar dat) // - - LCD_disp_char(0,1,0x38); // - - 显示8
& & LCD_set_xy(x,y);
& & LCD_delay_10us(5);
& & LCD_write_data(dat);
// - - 显示一个字符串函数
void LCD_disp_string(uchar x,uchar y,uchar *s)
&&LCD_set_xy(x,y);
&&LCD_delay_10us(5);
&&while(*s!='\0')
& & LCD_write_data(*s);
//********************************
/*******检查忙函数*************
void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{&&//至于不能正常使用LCD。因此我没有再用检查忙函数。而使
&&do& &//用了延时的方法,延时还是非常好用的。我试了一下,用
&&{ LCD_E=0;& &//for循环作延时,普通指令只要1次循就可完成。清屏指令
& & LCD_RS=0;& && && && && &&&//要用200次循环便能完成。& &
& & LCD_RW=1;
& & LCD_DB=0
& & LCD_E=1;
&&}while(LCD_DB^7==1);
void LCD_delay_10us(uint n) // - - 10微秒的延时子程序
&&uint i,j;
&&for(i=n;i&0;i--)
& & for(j=2;j&0;j--);&&
void LCD_delay_50us(uint n) // - - 50微秒的延时子程序
&&uint i,j;
&&for(i=n;i&0;i--)
& & for(j=22;j&0;j--);&&
这个也写进去过:
# define LCD_DB& &P0&&// - - P0& &= DB0~DB7
30楼的函数digitalWrite()由于你没有贴出来函数体。只能说31楼的代码,这个应当是正确的,唯一不足就是init()函数中的:
LCD_write_command(0x38); // - - 设置8位格式,2行,5x7
LCD_delay_10us(5); 只有一次写入0x38,如果这一次失败,往下就不行了。应当重复延时多次才可靠。我记得这是文档上特意说明的,
& &&&问题是为什么非得这样才可靠?我估计是1602控制器里面由于某种原因,反应太慢,需要多次重复才能建立稳定状态。纯属臆测,未必正确。
& &&&除了上述不同,与我贴出的代码很接近,而我实验是成功的,你用这个如果还不行,就应当从别处找问题了。
怎么感觉这个电路很简单
30楼的函数digitalWrite()由于你没有贴出来函数体。只能说31楼的代码,这个应当是正确的,唯一不足就是 ...
再一次表示感谢!但我弄半天还是不行!都有些烦了,过两天再说吧,再不行,就找个做程序员的朋友帮我写一个吧!
30楼的函数digitalWrite()由于你没有贴出来函数体。只能说31楼的代码,这个应当是正确的,唯一不足就是 ...
& &有时间的话,还请你帮我看看下面的源代码,可以用吗?费心了,朋友!
PM2.5检测器 代码如下:
  int measurePin = 0; // 连接模拟口0
  int ledPower = 2; // 连接数字口2
  int samplingTime = 280;
  int deltaTime = 40;
  int sleepTime = 9680;
  float voMeasured = 0;
  float calcVoltage = 0;
  float dustDensity = 0;
  void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);
  void loop(){
  digitalWrite(ledPower,LOW); //开启内部LED
  delayMicroseconds(samplingTime); // 开启LED后的280us的等待时间
  voMeasured = analogRead(measurePin); // 读取模拟值
  delayMicroseconds(deltaTime); // 40us等待时间
  digitalWrite(ledPower,HIGH); // 关闭LED
  delayMicroseconds(sleepTime);
  // 0 - 5V mapped to 0 - 1023 integer values
  // recover voltage
  calcVoltage = voMeasured * (5.0 / 1024.0); //将模拟值转换为电压值
  dustDensity = 0.17 * calcVoltage - 0.1; //将电压值转换为粉尘密度输出单位
  Serial.print(“Raw Signal Value (0-1023): ”);
  Serial.print(voMeasured);
  Serial.print(“ - Voltage: ”);
  Serial.print(calcVoltage);
  Serial.print(“ - Dust Density: ”);
  Serial.println(dustDensity); // 输出单位: 毫克/立方米
  delay(1000);
本帖最后由 yjx189 于
11:05 编辑
& & 上面的代码中,传感器使用了A0和D2口,但是这个D2口1602屏也要使用,怎么才能避开呢?& &&&还有就是,也没有看到初始化1602屏的语句啊?
很不错的样子
Powered by

我要回帖

更多关于 单片机 1602 ppt 的文章

 

随机推荐