📄 cloke.c
字号:
//功能:电子表,暂时只能软件设置初值
#include<reg51.h>
#include<absacc.h>
/********便于简便***************/
#define uchar unsigned char
#define uint unsigned int
/***************这里设置程序初始化时显示的时间****************/
#define SET_HOUR 12 /*设置初始化小时*/
#define SET_MINUTE 00 /*设置初始化分钟*/
#define SET_SECOND 00 /*设置初始化秒数*/
/*************************系统地址****************************/
#define BASE_PORT 0x8000 /*选通基地址*/
#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/
#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/
#define LED_SEG BASE_PORT+4 /*数码管段选地址*/
#define LED_BIT BASE_PORT+2 /*数码管位选地址*/
#define LED_ON(X) XBYTE[LED_BIT]=(0x01<<X) /*6位led的位选通,带参数宏,参数为0~5=""*/
#define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*/
/**************在设置模式下对秒分时的宏定义*****************/
#define SECOND 0 /*对应数码管右边两位*/
#define MINUTE 1 /*对应数码管中间两位*/
#define HOUR 2 /*对应数码管左边两位*/
/**********************全局变量声明部分*********************/
unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/
unsigned char dispbuf[6]; /*显示缓冲区数组*/
unsigned char clockstr[6]; /*时间显示的数码管编码数组*/
uint itime=0;
struct{ /*时间结构体变量*/
uchar s;
uchar m;
uchar h;
}clock={SET_SECOND,SET_MINUTE,SET_HOUR};//被赋初值
/****************以下是所有子函数的声明*********************/
void update_clockstr(void);
void clockplus(void);
void display(void);
void update_dispbuf(unsigned char *str);
void deley(int i);
/**************************函数部分*************************/
void main(void)
{
TMOD=0x02; /*定时器0设置为工作方式2,基准定时250×2=500us=0.5ms*/
TH0=(256-250); /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/
TL0=6; /*定时器1中断服务留给秒表使用,产生1/100秒定时*/
ET0=1; //定时器0中断允许;
EA=1; //开cpu的中断;
TR0=1;
update_clockstr(); /*初始化时钟显示编码数组*/
update_dispbuf(clockstr); /*初始化显示缓冲数组*/
while(1)
{
display();
}
}
/**************************函数*************************/
void update_clockstr(void) /*更新时钟显示代码数组clockstr*/
{
clockstr[0]=led[clock.s%10]; /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/
clockstr[1]=led[(int)(clock.s/10)]; /*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/
clockstr[2]=led[clock.m%10]; /*以下类推*/
clockstr[3]=led[(int)(clock.m/10)];
clockstr[4]=led[clock.h%10];
clockstr[5]=led[(int)(clock.h/10)];
}
/**************************函数*************************/
void timer0(void) interrupt 1 using 1 /*定时器0中断服务器,用来产生1秒定时*/
{
itime++;
if(itime==2000) /*两千次计数为1S 2000×0.5ms=1s*/
{
itime=0; /*定时1s时间到,软计数清零*/
clockplus(); /*时间结构体变量秒数加1 */
update_clockstr(); /* 更新时间显示编码数组 */
//if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /* 用时间编码数组更新显示缓冲区 */
}
}
/**************************函数*************************/
void clockplus(void) /*时间加1s判断分,时子函数*/
{
if(++clock.s==60) /*秒位判断*/
{
clock.s=0;
if(++clock.m==60) /*分位判断*/
{
clock.m=0;
if(++clock.h==24) /*时位判断*/
{
clock.h=0;
}
}
}
}
/**************************函数*************************/
void display(void) /*刷新显示六位LED一次*/
{
unsigned char i;
for(i=0;i<6;i++)
{
LED_ON(i); /*选通相应位*/
XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/
deley(50); /*延时显示*/
LED_OFF; /*写LED全灭段码*/
}
}
/**************************函数*************************/
void update_dispbuf(unsigned char *str) /*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/
{
dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/
dispbuf[1]=str[1];
dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/
dispbuf[3]=str[3];
dispbuf[4]=str[4]|0x80;
dispbuf[5]=str[5];
}
/**************************函数*************************/
void deley(int i) /*延时子函数*/
{
while(i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -