熱門: 51單片機(jī) | 24小時必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時間: 2017-11-4 20:41
正文摘要:單片機(jī)源程序如下: #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit sck=P1^0; sbit io=P1^1; sbit rst=P1^2; sbit dula=P2^6; sbit ... |
zl2168 發(fā)表于 2017-11-4 21:47 請問有程序嗎? |
zl2168 發(fā)表于 2017-11-9 19:34 已經(jīng)找到問題了,寫入1602液晶的數(shù)據(jù)加‘0’,轉(zhuǎn)化為對應(yīng)的字符型數(shù)據(jù)就可以了! |
探路 發(fā)表于 2017-11-5 00:43 “其實(shí)有些資料我可以找到”,資料與資料不一樣!你能看懂就行,就怕看不懂,看不懂就看我的吧,能讓你看懂才叫“資料”。! |
你這個不是程序的問題,是顯示器接觸不良了,換個顯示器試試看 |
給你改了一下,現(xiàn)在顯示正常了
|
給你修改了一下,現(xiàn)在顯示正常了
|
交給你個辦法,不會的去淘寶店鋪搜索用法。 |
探路 發(fā)表于 2017-11-5 14:14 聲明一個字符數(shù)組unsigned char table[] ="0123456789";與0~9數(shù)字?jǐn)?shù)組一樣用 10進(jìn)制變量按位分解 shi= table[x/10]; gei= table[x%10]; |
探路 發(fā)表于 2017-11-5 14:14 很簡單。 你顯示的都是數(shù)字吧,那么,每個值加上0x30 如:要顯示1,則輸入顯示值為0x30+1=0x31,1的ASCII碼就是0x31 再如:顯示9,則輸入顯示值為0x30+9=0x39。 |
探路 發(fā)表于 2017-11-5 01:09 冗長程序一般人是不會去看的。只有讀懂正確有效程序,自己對照查錯。 |
HC6800-ES-V2.0 發(fā)表于 2017-11-5 09:42 你好像提醒了我,我寫入的數(shù)據(jù)應(yīng)該是字符型或是ASCLL碼,而我寫的是十進(jìn)制數(shù),但變量的十進(jìn)制怎么轉(zhuǎn)化為字符型呢? disp[2]=time_data[0]%16; //年十位 disp[3]=time_data[0]/16; //年個位 write_data(disp[j]); |
wulin 發(fā)表于 2017-11-5 10:20 我只是個剛?cè)腴T的菜鳥,有些不一定看得懂,如果可以,我很希望大佬幫我看看我的問題出在哪里 |
給你一個成熟例程參考 /******************************* 描述:LCD萬年歷,TX-1C實(shí)驗(yàn)板 STC89C52RC,晶振11.0592MHz (如果晶振12MHz時間更準(zhǔn)些) ********************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit LCD_EN=P3^4; //定義1602液晶LCDEN端,使能信號 sbit LCD_RS=P3^5; //定義1602液晶RS端,數(shù)據(jù)/命令選擇端(H/L) //sbit LCD_RW=P3^6; //定義1602液晶RW端,讀/寫選擇端(H/L)已接地禁止讀 sbit BUZZ=P2^3; //定義蜂鳴器端,按鍵釋放和整點(diǎn)響 sbit dula=P2^6; //段端口 sbit wela=P2^7; //位端口 sbit key_1=P3^0; //進(jìn)入調(diào)試方式 sbit key_2=P3^1; //調(diào)試+ sbit key_3=P3^2; //調(diào)試- sbit key_4=P3^3; //退出調(diào)試方式 sbit MND_1=P3^7; //矩陣鍵盤模擬地 uchar code keycode[] = {0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,//按鍵鍵值 0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88}; uchar yue,ri,shi,fen,miao,week,nian; //月、日、時、分、秒、周、年變量 uchar flag=0; //功能鍵計(jì)數(shù)變量 uint count=0; //中斷計(jì)數(shù)變量 bit Cnt1s=0; //秒標(biāo)志 uchar code table[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};//顯示周 /***********毫秒級延時函數(shù)**********/ void delay(uint x) { uint y,z; for(y=x;y>0;y--) for(z=110;z>0;z--); } /***********蜂鳴器發(fā)聲函數(shù)**********/ void di(uint dd) { BUZZ=0; delay(dd); BUZZ=1; } /***********LCD1602忙等待**********/ /* uchar busycheck() { uchar s; //臨時變量 LCD_RS=0; //允許寫指令 // LCD_RW=1; //允許讀數(shù)據(jù)(讀寫端已接地,禁止讀) LCD_EN=1; //高電平使能讀數(shù)據(jù) delay(1); //延時 s=P0; //讀P0數(shù)據(jù)賦值s LCD_EN=0; //低跳變執(zhí)行 return s; //返回s值 s=0x80有效 } */ /***********液晶寫指令函數(shù)**********/ void write_com(uchar com) { // while((busycheck()&0x80)==0x80);//忙等待 LCD_RS=0; //允許寫指令 // LCD_RW=0; //讀寫端已接地,禁止讀 LCD_EN=0; //初始設(shè)置LCD_EN低電平 P0=com; //傳遞指令 delay(5); //延時 LCD_EN=1; //使能寫入 delay(5); //延時 LCD_EN=0; //低跳變執(zhí)行 } /***********液晶寫數(shù)據(jù)函數(shù)**********/ void write_date(uchar date) { // while((busycheck()&0x80)==0x80);//忙等待 LCD_RS=1; //允許寫數(shù)據(jù) // LCD_RW=0; //讀寫端已接地,禁止讀 LCD_EN=0; //初始設(shè)置LCD_EN低電平 P0 =date; //傳遞數(shù)據(jù) delay(5); //延時 LCD_EN=1; //使能寫入 delay(5); //延時 LCD_EN=0; //低跳變執(zhí)行 } /***********寫年函數(shù)**********/ void write_nian(uchar add,uchar date)reentrant //reentrant定義為可重入函數(shù),允許被遞歸調(diào)用 { uint bai,shi,ge; //定義百、十、個變量 bai=date/100; //分解百 shi=date%100/10; //分解十 ge=date%100%10; //分解個 write_com(0x80+add); //寫指令、設(shè)置顯示位置 write_date(0x30+bai);//寫數(shù)據(jù)百位0~9對應(yīng)的字符碼是0x30~0x39 write_date(0x30+shi);//寫數(shù)據(jù)十位 write_date(0x30+ge); //寫數(shù)據(jù)個位 /*write_date(dat[bai]); write_date(dat[shi]); write_date(dat[ge]);*/ } /***********大小月份設(shè)置**********/ uchar dxy(uchar r) { uchar k; switch(r) { case 1: k=31; break; case 2: //閏年29天, 平年28天 if((2000+nian)%100==0) if((2000+nian)%400==0) k=29; else k=28; else if((2000+nian)%4==0) k=29; else k=28; break; case 3:k=31;break; case 4:k=30;break; case 5:k=31;break; case 6:k=30;break; case 7:k=31;break; case 8:k=31;break; case 9:k=30;break; case 10:k=31;break; case 11:k=30;break; case 12:k=31;break; } return k; } /***********寫月、日、時、分、秒函數(shù)**********/ void write_yrsfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+add); //設(shè)置顯示位置 write_date(0x30+shi); write_date(0x30+ge); /*write_date(dat[shi]); write_date(dat[ge]);*/ } /***********寫星期函數(shù)**********/ void write_week(uchar add,uchar date) { uchar i; write_com(0x80+add); //設(shè)置顯示位置 for(i=0;i<3;i++) { write_date(table[date][i]); delay(5); } } /***********初始化函數(shù)**********/ void init() { count=0; // dula=0; //關(guān)閉數(shù)碼管段端口 wela=0; //關(guān)閉數(shù)碼管位端口 // P0=0xff; //關(guān)閉發(fā)光二極管 write_com(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 write_com(0x0c); //設(shè)置開顯示,不顯示光標(biāo) write_com(0x06); //寫一個字符后地址指針加1 write_com(0x01); //顯示清零,數(shù)據(jù)指針清零 write_com(0x80); //設(shè)置顯示初始位置 write_com(0x80+1); //寫出年份的最高位“2” write_date('2'); //寫數(shù)據(jù)'2' write_com(0x80+5); //寫指令,顯示位置 日期顯示部分的的兩'-' write_date('-'); //寫數(shù)據(jù)'-' write_com(0x80+8); //寫指令,顯示位置 日期顯示部分的的兩'-' write_date('-'); //寫數(shù)據(jù)'-' write_com(0x80+0x40+6); //寫指令,時間顯示部分的的兩個“:” write_date(':'); //寫數(shù)據(jù)':' write_com(0x80+0x40+9); //寫指令,時間顯示部分的的兩個“:” write_date(':'); //寫數(shù)據(jù)':' miao=0; //秒 fen=0; //分 shi=0; //時 week=5; //星期 ri=20; //日 yue=5; //月 nian=17; //年 write_yrsfm(0x40+10,miao); //寫入秒 write_yrsfm(0x40+7,fen); //寫入分 write_yrsfm(0x40+4,shi); //寫入時 write_week(12,week); //寫入星期 write_yrsfm(9,ri); //寫入日 write_yrsfm(6,yue); //寫入月 write_nian(2,nian); //寫入年 } /***********按鍵掃描函數(shù)**********/ void keyscan() { if(key_1==0) //功能鍵按下 { delay(10); //消抖 if(key_1==0)//功能鍵確認(rèn)按下 { flag++; //記錄功能鍵按下次數(shù) while(!key_1); //確認(rèn)釋放功能鍵 di(100); //每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲提醒 if((flag==1)||(flag==8)) //第一次按下功能鍵光標(biāo)閃爍到秒位置 { TR0=0; //關(guān)閉定時器 write_com(0x80+0x40+11); //光標(biāo)定位到秒位置 write_com(0x0f); //光標(biāo)開始閃爍 } if(flag==2) //第二次按下功能鍵光標(biāo)閃爍到分鐘位置 { write_com(0x80+0x40+8); } if(flag==3) //第三次按下功能鍵光標(biāo)閃爍到時位置 { write_com(0x80+0x40+5); } if(flag==4) //第四次按下功能鍵光標(biāo)閃爍到星期位置 { write_com(0x80+12); } if(flag==5) //第五次按下功能鍵光標(biāo)閃爍到日位置 { write_com(0x80+10); } if(flag==6) //第六次按下功能鍵光標(biāo)閃爍到月位置 { write_com(0x80+7); } if(flag==7) //第七次按下功能鍵光標(biāo)閃爍到年位置 { write_com(0x80+4); } if(flag==8) //第八次按下功能鍵退出功能鍵 flag=1; //記錄變成1;光標(biāo)重新回到秒位置 } } if(key_4==0) //退出調(diào)節(jié) { delay(10); if(key_4==0) { while(!key_4); //釋放按鍵 if(TR0==0) di(100); //只在調(diào)節(jié)時有按鍵釋放蜂鳴器發(fā)出滴聲 flag=0; //功能鍵按鍵次數(shù)清零 write_com(0x0c); //取消光標(biāo)閃爍 count=0; Cnt1s=0; TR0=1; //啟動定時器 } } if(flag!=0) //功能鍵按下后flag=1 { //增大鍵 if(key_2==0) //只有功能鍵按下后,增大和減少鍵才有效 { delay(10); if(key_2==0)//確認(rèn)增加按下 { while(!key_2); //釋放按鍵 di(100); //每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲提醒 if(flag==1) //功能鍵第一次按下調(diào)節(jié)秒 { miao++; //秒加1 if(miao>59) miao=0; write_yrsfm(0x40+10,miao); //每調(diào)節(jié)一次送液晶顯示一下 write_com(0x80+0x40+11); //顯示位置重新回到調(diào)節(jié)處 } if(flag==2) //功能鍵第二次按下調(diào)節(jié)分 { fen++; if(fen>59) fen=0; write_yrsfm(0x40+7,fen); write_com(0x80+0x40+8); } if(flag==3) //功能鍵第三次按下調(diào)節(jié)時 { shi++; if(shi>23) shi=0; write_yrsfm(0x40+4,shi); write_com(0x80+0x40+5); } if(flag==4) //功能鍵第四次按下調(diào)節(jié)星期 { week++; if(week>6) week=0; write_week(12,week); write_com(0x80+12); } if(flag==5) //功能鍵第五次按下調(diào)節(jié)日 { ri++; if(ri>(dxy(yue))) ri=1; write_yrsfm(9,ri); write_com(0x80+10); } if(flag==6) //功能鍵第六次按下調(diào)節(jié)月份 { yue++; if(yue>12) yue=1; write_yrsfm(6,yue); write_com(0x80+7); } if(flag==7) //功能鍵第七次按下調(diào)節(jié)年份 { nian++; write_nian(2,nian); write_com(0x80+4); } } } //減少鍵 if(key_3==0) //減少鍵被按下 { delay(10); if(key_3==0)//確認(rèn)減少鍵被按下 { while(!key_3);//按鍵釋放 di(100); //每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲 if(flag==1) //功能鍵第一次按下調(diào)節(jié)秒 { //秒減1 miao--; if((miao==(-1))||(miao>59)) //59到0循環(huán)遞減; miao=59; write_yrsfm(0x40+10,miao); //每調(diào)節(jié)一次送液晶顯示一下 write_com(0x80+0x40+11); //顯示位置重新回到調(diào)節(jié)處 } if(flag==2) //功能鍵第二次按下調(diào)節(jié)分 { fen--; if((fen==(-1))||(fen>59)) fen=59; write_yrsfm(0x40+7,fen); write_com(0x80+0x40+8); } if(flag==3) //功能鍵第三次按下調(diào)節(jié)時 { shi--; if((shi==(-1))||(shi>23)) shi=23; write_yrsfm(0x40+4,shi); write_com(0x80+0x40+5); } if(flag==4) //功能鍵第四次按下調(diào)節(jié)星期 { week--; if((week==(-1))||(week>6)) week=6; write_week(12,week); write_com(0x80+12); } if(flag==5) //功能鍵第五次按下調(diào)節(jié)日 { ri--; if((ri==0)||ri>dxy(yue)) ri=dxy(yue); write_yrsfm(9,ri); write_com(0x80+10); } if(flag==6) //功能鍵第六次按下調(diào)節(jié)月份 { yue--; if((yue==0)||(yue>12)) yue=12; write_yrsfm(6,yue); write_com(0x80+7); } if(flag==7) //功能鍵第七次按下調(diào)節(jié)年份 { nian--; write_nian(2,nian); write_com(0x80+4); } } } } } void LCD_Refresh() { if(flag==0) //調(diào)整時停止刷新 { if((ri>dxy(yue))||(ri<1)) //大小月匹配 ri=1; write_yrsfm(9,ri); //日若變化則重新寫入 if(Cnt1s==1) //1秒時間到 { Cnt1s=0; //清零 miao++; //秒、分、時、星期、日、月、年自動調(diào)節(jié)功能運(yùn)行 if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; di(500); //整點(diǎn)提醒 shi++; if(shi==24) { shi=0; week++; ri++; if(week>6) week=0; write_week(12,week); //星期若變化則重新寫入 if(ri>dxy(yue)) { ri=1; yue++; if(yue==13) { yue=1; nian++; write_nian(2,nian); //年份若變化則重新寫入 } write_yrsfm(6,yue); //月份若變化則重新寫入 } write_yrsfm(9,ri); //日若變化則重新寫入 } write_yrsfm(0x40+4,shi); //時若變化則重新寫入 } write_yrsfm(0x40+7,fen); //分若變化則重新寫入 } write_yrsfm(0x40+10,miao); //秒若變化則重新寫入 } } } void Timer0Init() //100微秒@12.000MHz { TMOD = 0x02; //設(shè)置定時器自動重載模式 // TL0 = 0x9C; //設(shè)置定時初值 // TH0 = 0x9C; //設(shè)置定時重載值 TL0=0xA4; //定時器裝初值 100微秒@11.0592MHz TH0=0xA4; //定時器裝初值 100微秒@11.0592MHz TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計(jì)時 EA=1; //開總中斷 ET0=1; //開定時器0中斷 } /***********主函數(shù)**********/ void main() { MND_1=0; //矩陣鍵盤模擬地 init(); //初始化程序 Timer0Init(); //初始化定時器 di(100); //開機(jī)蜂鳴器提示音 while(1) //不停地檢測按鍵是否被按下 { keyscan(); //按鍵掃描程序 LCD_Refresh(); //液晶屏顯示刷新 } } /***********中斷函數(shù)**********/ void timer0() interrupt 1 { count++; //11.0592MHz誤差0.17%,12MHz誤差0 if(count>=10017) //1秒/11.0592MHz // if(count>=10000) //1秒/12MHz { count=0; //清0 Cnt1s=1; //1秒標(biāo)標(biāo)志置1 } } |
HC6800-ES-V2.0 發(fā)表于 2017-11-5 09:42 謝謝,我剛才試了一下,結(jié)果還是如圖所示 ![]() |
我對照了我的程序,仔細(xì)看了你說的過程,有了以下判斷,你覺得怎么樣? 第一:你說用數(shù)碼管是成功的,那么,1302是沒有問題的。 第二:1602與數(shù)碼管的顯示,不同在于編碼。看到你的截圖,可以認(rèn)為,只是1602的顯示碼出問題了。 綜上所述,我認(rèn)為你的問題,就是這個地方: uchar time_data[7]={17,11,1,20,40,30}; //年周月日時分秒 改為:uchar time_data[7]={0x17,0x11,0x01,0x20,0x40,0x30}; |
zl2168 發(fā)表于 2017-11-4 21:47 還是很希望前輩能幫我看看我自己的代碼,畢竟這個花了一段時間了,我不想就這么放棄,拜托! 先前在數(shù)碼管上可以正常顯示,但在1602液晶就如圖所示了! |
cjjcjj1 發(fā)表于 2017-11-4 21:43 我剛開始有六位數(shù)碼管顯示I時分秒完全沒問題,但在1602液晶上顯示就是亂碼了 |
zl2168 發(fā)表于 2017-11-4 21:47 好吧,其實(shí)有些資料我可以找到,我就想把這個調(diào)出來,看看問題出在哪里,對于像我這樣初學(xué)的菜鳥,這些調(diào)試的過程就是一種提高的過程 |
cjjcjj1 發(fā)表于 2017-11-4 21:43 檢查過好幾遍了,是一致的 |
本帖最后由 zl2168 于 2017-11-4 21:49 編輯 介紹你一個正確有效的案例,自己對照查錯吧! 實(shí)例91 具有校正功能的時鐘1302(LCD1602顯示) 先Proteus仿真,確認(rèn)有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。 |
Powered by 單片機(jī)教程網(wǎng)