找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3106|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

12864顯示倒計(jì)時(shí)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85849 發(fā)表于 2015-7-16 16:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


#include <reg52.h>

#include <intrins.h>



/********************* 定義 ********************************/

#define LCD_data  P0       //數(shù)據(jù)口

sbit LCD_RS = P2 ^ 0; //寄存器選擇輸入

sbit LCD_RW = P2 ^ 1; //液晶讀/寫控制

sbit LCD_EN = P2 ^ 2; //液晶使能控制

sbit LCD_PSB = P2 ^ 3; //串/并方式控制

sbit LCD_RST = P2 ^ 5; //液晶復(fù)位端口



sbit sset=P3^4;//設(shè)置按鈕

sbit spk=P1^4;

sbit sadd=P2^7;

sbit sdel=P2^6;



signed char second=0,minute=0,hour=0,count=0,keycount=0;

signed char key=0;

unsigned char code DIS1[] =

{

  "距離系統(tǒng)爆炸時(shí)間"

};

unsigned char code DIS2[] =

{

  "還剩:"

};

unsigned char code DIS31[] =

{

  "時(shí)"

};

unsigned char code DIS32[] =

{

  "分"

}; unsigned char code DIS33[] =

{

  "秒"

};

unsigned char code DIS4[] =

{

  "周林"

};

unsigned char code table2[]="0123456789";



char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個(gè)字節(jié)



/*********************延時(shí)子函數(shù)**************************/



void delayNOP()//us延時(shí)子函數(shù)   (4.34us)

{

  _nop_();

  _nop_();

  _nop_();

  _nop_();

}



void delayms(unsigned int ms)//ms延時(shí)子函數(shù)

{

  unsigned char y;

  while (ms--)

  {

    for (y = 0; y < 114; y++)

      ;

  }

}

//******************檢查LCD忙狀態(tài)**************************





bit lcd_busy()//檢查LCD忙狀態(tài) 1忙,0閑

{

  bit result;

  LCD_RS = 0;

  LCD_RW = 1;

  LCD_EN = 1;

  delayNOP();

  result = (bit)(P0 &0x80);

  LCD_EN = 0;

  return (result); }



//***********************寫指令數(shù)據(jù)***********************



void lcd_wcmd(unsigned char cmd)//寫指令數(shù)據(jù)到LCD

{

  while (lcd_busy())

  {

  ;

  }

  LCD_RS = 0;

  LCD_RW = 0;

  LCD_EN = 1;

  P0 = cmd;

  delayNOP();

  LCD_EN = 0;

}



void lcd_wdat(unsigned char dat)//寫顯示數(shù)據(jù)到LCD

{

  while (lcd_busy())

    ;

  LCD_RS = 1;

  LCD_RW = 0;

  LCD_EN = 1;

  P0 = dat;

  delayNOP();

  LCD_EN = 0;

}



void writesmh(unsigned char add,unsigned char date)//顯示個(gè)位和十位數(shù)據(jù)

{

unsigned char shi,ge;

shi=date/10;

ge=date%10;

lcd_wcmd(0x80+add);

delayms(5);

lcd_wdat(table2[shi]);

delayms(5);

lcd_wdat(table2[ge]);

delayms(5);

}



//*********************初始化設(shè)定****************************  

void lcd_init()

{

  LCD_PSB = 1; //并口方式



  LCD_RST = 0; //液晶復(fù)位

  delayms(5);  //液晶復(fù)位

  LCD_RST = 1; //液晶復(fù)位

  delayms(5);  //液晶復(fù)位



  lcd_wcmd(0x34); //擴(kuò)充功能設(shè)定,擴(kuò)充指令,選8位數(shù)據(jù)

  delayms(5);

  lcd_wcmd(0x30); //功能設(shè)定,基本指令操作,選8位數(shù)據(jù)

  delayms(5);

  lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo),關(guān)光標(biāo)反白允許。

  delayms(5);

  lcd_wcmd(0x04); //光標(biāo)的移動(dòng)方向

  delayms(5);

  lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容

  delayms(5);



