#include <reg51.h>
#include <intrins.h>
#include <math.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
/*------------- 变量定义 ------------------------*/
//时间变量定义
uchar Time01ms=0;
uchar Time1ms=0;
uchar DQHour=6;//当前时间小时
uchar DQFen=0;//当前时间分钟
uchar DQMiao=0;//当前时间秒
bit flash=1;
uchar TabHour[]={0,0,0,0,0,0,0,0};
uchar TabMin[]={0,0,0,0,0,0,0,0};
uchar TabSec[]={0,0,0,0,0,0,0,0};
uchar n=0;
//按键
sbit S0 = P1^0;
sbit S1 = P1^1;
sbit S2 = P1^2;
sbit S3 = P1^3;
sbit S4 = P1^4;
sbit S5 = P1^5;
sbit S6 = P1^6;
sbit S7 = P1^7;
sbit S8 = P3^0;
sbit S9 = P3^1;
sbit S10 = P3^2;
sbit S11 = P3^3;
sbit S12 = P3^4;
sbit S13 = P3^5;
//蜂鸣器
sbit FMQ=P2^3;
bit bBell=0;
uint BellTime=0;
#define LCD_DB P0
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_E=P2^2;
/*------------ 变量定义 ------------------------------*/
bit flag_KEY=0;
void LCD_init(void); //初始化函数
void LCD_write_command(uchar command); //写指令函数
void LCD_write_data(uchar dat); //写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602显示字符串函数
void delay_n10us(uint n); //延时函数
/*------------------------------------------
定时器0中断处理
--------------------------------------------*/
void tim0_isr(void) interrupt 1 using 1
{
TH0=0XFF; //定时0.1ms
TL0=0XAB;
Time01ms++;
}
/*-------------------------------------
定时器初始化
---------------------------------------*/
void TIM0init(void)
{
TMOD=0x11;
TH0=0xFF; //定时0.1ms
TL0=0xAB;
ET0=1;
TR0=1;
EA=1;
}
void LCD_init(void)
{
delay_n10us(10);
LCD_write_command(0x38);//设置8位格式,2行,5x7
delay_n10us(10); LCD_write_command(0x0c);//开显示,关光标,不闪烁
delay_n10us(10); LCD_write_command(0x06);//设定输入方式,增量不移位
delay_n10us(10); LCD_write_command(0x01);//清除屏幕显示
delay_n10us(100); //延时清屏,延时函数,延时约n个10us
}
void LCD_write_command(uchar dat)
{
delay_n10us(10);
LCD_RS=0; //指令
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat; delay_n10us(10); //实践证明,LCD1602上,用for循环1次就能完成普通写指令。
LCD_E=0; delay_n10us(10); //实践证明,LCD1602上,用for循环1次就能完成普通写指令。
}
void LCD_write_data(uchar dat)
{
delay_n10us(10);
LCD_RS=1; //数据
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat; delay_n10us(10);
LCD_E=0; delay_n10us(10);
}
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
void LCD_disp_str(uchar x,uchar y,uchar *str)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
while(*str!='\0')
{
LCD_write_data(*str);
str++;
}
}
void delay_n10us(uint n) //延时
{
uint i;
for(i=n;i>0;i--)
{
nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
//按键扫描
void Key_()
{
if(S0==0)//当前时间小时+
{
if(flag_KEY==1)
{
flag_KEY=0;
if(DQHour<23)
{
DQHour++;
}
}
}
if(S1==0)//当前时间小时-
{
if(flag_KEY==1)
{
flag_KEY=0;
if(DQHour>0)
{
DQHour--;
}
}
}
if(S2==0)//当前时间分钟+
{
if(flag_KEY==1)
{
flag_KEY=0;
if(DQFen<59)
{
DQFen++;
}
}
}
if(S3==0)//当前时间分钟-
{
if(flag_KEY==1)
{
flag_KEY=0;
if(DQFen>0)
{
DQFen--;
}
}
}
if(S4==0)//当前时间秒+
{
if(flag_KEY==1)
{
flag_KEY=0;
if(DQMiao<59)
{
DQMiao++;
}
}
}
if(S5==0)//当前时间秒-
{
if(flag_KEY==1)
{
flag_KEY=0;
if(DQMiao>0)
{
DQMiao--;
}
}
}
if(S6==0)//打铃时间小时+
{
if(flag_KEY==1)
{
flag_KEY=0;
if(TabHour[n]<23)
{
TabHour[n]++;
}
}
}
if(S7==0)//打铃时间小时-
{
if(flag_KEY==1)
{
flag_KEY=0;
if(TabHour[n]>0)
{
TabHour[n]--;
}
}
}
if(S8==0)//打铃时间分钟+
{
if(flag_KEY==1)
{
flag_KEY=0;
if(TabMin[n]<23)
{
TabMin[n]++;
}
}
}
if(S9==0)//打铃时间分钟-
{
if(flag_KEY==1)
{
flag_KEY=0;
if(TabMin[n]>0)
{
TabMin[n]--;
}
}
}
if(S10==0)//打铃时间秒+
{
if(flag_KEY==1)
{
flag_KEY=0;
if(TabSec[n]<59)
{
TabSec[n]++;
}
}
}
if(S11==0)//打铃时间秒-
{
if(flag_KEY==1)
{
flag_KEY=0;
if(TabSec[n]>0)
{
TabSec[n]--;
}
}
}
if(S13==0)
{
if(flag_KEY==1)
{
flag_KEY=0;
if(n<7)
{
n++;
}
}
}
if(S12==0)
{
if(flag_KEY==1)
{
flag_KEY=0;
if(n>0)
{
n--;
}
}
}
if(S0&&S1&&S2&&S3&&S4&&S5&&S6&&S7&&S8&&S9&&S10&&S11&&S12&&S13)//全部按键松开
{
flag_KEY=1;
}
}
/**********************************************************************************************************/
//主函数
void main(void)
{
FMQ=0;
TIM0init();
LCD_init();
LCD_disp_str(0,1,"Time "); //当前时间显示
LCD_disp_str(0,2,"Save1 "); //打铃时间显示
while(1)
{
Key_(); //扫描按键
//LCD显示
LCD_disp_char(8,1,DQHour/10+'0');
LCD_disp_char(9,1,DQHour%10+'0');
LCD_disp_char(10,1,':');
LCD_disp_char(11,1,DQFen/10+'0');
LCD_disp_char(12,1,DQFen%10+'0');
LCD_disp_char(13,1,':');
LCD_disp_char(14,1,DQMiao/10+'0');
LCD_disp_char(15,1,DQMiao%10+'0');
LCD_disp_char(4,2,(n+1)+'0');
LCD_disp_char(8,2,TabHour[n]/10+'0');
LCD_disp_char(9,2,TabHour[n]%10+'0');
LCD_disp_char(10,2,':');
LCD_disp_char(11,2,TabMin[n]/10+'0');
LCD_disp_char(12,2,TabMin[n]%10+'0');
LCD_disp_char(13,2,':');
LCD_disp_char(14,2,TabSec[n]/10+'0');
LCD_disp_char(15,2,TabSec[n]%10+'0');
//打铃判断
if(DQHour==TabHour[n] && DQFen==TabMin[n] && DQMiao==TabSec[n])
{
bBell=1;
}
//---------------1ms---------------
if(Time01ms>=10)
{
Time01ms=0;
Time1ms++;
//---------------1s---------------
if(Time1ms>=50)
{
Time1ms=0;
if(bBell==1)
{
BellTime++;
flash=~flash;
if(flash)FMQ=0;
else FMQ=1;
if(BellTime>=30)
{
bBell=0;
BellTime=0;
}
}
else
{
FMQ=0;
}
//当前时间计时
if(DQMiao<59)
{
DQMiao++;
}
else
{
DQMiao=0;
if(DQFen<59)
{
DQFen++;
}
else
{
DQFen=0;
if(DQHour<23)
{
DQHour++;
}
else
{
DQHour=0;
}
}
}
}
}
}
}
评论0