久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: LCD1602倒計時程序寫了一半不會寫了,請求幫助 [打印本頁]

作者: yujianli    時間: 2016-1-8 20:00
標題: 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);
}


作者: yujianli    時間: 2016-1-9 00:32
已解決了~
作者: admin    時間: 2016-1-9 04:01
yujianli 發表于 2016-1-9 00:32
已解決了~

怎么解決的 能分享一下嗎?
作者: 劍意如風    時間: 2016-1-9 13:19
可以用數組,,然后判斷,,選擇數組里面的其中以為,,逐個來,,,也可以用左移右移的辦法
作者: yujianli    時間: 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;
}
作者: duzou    時間: 2016-12-13 19:26
yujianli 發表于 2016-1-9 21:13
其實也挺簡單的,顯示函數更新就可以,程序如下:
#include
//定義

謝謝  樓上
作者: lansedexiang    時間: 2016-12-13 22:48
很好   謝謝幫助
作者: przwfy    時間: 2018-6-22 19:02
樓主,能把原理圖分享一下嗎?
作者: zl2168    時間: 2018-6-23 08:09
實例96  能預置初值的倒計時秒表
Proteus仿真一下,確認有效。
實例96 能設置初值的倒計時秒表.rar (40 KB, 下載次數: 31)

以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,書中電路和程序設計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。

作者: ~何去何從    時間: 2018-11-5 16:14
請問樓主,if(rl_min>250)這里大于250 什么意思啊




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 99久久99久久精品国产片果冰 | 国产精品99久久久久久www | 日韩精品一区二区三区 | 视频在线一区二区 | www.青青草 | 日本精品在线观看 | 欧美午夜精品久久久久免费视 | 成人在线一区二区三区 | 在线播放中文 | 99热激情| 欧美日韩在线电影 | 国产成人久久精品一区二区三区 | 亚洲美女一区 | 久久久久久久久国产成人免费 | 九九热精品在线 | 日韩一区二区三区在线 | 日韩精品一区二区三区视频播放 | 免费成人高清在线视频 | 狠狠爱综合 | 天堂久久av | 伊人网伊人 | 亚洲免费在线播放 | 国产在线对白 | 欧美色专区 | 亚洲欧美激情四射 | 亚洲视频欧美视频 | 九九免费观看视频 | 久久久www成人免费精品 | 亚洲精品一区中文字幕乱码 | 精品九九九 | 一区二区三区国产 | 色婷婷综合网站 | 欧美一区二区三区 | 新超碰97 | 91av在线免费 | 丝袜一区二区三区 | 日本电影韩国电影免费观看 | 亚洲大片| 国产一级视频在线观看 | 天天干视频网 | 欧美日韩一区二区三区在线观看 |