TMOD=0x01;

TH0=0x3C;

TL0=0xB0;

EA=1;

ET0=1;

TR0=0;

EX0=0; //外部中斷0允許

IT0=1; //外部中斷0為邊沿觸發(fā)方式

}



//*********************設(shè)定顯示位置子函數(shù)**********************



void lcd_pos(unsigned char X, unsigned char Y)//設(shè)定顯示位置

{

  unsigned char pos;



  if (X == 1)

  {

    X = 0x80;

  }

  else if (X == 2)

  {

    X = 0x90;   }

  else if (X == 3)

  {

    X = 0x88;

  }

  else if (X == 4)

  {

    X = 0x98;

  }

  pos = X + Y; //確定顯示地址



  lcd_wcmd(pos); //寫顯示地址

}



//*****************清屏子函數(shù)***************************



void clr_screen()//清屏子函數(shù)

{

  lcd_wcmd(0x34); //擴(kuò)充指令操作

  delayms(5);

  lcd_wcmd(0x30); //基本指令操作

  delayms(5);

  lcd_wcmd(0x01); //清屏

  delayms(5);

}



//******************閃爍子函數(shù)**************************

void lcdflag()

{

  lcd_wcmd(0x08); //關(guān)閉顯示

  delayms(500);

  lcd_wcmd(0x0c); //開啟顯示

  delayms(500);

  lcd_wcmd(0x08);

  delayms(500);

  lcd_wcmd(0x0c);

  delayms(500);

  lcd_wcmd(0x08);

  delayms(500);

  lcd_wcmd(0x0c);

  delayms(500);



}

//******************寫字符串子函數(shù)*************************  

void wr_string(unsigned char str[])//寫字符串子函數(shù)

{

  unsigned char num = 0;



  while (str[num])

  {

    lcd_wdat(str[num++]); //寫數(shù)據(jù)



  }

}



//********************按鍵設(shè)置時(shí)間*************************

void keyscan()//按鍵設(shè)置時(shí)間

{



if(sset==0)

{

  delayms(10);

  if(sset==0)

  {

   EX0=1;

   keycount++;

   while(sset==0)

   {

    ;

   }

   if(keycount==1)

   {

    TR0=0;          //停止計(jì)時(shí)

    key=1;

    keycount=2;

    lcd_wcmd(0x8e);

    lcd_wcmd(0x0d);//秒位閃爍



   }

   if(keycount==2)

   {



    ;



   }

   if(keycount==3)

   {     keycount=4;

    lcd_wcmd(0x8c);

    lcd_wcmd(0x0d);//分位閃爍

    //lcd_wcmd(0x04);光標(biāo)左移一位

   }

   if(keycount==4)

   {

    ;





   }

   if(keycount==5)

   {

    keycount=6;

    lcd_wcmd(0x8a);

    lcd_wcmd(0x0d);//時(shí)位閃爍



   }

   if(keycount==6)

   {

    ;

   }

   if(keycount==7)

   {

    keycount=0;



    lcd_wcmd(0x0c);//停止閃爍

    TR0=1;          //開始計(jì)時(shí)

    EX0=1;



   }

  }

}



if(keycount!=0)

{

  if(keycount==2)//編輯秒

  {

   if(sadd==0)//數(shù)值加1

   {

    delayms(10);

    if(sadd==0)

    {

     second++;      if(second==60)

     {

      second=0;

     }

     sadd=1;

    }

    writesmh(0x0e,second);

    lcd_wcmd(0x8e);

    lcd_wcmd(0x0d);//秒位閃爍



   }

   if(sdel==0)//數(shù)值減1

   {

    delayms(10);

    if(sdel==0)

    {



     if(second==0)

     {

      second=60;

     }

     second--;

     sdel=1;

    }

    writesmh(0x0e,second);

    lcd_wcmd(0x8e);

    lcd_wcmd(0x0d);//秒位閃爍



   }







  }

  if(keycount==4)//編輯分鐘

  {

   if(sadd==0)//數(shù)值加1

   {

    delayms(10);;

    if(sadd==0)

    {

     minute++;

     if(minute==60)

     {

      minute=0;      }

     sadd=1;

    }

    writesmh(0x0c,minute);

    lcd_wcmd(0x8c);

    lcd_wcmd(0x0d);//分位閃爍

   }

   if(sdel==0)//數(shù)值減1

   {

    delayms(10);

    if(sdel==0)

    {



     if(minute==0)

     {

      minute=60;

     }

     minute--;

     sdel=1;

    }

       writesmh(0x0c,minute);

    lcd_wcmd(0x8c);

    lcd_wcmd(0x0d);//分位閃爍

   }





  }

  if(keycount==6)//編輯小時(shí)

  {

   if(sadd==0)//數(shù)值加1

   {

    delayms(10);

    if(sadd==0)

    {

     hour++;

     if(hour==24)

     {

      minute=0;

     }

     sadd=1;

    }

       writesmh(0x0a,hour);

    lcd_wcmd(0x8a);

    lcd_wcmd(0x0d);//時(shí)位閃爍    }

   if(sdel==0)//數(shù)值減1

   {

    delayms(10);

    if(sdel==0)

    {



     if(hour==0)

     {

      hour=24;

     }

     hour--;

     sdel=1;

    }

    writesmh(0x0a,hour);

    lcd_wcmd(0x8a);

    lcd_wcmd(0x0d);//時(shí)位閃爍

   }





  }



}

} }



