![]() |
發(fā)布時間: 2015-5-21 20:21
正文摘要:這是程序#include<reg51.h>#define LCD_data P0 sbit RS=P2^0; sbit RW=P2^1; sbit LCDE=P2^2; unsigned char m,miao,fen=12,shi=10; unsigned char line1[16]={" BEIJING TIME ... |
仿真不用查忙 |
仿真是不用查忙的,實物中需要。因為仿真中單片機速度沒有1602反應快 |
其實不用查忙的,延時就行,忙這個條件有點苛刻 |
跪求,感覺好難! |
本帖最后由 zl2168 于 2017-5-7 14:43 編輯 實例91 具有校正功能的時鐘1302(LCD1602顯示) 先Proteus仿真,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,書中電路和程序設計有詳細說明,程序語句條條有注解。 仿真電路和Hex文件能在清華出版社網(wǎng)站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。 |
同問求大佬茲磁 |
你看看你的接口順序?qū)?/td> |
TR0=0,未進入中斷函數(shù) |
我寫的程序也是顯示亂碼。。。。。 |
TR0=0,未進入中斷函數(shù) |
你的延時太多了 不用探忙的 |
初始化很重要 |
對于任何外設訪問都要探忙,但是好像跟你這個顯示的沒關系,你不能把程序模塊化了嗎,寫的很亂,到最后自己都不好改。 |
為什么要探忙,能解釋下嗎 |
wanglu071912 發(fā)表于 2015-5-24 10:42 對哦 謝謝哈 |
我自己是焊了個LCD1602的時鐘,就是不想看代碼,代碼風格不一樣,很腦大的。我把我的LCD1602.c貼出來,宋老師的風格,功能模塊化,好查錯,你對比分析一下吧,這個.c是一定沒問題的。 #include<reg52.h> #define lcdDB P0 sbit lcdRS = P1^0; sbit lcdRW = P1^1; sbit lcdE = P1^5; void lcdready() //探忙 { unsigned char sta; lcdDB = 0xFF; lcdRS = 0; lcdRW = 1; do{ lcdE = 1; sta = lcdDB; lcdE = 0; }while(sta & 0x80); } void lcdwritecmd(unsigned char cmd) //寫入命令 { lcdready(); lcdRS = 0; lcdRW = 0; lcdDB = cmd; lcdE = 1; lcdE = 0; } void lcdwritedat(unsigned char dat) //寫入數(shù)據(jù) { lcdready(); lcdRS = 1; lcdRW = 0; lcdDB = dat; lcdE = 1; lcdE = 0; } void lcdsetaddr(unsigned char x, unsigned char y) //設置顯示位置 { unsigned char addr; if(y == 0) addr = 0x00 + x; else addr = 0x40 + x; lcdwritecmd(addr | 0x80); } void lcdshowstr(unsigned char x, unsigned char y, unsigned char *str) //顯示內(nèi)容 { lcdsetaddr(x, y); while(*str != '\0') { lcdwritedat(*str++); } } /*********************************************************** void lcdareaclear(unsigned char x, unsigned char y, unsigned char len) //局部清除 { lcdsetaddr(x, y); while(len--) { lcdwritedat(' '); } } void lcdfullclear() //整屏清除 { lcdwritecmd(0x01); } **********************************************************************/ void lcdgbss(unsigned char x, unsigned char y, bit gb) //光標閃爍:1開0關 { if(gb == 1) lcdwritecmd(0x0F); else lcdwritecmd(0x0C); lcdsetaddr(x, y); } void initlcd() //初始化 { lcdwritecmd(0x38); lcdwritecmd(0x0C); lcdwritecmd(0x06); lcdwritecmd(0x01); } |
參與人數(shù) 1 | 黑幣 +50 | 收起 理由 |
---|---|---|
![]() | + 50 | 共享資料的積分獎勵! |
同問! |
Powered by 單片機教程網(wǎng)