標(biāo)題:
沒學(xué)過該怎么在1602里面加定時器
[打印本頁]
作者:
nooobaoe
時間:
2025-4-8 23:03
標(biāo)題:
沒學(xué)過該怎么在1602里面加定時器
新作業(yè)用定時器定時,做一個電子時鐘,時間從23:59:56開始計時,并在lcd1602上顯示,顯示要求:第一行顯示:Time:第二行顯示:23:59:56
不懂就問,是不是就是加一個定時器0?
#include <reg51.h>
sbit e=P2^7;
sbit rs=P2^6;
sbit rw=P2^5;
void delayms(int ms)
{int i,j;
for (j=0;j<ms;j++)
for(i=0;i<333;i++);
}
bit checkbusy()
{bit stat;
rs=0;
rw=1;
e=0;
delayms(1);
e=1;
delayms(1);
stat=P0&0x80;
e=0;
delayms(1);
return stat;
}
void lcdcom(char com)
{while (checkbusy());
rs=0;
rw=0;
e=0;
delayms(1);
P0=com;
e=1;delayms(1);
e=0;delayms(1);
}
void lcddat(char dat)
{while (checkbusy());
rs=1;//寫數(shù)據(jù)
rw=0;
e=0;
delayms(1);
P0=dat;
e=1;delayms(1);
e=0;delayms(1);
}
void main()
{ lcdcom(0x01);
lcdcom(0x06);
lcdcom(0x0e);
lcdcom(0x38);
lcdcom(0x80);
lcddat('T');
lcddat('I');
lcddat('M');
lcddat('E');
lcdcom(0xC3);
lcddat('3');
lcddat('6');
while(1);
}這是我現(xiàn)在寫的代碼,滿足了條件1
作者:
zhuls
時間:
2025-4-9 14:32
是的,你要開一個計數(shù)定時器,用于計時。
從23:59:56開始,每秒減1個秒計數(shù)。。直到時分秒均為0停止。
作者:
1565654483dsh
時間:
2025-4-9 15:31
用的是單片機8051?可以用定時器間隔例如每 50ms 觸發(fā)一次中斷,每 20 次中斷(即 1 秒)更新一次時間來進(jìn)行日,時,分,秒的轉(zhuǎn)換
作者:
hantu
時間:
2025-4-9 22:57
是的,開個定時中斷來走時分秒,然后在主函數(shù)的while(1)循環(huán)里更新顯示時間即可
作者:
nooobaoe
時間:
2025-4-10 18:21
已解決
謝謝大家
作者:
man1234567
時間:
2025-4-12 20:00
通常所指的1602是顯示用的,里面加不了定時器。
問的沒頭沒尾,解決后也不傳結(jié)果供參考,好像不是要討論而是來免費進(jìn)貨的
作者:
nooobaoe
時間:
2025-4-15 09:11
man1234567 發(fā)表于 2025-4-12 20:00
通常所指的1602是顯示用的,里面加不了定時器。
問的沒頭沒尾,解決后也不傳結(jié)果供參考,好像不是要討論而 ...
沒有吧,在里面程序里加了個定時器就好了。也沒有免費進(jìn)貨啊,不然我一點代碼都不打直接問得了。#include <REGX51.H>
#include "1602.h"
struct Time {
char hour;
char minute;
char second;
};
struct Time currentTime = {23, 59, 56}; // 初始時間將在 main() 里設(shè)置
int Count = 0;
void Timer0_Init() {
TMOD &= 0xF0; // 設(shè)置定時器0模式1
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x18;
ET0 = 1; // 允許定時器0中斷
EA = 1; // 開總中斷
TR0 = 1; // 啟動定時器0
}
void UpdateTimeDisplay() {
char timeStr[9];
// 格式化時間字符串
timeStr[0] = currentTime.hour / 10 + '0';
timeStr[1] = currentTime.hour % 10 + '0';
timeStr[2] = ':';
timeStr[3] = currentTime.minute / 10 + '0';
timeStr[4] = currentTime.minute % 10 + '0';
timeStr[5] = ':';
timeStr[6] = currentTime.second / 10 + '0';
timeStr[7] = currentTime.second % 10 + '0';
timeStr[8] = '\0';
LCD_ShowString(2, 1, timeStr);
}
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重新加載初值
TL0 = 0x18;
Count++;
if (Count >= 1000) { // 1秒到
Count = 0;
currentTime.second++;
// 處理秒進(jìn)位
if (currentTime.second >= 60) {
currentTime.second = 0;
currentTime.minute++;
// 處理分鐘進(jìn)位
if (currentTime.minute >= 60) {
currentTime.minute = 0;
currentTime.hour++;
// 處理小時進(jìn)位
if (currentTime.hour >= 24) {
currentTime.hour = 0;
}
}
}
UpdateTimeDisplay(); // 更新顯示
}
}
void main()
{
LCD_Init();
LCD_ShowString(1,1,"TIME:");
Timer0_Init();
UpdateTimeDisplay();
while(1)
{
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1