📄 z_ht1380.c
字号:
if (keyWord==0x3c)//加
{
dataTime[2]++;
dataTime[2]=dataTime[2]%24;
}
if (keyWord==0x3d)//减
{
if (dataTime[2]==0){dataTime[2]=24;}
dataTime[2]--;
}
dispChange();
}
if (setSt==1)//minute
{
if (keyWord==0x3c)
{
dataTime[1]++;
dataTime[1]=dataTime[1]%60;
}
if (keyWord==0x3d)
{
if(dataTime[1]==0){dataTime[1]=60;}
dataTime[1]--;
}
dispChange();
}
if (setSt==2)//second
{
if (keyWord==0x3c)
{
dataTime[0]++;
dataTime[0]=dataTime[0]%60;
}
if (keyWord==0x3d)
{
if(dataTime[0]==0){dataTime[0]=60;}
dataTime[0]--;
}
dispChange();
}
}break;
case 1://修改年、月、日
{
if (setSt==0)//年
{
if (keyWord==0x3c)
{
dataTime[6]++;
dataTime[6]=dataTime[6]%100;
}
if (keyWord==0x3d)
{
if(dataTime[6]==0){dataTime[6]=100;}
dataTime[6]--;
}
dispChange();
}
if (setSt==1)//月
{
if (keyWord==0x3c)
{
dataTime[4]=dataTime[4]%12;
dataTime[4]++;
}
if (keyWord==0x3d)
{
dataTime[4]--;
if (dataTime[4]<=0){dataTime[4]=12;}
}
dispChange();
}
if (setSt==2)//日
{
if (keyWord==0x3c)
{
if ((dataTime[6]%4==0)&&(dataTime[4]==2))
dataTime[3]=dataTime[3]%29;
else dataTime[3]=dataTime[3]%(nowDate[dataTime[4]]);
dataTime[3]++;
}
if (keyWord==0x3d)
{
dataTime[3]--;
if (dataTime[3]<=0)
{
dataTime[3]=(nowDate[dataTime[4]]);
if((dataTime[6]%4==0)&&(dataTime[4]==2))
{dataTime[3]=29;}
}
}
dispChange();
}
}break;
default:;
}
}
/*-------------------------------------------------------------
** 函数名:changeDay
** 格式: void changeDay()
** 返回值: 无
** 描述:日期的变化,以2000年为基准
** 算法:先判断当年是否为闰年,当前月是在二月之前还是之后,
** 根据以上条件算出天数,对7取余加上基准星期再对7取余。
**-------------------------------------------------------------
*/
void changeDay()//日期的变化,以2000年为基准
{
unsigned int year,temp,i;//星期确定
i=0;
temp=dataTime[6]*365;//天数
for(year=0;year<dataTime[6];year++)//闰日的天数;以2000的100年。
{
if(year%4==0) i++;
}
temp=(temp+i+dataTime[3]);
if ((dataTime[6]%4==0)&&(dataTime[4]>2))
{temp=temp+1;}//二月后当年如是闰年天数加一
for(i=1;i<dataTime[4];i++)//当月之前的天数相加
{temp+=nowDate[i];}
dataTime[5]=(temp%7+5)%7;//算星期
if (dataTime[5]==0)dataTime[5]=7;
dayW();
}
/*-------------------------------------------------------------
** 函数名:mSecond
** 格式: void mSecond()
** 返回值: 无
** 描述:时间延时
** 算法:嵌套循环产生时间延时
**-------------------------------------------------------------
*/
void mSecond(unsigned char x) //延迟x ms
{
unsigned char i;
while(x--)
{
for (i=0;i<125;i++){;}
}
}
/*-------------------------------------------------------------
** 函数名:getKey
** 格式: void getKey()
** 返回值: 无
** 描述:判是否有键按下.
** 算法:读状态口是否有键按下,有键值不为0.
** 再读FIFO RAM命令,查表的键值.
**-------------------------------------------------------------
*/
void getKey()
{
keyWord=0;
keyWord=(z8279&0x0f);//读状态口是否有键按下,有键值不为0
if(keyWord!=0x00)
{
z8279=0x40;//读FIFO RAM命令
keyWord=(d8279&0x3f);
keyWord=key[keyWord];
}
}
/*-------------------------------------------------------------
** 函数名:opKey2
** 格式: void opKey2()
** 返回值: 无
** 描述:判定是SET键、+键、-键?
** 算法:对键值进行判断为0x3b:SET键,0x3c:+键,0x3d:-键
**-------------------------------------------------------------
*/
void opKey2()
{
getKey();
if(keyWord==0x3b)
{
setSt++;
if((dataTime[6]%4==0)&&(dataTime[4]==2))
{
if(dataTime[3]>29)
{dataTime[3]=1;}
}
else if(dataTime[3]>nowDate[dataTime[4]])
{dataTime[3]=1;}//当上次修改的天数大于现要的天数,使值为1
}
if(keyWord==0x3c||keyWord==0x3d)
{
AddSubb();
notRead=1;
}
}
/*-------------------------------------------------------------
** 函数名:flicker
** 格式: void flicker()
** 返回值: 无
** 描述:显示闪烁,并判断键值。
** 算法:数码管显示,延迟
** 数码管灭,延迟同时判是否有键按下
**-------------------------------------------------------------
*/
void flicker()
{
if(notRead==0)rd1380D();
dispChange();//亮
mSecond(200);
opKey2();
disp[num]=0x1a;//灭
disp[num+1]=0x1a;
display();
mSecond(200);
opKey2();
}
/*-------------------------------------------------------------
** 函数名:enterSet
** 格式: void enterSet()
** 返回值: 无
** 描述:读键以修改内容
** 算法:判断setSt=0/1/2;进入不同的处理内容。
**-------------------------------------------------------------
*/
void enterSet()
{
while(setSt==0)
{
num=6;
flicker();
}
dispChange();
while(setSt==1)
{
num=3;
flicker();
}
dispChange();
while(setSt==2)
{
num=0;
flicker();
}
}
/*-------------------------------------------------------------
** 函数名:opKey
** 格式: void opKey()
** 返回值: 无
** 描述:判断是MODE键、SET键
** 算法:对键值进行判断为0x3a:MODE,键0x3b:SET键。进入不同的处理内容
**-------------------------------------------------------------
*/
void opKey()
{
getKey();
if(keyWord==0x3a)
{
modeSt++;
modeSt=modeSt%3;
if(modeSt==2) changeDay();
}
if(keyWord==0x3b)
{
setSt=0;
if(modeSt==2){setSt=3;}
while(setSt<=2)
{
enterSet();
}
if (setSt==3)
{
if(modeSt==0) hmsW();
if(modeSt==1) ymdW();
notRead=0;
}
}
}
/*-------------------------------------------------------------
** 函数名:sta8279
** 格式: void sta8279()
** 返回值: 无
** 描述:8279初始化
** 算法:将显示方式、扫描速率、和清除命令送命令/状态口
**-------------------------------------------------------------
*/
void sta8279() //初始化8279
{
z8279=0x00; //00表示左键输入,八位字符显示,双键锁定
z8279=0x2f; //2f表示键盘扫描速率
z8279=0xc1; //C1清除显示RAM
}
/*-------------------------------------------------------------
** 函数名:main
** 格式: void main()
** 返回值: 无
** 描述:主程序
** 算法:初始化,循环调用读1380数据,LED显示和判键处理。
**-------------------------------------------------------------
*/
void main()
{
sta8279();
rest=0;
secondR();//读秒值以判断是否要初始化
if ((x1&0x80)==0x80)//如D7是1,则需初始化
{
x1=x1&0x7f;//x1b7=0;
dataTime[0]=x1;
if(x1>0x59) dataTime[0]=0;
start1380();
}
while(1)
{
rd1380D();
dispChange();
opKey();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -