能顯示星期,顯示在右上角,并且能修改它;現在情況是用按鍵修改鬧鐘后,時間到了,卻不會響;很煩這個;還有就是希望能間歇響蜂鳴器,現在是長響;話不多說,各位大佬請看程序:
# include <reg52.h>
#define uchar unsigned char
#define uint unsigned int //宏定義
/********************************
腳位定義
********************************/
sbit rs = P3^5; //寫命令/數據端
sbit en = P3^4; //使能
sbit rw = P3^6; //led1602讀命令/數據端
sbit we = P2^7; //數碼管位選
sbit du = P2^7; //數碼管段選
sbit S2 = P3^0;
sbit S3 = P3^1;
sbit S4 = P3^2;
sbit S5 = P3^3; //獨立鍵盤四個按鍵腳位
sbit fm = P2^3; //蜂鳴器腳位
uchar count, S2num; //定時器,修改按鍵次數,
uchar hour = 7, //時
min = 59, //分
sec = 55; //秒 時間
uint nian = 2020, //年
yue = 3, //月
ri = 19; //日 日期
uchar clock,
hour1 = 8, //時
min1 = 0; //分 鬧鐘
// 星期一↓ 二↓ 三↓ 四↓ 五↓ 六↓ 日↓
uchar X[] = {"MON,TUE,MED,THU,FRI,SAT,SUN"};//星期循環
uchar code table[] = "2020-03-19"; //注意:修改這里必須先修改↑ uchar ↑,↓↓↓↓
uchar code table1[] = "07:59:55 C08:00"; // 否則,時間不會跟著這里走
/********************************************
延時函數
********************************************/
void delay(uint z)//長延時函數
{
uint x, y;
for(x = z; x > 0;x --)
for (y = 110; y > 0; y --);
}
/********************************************
寫命令函數
********************************************/
void write_com(uchar com)
{
rs = 0;
P0 = com;
delay(5);
en = 1;
delay(5);
en = 0;
}
/********************************************
寫數據函數
********************************************/
void write_dat(uchar dat)
{
rs = 1;
P0 = dat;
delay(5);
en = 1;
delay(5);
en = 0;
}
/********************************************
初始化函數
********************************************/
void init()
{
uchar num;
rw =0;
en = 0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
for(num = 0; num < 10; num ++)
write_dat(table[num]);
write_com(0x80 + 0x40);
for(num = 0; num < 16; num ++)
write_dat(table1[num]);
TMOD = 0x01;
TH0 = (65536 - 50000) / 256; //裝定時器初值
TL0 = (65536 - 50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/********************************************
定時器函數
********************************************/
void timer0() interrupt 1
{
TH0 = (65536 - 50000) / 256;//再次裝定時器初值
TL0 = (65536 - 50000) % 256;
count ++;
}
/********************************************
時分秒 + 鬧鐘函數
********************************************/
void write_sfm(uchar add, uchar date)
{
uchar shi, ge;
shi = date / 10;
ge = date % 10;
write_com(0x80 + 0x40 + add); //時間 / 鬧鐘顯示的位置
write_dat(0x30 + shi);
write_dat(0x30 + ge);
}
/********************************************
年月日函數
********************************************/
void write_nyr(uint add, uint date)
{ //這里不能用uchar,uchar數字最多只有255,顯示不全年份
uint qian, bai, shi, ge;
qian = date / 1000;
bai = date % 1000 / 100;
shi = date % 100 / 10;
ge = date % 10;
write_com(0x80 + add);
if (add == 0) //年顯示的位置
{
write_dat(0x30 + qian);
write_dat(0x30 + bai);
write_dat(0x30 + shi);
write_dat(0x30 + ge);
}
if(add == 5) //月顯示的位置
{
write_dat(0x30 + shi);
write_dat(0x30 + ge);
}
if(add == 8) //日顯示的位置
{
write_dat(0x30 + shi);
write_dat(0x30 + ge);
}
}
/********************************************
星期函數
********************************************/
void write_xq(uchar add, uchar date)
{
uchar ge;
ge = date % 10;
write_com(0x80 + add); //星期顯示的位置
write_dat(0x30 + ge);
}
/************************************************************
日期時間自加函數 + 插入的鬧鐘函數
*************************************************************/
void write_shijian()
{
if(count == 20) //定時1秒
{
count = 0;
sec ++;
if(sec == 60)
{
sec = 0;
min ++;
if(min == 60)
{
min = 0;
hour ++;
/*******↓*****↓*****插入鬧鐘*****↓*****↓*******/
if(hour == hour1 & min == min1) //當時間‘時’‘分’==鬧鐘‘時’‘分’時,蜂鳴器打開
{
fm = 0; //fm = 0時,蜂鳴器打開,fm = 1時,蜂鳴器關閉
}
/**********↑***↑***↑***↑***↑***↑***↑***********/
if(hour == 24)
{
hour = 0;
ri ++;
if(ri == 31)
{
ri = 1;
yue ++;
if(yue == 13)
{
yue = 1;
nian ++;
if(nian == 2100)
{
nian = 0;
yue = 0;
ri = 0;
hour = 0;
min = 0;
sec = 0;
}
write_nyr(0, nian);//年份送回LED屏幕顯示
}
write_nyr(5, yue); //月份送回LED屏幕顯示
}
write_nyr(8, ri); //天數送回LED屏幕顯示
}
write_sfm(0, hour); //小時送回LED屏幕顯示
}
write_sfm(3, min); //分鐘送回LED屏幕顯示
}
write_sfm(6, sec); //秒送回LED屏幕顯示
}
}
/*****************函數聲明********************/
void Key();
/********************************************
主函數
********************************************/
void main()
{
init();
while(1)
{
Key(); //插入按鍵函數
write_shijian();
}
}
/********************************************
按鍵函數
********************************************/
void Key()
{
/***************插入停止鬧鐘按鍵設置************/
if(fm == 0) //鬧鐘是撿來的,到處插入^_^
{
if(S5 == 0)
{
delay(5);
if(S5 == 0)
fm = 1;
}
}
/***********修改日期 + 時間 + 鬧鐘按鍵設置************/
if(S2 == 0) //按下修改按鍵
{
delay(25); //軟件消抖
if(S2 == 0) //確認按下
{
S2num ++; //按鍵次數增加
while(!S2); //松開按鍵
TR0 = 0; //關閉定時器
write_com(0x0f); //打開光標且閃爍
if(S2num == 1)
write_com(0x80 + 0x40 + 7); //修改時間秒針數
if(S2num == 2)
write_com(0x80 + 0x40 + 4); //修改時間分鐘數
if(S2num == 3)
write_com(0x80 + 0x40 + 1); //修改時間小時數
if(S2num == 4)
write_com(0x80 + 0X40 + 12);//修改鬧鐘小時數
if(S2num == 5)
write_com(0x80 + 0X40 + 15);//修改鬧鐘分鐘份
if(S2num == 6)
write_com(0x80 + 3); //修改日期年份
if(S2num == 7)
write_com(0x80 + 6); //修改日期月份
if(S2num == 8)
write_com(0x80 + 9); //修改日期天數
if(S2num == 9)
{
S2num = 0; //修改按鍵次數清零
write_com(0x0c); //關閉光標且停止閃爍
TR0 = 1; //打開定時器
}
}
}
/*************增加日期 + 時間 + 鬧鐘按鍵設置**************/
if(S2num != 0) //按下修改按鍵,取消修改、增加和減少按鍵才有效
{
if(S5 == 0) //取消修改按鍵(僅在S2按下有效)
{
delay(25);
if(S5 == 0)
S2num = 0; //修改按鍵次數清零
write_com(0x0c); //關閉光標且停止閃爍
TR0 = 1; //打開定時器
}
if(S3 == 0) //增加鍵按下
{
delay(25); //軟件消抖
if(S3 == 0)
{
while(!S3); //確定按鍵按下
/********************時間*************************/
if(S2num == 1)
{
sec ++;
if(sec == 60)
sec = 0;
write_sfm(6, sec);
write_com(0x80 + 0x40 + 7); //秒
}
if(S2num == 2)
{
min ++;
if(min == 60)
min = 0;
write_sfm(3, min);
write_com(0x80 + 0x40 + 4); //分
}
if(S2num == 3)
{
hour ++;
if(hour == 24)
hour = 0;
write_sfm(0, hour);
write_com(0x80 + 0x40 + 1); //時
}
/********************鬧鐘*************************/
if(S2num == 4)
{
hour1 ++;
if(hour1 == 24)
hour1 = 0;
write_sfm(11, hour1);
write_com(0x80 + 0x40 + 12); //時
}
if(S2num == 5)
{
min1 ++;
if(min1 == 60)
min1 = 0;
write_sfm(14, min1);
write_com(0x80 + 0x40 + 15); //分
}
/********************日期*************************/
if(S2num == 6)
{
nian ++;
if(nian == 2101)
nian = 1999;
write_nyr(0, nian);
write_com(0x80 + 3); //年
}
if(S2num == 7)
{
yue ++;
if(yue == 13)
yue = 1;
write_nyr(5, yue);
write_com(0x80 + 6); //月
}
if(S2num == 8)
{
ri ++;
if(ri == 31)
ri = 1;
write_nyr(8, ri);
write_com(0x80 + 9); //日
}
}
}
/***********減少日期 + 時間 + 鬧鐘按鍵設置******************/
if(S4 == 0) //減少鍵按下
{
delay(25);
if(S4 == 0)
{
while(!S4); //確定按鍵按下
/********************時間*************************/
if(S2num == 1)
{
sec --;
if(sec == -1)
sec = 59;
write_sfm(6, sec);
write_com(0x80 + 0x40 + 7); //秒
}
if(S2num == 2)
{
min --;
if(min == -1)
min = 59;
write_sfm(3, min);
write_com(0x80 + 0x40 + 4); //分
}
if(S2num == 3)
{
hour --;
if(hour == -1)
hour = 23;
write_sfm(0, hour);
write_com(0x80 + 0x40 + 1); //時
}
/********************鬧鐘*************************/
if(S2num == 4)
{
hour1 --;
if(hour1 == -1)
hour1 = 23;
write_sfm(11, hour1);
write_com(0x80 + 0x40 + 12); //時
}
if(S2num == 5)
{
min1 --;
if(min1 == -1)
min1 = 59;
write_sfm(14, min1);
write_com(0x80 + 0x40 + 15); //分
}
/********************日期*************************/
if(S2num == 6)
{
nian --;
if(nian == 1998)
nian = 2100;
write_nyr(0, nian);
write_com(0x80 + 3); //年
}
if(S2num == 7)
{
yue --;
if(yue == 0)
yue = 12;
write_nyr(5, yue);
write_com(0x80 + 6); //月
}
if(S2num == 8)
{
ri --;
if(ri == 0)
ri = 30;
write_nyr(8, ri);
write_com(0x80 + 9); //日
}
}
}
}
}
|