📄 z_ht1380.c
字号:
/*-------------------------------------------------------------
**
** 版权:上海航虹高科技有限公司,2002年
**
** 文件名: HT1380b6.C
**
** 描述: 本文件与5196ET完成的实验程序。
** 更改: FOR EAT598实验机
**--------------------------------------------------------------
*/
/*-------------------------------------------------------------
** 文件包括
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
**
**
*/
#include <reg51.h> //定义51单片机特殊功能寄存器的值的标准头文件
#define XBYTE ((unsigned char volatile *) 0x020000L)
//#define CBYTE ((unsigned char volatile *) 0x050000L)
//#define DBYTE ((unsigned char volatile *) 0x040000L)
#define z8279 XBYTE[0xf239] //8279命令/状态口//
#define d8279 XBYTE[0xf238] //8279数据口//
sbit sclk=P1^0;
sbit io=P1^1;
sbit rest=P1^2;
unsigned char data x1; //used in HT1380读写
unsigned char data dti;
unsigned char data dataTime[8]; //数组用于读写时间数据
unsigned char data num;
unsigned char data disp[8];//显示
unsigned char data modeSt;//各种不同的状态
unsigned char data setSt;
unsigned char data comByte;
unsigned char data keyWord;//键处理
unsigned char data notRead;
unsigned char code nowDate[13]={00,31,28,31,30,31,30,31,31,30,31,30,31};//每一个月的天数从1开始
unsigned char code led[28]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
/* 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9*/
0x77,0x7c,0x39,0x5e,0x6e,0x40,
//a,b,c,d,e,y
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,
/* 0. , 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9.*/
0x00,0x80};
//., ,
unsigned char code key[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};
/*
/*-------------------------------------------------------------
** 函数定义
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
** 函数名:wr8Bit
** 格式: void wr8Bit()
** 返回值: 无
** 描述:x1写入ht11380 8位
** 算法:从低位一位一位传送,在SCLK上升沿输入
**-------------------------------------------------------------
*/
void wr8Bit() //写8位x1到HT1380,上跳沿,低位先输
{
unsigned char j;
for(j=0;j<8;j++)
{
if(x1&0x01)
io=1;
else io=0;
sclk=1;
sclk=0;
x1=x1>>1;
}
}
/*-------------------------------------------------------------
** 函数名:rd8Bit
** 格式: void rd8Bit()
** 返回值: 无
** 描述:读HT1380 8位到x1
** 算法:从低位一位一位传送,在SCLK下跳沿读出
**-------------------------------------------------------------
*/
void rd8Bit() //读HT1380 8位到x1,下跳沿,低位先输
{
unsigned char j;
x1=0;
for(j=0;j<8;j++)
{
sclk=1;
x1=x1>>1;
if(io==1)
x1+=0x80;
sclk=0;
}
}
/*-------------------------------------------------------------
** 函数名:rd1380D
** 格式: void rd1380D()
** 返回值: 无
** 描述:读寄存器的数据
** 算法:读命令写入1380,将八个寄存器的内容一起读。
**-------------------------------------------------------------
*/
void rd1380D()//read the data of 1380
{
rest=1;
x1=0xbf;
wr8Bit();
for(dti=0;dti<=0x06;dti++)
{
rd8Bit();
x1=((x1/16)*10)+(x1%16);
dataTime[dti]=x1;
}
rest=0;
}
/*-------------------------------------------------------------
** 函数名:secondR
** 格式: void secondR()
** 返回值: 无
** 描述:初始化时调用读秒以判定是否要对1380初始化。
** 算法:读秒命令写入1380,读出数据。
**-------------------------------------------------------------
*/
void secondR()
{
rest=1;
x1=0x81;
wr8Bit();
rd8Bit();
rest=0;
}
/*-------------------------------------------------------------
** 函数名:wr1380D1
** 格式: void wr1380D1()
** 返回值: 无
** 描述:写一个数据到1380
** 算法:写操作命令写入1380,写数据到1380
**-------------------------------------------------------------
*/
void wr1380D1() //写一个数据到1380
{
rest=1;
x1=comByte;
wr8Bit();
x1=((dataTime[dti]/10)<<4)|(dataTime[dti]%10);
wr8Bit();
rest=0;
}
/*-------------------------------------------------------------
** 函数名:hmsW
** 格式: void hmsW()
** 返回值: 无
** 描述:写时分秒到1380
** 算法:写操作命令写入1380,写数据到1380
**-------------------------------------------------------------
*/
void hmsW()//时分秒
{
comByte=0x84;//hour
dti=2;
wr1380D1();
comByte=0x82;//minute
dti=1;
wr1380D1();
comByte=0x80;//second
dti=0;
wr1380D1();
}
/*-------------------------------------------------------------
** 函数名:ymdW
** 格式: void ymdW()
** 返回值: 无
** 描述:写年月日到1380
** 算法:写操作命令写入1380,写数据到1380
**-------------------------------------------------------------
*/
void ymdW()//年月日
{
comByte=0x8c; //year
dti=6;
wr1380D1();
comByte=0x88; //month
dti=4;
wr1380D1();
comByte=0x86; //day
dti=3;
wr1380D1();
}
/*-------------------------------------------------------------
** 函数名:dayW
** 格式: void dayW()
** 返回值: 无
** 描述:写星期到1380
** 算法:写操作命令写入1380,写星期到1380
**-------------------------------------------------------------
*/
void dayW()//星期
{
comByte=0x8a;
dti=5;
wr1380D1();
}
/*-------------------------------------------------------------
** 函数名:start1380
** 格式: void start1380()
** 返回值: 无
** 描述:对HT1380初始化
** 算法:将初始命令写到1380
**-------------------------------------------------------------
*/
void start1380()//start 1380
{
rest=1;
x1=0x8e; //写操作且写保护
wr8Bit();
x1=0x00; //WP=0不写保护
wr8Bit();
rest=0;
rest=1;
x1=0x80; //写操作且写秒
wr8Bit();
x1=dataTime[0];
wr8Bit();
rest=0;
}
/*-------------------------------------------------------------
** 函数名:display
** 格式: void display()
** 返回值: 无
** 描述:显示
** 算法:显示的RAM地址加上位置偏移量,数据送8279数据口地址
** 循环8次使显示完全。
**-------------------------------------------------------------
*/
void display()
{
unsigned char num;//显示位置
num=0;
for(num==0;num<8;num++)//hms
{
z8279=0x80+num; //显示的RAM地址加上位置偏移量n
d8279=led[disp[num]]; //数据送8279数据口地址
}
}
/*-------------------------------------------------------------
** 函数名:dispChange
** 格式: void dispChange()
** 返回值: 无
** 描述:在不同模式下改变显示缓冲区
** 算法:将dataTime[]的值化成十位数和个位数,送显示缓冲区
** 再调用8279显示子程序。
**-------------------------------------------------------------
*/
void dispChange()
{
switch(modeSt)
{
case 0:
{
disp[0]=dataTime[0]%10;
disp[1]=dataTime[0]/10;
disp[2]=0x0f;//0x1b;
disp[3]=(dataTime[1]%10);
disp[4]=dataTime[1]/10;
disp[5]=0x0f;//0x1b;
disp[6]=(dataTime[2]%10);
disp[7]=dataTime[2]/10;
}break;
case 1:
{
disp[0]=dataTime[3]%10;
disp[1]=dataTime[3]/10;
disp[2]=0x0f;//0x1b;
disp[3]=(dataTime[4]%10);
disp[4]=dataTime[4]/10;
disp[5]=0x0f;//0x1a;
disp[6]=(dataTime[6]%10);
disp[7]=dataTime[6]/10;
}break;
case 2:
{
disp[0]=dataTime[5]%10;
disp[1]=dataTime[5]/10;
disp[2]=0x0f;
disp[3]=0x0f;
disp[4]=0x0f;
disp[5]=0x0e;
disp[6]=0x0a;
disp[7]=0x0d;
}break;
default:;
}
display();
}
/*-------------------------------------------------------------
** 函数名:AddSubb
** 格式: void AddSubb()
** 返回值: 无
** 描述:数据加、减
** 算法:先关读数据,判断在何种模式下modeSt=0/1?
** 在何种修改状态下setSt=0/1/?
** 然后判断是加号键还是减号键keyWord=3c/3d?
** 最后改变显示.
**-------------------------------------------------------------
*/
void AddSubb()//修改时钟内容+/-
{
switch (modeSt)
{
case 0://修改时、分、秒
{
if (setSt==0)//hour
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -