當前位置:編程學習大全網 - 編程語言 - 51單片機lcd1602顯示時間

51單片機lcd1602顯示時間

#include <reg52.h>

#include <stdio.h>

#include "delay.h"

#include "string.h"

#include "ds1302.h"

#include "LCD1602.H"

#include "NONGLICONVERSION.H"

#define uchar unsigned char

#define uint unsigned int

sbit key1=P1^0;//日期設置;時間設置;模式選擇

sbit key2=P1^1;//加

sbit key3=P1^2;//減

sbit key4=P1^3;//確認;復位

sbit bell=P1^7;//鬧鐘

uint count;

bit flag,dp;

uchar displaytemp[16];//定義顯示區域臨時存儲數組

code uchar tab[] = {'0','1','2','3','4','5','6','7','8','9'};

uchar timeUPtab[6] = {99,12,31,24,59,59};

uchar timeDOWNtab[6] = {0,1,1,0,0,0};

uchar timetab[6] = {20,11,6,16,4,23}; //年 月 日? 時 分 秒

uchar state;

//狀態0:工作狀態

//狀態1:年調整

//狀態2:月調整

//狀態3:日調整

//狀態4:時調整

//狀態5:分調整

//狀態6:秒調整

//****************函數聲明************************************//

void InitTIMER0(void);//定時器初始化

void KeyDo();//按鍵操作函數

void Read_time();//時間處理函數

void display(); // 顯函數

void Conver_week(bit c,uchar year,uchar month,uchar day);

void Conversion(bit c,uchar year,uchar month,uchar day);

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

void Read_time()

{

uchar i = 0;

Read_RTC();//讀日歷

for(i=0;i<6;i++)

timetab[i] = l_tmpdate[i];

}

void Set_time()

{

uchar i;

for(i=0;i<6;i++)

{

? l_tmpdate[i]=timetab[i];

? Set_RTC(i);

}

}

void NL_read(uchar nian,uchar yue,uchar ri)

{

uchar tmp;

tmp=nian/10;

nian=nian%10;

nian=nian+tmp*16; //十進制轉BCD處理

tmp=yue/10;

yue=yue%10;

yue=yue+tmp*16; //十進制轉BCD處理

tmp=ri/10;

ri=ri%10;

ri=ri+tmp*16; //十進制轉BCD處理

Conversion(0,nian,yue,ri);

tmp=year_moon/16;

year_moon=year_moon%16;

year_moon=year_moon+tmp*10;//BCD轉十進制

tmp=month_moon/16;

month_moon=month_moon%16;

month_moon=month_moon+tmp*10;//BCD轉十進制

tmp=day_moon/16;

day_moon=day_moon%16;

day_moon=day_moon+tmp*10;//BCD轉十進制

}

void display() // 顯函數

{

uchar displaytemp1[8]={0,0,0,0,0,0,0,0};

uchar displaytemp2[8]={0,0,0,0,0,0,0,0};

// 分狀態顯示

switch(state)

{

case 0:

{

sprintf(displaytemp1,"? -? -? ");//日期

displaytemp1[0]=tab[timetab[0]/10];

displaytemp1[1]=tab[timetab[0]%10];

displaytemp1[3]=tab[timetab[1]/10];

displaytemp1[4]=tab[timetab[1]%10];

displaytemp1[6]=tab[timetab[2]/10];

displaytemp1[7]=tab[timetab[2]%10];

displaytemp2[0]=tab[timetab[3]/10];

displaytemp2[1]=tab[timetab[3]%10];

displaytemp2[2]=':';

displaytemp2[3]=tab[timetab[4]/10];

displaytemp2[4]=tab[timetab[4]%10];

displaytemp2[5]=':';

displaytemp2[6]=tab[timetab[5]/10];

displaytemp2[7]=tab[timetab[5]%10];

}break;

case 1:

{

displaytemp1[0]=tab[timetab[0]/10];

displaytemp1[1]=tab[timetab[0]%10];

}break;

case 2:

{

displaytemp1[3]=tab[timetab[1]/10];

displaytemp1[4]=tab[timetab[1]%10];

}break;

case 3:

{

displaytemp1[6]=tab[timetab[2]/10];

displaytemp1[7]=tab[timetab[2]%10];

}break;

case 4:

{

displaytemp2[0]=tab[timetab[3]/10];

displaytemp2[1]=tab[timetab[3]%10];

}break;

case 5:

{

displaytemp2[3]=tab[timetab[4]/10];

displaytemp2[4]=tab[timetab[4]%10];

}break;

case 6:

{

displaytemp2[6]=tab[timetab[5]/10];

displaytemp2[7]=tab[timetab[5]%10];

}break;

default:break;

}

// 輸出到屏幕

disstring(0x80,displaytemp1,8);

disstring(0xc0,displaytemp2,8);

}

void main()

{

LCD_init(); ? //lcd初始化?

InitTIMER0(); ? //定時器初始化

Set_time();//qq:289440

Read_time();?//426

bell=1;?

while(1)

{

display();

if(flag)

{

KeyDo();

flag=0;

}

delay(100);

}

}

/**********************定時器初始化***************************/

void InitTIMER0(void)

{

TMOD|=0x01;//定時器設置 16位

TH0=0xfc;//初始化值

TL0=0x18;

ET0=1;

TR0=1;

EA=1;

}

void tim(void) interrupt 1 using 1//中斷,用於掃描鍵盤

{?

TH0 = 0xfc;

TL0 = 0x18;

flag=1;?

}

void KeyDo()//按鍵操作函數

{

char up = 0,down = 0;

key1=1;key4=1;

if(key1==0)

{

while(key1==0);

state++;

if(state>6)

state = 1;

}

if(key4==0)

{

while(key4==0);

state = 0;

Set_time();

}

if(key2==0)

{

while(key2==0);

up = 1;

}

if(key3==0)

{

while(key3==0);

down = 1;

}

switch(state)

{

case 0:

{

Read_time();

}break;

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

{

// 每月時間計算

switch(timetab[1])

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:timeUPtab[2] = 31;break;

case 4:

case 6:

case 9:

case 11:timeUPtab[2] = 30;break;

case 2:

{

if(timetab[0] % 4 == 0)

timeUPtab[2] =29;

else

timeUPtab[2] =28;

}

default:break;

}

if(up)

timetab[state-1]++;

if(timetab[state-1] > timeUPtab[state-1])

timetab[state-1] = timeUPtab[state-1];

if(down)

timetab[state-1]--;

if(timetab[state-1] < timeDOWNtab[state-1])

timetab[state-1] = timeDOWNtab[state-1];

}break;

default:break;

}

}

  • 上一篇:初中物理所有的公式
  • 下一篇:VB和數據庫的鏈接
  • copyright 2024編程學習大全網