寄存器宏定义详解.docx
- 文档编号:13979010
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:44
- 大小:23.03KB
寄存器宏定义详解.docx
《寄存器宏定义详解.docx》由会员分享,可在线阅读,更多相关《寄存器宏定义详解.docx(44页珍藏版)》请在冰点文库上搜索。
寄存器宏定义详解
/******************寄存器宏定义********************/
#defineWRITE_DS1302_SECOND0X80//写入“秒”寄存器
#defineWRITE_DS1302_MINUTE0X82//写入“分”寄存器
#defineWRITE_DS1302_HOUR0X84//写入“小时”寄存器
#defineWRITE_DS1302_DAY0X86//写入“日”寄存器
#defineWRITE_DS1302_MONTH0X88//写入“月”寄存器
#defineWRITE_DS1302_WEEK0X8A//写入“星期”寄存器
#defineWRITE_DS1302_YEAR0X8C//写入“年”寄存器
#defineWRITE_DS1302_REINIT_ADDR0XC0//写入上电判断RAM寄存器
#defineREAD_DS1302_SECOND0X81//读出“秒”寄存器
#defineREAD_DS1302_MINUTE0X83//读出“分”寄存器
#defineREAD_DS1302_HOUR0X85//读出“小时”寄存器
#defineREAD_DS1302_DAY0X87//读出“日期”寄存器
#defineREAD_DS1302_MONTH0X89//读出“月”寄存器
#defineREAD_DS1302_WEEK0X8B//读出“星期”寄存器
#defineREAD_DS1302_YEAR0X8D//读出“年”寄存器
#defineREAD_DS1302_REINIT_ADDR0XC1//读出上电判断RAM寄存器
#defineWRITE_DS1302_Timing_Hour10XC2
#defineWRITE_DS1302_Timing_Min10XC4
#defineWRITE_DS1302_Timing_Hour20XC6
#defineWRITE_DS1302_Timing_Min20XC8
#defineWRITE_MODE_STA0XCA
#defineWRITE_WIN_STA0XCC
#defineREAD_DS1302_Timing_Hour10XC3
#defineREAD_DS1302_Timing_Min10XC5
#defineREAD_DS1302_Timing_Hour20XC7
#defineREAD_DS1302_Timing_Min20XC9
#defineREAD_MODE_STA0XCB
#defineREAD_WIN_STA0XCD
#defineDS1302_WRITE_PROTECT0X8E//写保护寄存器
#defineDS1302_Trickl_Charge0X90//慢速充电寄存器
/******************初始化日期时间宏定义********************/
//初始日期时间为“2011年10月09日星期日12点00分00秒”
//注意:
此处是十进制,下面“地址,数据发送子程序”中有转换
#defineINIT_SECONGD50
#defineINIT_MINUTE59
#defineINIT_HOUR22
#defineINIT_DAY9
#defineINIT_MONTH10
#defineINIT_WEEK7
#defineINIT_YEAR11
/******************写保护设置宏定义********************/
//注意:
此处是十进制,下面“地址,数据发送子程序”中有转换
#defineDS1302_WRITE_PROTECT_NO0//写保护禁止
#defineDS1302_WRITE_PROTECT_OFF128//写保护允许
/******************DS1302端口定义********************/
sbitDS1302_SCLK=P1^5;//DS1302时钟信号
sbitDS1302_DIO=P1^6;//DS1302数据信号
sbitDS1302_CE=P1^7;//DS1302片选信号
/********************充电方式宏定义*********************/
//TCSTCSTCSTCSDSDSRSRS
//慢速充电选择(TCS)位(位4~7)控制快速充电器的选择,只有1010模式才能使慢速充电器工作
//所有其它模式将禁止慢速充电器工作
//DS1302上电时,慢速充电器被禁止
//(DS)位(位2~3)选择是一个二极管(01)还是两个二极管(10),如果DS为“00”或“11”,则充电器被禁止
//RS位(位0~1)选择连接在VCC2与VCC1之间的电阻:
“00”无;“01”2K;“10”4K;“11”8K。
//如果RS为00,充电器被禁止,与TCS无关
//最大充电电流计算:
Imax=(5.0V-二极管压降)/R
#defineHold_DS1302_Charge160//=0XA5即10100101使用慢速充电器,选择一个二极管、一个电阻
/********************重新上电判断宏定义*********************/
#defineDS1302_REINIT_DATA3//=0x55即01010101
/********************标示位定义*********************/
bitDS1302_CH_flog=0;//1302时钟暂停标示位“=0”运行“=1”暂停
bitDS1302_CLK_WAY=0;//1302时钟工作方式标示位“=0”24小时方式“=1”12小时方式
externvoiddelayms(unsignedintxms);
/********************地址,数据发送子程序*********************/
voidWRITE_DS1302(unsignedcharaddr,dat)//注意:
为了方便此处的dat为十进制
{
unsignedchari,temp;
dat=(dat/10)*16+dat%10;//十进制转化成十六进制
DS1302_CE=0;//没有先前的低电平不能工作。
,,,DS1302_CE的高电平启动一次数据的传输
DS1302_SCLK=0;
DS1302_CE=1;//DS1302片选上跳变打开数据传输
for(i=0;i<8;i++)//循环8次位移
{
DS1302_SCLK=0;
temp=addr;
DS1302_DIO=(bit)(temp&0x01);//每次传送低字节
addr=addr>>1;//右移一位
delayms
(1);
DS1302_SCLK=1;
}
for(i=0;i<8;i++)//循环8次位移
{
DS1302_SCLK=0;
temp=dat;
DS1302_DIO=(bit)(temp&0x01);//每次传送低字节
dat=dat>>1;//右移一位
delayms
(1);
DS1302_SCLK=1;
}
DS1302_CE=0;////DS1302片选下跳变关闭数据传输
}
/********************数据读取子程序*********************/
unsignedcharREAD_DS1302(unsignedcharaddr)
{
unsignedchari,temp,dat;
DS1302_CE=0;//没有先前的低电平不能工作。
,,,DS1302_CE的高电平启动一次数据的传输
DS1302_SCLK=0;
DS1302_CE=1;//DS1302片选上跳变打开数据传输
for(i=0;i<8;i++)//循环8次位移
{
DS1302_SCLK=0;
temp=addr;
DS1302_DIO=(bit)(temp&0x01);//每次传送低字节
addr=addr>>1;//右移一位
delayms
(1);
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
if(DS1302_DIO==1)
dat|=0x80;
DS1302_SCLK=1;
dat=dat>>1;
delayms
(1);
DS1302_SCLK=0;
}
DS1302_CE=0;//DS1302片选下跳变关闭数据传输
dat=(dat/16)*10+dat%16;//十六进制转化成十进制
returndat;//注意:
为了方便此处返回的值为十进制
}
/********************初始化DS1302子程序*********************/
voidINIT_DS1302()
{
if(READ_DS1302(READ_DS1302_REINIT_ADDR)!
=DS1302_REINIT_DATA)//判断是否是重新上电
{
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO);//禁止写保护
WRITE_DS1302(WRITE_DS1302_SECOND,INIT_SECONGD);//秒
WRITE_DS1302(WRITE_DS1302_MINUTE,INIT_MINUTE);//分
WRITE_DS1302(WRITE_DS1302_HOUR,INIT_HOUR);//小时
WRITE_DS1302(WRITE_DS1302_DAY,INIT_DAY);//日期
WRITE_DS1302(WRITE_DS1302_MONTH,INIT_MONTH);//月份
WRITE_DS1302(WRITE_DS1302_WEEK,INIT_WEEK);//星期
WRITE_DS1302(WRITE_DS1302_YEAR,INIT_YEAR);//年
WRITE_DS1302(DS1302_Trickl_Charge,Hold_DS1302_Charge);//充电方式设置
WRITE_DS1302(WRITE_DS1302_REINIT_ADDR,DS1302_REINIT_DATA);//用于主控制器重新上电判断
WRITE_DS1302(WRITE_DS1302_Timing_Hour1,6);
WRITE_DS1302(WRITE_DS1302_Timing_Min1,30);
WRITE_DS1302(WRITE_DS1302_Timing_Hour2,18);
WRITE_DS1302(WRITE_DS1302_Timing_Min2,20);
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF);//允许写保护
}
else
{
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO);//禁止写保护
WRITE_DS1302(DS1302_Trickl_Charge,Hold_DS1302_Charge);//充电方式设置
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF);//允许写保护
}
}
#defineucharunsignedchar
#defineuintunsignedint
sbitEN=P2^6;
sbitRS=P2^4;
sbitRW=P2^5;
ucharLCD1602_Table[]="0123456789";
//LCD1602显示标尺//0123456789abcdef
ucharcodeDIS_TIM[16]={"2000/00/0000:
00"};//时间日期显示2000/00/0000:
00
ucharcodeDIS_STA[16]={"M:
AutoWIN:
OFF"};//系统工作状态显示
ucharcodeDIS_SET_TIM[16]={"Setthetimer:
"};
ucharcodeDIS_THE_TIM[16]={"O:
--:
--C:
--:
--"};
externvoiddelayms(uintxms);
voidWRITE_LCD1602_DAT(uchardate)
{
EN=0;
RS=1;
P0=date;
EN=0;
delayms(5);
EN=1;
}
voidWRITE_LCD1602_COM(uchardate)
{
EN=0;
RS=0;
P0=date;
EN=0;
delayms(5);
EN=1;
}
voidinit_1602()
{
unsignedchari;
RW=0;
WRITE_LCD1602_COM(0x38);
WRITE_LCD1602_COM(0x0c);
WRITE_LCD1602_COM(0x06);
WRITE_LCD1602_COM(0x01);
WRITE_LCD1602_COM(0x80);
for(i=0;i<16;i++)
WRITE_LCD1602_DAT(DIS_TIM[i]);
WRITE_LCD1602_COM(0x80+0x40);
for(i=0;i<16;i++)
WRITE_LCD1602_DAT(DIS_STA[i]);
}
#include
#include"DS1302.H"
#include"LCD1602.H"
#defineucharunsignedchar
#defineuintunsignedint
#defineMotor_Step400
#defineHIGH1
#defineLOW0
#defineKEY_NO_NUM0
#defineKEY_TIM_SET_NUM1
#defineKEY_MODE_SET_NUM2
#defineKEY_ADD_NUM3
#defineKEY_MIN_NUM4
#defineAuto_MODE0
#defineManual_MODE1
#defineTiming_MODE2
unsignedcharspeed=8;//步进电机的转速
ucharTim_red_tab[6]={0};//记录年月日时分秒和系统状态信息
ucharTiming_tab[2][2]={{12,30},{15,20}};//记录定时间
ucharTime_num1,Time_num2;
uchartime1_num=0;
uinttime2_num=0;
ucharWin_Sta=0;//窗帘状态0打开1关闭
ucharSET_TIM_FLAG=0;//时间设置标志位
ucharMODE_FLAG=0;//工作模式标志位
ucharWIN_STA_FLAG=0;//窗帘状态标志位
bitAction_FLAG=0;//窗帘动作标志位
bitAgain_flag=0;
sbitKEY_TIM_SET=P1^0;//时间设置按键
sbitKEY_MODE_SET=P1^1;//定时时间设置按键
sbitKEY_ADD=P1^2;//时间设置加/手动模式开窗帘
sbitKEY_MIN=P1^3;//时间设置减/手动模式关窗帘
sbitWIR_KEY_TIM_SET=P2^2;//时间设置按键
sbitWIR_KEY_MODE_SET=P2^0;//定时时间设置按键
sbitWIR_KEY_ADD=P2^3;//时间设置加/手动模式开窗帘
sbitWIR_KEY_MIN=P2^1;//时间设置减/手动模式关窗帘
/*sbitMOTOR_IN1=P3^0;
sbitMOTOR_IN2=P3^1;
sbitMOTOR_EN=P3^2;*/
/*#defineMOTOR_InitMOTOR_IN1=1;MOTOR_IN2=1
#defineMOTOR_ForwardMOTOR_IN1=0;MOTOR_IN2=1
#defineMOTOR_ReversionMOTOR_IN1=1;MOTOR_IN2=0
#defineMOTOR_ENABLEMOTOR_EN=0
#defineMOTOR_DISABLEMOTOR_EN=1*/
/*八拍方式驱动,顺序为AABBBCCCDDDA*/
unsignedcharcodeclockWise[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
unsignedcharcodeclockWise1[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
sbitLight_IO=P1^4;
voiddelayms(uintxms);
voidTime0_init(void);
voidSys_init(void);
voidMain_display(void);
voidkeycsan(void);
voidControl(void);
voidTiming_display(void);
/************************************
主程序
************************************/
voidmain()
{
Sys_init();
while
(1)
{
if(MODE_FLAG==Timing_MODE&&SET_TIM_FLAG!
=0)
{
Again_flag=1;
Timing_display();
}
else
Main_display();
keycsan();
Control();
}
}
/************************************
延时子程序
延时时间(xms*1)ms
*************************************/
voiddelayms(uintxms)
{
uintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/************************************
定时器0初始化子程序
************************************/
voidTime0_init(void)
{
TMOD=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
ET0=1;
TR0=0;
EA=1;
}
/************************************
系统初始化
************************************/
voidSys_init(void)
{
//MOTOR_Init;
//MOTOR_DISABLE;
Time0_init();//初始化定时器0
INIT_DS1302();//初始化DS1302
init_1602();//初始化LCD1602
WIN_STA_FLAG=READ_DS1302(READ_WIN_STA);
if(WIN_STA_FLAG>1)
WIN_STA_FLAG=0;
MODE_FLAG=READ_DS1302(READ_MODE_STA);
if(MODE_FLAG>3)
MODE_FLAG=0;
Timing_tab[0][0]=READ_DS1302(READ_DS1302_Timing_Hour1);
if(Timing_tab[0][0]>23)
Timing_tab[0][0]=0;
Timing_tab[0][1]=READ_DS1302(READ_DS1302_Timing_Min1);
if(Timing_tab[0][1]>59)
Timing_tab[0][1]=0;
Timing_tab[1][0]=READ_DS1302(READ_DS1302_Timing_Hour2);
if(Timing_tab[1][0]>23)
Timing_tab[1][0]=0;
Timing_tab[1][1]=READ_DS1302(READ_DS1302_Timing_Min2);
if(Timing_tab[1][1]>59)
Timing_tab[1][1]=0;
WRITE_LCD1602_COM(0x80+0x40+13);//指定显示字符的地址
if(WIN_STA_FLAG==0)
{
WRITE_LCD1602_DAT('O');
WRITE_LCD1602_DAT('F');
WRITE_LCD1602_DAT('F');
}
else
{
WRITE_LCD1602_DAT('O');
WRITE_LCD1602_DAT('N');
WRITE_LCD1602_DAT('');
}
WRITE_LCD1602_COM(0x80+0x40+2);//指定显示字符的地址
if(MODE_FLAG==Auto_MODE)
{
WRITE_LCD1602_DAT('A');
WRITE_LCD1602_DAT('u');
WRITE_LCD1602_DAT('t');
WRITE_LCD1602_DAT('o');
WRITE_LCD1602_DAT('');
WRITE_LCD1602_D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 寄存器 定义 详解
![提示](https://static.bingdoc.com/images/bang_tan.gif)