熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 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 ... |
附上我已經(jīng)測試過的代碼,使用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; // 延時(shí) void delay (ulong m) { while(m--); } // 判斷1602是否處于忙狀態(tài) 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; } // 設(shè)置顯示位置:80H+ 地址碼( 0-27H ,40H-67H) void lcd_pos (BYTE pos) { lcd_wcmd (pos|0x80); } // 向1602寫數(shù)據(jù) 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 編輯 樓主啊,你使用的開發(fā)板,明明是使用P2口作為數(shù)據(jù)線提供給液晶,P0.7,P0.6,P0.5作為控制線。而你的程序你確實(shí)用P2.7,P2.6,P2.5作為控制線,P0做數(shù)據(jù)口,又怎么可能會(huì)成功呢? 你修改這部分代碼: 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開發(fā)板,一定要牢記這個(gè)開發(fā)板的口線分配,在編程時(shí)一定要和程序嚴(yán)格匹配,否則肯定會(huì)出錯(cuò)的。 另外再修改數(shù)據(jù)傳遞語句: P0 = zhilin ; ==> P2=zhilin; P0 = suzi ; ==> P2 = suzi ; 另外使用過程中,注意各個(gè)跳線的設(shè)置。有些功能需要通過短路/斷開跳線才能正常執(zhí)行。 |
看這個(gè)貼子 單片機(jī)+LCD1602顯示℃ 這種自定義符號 www.zg4o1577.cn/bbs/dpj-200685-1.html 你把595 改成P0口 就行了 |
wwh2382 發(fā)表于 2020-12-22 11:04 可以幫我看看問題出在哪嗎? |
wwh2382 發(fā)表于 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的數(shù)據(jù)口沒有定義吧,樓下幫你定義了P0 |
還要考慮是不是硬件問題,比如你的LCD1602屏壞了 |
名字不是重點(diǎn) 發(fā)表于 2020-12-21 11:36 我已經(jīng)初始化了呀?還是顯示不出來而且仿真是沒有問題的 |
1、你使用的應(yīng)該是開發(fā)板吧,開發(fā)板提供的肯定有LCD1602的例程。 2、下載提供的例程看下能不能顯示,這主要是為了判斷你的硬件是不是好的。 1)例程指軟件,開發(fā)板配套的例程肯定都是被很多人驗(yàn)證過的,理論上是沒有問題的。 2)你手頭的板子是硬件,出廠有無檢驗(yàn)不知道,即使檢驗(yàn)了,路上運(yùn)輸可能造成不良。 3、LCD1602屏對供電有要求,一般是5V供電的。看你單片機(jī)是早期的STC89C52系列的吧,所以供電不存在選擇其他電壓,因?yàn)檫@個(gè)單片機(jī)就是5V供電的。 4、LCD1602屏顯示還需要調(diào)節(jié)對比度的,一般都是針對屏VO引腳,外接可調(diào)電阻實(shí)現(xiàn)。但初步看你的現(xiàn)象,應(yīng)該是調(diào)節(jié)了的,因?yàn)橛嘘幱俺霈F(xiàn),只是沒有確切的內(nèi)容。 5、這個(gè)開發(fā)板的單片機(jī)是可插拔的,一定注意下你單片機(jī)方向別插錯(cuò)了。 6、當(dāng)然也不排除軟件問題,下面給出下自已手頭的有一款艾克姆的STC8的驅(qū)動(dòng)程序,寫得不錯(cuò),比你截圖的設(shè)計(jì)思路要清晰。 ![]() ![]() |
14.67 KB, 下載次數(shù): 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 //數(shù)據(jù)端口 char data TimeNum[]=" "; char data Test1[]=" "; /******************************************************************/ /* 函數(shù)聲明 */ /******************************************************************//***************************************************************/ 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));//循環(huán)顯示16個(gè)字符 } /*********************************************************************/ void InitLcd() { DelayMs(15); WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //顯示光標(biāo)移動(dòng)位置 WriteCommand(0x0c); //顯示開及光標(biāo)設(shè)置 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 白就有 |
Powered by 單片機(jī)教程網(wǎng)