亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: LCD1602倒計時程序?qū)懥艘话氩粫䦟懥耍埱髱椭?[打印本頁]

作者: yujianli    時間: 2016-1-8 20:00
標(biāo)題: LCD1602倒計時程序?qū)懥艘话氩粫䦟懥,請求幫?br /> 本帖最后由 yujianli 于 2016-1-8 20:53 編輯

課設(shè)作業(yè),控制要求是:20S倒計時顯示在1602上,時間到后蜂鳴器響10S。要求倒計時時間和蜂鳴器響應(yīng)延時時間都顯示在1602上。
自己寫了一般的程序,寫的很爛...液晶屏數(shù)據(jù)和命令的函數(shù)都寫了,倒計時這個怎么實現(xiàn),數(shù)碼管的倒計時會一些,可是要怎么顯示在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]={"                "};          //第二行延時
//延時函數(shù)
void delayMS(uint n)
{
   uint x,y;
    for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
//顯示函數(shù),在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);
}
//寫數(shù)據(jù)
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 發(fā)表于 2016-1-9 00:32
已解決了~

怎么解決的 能分享一下嗎?
作者: 劍意如風(fēng)    時間: 2016-1-9 13:19
可以用數(shù)組,,然后判斷,,選擇數(shù)組里面的其中以為,,逐個來,,,也可以用左移右移的辦法
作者: yujianli    時間: 2016-1-9 21:13
其實也挺簡單的,顯示函數(shù)更新就可以,程序如下:
#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;
//延時函數(shù)
void delayMS(uint n)
{
   uint x,y;
    for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
//顯示函數(shù),在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);
}
//寫數(shù)據(jù)
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中斷函數(shù)
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;//關(guān)閉蜂鳴器
                                }
                  }
                }
  }
TR0=1;
}
作者: duzou    時間: 2016-12-13 19:26
yujianli 發(fā)表于 2016-1-9 21:13
其實也挺簡單的,顯示函數(shù)更新就可以,程序如下:
#include
//定義

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

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

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




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1