电子万年历源程序.doc_第1页
电子万年历源程序.doc_第2页
电子万年历源程序.doc_第3页
电子万年历源程序.doc_第4页
电子万年历源程序.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子万年历源程序IO口程序#include /*数码管引脚*sbit L1 = P20;sbit L2 = P21;sbit L3 = P22;sbit LEDC= P23;#define LED_DATA P0/按键接口定义#define K_Port P2sbit K_D = P33; /外部中断1/*PCF8563接口定义*sbit PCF8563CLK=P10;sbit PCF8563SDA=P11;/ 24c02接口定义sbit E2PCLK=P15;sbit E2PSDA=P16;/蜂鸣器接口定义sbit BEEP = P12主程序#include void Delay_1ms(unsigned int time)unsigned char temp;while(time-)for(temp=127;temp0;temp-)_nop_();/系统初始化void Sys_Init() TMOD=0x01;TH0=(65535-20000)/256;/给定时器初值。TL0=(65535-20000)%256;TR0=1;/启动定时器T0ET0=1;/允许T0中断EA=1;LEDC=0;/138正常工作Beep_Flag=1;/闹铃开/刷新数码管显示void Fresh_Display()static unsigned char Num;unsigned char temp;static unsigned int Flash_Time;Num+;if(Num=8)Num=0;LED_DATA=0x00;/P0口全部为零if(Num=0)L3=1;L2=1;L1=1; /第八个数码管亮else if(Num=1) L3=1;L2=1;L1=0;/第七个数码管亮else if(Num=2)L3=1;L2=0;L1=1;/第六个数码管亮else if(Num=3)L3=1;L2=0;L1=0;/第五个数码管亮else if(Num=4) L3=0;L2=1;L1=1;/第四个数码管亮else if(Num=5) L3=0;L2=1;L1=0;/第二个数码管亮else if(Num=6)L3=0;L2=0;L1=1;/第一个数码管亮else if(Num=7) L3=0;L2=0;L1=0;/第零个数码亮Flash_Time+;LED_ON=0xff;if(Flash_Time400)Flash_Time=0;temp=(10 )if(Beep_Flag=1)&(Num=0)LED_DATA=Dis_TabDis_BufferNum+0x20;elseLED_DATA=Dis_TabDis_BufferNum;elseLED_DATA=0x00;void Test_Ring() /这个函数有什么作用?unsigned char i,temp_m,temp_h; temp_m=(F8563RWBuff24)*10+(F8563RWBuff2&0x0f); /分 temp_h=(F8563RWBuff34)*10+(F8563RWBuff3&0x0f); /时for(i=0;i3)Key_Value=K_Port5;if(Key_Bak=10)/对于前一次按键值,怎么处理?Key_Flag=1;/置按键标志位。Key_Bak=Key_Value;/存贮当前按键值。if(Ringing_Time10)/设定闹铃的时间Ringing_Time=0; else /如果没有键按下key_Down_Time=0;Key_Bak=10;if(Ringing_Time0)Ringing=0;Ringing_Time-; BEEP=0;/开闹铃elseBEEP=1;/关闹铃if(Ringing=1)Ringing=0;Ringing_Time=12000;void Adjust_Time()unsigned char position=1;/position有什么作用?Adjust_Buffer0=(F8563RWBuff14)*10+(F8563RWBuff1&0x0f) ;/秒Adjust_Buffer1=(F8563RWBuff24)*10+(F8563RWBuff2&0x0f); /分;Adjust_Buffer2=(F8563RWBuff34)*10+(F8563RWBuff3&0x0f);if(position=1) Flash_Number=0x03;else if(position=2)Flash_Number=0x18;else if(position=3) Flash_Number=0xC0;if(Key_Flag=1)Key_Flag=0;if(Key_Value=2if(position0)position-;else if(Key_Value=3)/+ if(position=1)if(Adjust_Buffer060)Adjust_Buffer0+;elseAdjust_Buffer0=30;else if(position=2)if(Adjust_Buffer160)Adjust_Buffer1+;elseAdjust_Buffer1=30;else if(position=3)if(Adjust_Buffer20)Adjust_Buffer0-;elseAdjust_Buffer0=30;else if(position=2)if(Adjust_Buffer10)Adjust_Buffer1-;elseAdjust_Buffer1=30;else if(position=3)if(Adjust_Buffer20)Adjust_Buffer2-;elseAdjust_Buffer2=12;else if(Key_Value=0)/F8563RWBuff1=(Dis_Buffer14)+Dis_Buffer0;/秒F8563RWBuff2=(Dis_Buffer44)+Dis_Buffer3;/分F8563RWBuff3=(Dis_Buffer74)*10+(F8563RWBuff4&0x0f);/秒Adjust_Buffer1=(F8563RWBuff54)*10+(F8563RWBuff5&0x0f); /分;Adjust_Buffer2=(F8563RWBuff64)*10+(F8563RWBuff6&0x0f); /时while(1)if(position=1) Flash_Number=0x03;else if(position=2)Flash_Number=0x18;else if(position=3) Flash_Number=0xC0;if(Key_Flag=1)Key_Flag=0;if(Key_Value=2)if(position0)position-;else if(Key_Value=3)/+ if(position=1)if(Adjust_Buffer032)Adjust_Buffer0+;elseAdjust_Buffer0=15;else if(position=2)if(Adjust_Buffer112)Adjust_Buffer1+;elseAdjust_Buffer1=6;else if(position=3)if(Adjust_Buffer20)Adjust_Buffer0-;elseAdjust_Buffer0=15;else if(position=2)if(Adjust_Buffer10)Adjust_Buffer1-;elseAdjust_Buffer1=6;else if(position=3)if(Adjust_Buffer20)Adjust_Buffer2-;elseAdjust_Buffer2=50;else if(Key_Value=0)/F8563RWBuff4=(Dis_Buffer14)+Dis_Buffer0;/秒F8563RWBuff5=(Dis_Buffer44)+Dis_Buffer3;/分F8563RWBuff6=(Dis_Buffer70)&(Key_Value4);Dis_Buffer2=12;Dis_Buffer3=(F8563RWBuff2&0x0f);Dis_Buffer4=(F8563RWBuff24);Dis_Buffer5=12;Dis_Buffer6=(F8563RWBuff3&0x0f);Dis_Buffer7=(F8563RWBuff34);else if(i=2)Dis_Buffer0=(F8563RWBuff4&0x0f);Dis_Buffer1=(F8563RWBuff44);Dis_Buffer2=12;Dis_Buffer3=(F8563RWBuff5&0x0f);Dis_Buffer4=(F8563RWBuff54);Dis_Buffer5=12;Dis_Buffer6=(F8563RWBuff6&0x0f);Dis_Buffer7=(F8563RWBuff64);void Add_Ring()unsigned char ring_Number=1,position;Flash_Number=0x00;while(1)if(Key_Flag=1)Key_Flag=0;if(Key_Value=4)if(ring_Number1)ring_Number-;else if(Key_Value=3)if(ring_Number5)ring_Number+;else if(Key_Value=5)/确定进入调整某个闹铃break;elseif(Key_Value!=7)return;Dis_Buffer0=Ring_Bufferring_Number-10%10;Dis_Buffer1=Ring_Bufferring_Number-10/10;Dis_Buffer2=12;Dis_Buffer3=Ring_Bufferring_Number-11%10;Dis_Buffer4=Ring_Bufferring_Number-11/10;Dis_Buffer5=13;Dis_Buffer6=13;Dis_Buffer7=ring_Number;position=1;while(1)if(position=1) Flash_Number=0x03;else if(position=2)Flash_Number=0x18;if(Key_Flag=1)Key_Flag=0;if(Key_Value=2)if(position0)position-;else if(Key_Value=3)/+ if(position=1)if(Ring_Bufferring_Number-1059)Ring_Bufferring_Number-10+;elseRing_Bufferring_Number-10=30;else if(position=2)if(Ring_Bufferring_Number-110)Ring_Bufferring_Number-10-;elseRing_Bufferring_Number-10=30;else if(position=2)if(Ring_Bufferring_Number-110)Ring_Bufferring_Number-11-;elseRing_Bufferring_Number-11=12;else if(Key_Value=0)Beep_Flag=1;/打开闹铃break;Dis_Buffer0=Ring_Bufferring_Number-10%10; /分Dis_Buffer1=Ring_Bufferring_Number-10/10;Dis_Buffer3=Ring_Bufferring_Number-11%10; /时 Dis_Buffer4=Ring_Bufferring_Number-11/10;void main()unsigned int i;Delay_1ms(500);Sys_Init();Delay_1ms(100);Flash_Number=0x00; /闪烁控制位为0,所有的位都不闪烁。while(1)i+;Flash_Number=0x00;if(i200)i=0;GetTimeFrom8563();Dis_Buffer0=(F8563RWBuff1&0x0f);Dis_Buffer1=(F8563RWBuff14);Dis_Buffer2=12;Dis_Buffer3=(F8563RWBuff2&0x0f);Dis_Buffer4=(F8563RWBuff24);Dis_Buffer5=12;Dis_Buffer6=(F8563RWBuff3&0x0f);Dis_Buffer7=(F8563RWBuff34);if( Beep_Flag=1)if(Dis_Buffer0=0)/零秒开始闹铃Test_Ring();/判断是否闹铃if(Key_Flag=1)Key_Flag=0;if(Key_Value=0) /显示年月日 时分秒切换GetTimeFrom8563();Dis_Buffer0=(F8563RWBuff4&0x0f);Dis_Buffer1=(F8563RWBuff44);Dis_Buffer2=12;Dis_Buffer3=(F8563RWBuff5&0x0f);Dis_Buffer4=(F8563RWBuff54);Dis_Buffer5=12;Dis_Buffer6=(F8563RWBuff6&0x0f);Dis_Buffer7=(F8563RWBuff64);Delay_1ms(500);while(1)if(Key_Flag=1)Key_Flag=0;i=500;break;else if(Key_Value=5)/闹铃开关 Beep_Flag=Beep_Flag;else if(Key_Value=6)/修改时间Rewrite_Time();i=500;else if(Key_Value=7)/设置闹铃 Add_Ring();i=500;主程序头文件#include #include #include #include #include unsigned char Flash_Number=0x00; /闪烁位控制(1闪烁,0常亮)unsigned char LED_ON=0xff; /第8位数码管显示开关(1显示,0不显示)unsigned char Dis_Buffer8=0,0,0,0,0,0,0,0; /8位数码显示缓冲区unsigned char code Dis_Tab=0x9f,0x06,0x5b,0x4f,0xc6,0xcd,0xdd,0x07,0xdf,0xcf,0xd3,0xd6,0x40,0x00,0x08,0x99,0xd1; /显示表格: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, P, H, -, , _, C, F;/10 11 12 13 14 15 16volatile unsigned char idata Ring_Buffer52;/读写24C02缓冲区unsigned char Adjust_Buffer3;/调整时间缓冲区unsigned char Key_Time;/按键消抖系数unsigned char Key_Value;/当前按键值unsigned char Key_Bak;/前一次按键值bit Key_Flag;/按键标志(1 有新的键被下)bit Beep_Flag;/闹铃开关(1打开,0关闭)bit Ringing=0;unsigned int Ringing_Time; /闹铃时间void Delay_1ms(unsigned int);void Sys_Init(void);void Fresh_Display(void);子程序(AT24C02读写模块)#include #include #include /*sbit E2PCLK =P14;sbit E2PSDA =P15;*/*函 数 名:Start24CX*功 能:I2C的启动信号*入 口: 无*出 口:无*调用模块:*备 注: 无*/void Start24CX()E2PSDA=1;_nop_();_nop_();_nop_();E2PCLK=1;_nop_();_nop_();_nop_();E2PSDA=0;_nop_();_nop_();_nop_();E2PCLK=0;_nop_();_nop_();_nop_();/*函 数 名:Stopt24CX*功 能:I2C的停止信号*入 口: 无*出 口:无*调用模块:*备 注: 无*/void Stopt24CX()E2PCLK=0;_nop_();_nop_();_nop_();E2PSDA=0;_nop_();_nop_();_nop_();E2PCLK=1;_nop_();_nop_();_nop_();E2PSDA=1;_nop_();_nop_();_nop_();E2PCLK=0;_nop_();_nop_();_nop_();/*函 数 名:ACK24CX*功 能:I2C的上的应答信号(读)*入 口: 无*出 口:无*调用模块:*备 注:*/void ACK24CX()unsigned char i=200;E2PSDA=1; E2PCLK=0;_nop_();_nop_();_nop_();E2PCLK=1;_nop_();_nop_();_nop_();doi-;if(E2PSDA=0)E2PCLK=0;return;while(i0); E2PCLK=0;/*函 数 名:SendACK*功 能:I2C的上的应答信号(写)*入 口: 无*出 口:无*调用模块:*备 注:*/void SendACK()E2PCLK=0;_nop_();_nop_(); _nop_(); E2PSDA=0;_nop_(); _nop_(); _nop_();E2PCLK=1;_nop_();_nop_();_nop_(); E2PCLK=0;/*函 数 名:NoACK*功 能:I2C的上的应答信号(写)*入 口: 无*出 口:无*调用模块:*备 注:*/void NoACK()E2PCLK=0;_nop_();_nop_(); _nop_(); E2PSDA=1;_nop_(); _nop_(); _nop_();E2PCLK=1;_nop_();_nop_();_nop_(); E2PCLK=0;/*函 数 名:WriteByteto24CX*功 能:向24C256写一个字节数据*入 口: 无*出 口:无*调用模块:*备 注:*/void WriteByteto24CX(unsigned char value)unsigned char i;ACC=value;for(i=8;i0;i-)ACC0;i-)E2PCLK=1;value8 );ACK24CX();WriteByteto24CX( address&0xff );ACK24CX();/*函 数 名:WriteDatato24CX*功 能:向24C256写入数据*入 口: f; 要写入24C256中的地址 *P; 要写入数据的首地址 n; 要写入数据的个数*出 口:*调用模块:WriteByteto24CX() waddr() w16addr() ACK24CX() Stopt24CX()*备 注:*/void WriteDatato24CX(unsigned int f,unsigned char *addr,unsigned char n) waddr();w16addr(f);for(;n0;n-) WriteByteto24CX(*addr); ACK24CX(); addr+; Stopt24CX();for(f=700;f0;f-)_nop_();/*函 数 名:ReadDataFrom24CX*功 能:从24c256中读出数据*入 口: f; 要读24C256中的地址 *P; 要读出数据存放的首地址 n; 要读出数据的个数*出 口:无*调用模块: waddr() w16addr() raddr()*备 注:*/void ReadDataFrom24CX(unsigned int f,unsigned char *addr,unsigned char n) waddr();w16addr(f); Start24CX();WriteByteto24CX(0xa1);ACK24CX();for(;n0;n-) *addr=ReadByteFrom24CX(); SendACK(); addr+; *addr=ReadByteFrom24CX(); NoACK(); Stopt24CX(); /*main()uchar a5;a0=1; a1=2; a2=3; a3=4; a4=5;WriteDatato24CX(0,a,5);a0=0; a1=0; a2=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论