#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k0=P2^0; //光标移位
sbit k1=P2^1; //加
sbit k2=P2^2; //减
uchar code table0[]=" 2011-03-31 4";
uchar code table1[]=" 20:00:00";
uchar i,tcnt,shi,fen,miao,year,month,day,k0_keycnt;
uchar year=11;
uchar month=2;
uchar day=7;
uchar week=5;
uchar count0,count1;
sbit Kint0=P3^2;
sbit Kint1=P3^3;
sbit LED =P3^6;
sbit beep =P3^7;
//这三个引脚参考资料
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
void delay(uchar x)
{
uchar a;
while(x--)
for(a=120;a>0;a--);
}
void write_command(uchar tempdata)
{
E=0;
delay(5);
RS=0;
delay(5);
RW=0;
P0=tempdata;
delay(5);
E=1;
delay(5);
E=0;
}
void write_data(uchar tempdata)
{
E=0;
delay(5);
RS=1;
delay(5);
RW=0;
P0=tempdata;
delay(5);
E=1;
delay(5);
E=0;
}
void L1602_init(void)
{
write_command(0x38);
write_command(0x0c);
write_command(0x01);
write_command(0x06);
write_command(0x80); //第一行液晶显示
for(i=0;i<16;i++)
{
write_data(table0[i]);
}
write_command(0xc0); //第二行液晶显示
for(i=0;i<12;i++)
{
write_data(table1[i]);
}
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
void write_week(uchar addr,uchar temp)//nyr代表“年月日”
{
uchar wek;
wek=temp%10;
write_command(0x80+addr); //写命令,从这个地址开始
write_data(0x30+wek);
}
void write_nyr(uchar addr,uchar temp)//nyr代表“年月日”
{
uchar s,g;
s=temp/10;
g=temp%10;
write_command(0x80+addr); //写命令,从这个地址开始
write_data(0x30+s);
delay(5);
write_data(0x30+g);
}
void write_sfm(uchar addr,uchar temp)//sfm代表“时分秒”
{
uchar shi,ge;
shi=temp/10;
ge=temp%10;
write_command(0xc0+addr); //写命令,从这个地址开始
write_data(0x30+shi);
write_data(0x30+ge);
}
void timer0() interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tcnt++;
if(tcnt==18) //1s定时
{
tcnt=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
day++;
week++;
if(week==8)
{
week=1;
}
write_week(15,week);
if(day==31)
{
day=0;
month++;
if(month==13)
{
month=0;
year++;
if(year==100)
{
year=0;
}
write_nyr(5,year);
}
write_nyr(8,month);
}
write_nyr(11,day);
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
void keyscan()
{
if(k0==0) //..................//光标移位
{
delay(10);
if(k0==0)
{
k0_keycnt++;
while(!k0); //松手之后开始执行定时器停止,光标闪烁
if(k0_keycnt==1) //功能按键暂停/运行键被按键第1下
{
TR0=0;
write_command(0xc0+11);//指针指到“秒”钟个位处
write_command(0x0e); //光标开不闪烁,此处不设置闪烁,闪烁不好看
}
if(k0_keycnt==2) //功能按键暂停/运行键被按键第2下
{
write_command(0xc0+8); //指针指到“分”钟个位处 /*uchar code table1[]=" 00:00:00";*/
}
if(k0_keycnt==3) //功能按键暂停/运行键被按键第3下
{
write_command(0xc0+5); //指针指到“时”钟个位处
}
if(k0_keycnt==4)
{
write_command(0x80+15);//指针指到“周”的位置
}
if(k0_keycnt==5) //功能按键暂停/运行键被按键第4下
{
write_command(0x80+12);//指针指到“日”的个位处
}
if(k0_keycnt==6) //功能按键暂停/运行键被按键第5下
{
write_command(0x80+9); //指针指到“月”的个位处 /*uchar code table0[]=" 2011-02-07";*/
}
if(k0_keycnt==7) //功能按键暂停/运行键被按键第6下
{
write_command(0x80+6); //指针指到“年”的个位处
}
if(k0_keycnt==8) //功能按键暂停/运行键被按键第7下,暂停取消,继续运行时钟
{
k0_keycnt=0;
write_command(0x0c); //光标关,继续运行时钟
TR0=1;
}
}
}
if(k0_keycnt!=0)
{
if(k1==0) //加“1”键盘,检测k1是否有键按下?
{
delay(10);
if(k1==0)
{
while(!k1); //等待k1键松开之后开始执行按键之后的程序
if(k0_keycnt==1) //秒设置
{
miao++;
if(miao==60)
{
miao=0;
}
write_sfm(10,miao);
write_command(0xc0+11);
}
if(k0_keycnt==2) //分设置 /*uchar code table1[]=" 00:00:00";*/
{
fen++;
if(fen==60)
{
fen=0;
}
write_sfm(7,fen);
write_command(0xc0+8);
}
if(k0_keycnt==3) //时设置
{
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
write_command(0xc0+5);
}
if(k0_keycnt==4) //周设置
{
week++;
if(week==8)
{
week=1;
}
write_week(15,week);
write_command(0x80+15);
}
if(k0_keycnt==5) //日设置
{
day++;
if(day==31)
{
day=0;
}
write_nyr(11,day);
write_command(0x80+12);
}
if(k0_keycnt==6) //月设置 /*uchar code table0[]=" 2011-02-07 5";;*/
{
month++;
if(month==12)
{
month=0;
}
write_nyr(8,month);
write_command(0x80+9);
}
if(k0_keycnt==7) //年设置
{
year++;
if(year==100)
{
year=0;
}
write_nyr(5,year);
write_command(0x80+6);
}
}
}
if(k2==0) //................... //减号键盘
{
delay(10);
if(k2==0)
{
while(!k2);
if(k0_keycnt==1) //秒设置
{
miao--;
if(miao==-1)
{
miao=59;
}
write_sfm(10,miao);
write_command(0xc0+11);
}
if(k0_keycnt==2) //分设置 /*uchar code table1[]=" 00:00:00";*/
{
fen--;
if(fen==-1)
{
fen=59;
}
write_sfm(7,fen);
write_command(0xc0+8);
}
if(k0_keycnt==3) //时设置
{
shi--;
if(shi==-1)
{
shi=23;
}
write_sfm(4,shi);
write_command(0xc0+5);
}
if(k0_keycnt==4) //周设置
{
week--;
if(week==0)
{
week=7;
}
write_week(15,week);
write_command(0x80+15);
}
if(k0_keycnt==5) //天设置
{
day--;
if(day==-1)
{
day=30;
}
write_nyr(11,day);
write_command(0x80+12);
}
if(k0_keycnt==6) //月设置 /*uchar code table0[]=" 2011-02-07 5";*/
{
month--;
if(month==-1)
{
month=12;
}
write_nyr(8,month);
write_command(0x80+9);
}
if(k0_keycnt==7) //年设置
{
year--;
if(year==-1)
{
year=99;
}
write_nyr(5,year);
write_command(0x80+6);
}
}
}
}
}
void init() //初始化子函数
{
P2 = 0x0f; //使灯灭
P1 = 0x00;
ET0 = 1; //外部中断0请求触发方式
ET1 = 1; //外部中断1请求触发方式
IE = 0x87;//EA=1;EX1=0;EX0=1,ET0=1;
IP = 0x07;
}
void external_int0() interrupt 0
{
count0++;
if(count0==1)
{
if(Kint0==0)
{
while(!Kint0); //等待键放松
delay(5);
P1=0x3f; //数码管显示0
for(i=0;i<50;i++)//LED灯闪烁一段时间
{
LED=~LED;
delay(50);
}
count0=0; //按键计数清零
P1=0x00; //灭灯
P2=P2|0x0f; //灭灯
LED=1; //灭灯
}
}
}
void external_int1() interrupt 2
{
count1++;
if(count1==1)
{
if(Kint1==0)
{
while(!Kint1);
delay(5);
P1=0x06;
for(i=0;i<50;i++)
{
beep=~beep;
delay(50);
}
count1=0;
P1=0x00;
P2=P2|0x0f;
beep=1;
}
}
}
void main()
{
init();
L1602_init();
while(1)
{
keyscan();
}
}
单片机实验报告(简易报警器加简易数字时钟)
需积分: 13 108 浏览量
2011-04-19
18:28:21
上传
评论 2
收藏 3.41MB RAR 举报
YLIMHHMILY
- 粉丝: 158
- 资源: 50
最新资源
- 最入门的爬虫代码 python.docx
- 爬虫零基础入门-爬取天气预报.pdf
- 最通俗易懂的 MongoDB 非结构化文档存储数据库教程.zip
- 以mongodb为数据库的订单物流小项目.zip
- 腾讯云-mongodb数据库, 项目部署.zip
- 腾讯 APIJSON 的 MongoDB 数据库插件.zip
- 理解非关系型数据库和关系型数据库的区别.zip
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
- SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