|
我用定时器T0进行定时,但是1602从24开始计时,如果我把LCD_String(1,1,"TIME:");删除就可以从0开始,有没有大佬看看
这是我的程序
/**********************************
包含头文件
**********************************/
#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:");
}
}
|
|