/**************************************************************************************
程序功能:在8个数码管上显示时间(24小时制),包含时、分、秒各2位,共6位,时分秒之间
用短横隔开,可以使用按键对各位进行调时校准,被调整的那位所对应的数码管会闪烁,被调整的
位循环方向可以左移也可以右移,调整的数值可加可减。
***************************************************************************************/
#include "reg52.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用来存放按键扫描读取到的键值
//预设时间各位数值,这里设置23:59:55是为了尽快观察进制变化是否正常
u8 a=2; //小时,十位
u8 b=3; //小时,个位
u8 c=5; //分钟,十位
u8 d=9; //分钟,个位
u8 e=5; //秒,十位
u8 f=5; //秒,个位
u16 smgwei[8]={2,3,10,5,9,10,5,5};//8位数码管对应的段码,10在smgduan数组中对应smgduan[10]=0x40,显示到数码管上是中间的一短横
u8 setwei=0; //调整时间各位的位置参数,默认为0,即不调整任何位。
u16 times[8];//循环次数累计,累计指令条数,粗略估算时间,控制被调整位闪烁频率。
u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//数码管段选,显示0~9的值
0x40};//0x40数码管显示是短横
void delay(u16 i) //延时子函数
{
while(i--);
}
void sub() //调整时间数值,数值减小
{
switch(setwei) //先判断调整时间中的哪一位,然后被选中位的数值自减
{ //减法可能越界,所以需要根据不同各位的进制来控制越界
case(1):smgwei[0]--;if(smgwei[0]==-1) smgwei[0]=2;break;
case(2):smgwei[1]--;if(smgwei[0]==0&&smgwei[1]==-1)
{smgwei[1]=3;smgwei[0]=2;}
else if(smgwei[1]==-1)
{smgwei[1]=9;smgwei[0]