求一个lcd1602电子时钟的设计

求一个lcd1602电子时钟的设计,第1张

/按你的仿橘备真图编写的

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、比较当前时钟在响闹时间范围内,输出闹配袭铃(如果是蜂鸣器,给他一个祥汪输出频率的信号)。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12493791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存