电子钟显示时分秒c语言程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bit ampm=1;// 0:上午(am),1:下午(pm),初值下午
char hour=11;//来自百度文库明时,初值为11点
char minute=59;//声明分,初值为59分
char second=50;//声明秒,初值为50秒
void transfer(void);//转换时分秒至time阵列中
time[3]= minute/10 + 0x30;//分数之十位数显示资料
time[4]= minute%10 + 0x30;//分数之个位数显示资料
time[5]= ':';//显示冒号
time[6]= second/10 + 0x30;//秒数之十位数显示资料
time[7]= second%10 + 0x30;//秒数之个位数显示资料
void write_inst(char);//写入指令函数
void write_char(char);//写入字元函数
void write_pat(void);//写入自建字型函数
void check_BF(void);//检查忙碌函数
void init_LCM(void);//声明LCM初始设定函数
{
TR0=0;
delay(20);
if(INCH==1)
hour=hour+1;
if (hour == 13)//是否达到13小时
hour=1;//时数改为1
if (hour == 12)//是否达到12小时
ampm=~ampm;//切换上下午
TR0=1;
}
//外中断1,分加1
void int_1(void)interrupt 2
{
TR0=0;
delay(20);
if(INCM==1)
minute=minute+1;
if (minute>=60)//是否达到60分
{minute=0;//分数归零
hour++;//时数加1
if (hour == 13)//是否达到13小时
hour=1;//时数改为1
if (hour == 12)//是否达到12小时
second++;//秒数加1
if (second>=60)//是否达到60秒
{second=0;//秒数归零
minute++;//分数加1
if (minute>=60)//是否达到60分
{minute=0;//分数归零
hour++;//时数加1
if (hour == 13)//是否达到13小时
hour=1;//时数改为1
ampm=~ampm;//切换上下午
}
TR0=1;
}
//T0中断
void clock(void)interrupt 1
{TH0=(56636-50000)/256;//填入计时量
TL0=(56636-50000)%256;//填入计时量
if (--count==0)//中断次数是否达到20次
{count=20;//重新计次
write_inst(0x01);//清除显示幕(填0x20,I/D=1)
write_inst(0x06);//输入模式-位址递增-关显示幕
write_inst(0x0c);//显示功能-开显示幕-无游标-游标不闪
}
//LCD写入指令函数
void write_inst(char inst)
{
E=0;//写入指令至LCM
E=0;
}
void delay(int x)
{
int a,b;
for(a=0;a<x;a++)
for(b=0;b<120;b++);
}
if (hour == 12)//是否达到12小时
ampm=~ampm;//切换上下午
}}}}
//LCD初始化
void init_LCM(void)
{write_inst(0x30);//设定功能-8位元-基本指令
write_inst(0x38);//英文LCM设定两列
write_inst(0x08);//显示功能-关显示幕-无游标-游标不闪
sbit E = P2^5;//致能位元(0:禁能,1:致能)
sbit BF = P0^7;//忙碌检查位元(0:不忙,1:忙碌)
charcount=20;//中断次数计数,20次*50ms=1秒
chartime0[]="CLOCK"; //显示时间阵列(第1行)
chartime[11];//显示时间阵列(第2行)
RS=0;
RW=0;
E=1;
LCDP=inst;// LCM读入MPU指令
delay(3);
E=0;
}
//LCD写入数据
void write_char(char chardata)
{
E=0;//写入数据至LCM
RS=1;
RW=0;
E=1;
LCDP=chardata;// LCM读入字元
delay(3);
void delay(int);//去抖函数
main()
{char i;
init_LCM();//初始设定
IE=0X87;// T0、INT0、INT1中断使能
TMOD=0x01;// T0设为MODE1
TH0=(56636-50000) / 256;//填入计时量之高位元组
TL0=(56636-50000) % 256;//填入计时量之低位元组
for (i=0;i<11;i++)
write_char(time[i]);//显示时间
}
}
//转换函数
void transfer(void)
{time[0]= hour/10 + 0x30;//时数之十位数显示资料
time[1]= hour%10 + 0x30;//时数之个位数显示资料
time[2]= ':';//显示冒号
/*电子钟显示时分秒*/
#include <reg51.h>
sbit INCH=P3^2;//小时加1
sbit INCM=P3^3;//分钟加1
#define LCDP P0//定义LCM接至P0
sbit RS = P2^7;//暂存器选择位元(0:指令,1:资料)
sbit RW = P2^6;//设定读写位元(0:写入,1:读取)
TR0=1;//启动Timer 0
write_inst(0x85);//指定第1列位置
for (i=0;i<5;i++)
write_char(time0[i]); //显示CLOCK
while(1)
{transfer();//转换时分秒至time阵列中
write_inst(0xC0);//指定第2列位置
time[8]=' ';//0x00;//自键字型之高位元组
if (ampm==0)//判定是否为上午
{
time[9]=0x41;//表示上午AM
time[10]=0x4D;
}
else
{
time[9]=0x50;//表示下午PM
time[10]=0x4D;
}
}
//外中断0,时加1
void int_0(void)interrupt 0
相关文档
最新文档