找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6942|回复: 9
打印 上一主题 下一主题
收起左侧

LCD1602倒计时程序写了一半不会写了,请求帮助

[复制链接]
跳转到指定楼层
楼主
本帖最后由 yujianli 于 2016-1-8 20:53 编辑

课设作业,控制要求是:20S倒计时显示在1602上,时间到后蜂鸣器响10S。要求倒计时时间和蜂鸣器响应延时时间都显示在1602上。
自己写了一般的程序,写的很烂...液晶屏数据和命令的函数都写了,倒计时这个怎么实现,数码管的倒计时会一些,可是要怎么显示在1602上,请大神们帮个忙!
#include<reg51.h>
//定义
#define uchar unsigned char
#define uint unsigned int

void init();
void set_POS(uchar);
void write_command(uchar);
void write_data(uchar);

sbit BUZZER=P1^0;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
bit busy_check();

uchar data TIME1_str[16]={"                "};   //第一行倒计时间
uchar data TIME2_str[16]={"                "};          //第二行延时
//延时函数
void delayMS(uint n)
{
   uint x,y;
    for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
//显示函数,在LCD上显示字符串
void display_str(uchar* str,uchar lineno)
{
   uchar k;
   set_POS(lineno);
   for(k=0;k<16;k++)
   write_data(str[k]);
}
//1602测忙
bit busy_check()
{
        bit Result;
        RS=0;
        delayMS(5);
        RW=1;
        delayMS(5);
        LCD_EN=1;
        delayMS(5);
        Result=(bit)(P0&0x80);
        delayMS(5);
        EN=0;
        delayMS(5);
        return Result;
}
//写指令
void write_command(uchat cmd)
{
        while(busy_check())        ;
        delayMS(5);
        RS=0;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5)
        P0=com;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delayMS(5);
}
//写数据
void write_data(uchar dat)
{
        while(busy_check());
        delayMS(5);
        RS=1;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5);
        P0=dat;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delay=0;
}
void init()
{
    delayMS(5);
        write_command(0x38);
        delayMS(5);
        write_command(0x0c);
        delayMS(5);
        write_command(0x06);
        delayMS(5);
        write_command(0x01);
        delayMS(5);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:90857 发表于 2016-1-9 00:32 | 只看该作者
已解决了~
回复

使用道具 举报

板凳
ID:1 发表于 2016-1-9 04:01 | 只看该作者

怎么解决的 能分享一下吗?
回复

使用道具 举报

地板
ID:102500 发表于 2016-1-9 13:19 | 只看该作者
可以用数组,,然后判断,,选择数组里面的其中以为,,逐个来,,,也可以用左移右移的办法
回复

使用道具 举报

5#
ID:90857 发表于 2016-1-9 21:13 | 只看该作者
其实也挺简单的,显示函数更新就可以,程序如下:
#include<STC12C5A60S2.h>
//定义
#define uchar unsigned char
#define uint unsigned int

void init();
void set_POS(uchar);
void write_command(uchar);
void write_data(uchar);

sbit BUZZER=P2^5;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
bit busy_check();

uchar data BUF1_str[16]={"                "};   //第一行倒计时间
uchar data BUF2_str[16]={"                "};          //第二行延时
uint sec,min,rl_sec,rl_min,cnt=0,START=0;
//延时函数
void delayMS(uint n)
{
   uint x,y;
    for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
//显示函数,在LCD上显示字符串
void display_str(uchar* str,uchar lineno)
{
   uchar k;
   set_POS(lineno);
   for(k=0;k<16;k++)
   write_data(str[k]);
}
//1602测忙
bit busy_check()
{
        bit Result;
        RS=0;
        delayMS(5);
        RW=1;
        delayMS(5);
        EN=1;
        delayMS(5);
        Result=(bit)(P0&0x80);
        delayMS(5);
        EN=0;
        delayMS(5);
        return Result;
}
void write_command(uchar cmd)
{
        while(busy_check())        ;
        delayMS(5);
        RS=0;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5);
        P0=cmd;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delayMS(5);
}
//写数据
void write_data(uchar dat)
{
        while(busy_check());
        delayMS(5);
        RS=1;
        delayMS(5);
        RW=0;
        delayMS(5);
        EN=0;
        delayMS(5);
        P0=dat;
        delayMS(5);
        EN=1;
        delayMS(5);
        EN=0;
        delayMS(5);
}
void init()
{
    delayMS(5);
        write_command(0x38);
        delayMS(5);
        write_command(0x0c);
        delayMS(5);
        write_command(0x06);
        delayMS(5);
        write_command(0x01);
        delayMS(5);
}
void set_POS(uchar position)
{
        write_command(position|0x80);
}
  //初始化定时器0
void inittimer0(void)
{
  TMOD=0X01;//定时器寄存器配置
  TH0=(65535-50000)/256;//定时50000us=50ms
  TL0=(65535-50000)%256;
  TR0=1;//启动定时器0
  ET0=1;
  EA=1;//开总中断
}
void main()
{
        inittimer0();//初始化定时器0
        delayMS(10);
        init();//初始化LCD
       
                BUF1_str[6]='T';
                BUF1_str[7]='I';
                BUF1_str[8]='M';
                BUF1_str[9]='E';

                BUF2_str[3]='W';
                BUF2_str[4]='A';
                BUF2_str[5]='R';
                BUF2_str[6]='N';
                BUF2_str[7]='I';
                BUF2_str[8]='N';
            BUF2_str[9]='G';
                min=0;sec=20;rl_min=0;rl_sec=10;
                START=1;
        while(1)
        {
                BUF1_str[11]=min%100/10+'0';
                BUF1_str[12]=min%10+'0';
                BUF1_str[13]=':';
                BUF1_str[14]=sec%100/10+'0';
                BUF1_str[15]=sec%10+'0';
               
                BUF2_str[11]=rl_min%100/10+'0';
                BUF2_str[12]=rl_min%10+'0';
                BUF2_str[13]=':';
                BUF2_str[14]=rl_sec%100/10+'0';
                BUF2_str[15]=rl_sec%10+'0';
               
          display_str(BUF1_str,0x00);//第一行显示更新
          display_str(BUF2_str,0x40);//第二行显示更新
        }
}
//定时器0中断函数
timer0() interrupt 1
{
  TR0=0;
  TH0=(65535-50000)/256;//50000us=50ms
  TL0=(65535-50000)%256;
        if(START==1)//继电器开启倒计时开始
        {
    cnt++;
    if(cnt>=20)//20*50ms=1s
    {
      cnt=0;
            sec--;
            if(sec==0)
            {
                                sec=59;
                          min--;
                                if(min>250)
                                {
                                        START=2;
                                        sec=0;
                                        min=0;
                                        BUZZER=0;//开启蜂鸣器
                                        cnt=0;
                                }
                  }
                }
  }
        if(START==2)//继电器延时倒计时开始
        {
    cnt++;
    if(cnt>=20)
    {
      cnt=0;
            rl_sec--;
            if(rl_sec==0)
            {
                                rl_sec=59;
                          rl_min--;
                                if(rl_min>250)
                                {
                                        START=0;
                                        rl_sec=0;
                                        rl_min=0;
                                        BUZZER=1;//关闭蜂鸣器
                                }
                  }
                }
  }
TR0=1;
}
回复

使用道具 举报

6#
ID:141378 发表于 2016-12-13 19:26 | 只看该作者
yujianli 发表于 2016-1-9 21:13
其实也挺简单的,显示函数更新就可以,程序如下:
#include
//定义

谢谢  楼上
回复

使用道具 举报

7#
ID:154563 发表于 2016-12-13 22:48 来自手机 | 只看该作者
很好   谢谢帮助
回复

使用道具 举报

8#
ID:356686 发表于 2018-6-22 19:02 来自手机 | 只看该作者
楼主,能把原理图分享一下吗?
回复

使用道具 举报

9#
ID:111634 发表于 2018-6-23 08:09 | 只看该作者
实例96  能预置初值的倒计时秒表
Proteus仿真一下,确认有效。
实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 31)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。
回复

使用道具 举报

10#
ID:418347 发表于 2018-11-5 16:14 | 只看该作者
请问楼主,if(rl_min>250)这里大于250 什么意思啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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