RS BIT P2.0 //重命名IO口
RW BIT P2.1
E BIT P2.2
BF BIT P3.7 //D0~D7接在P3口
K1 BIT P1.0
K2 BIT P1.1
K3 BIT P1.2
K4 BIT P1.3
NOP
MOV TMOD ,#11H //设定时器0和1工作在圆闭毁定时方式一
MOV IE,#8AH
SETB TR0
AJMP L0
JS: MOV TH0,#0BH //定时器中断0
MOV TL0,#0DCH
INC R7 //R7为秒的个位
CJNE R7,#160,JW
INC R6 //R6为秒的十位
CPL P2.4 /态做/LED每过10秒状态变一下
AJMP L1
JW: RETI
INC R7 //定时器中断1
CJNE R7,#2,JW
MOV R7,#0
INC @R0
CJNE R5,#3AH,L3 //R5为分的个位
MOV R5,#48
INC R4
#include <reg52.h>#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code table[]="2000:01:01Week:W"//
uchar code table1[]="T:00:00:00#00:00"
sbit lcd_rs=P2^6//定义LCD端尘竖态口
sbit lcd_rw=P3^6
sbit lcd_en=P2^5
sbit k1=P3^2//菜单键光纤宴标位
sbit k2=P3^3//加键
sbit k3=P3^4//减键
sbit k4=P3^5//退出键
//sbit werr=P3^2
sbit DUAN=P2^0//数码管段
sbit WEI=P2^1//数码管位
void yue31()//大月
void yue30()//小月
void yue29()//闰天
void yue28()//平月
//void timing()
//void Timing()
void week7()
void wei_1()
{
WEI=1
P0=0
WEI=0
}
void duan_1()
{
DUAN=1
P0=0
DUAN=0
}
uchar count, k1num//声明秒的变量
char shi,fen,miao//声明时分秒
uint nian, yue,ri,week//声明年月日星期
uchar f,s,n//定时器/
void delay(uchar z)//延时函数
{
uchar x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void write_com(uchar com)//lcd写指令
{
lcd_rs=0
lcd_rw=0
lcd_en=0
P0=com
delay(5)
lcd_en=1
delay(5)
lcd_en=0
}
void write_data(uchar date)//lcd写数据
{
lcd_rs=1
lcd_rw=0
lcd_en=0
P0=date
delay(5)
lcd_en=1
delay(5)
lcd_en=0
}
void write_week(uchar add,uchar date)//计算星期显示位
{
uchar ge
ge=date/1
write_com(0x80+0x00+add)
write_data(0x30+ge)
}
void write_tim(uchar add,uchar date)
{
uchar ge
ge=date/1
write_com(0x80+0x40+add)
write_data(0x30+ge)
}
void write_fsm(uchar add,uchar date)//计算时分秒位
{
uchar shi,ge
shi=date/派源10
ge=date%10
write_com(0x80+0x40+add)
write_data(0x30+shi)
write_data(0x30+ge)
}
void write_nyr(uchar add,uchar date)//计算月日位
{
uint shi,ge
shi=date/10
ge=date%10
write_com(0x80+0x00+add)
write_data(0x30+shi)
write_data(0x30+ge)
}
void write_nian(uchar add,uchar date)//计算年位,年是百位
{
uint bai,shi,ge
bai=date/100%10
shi=date/10
ge=date%10
write_com(0x80+0x00+add)
write_data(0x30+bai)
write_data(0x30+shi)
write_data(0x30+ge)
}
void jiaxian()//设置键盘加显
{
if(k1num!=0)
{
if(k2==0)
{
delay(5)
if(k2==0)
{
while(!k2)
if(k1num==1)
{
miao++
if(miao==60)
miao=0
write_fsm(8,miao)
write_com(0x80+0x40+8)
}
if(k1num==2)
{
fen++
if(fen==60)
fen=0
write_fsm(5,fen)
write_com(0x80+0x40+5)
}
if(k1num==3)
{
shi++
if(shi==24)
shi=0
write_fsm(2,shi)
write_com(0x80+0x40+2)
}
if(k1num==4)
{
ri++
if(ri==31)
ri=1
write_nyr(8,ri)
write_com(0x80+0x00+8)
}
if(k1num==5)
{
yue++
if(yue==12)
yue=1
write_nyr(5,yue)
write_com(0x80+0x00+5)
}
if(k1num==6)
{
nian++
if(nian==999)
nian=0
write_nian(1,nian)
write_com(0x80+0x00+1)
}
if(k1num==7)
{
week++
if(week>7)
week=1
write_week(15,week)
write_com(0x80+0x00+15)
}
if(k1num==8)
{
s++
if(s==24)s=0
write_fsm(11,s)
write_com(0x80+0x40+11)
}
if(k1num==9)
{
f++
if(f==59)f=0
write_fsm(14,f)
write_com(0x80+0x40+14)
}
if(k1num==10)
{
n++
if(n==3)
n=1
write_tim(0,n)
write_com(0x80+0x40+0)
}
}
}
}
}
void jianxian()//设置键盘减显
{
if(k1num!=0)
{
if(k3==0)//K3设置
delay(5)
if(k3==0)
{
while(!k3)
if(k1num==1)
{
miao--
if(miao==-1)
miao=59
write_fsm(11,miao)
write_com(0x80+0x40+11)
}
if(k1num==2)
{
delay(5)
fen--
if(fen==-1)
fen=59
write_fsm(8,fen)
write_com(0x80+0x40+8)
}
if(k1num==3)
{
shi--
if(shi==-1)
shi=23
write_fsm(5,shi)
write_com(0x80+0x40+5)
}
}
}
}
void keyk4()//K4是锁定
{
if(k4==0)
{
delay(5)
if(k4==0)
TR0=1
{
while(!k4)
k1num=0
write_com(0x0c)
}
}
}
void keyk1()//菜单光标设置
{
if(k1==0)
{
delay(5)
if(k1==0)
{
while(!k1)
k1num++
TR0=0
if(k1num==1)
{
write_com(0x80+0x40+8)
write_com(0x0f)
}
if(k1num==2)
{
write_com(0x80+0x40+5)
}
if(k1num==3)
{
write_com(0x80+0x40+2)
}
if(k1num==4)
{
write_com(0x80+0x00+8)
}
if(k1num==5)
{
write_com(0x80+0x00+5)
}
if(k1num==6)
{
write_com(0x80+0x00+1)
}
if(k1num==7)
{
write_com(0x80+0x00+18)
}
if(k1num==8)
{
write_com(0x80+0x40+11)
}
if(k1num==9)
{
write_com(0x80+0x40+14)
}
if(k1num==10)
{write_com(0x80+0x40+0)}
}
}
jiaxian()
//jianxian()
keyk4()
}
void init()//启动 LCD初始化数据
{
uchar num
lcd_rs=0
lcd_en=0
shi=0
fen=0
miao=0
nian=0000
week=0x27
yue=1
ri=1
s=06
f=10
n=1
write_com(0x38)//不监察忙信号
write_com(0x0c)//显示开光标设置
write_com(0x06)//显示光标移动设置
write_com(0x01)//显示清屏
write_com(0x80)//数据指针
write_com(0x80+0x00)
for(num=0num<16num++)//延时15ms
{
write_data(table[num])//年月日的数据延时
delay(5)
}
write_com(0x80+0x40)
for(num=0num<16num++)
{
write_data(table1[num])//时的延时
delay(5)
}//时钟初始化设置
TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
}
void display()
{
if(count==18)//是秒是的时间
{
count=0
miao++
if(miao==60)
{
miao=0
fen++
if(fen==60)
{
fen=0
shi++
if(shi==24)
{
shi=0
ri++
week++
}
if(week>7){week=1}//计算星期日
if(yue==2)
{
if((nian%4==0&&nian%100!=0)|(nian%400==0))//计算闰年
{yue29()}
else {yue28()}
}
else if((yue==4)|(yue==6)|(yue==9)|(yue==11))//计算大小月
{
yue30()
}
else
{yue31()}
if(yue>12){yue=1nian++}
{
if(nian>999)
nian=0
write_nian(1,nian)
}
{
write_nyr(5,yue)
}
{
write_nyr(8,ri)
}
write_fsm(2,shi)
}
write_fsm(5,fen)
}
write_fsm(8,miao)
{
write_week(15,week)
}
{
write_fsm(11,s)
}
{
write_fsm(14,f)
}
{
write_tim(0,n)
}
}
}
void yue31()//大月变量
{
if(ri>31){ri=1yue++}
}
void yue30()//小月变量
{
if(ri>30){ri=1yue++}
}
void yue29()//闰天变量
{
if(ri>29){ri=1yue++}
}
void yue28()//平月变量
{
if(ri>28){ri=1yue++}
}
void week7()
{
if(week==7)week=0x27
}
void main()//主函数
{
wei_1()
duan_1()
init()
while(1)
{
keyk1()
display()
week7()
//Timing()
}
}
void time0() interrupt 1//中断子函数
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
count++//时钟
}
void Timing()//定时闹钟设置。
{ /*
if(n==1)
{
if(shi==s&&fen==f)
//werr=0
//else //werr=1
}
if(n==2)
{
if(shi==s&&fen==f)
//werr=1
} */
}
我也是网上找来的,忘记是在哪个博客了...
1、闹钟设置界面。2、存储响闹时间。谨卖仔
3、时间中断,设置读取时间的flag.
4、主程序中判断flag设置,读取时钟。
5、比较当前时钟在响闹时间范围内,输出闹配袭铃(如果是蜂鸣器,给他一个祥汪输出频率的信号)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)