//主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函數(shù)主函




void main()

{

    delayms(100); //上電,等待穩(wěn)定

    lcd_init(); //初始化LCD



lcd_pos(1, 0); //設(shè)置顯示位置為第一行

    wr_string(DIS1);

    lcd_pos(2, 0); //設(shè)置顯示位置為第二行

    wr_string(DIS2);

lcd_pos(3, 3); //設(shè)置顯示位置為第四行

    wr_string(DIS31);

lcd_pos(3, 5); //設(shè)置顯示位置為第四行

    wr_string(DIS32);

lcd_pos(3, 7); //設(shè)置顯示位置為第四行

    wr_string(DIS33);

lcd_pos(4, 6); //設(shè)置顯示位置為第四行     wr_string(DIS4);



writesmh(0x0e,second);

delayms(5);

writesmh(0x0c,minute);

delayms(5);

writesmh(0x0a,hour);

delayms(5);



  while (1)

  {



keyscan();





  }

}

//**********************中斷***************************



void time0() interrupt 1 using 0//倒計(jì)時(shí)中斷

{



TH0=0x3C;

TL0=0xB0;

count++;

if(count==20)

{

  count=0;

  second--;

  if(second<0)

  {

   second=59;

   minute--;

   if(minute<0)

   {

    minute=59;

    hour--;

    if(hour<0)

    {

     hour=24;

    }

    lcd_pos(3, 2); //設(shè)置顯示位置為第三行,第七列

    writesmh(0x0a,hour);

   }    lcd_pos(3, 4); //設(shè)置顯示位置為第三行,第七列

   writesmh(0x0c,minute);

  }

  lcd_pos(3, 6); //設(shè)置顯示位置為第三行,第七列

  writesmh(0x0e,second);

  if((second==0)&&(minute==0)&&(hour==0))//到點(diǎn)后響鈴

  {

   TR0=0;

   spk=0;

   second=0;

   minute=0;

   hour=0;

   lcdflag();



   spk=1;



  }

}



}



void encoder(void) interrupt 0//外部中斷0 旋轉(zhuǎn)碼開關(guān)中斷程序

{

if(INT1==1)

{  

  sadd=0;

  sdel=1;



}

if(INT1==0)

{

  sdel=0;

  sadd=1;



}

}



//*********************************************************

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表