附上我已经测试过的代码,使用STC89C52,11.0592晶振. # include <reg52.h> # include <intrins.h> typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long ulong; typedef bit BOOL; #define PDATA P2 sbit rs=P0^7; sbit rw=P0^6; sbit ep=P0^5; // 延时 void delay (ulong m) { while(m--); } // 判断1602是否处于忙状态 BOOL lcd_bz() { BOOL result; rs=0; // 读忙信号 rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(PDATA&0x80); ep=0; result ; } // 向1602写指令 void lcd_wcmd (BYTE cmd) { while (lcd_bz()); rs=0; rw=0; ep=0; _nop_(); _nop_(); PDATA=cmd ; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } // 设置显示位置:80H+ 地址码( 0-27H ,40H-67H) void lcd_pos (BYTE pos) { lcd_wcmd (pos|0x80); } // 向1602写数据 void lcd_wdat (BYTE dat) { while (lcd_bz()); rs=1; rw=0; ep=0; _nop_(); _nop_(); PDATA=dat ; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } // 液晶的初始化处理 void lcd_init () { lcd_wcmd (0x38); delay(1200); lcd_wcmd (0x0c); delay(1200); lcd_wcmd (0x06); delay(1200); lcd_wcmd (0x01); delay(1200); } |
本帖最后由 suncat0504 于 2021-1-4 11:08 编辑 楼主啊,你使用的开发板,明明是使用P2口作为数据线提供给液晶,P0.7,P0.6,P0.5作为控制线。而你的程序你确实用P2.7,P2.6,P2.5作为控制线,P0做数据口,又怎么可能会成功呢? 你修改这部分代码: sbit rs=P2^5; ==》sbit rs=P0^7; sbit rw=P2^6 ; ==》sbit rw=P0^6; sbit e=P2^7; ==》sbit e=P0^5; 你使用YL-39开发板,一定要牢记这个开发板的口线分配,在编程时一定要和程序严格匹配,否则肯定会出错的。 另外再修改数据传递语句: P0 = zhilin ; ==> P2=zhilin; P0 = suzi ; ==> P2 = suzi ; 另外使用过程中,注意各个跳线的设置。有些功能需要通过短路/断开跳线才能正常执行。 |
看这个贴子 单片机+LCD1602显示℃ 这种自定义符号 www.51hei.com/bbs/dpj-200685-1.html 你把595 改成P0口 就行了 |
wwh2382 发表于 2020-12-22 11:04 可以帮我看看问题出在哪吗? |
wwh2382 发表于 2020-12-22 11:04 #include<reg51.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int typedef unsigned char U8; /* defined for unsigned 8-bits integer variable */ typedef unsigned int U16; sbit rs=P2^5; sbit rw=P2^6 ; sbit e=P2^7; sbit ADCS =P3^5; //ADC0832 chip seclect sbit ADDI =P3^7; //ADC0832 k in sbit ADDO =P3^7; //ADC0832 k out sbit ADCLK =P3^6; //ADC0832 clock signal unsigned int temp; unsigned char dispbuf[4]; uchar getdata; void Delay(U16 j) { U8 i; for(;j>0;j--) { for(i=0;i<27;i++); } } //1602D′Ö¸áîoˉêy void xiezhilin(uchar zhilin) { rs = 0 ; rw = 0 ; e = 0 ; P0 = zhilin ; Delay(100); e = 1 ; Delay(100); e = 0 ; } //1602D′êy¾Yoˉêy void xiesu(uchar suzi) { rs = 1 ; rw = 0 ; e = 0 ; P0 = suzi ; Delay(100); e = 1 ; Delay(100); e = 0 ; } //1602¿ØÖÆÏÔê¾oˉêy void xianshi(uchar dizhi, uchar suzi) { xiezhilin(dizhi); xiesu(suzi); } //×a»»3é¿éòÔÔú1602ÏÔê¾μÄêyÖμ void LCDdisplay(void) { xianshi(0x80+0,'V'); xianshi(0x80+1,'a'); xianshi(0x80+2,'l'); xianshi(0x80+3,'u'); xianshi(0x80+4,'e'); xianshi(0x80+5,':'); xianshi(0x80+6,0x30+dispbuf[2]); xianshi(0x80+7,0x30+dispbuf[1]); xianshi(0x80+8,0x30+dispbuf[0]); xianshi(0x80+9,'G'); xianshi(0x80+10,'E'); xianshi(0x80+11,'\0'); } |
1602的数据口没有定义吧,楼下帮你定义了P0 |
还要考虑是不是硬件问题,比如你的LCD1602屏坏了 |
名字不是重点 发表于 2020-12-21 11:36 我已经初始化了呀?还是显示不出来而且仿真是没有问题的 |
1、你使用的应该是开发板吧,开发板提供的肯定有LCD1602的例程。 2、下载提供的例程看下能不能显示,这主要是为了判断你的硬件是不是好的。 1)例程指软件,开发板配套的例程肯定都是被很多人验证过的,理论上是没有问题的。 2)你手头的板子是硬件,出厂有无检验不知道,即使检验了,路上运输可能造成不良。 3、LCD1602屏对供电有要求,一般是5V供电的。看你单片机是早期的STC89C52系列的吧,所以供电不存在选择其他电压,因为这个单片机就是5V供电的。 4、LCD1602屏显示还需要调节对比度的,一般都是针对屏VO引脚,外接可调电阻实现。但初步看你的现象,应该是调节了的,因为有阴影出现,只是没有确切的内容。 5、这个开发板的单片机是可插拔的,一定注意下你单片机方向别插错了。 6、当然也不排除软件问题,下面给出下自已手头的有一款艾克姆的STC8的驱动程序,写得不错,比你截图的设计思路要清晰。 ![]() ![]() |
14.67 KB, 下载次数: 4
LCD1602测试代码 #include<reg52.h> #include<stdio.h> #include<intrins.h> unsigned int hour,minute,second,count; sbit RS = P2^4;//Pin4 sbit RW = P2^5; //Pin5 sbit E = P2^6;//Pin6 #define Data P0 //数据端口 char data TimeNum[]=" "; char data Test1[]=" "; /******************************************************************/ /* 函数声明 */ /******************************************************************//***************************************************************/ void DelayUs(unsigned char us)//delay us { unsigned char uscnt; uscnt=us>>1;/* Crystal frequency in 12MHz*/ while(--uscnt); } /******************************************************************/ void DelayMs(unsigned char ms)//delay Ms { while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); } } void WriteCommand(unsigned char c) { DelayMs(5);//short delay before operation E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; } /****************************************************************/ void WriteData(unsigned char c) { DelayMs(5); //short delay before operation E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; } /*********************************************************************/ void ShowChar(unsigned char pos,unsigned char c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 WriteCommand (p);//write command WriteData (c); //write data } /*************************************************************************/ void ShowString (unsigned char line,char *ptr) { unsigned char l,i; l=line<<4; for (i=0;i<16;i++) ShowChar (l++,*(ptr+i));//循环显示16个字符 } /*********************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏 } ///////////////////////////////////////////////////////////////// void main(void) { InitLcd();// DelayMs(15); sprintf(Test1," xxxxxxxx ");//the first line ShowString(0,Test1); sprintf(TimeNum,"LCM1602 Test ok!");//the first line ShowString(1,TimeNum); while(1); } |
你的MAIN中,没有LCD的初始化,如何能显示? LCD1602初始化没成功,显示出来就是象你这样的图形。 |
可以去看看以前的贴子,搜1602 白就有 |