能显示星期,显示在右上角,并且能修改它;现在情况是用按键修改闹钟后,时间到了,却不会响;很烦这个;还有就是希望能间歇响蜂鸣器,现在是长响;话不多说,各位大佬请看程序:
# 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); //日
}
}
}
}
}
|