找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1284|回复: 3
收起左侧

单片机+LCD1602与74hc595连接显示定时 程序问题

[复制链接]
ID:951265 发表于 2023-3-31 20:17 | 显示全部楼层 |阅读模式
我用定时器T0进行定时,但是1602从24开始计时,如果我把LCD_String(1,1,"TIME:");删除就可以从0开始,有没有大佬看看
这是我的程序
2.png
/**********************************
包含头文件
**********************************/
#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:");




回复

使用道具 举报

ID:384109 发表于 2023-4-2 08:05 | 显示全部楼层
时间变量没有初始化
回复

使用道具 举报

ID:951265 发表于 2023-4-3 10:01 | 显示全部楼层
人中狼 发表于 2023-4-2 08:05
时间变量没有初始化

unsigned int sec=0,min=0,hour=0;
这样初始化以后还是从24开始计时,大佬知道怎么回事吗
回复

使用道具 举报

ID:229502 发表于 2023-4-11 22:25 | 显示全部楼层
void LCD1602_DATAPINS(uchar value),这个函数是hc595串转并给lcd1602的D0~D7.楼主仿真里没有hc595.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表