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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3148|回復: 0
收起左側

12864顯示倒計時

[復制鏈接]
ID:85849 發表于 2015-7-16 16:30 | 顯示全部樓層 |閱讀模式


#include <reg52.h>

#include <intrins.h>



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

#define LCD_data  P0       //數據口

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; //液晶復位端口



sbit sset=P3^4;//設置按鈕

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[] =

{

  "距離系統爆炸時間"

};

unsigned char code DIS2[] =

{

  "還剩:"

};

unsigned char code DIS31[] =

{

  "時"

};

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個字節



/*********************延時子函數**************************/



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

{

  _nop_();

  _nop_();

  _nop_();

  _nop_();

}



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

{

  unsigned char y;

  while (ms--)

  {

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

      ;

  }

}

//******************檢查LCD忙狀態**************************





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

{

  bit result;

  LCD_RS = 0;

  LCD_RW = 1;

  LCD_EN = 1;

  delayNOP();

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

  LCD_EN = 0;

  return (result); }



//***********************寫指令數據***********************



void lcd_wcmd(unsigned char cmd)//寫指令數據到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)//寫顯示數據到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)//顯示個位和十位數據

{

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);

}



//*********************初始化設定****************************  

void lcd_init()

{

  LCD_PSB = 1; //并口方式



  LCD_RST = 0; //液晶復位

  delayms(5);  //液晶復位

  LCD_RST = 1; //液晶復位

  delayms(5);  //液晶復位



  lcd_wcmd(0x34); //擴充功能設定,擴充指令,選8位數據

  delayms(5);

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

  delayms(5);

  lcd_wcmd(0x0C); //顯示開,關光標,關光標反白允許。

  delayms(5);

  lcd_wcmd(0x04); //光標的移動方向

  delayms(5);

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

  delayms(5);



TMOD=0x01;

TH0=0x3C;

TL0=0xB0;

EA=1;

ET0=1;

TR0=0;

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

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

}



//*********************設定顯示位置子函數**********************



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

{

  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); //寫顯示地址

}



//*****************清屏子函數***************************



void clr_screen()//清屏子函數

{

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

  delayms(5);

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

  delayms(5);

  lcd_wcmd(0x01); //清屏

  delayms(5);

}



//******************閃爍子函數**************************

void lcdflag()

{

  lcd_wcmd(0x08); //關閉顯示

  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);



}

//******************寫字符串子函數*************************  

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

{

  unsigned char num = 0;



  while (str[num])

  {

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



  }

}



//********************按鍵設置時間*************************

void keyscan()//按鍵設置時間

{



if(sset==0)

{

  delayms(10);

  if(sset==0)

  {

   EX0=1;

   keycount++;

   while(sset==0)

   {

    ;

   }

   if(keycount==1)

   {

    TR0=0;          //停止計時

    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);光標左移一位

   }

   if(keycount==4)

   {

    ;





   }

   if(keycount==5)

   {

    keycount=6;

    lcd_wcmd(0x8a);

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



   }

   if(keycount==6)

   {

    ;

   }

   if(keycount==7)

   {

    keycount=0;



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

    TR0=1;          //開始計時

    EX0=1;



   }

  }

}



if(keycount!=0)

{

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

  {

   if(sadd==0)//數值加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)//數值減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)//數值加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)//數值減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)//編輯小時

  {

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

   {

    delayms(10);

    if(sadd==0)

    {

     hour++;

     if(hour==24)

     {

      minute=0;

     }

     sadd=1;

    }

       writesmh(0x0a,hour);

    lcd_wcmd(0x8a);

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

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

   {

    delayms(10);

    if(sdel==0)

    {



     if(hour==0)

     {

      hour=24;

     }

     hour--;

     sdel=1;

    }

    writesmh(0x0a,hour);

    lcd_wcmd(0x8a);

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

   }





  }



}

} }



//主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函




void main()

{

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

    lcd_init(); //初始化LCD



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

    wr_string(DIS1);

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

    wr_string(DIS2);

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

    wr_string(DIS31);

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

    wr_string(DIS32);

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

    wr_string(DIS33);

lcd_pos(4, 6); //設置顯示位置為第四行     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//倒計時中斷

{



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); //設置顯示位置為第三行,第七列

    writesmh(0x0a,hour);

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

   writesmh(0x0c,minute);

  }

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

  writesmh(0x0e,second);

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

  {

   TR0=0;

   spk=0;

   second=0;

   minute=0;

   hour=0;

   lcdflag();



   spk=1;



  }

}



}



void encoder(void) interrupt 0//外部中斷0 旋轉碼開關中斷程序

{

if(INT1==1)

{  

  sadd=0;

  sdel=1;



}

if(INT1==0)

{

  sdel=0;

  sadd=1;



}

}



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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕韩在线第一页 | 日韩综合网 | 久久久久国产一区二区三区四区 | 二区在线视频 | 一级做a爰片性色毛片16美国 | 精品一区二区久久久久久久网站 | 国产欧美在线观看 | 亚洲视频www | 嫩草网 | 国产精品一区二区在线 | 国产a爽一区二区久久久 | 中文字幕视频在线观看免费 | 国产欧美日韩一区二区三区 | 日本精品一区二区三区视频 | 亚洲午夜精品久久久久久app | 日韩欧美精品 | 自拍偷拍中文字幕 | 久久久久中文字幕 | 激情在线视频网站 | 日韩成人在线视频 | 国产精品一区二区福利视频 | 黄色成人免费在线观看 | 国产日韩一区二区三区 | av网站在线看 | 99亚洲| 国产一区视频在线 | 亚洲成人高清 | 国产激情视频在线免费观看 | 成人av网站在线观看 | 国产精品一码二码三码在线 | 国产精品久久久久无码av | 日韩精品成人免费观看视频 | 亚洲毛片一区二区 | 国产一区二区三区高清 | 99国内精品久久久久久久 | 一级毛片视频在线 | 国产一区二区在线免费观看 | 天天天天操 | 欧美 日韩 国产 成人 在线 91 | 青青久久 | 81精品国产乱码久久久久久 |