|
發布時間: 2020-12-21 10:56
正文摘要:程序在這里 #include<reg51.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int typedef unsigned char U8; /* defined for un ... |
|
附上我已經測試過的代碼,使用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顯示℃ 這種自定義符號 m.raoushi.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 白就有 |