|
我用定時器T0進行定時,但是1602從24開始計時,如果我把LCD_String(1,1,"TIME:");刪除就可以從0開始,有沒有大佬看看
這是我的程序
2.png (65.5 KB, 下載次數: 35)
下載附件
2023-3-31 22:33 上傳
/**********************************
包含頭文件
**********************************/
#include <reg52.h>
#include "LCD1602.h"
/**********************************
PIN口定義
**********************************/
sbit LCD1602_SHCP=P0^0;
sbit LCD1602_DS=P0^1;
sbit LCD1602_STCP=P0^2;
sbit LCD1602_E=P0^5;
sbit LCD1602_RW=P0^4;
sbit LCD1602_RS=P0^3;
/**********************************
/*******************************************************************************
* 函 數 名 : LCD1602_DATAPINS
* 函數功能 : 更改74HC595連接LCD1602的數據
* 輸 入 : value
* 輸 出 : 無
*******************************************************************************/
void LCD1602_DATAPINS(uchar value)
{
uchar i;
for(i=0;i<8;i++)
{
LCD1602_DS=value&0x80;//取數據高位
if(LCD1602_DS==0x80){ //判斷數據高位是否為1
LCD1602_DS=1;//如果高位為1,DS置1
}
else{
LCD1602_DS=0;//否則DS置0
}
LCD1602_SHCP=0;
LCD1602_SHCP=1;//上升沿使這一位寫入移位寄存器
value<<=1;//數據左移1位,數據的第7位變為最高位,循環第8次時數據的最低位也變成最高位
}
LCD1602_STCP=0;
LCD1602_STCP=1;//給STCP一個上升沿,將for循環中輸入的數據移入輸出鎖存寄存器,刷新輸出數據
}
/*******************************************************************************
* 函 數 名 : LcdWriteCom
* 函數功能 : 向LCD寫入一個字節的命令
* 輸 入 : com
* 輸 出 : 無
*******************************************************************************/
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS(com); //放入命令
Lcd1602_Delay1ms(1); //等待數據穩定
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
/****************************************************************************
* 函 數 名 : LcdWriteData
* 函數功能 : 向LCD寫入一個字節的數據
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
void LcdWriteData(uchar dat) //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS(dat); //寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
/**
* @brief LCD1602初始化函數
* @param 無
* @retval 無
*/
void LCD_Init()
{
LcdWriteCom(0x38);//八位數據接口,兩行顯示,5*7點陣
LcdWriteCom(0x0c);//顯示開,光標關,閃爍關
LcdWriteCom(0x06);//數據讀寫操作后,光標自動加一,畫面不動
LcdWriteCom(0x01);//光標復位,清屏
}
/**
* @brief LCD1602顯示一個字符
* @param 無
* @retval 無
*/
void LCD_Char(unsigned char line,unsigned char column,unsigned char dat)
{
if(line==1)
{
LcdWriteCom(0x80+column);
}
if(line==2)
{
LcdWriteCom(0xC0+column);
}
LcdWriteData(dat);
}
/**
* @brief LCD1602顯示字符串
* @param 無
* @retval 無
*/
void LCD_String(unsigned char line,unsigned char column,unsigned char *p)
{
unsigned char a;
if(line==1)
{
a=0x80;
}
if(line==2)
{
a=0xC0;
}
a=a+column;
LcdWriteCom(a);
while(1)
{
if(*p == '\0') break;
LcdWriteData(*p);
p++;
}
}
/**
* @brief LCD1602顯示字符串
* @param 無
* @retval 無
*/
void LCD_Num(unsigned char line,unsigned char column,unsigned int dat)
{
// LCD_Char(line,column,dat/100+'0');
LCD_Char(line,column+1,dat/10%10+'0');
LCD_Char(line,column+2,dat%10+'0');
}
#include <REGX52.H>
#include "time.h"
unsigned char sec,min,hour;
unsigned char cnt=0;
void T0_init(void)
{
TMOD &=0xf0;
TMOD |=0x01;//T0,方式1
TR0=1;
TH0=(47104)/256;
TL0=(47104)%256;
TF0=0;
ET0=1;
EA=1;
PT0=1;
}
void T0_IRQ(void) interrupt 1 //50ms,20次1s
{
TH0=(47104)/256;
TL0=(47104)%256;
cnt++;
if(cnt==20)
{
cnt=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void main()
{
uint i,m;
uchar j,k;
T0_init();
LCD_Init();
while(1)
{
Delay(10);
LCD_String(1,1,"TIME:");
LCD_Num(1,6,sec);
LCD_String(2,1,"HEAT:");
}
}
|
|