⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 z_ht1380.c

📁 MCS-51单片机实验 39个实用实验和源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------------------
**
**  版权:上海航虹高科技有限公司,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 + -