公历阳历转阴历农历C51程序键盘数码管成功剖析_第1页
公历阳历转阴历农历C51程序键盘数码管成功剖析_第2页
公历阳历转阴历农历C51程序键盘数码管成功剖析_第3页
公历阳历转阴历农历C51程序键盘数码管成功剖析_第4页
公历阳历转阴历农历C51程序键盘数码管成功剖析_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、末实验名 *使用的10*实验效果*注意:动态显示数码管实验:数码管使用P0F22P23P2.4:数码管显示76543210c>K)4c)K*p)K*)K*p*p*p*p*)4c)K*p)K*)K*p*p)K*)K*>K*p>K)4c)K*p)K*p*p*)K*p*p>K)4c)K*p*)K*)K*p)K*)K*>K*p*p*#in clude<reg51.h>#in clude<stdio.h>#define GPIO_DIG P0数码管显示#define GPIO_KEY Pl/键盘sbit LSA=P2A2;sbit LSB=P2A3;

2、sbit LSC=P2A4;sbit K3=P3A2;/外部中断 unsigned char code DataTab404=口期差上大小月卞人小月闰月月份及大小 0x46,0x43,0x21,0x00,999 0x35,0x15,0x51,0x007/20000x23,0x11,0x52,0x41,0x42,0x12,0x65,0x00,0x31,0x11,0x32,0x00,0x21,0x42,0x52,0x21,0x39,0x52,0x25,0x007/2005 0x28,0x25,0x04,0x71,0x4&0x66,0x42,0x00,0x37,0x33,0x22,0x00,

3、0x25,0x15,0x24,0x51, 0x44,0x25,0x52,0x007/20100x33,0x22,0x65,0x00,0x22,0x21,0x25,0x41,0x40,0x24,0x52,0x00,0x30,0x52,0x42,0x91,0x49,0x55,0x05,0x00,/20150x38,0x26,0x44,0x00,0x27,0x53,0x50,0x60,0x46,0x53,0x24,0x00,0x35,0x25,0x54,0x00,0x24,0x41,0x52,0x41,/2O2O0x42,0x45,0x25,0x00,0x31,0x24,0x52,0x00,0x21

4、,0x51,0x12,0x21,0x40,0x55,0x11,0x00,0x28,0x32,0x21,0x61,0x47,0x26,0x61,0x00,0x36,0x13,0x31,0x00,0x25,0x05,0x31,0x51,0x43,0x12,0x54,0x00,0x33,0x51,0x25,0x00,0x22,0x42,0x25,0x31,0x41,0x32,0x22,0x00,0x30,0x55,0x02,0x71,0x49,0x55,0x22,0x00,0x38,0x26,0x62,0x00,0x27,0x13,0x64,0x60,0x45,0x13,0x32,0x00,0x34

5、,0x12,0x55,0x00,0x23,0x10,0x53,0x51,0x42,0x22,0x45,0x00,0x31,0x52,0x22,0x00,0x21,0x52,0x44,0x21,0x40,0x55,0x44,0x00,0x29,0x26,0x50,0x71,0x47,0x26,0x64,0x00,0x36,0x25,0x32,0x00,0x25,0x23,0x32,0x50,0x44,0x44,0x55,0x00,0x32,0x24,0x45,0x00,0x22,0x55,0x11,0x30,0x41,0x33,0x10,0x00,0x31,0x55,0x40,0x81,0x49

6、,0x55,0x50,0x00,0x38,0x46,0x64,0x00,0x27,0x45,0x65,0x60,0x45,0x05,0x32,0x00,0x34,0x45,0x15,0x00,0x23,0x26,0x23,0x40,0x42,0x25,0x21,0x00,0x32,0x33,0x21,0x00,0x20,0x43,0x21,0x31,0x39,0x15,0x51,0x00,0x28,0x12,0x52,0x71,0x47,0x12,0x65,0x00,0x35,0x11,0x32,0x00,0x25,0x50,0x52,0x51,0x44,0x52,0x25,0x00,0x33

7、,0x26,0x22,0x00,/2O25/2O3O/2O35/2O4O仇045/2O5O/Z2O55/2O6O/2O650x22,0x52,0x42,0x41,0x41,0x53,0x22,0x00,/2O7O0x30,0x25,0x44,0x81,0x49,0x25,0x52,0x00,0x37,0x22,0x65,0x00,0x26,0x22,0x25,0x61,0x45,0x24,0x52,0x00,/2O750x35,0x52,0x45,0x00,0x23,0x25,0x05,0x41,0x42,0x26,0x44,0x00,0x32,0x53,0x24,0x00,0x21,0x23

8、,0x30,0x31,/2O8O0x39,0x45,0x54,0x00,0x28,0x43/0xl4,0x71,0x47,0x45,0x25,0x00,0x36,0x24,0x52,0x00,0x25,0x55,0x12,0x50,/20850x44,0x55,0x11,0x00,0x33,0x26,0x50,0x00,0x23,0x52,0x61,0x41,0x40,0x13,0x31,0x00,0x29,0x05,0x51,0x81,/2O9O0x48,0x12,0x55,0x00,0x37,0x11,0x25,0x00,0x26,0x45,0x25,0x60,0x45,0x52,0x22

9、,0x00,0x35,0x55,0x21,0x00,/20950x24,0x25,0x42,0x41,0x42,0x26,0x62,0x00,0x31,0x13,0x52,0x00,0x20,0x03,0x32,0x21/2099lhunsigned char code DIG_CODE17=0x3£0x06,0x5b,0x4f,0x66,0x6cL0x7ct0x070x7f,0x6f/0x77/0x7c/0x39,0x5e/0x79/0x71;/Q、1. 2、3、4、5、6、7. 8、9、A、b、C、d、E. F 的显示码unsigned char code so_m_d12=31

10、/28,31/30/31,30,31,31,30,31,30,31;公历该月的天数unsigned char DisplayData8;用来存放要显示的8位数的值unsigned char TempData8;unsigned char TurnData4;转换用于取出数据表的四个数据unsigned char KeyValue;用来存放读取到的键值unsigned char KV;char year_soH;char year_so;/ 公历年月口char month_so;char day_so;int SumDar_so; /char型位数不够,出现瓶颈char yearu;农历年月口c

11、har monthju;char day Ju;int SumDarJu;int mH;延时10ms检测按键函数 检测键值并显示 阳历转换阴历void DigDisplay(); /动态显示函数void DelaylOms();void KeyDown();void KeyShow();void Turn();/int LMPfint LP);int monthl2_lu(int month_a,unsigned char month_b,unsigned char month_c);:main:主函数:无:无末函数名 *函数功能 *输 入 *输 出void main()year_lu=0;农

12、历年月口 mon th_lu=O; dayJu=O;KeyShow();设置INTOIT0=l;/跳变沿出发方式(下降沿) EXO=1;打开INTO的中断允许。EA=1;/打开总中断while(l)DigDisplay();/ 显示 if(KV=l)/ 进中断Turn(); 转换程序承函数名*函数功能*输 入*输 出:KeyShow:检测有按键按卞并显示键值:无:无void KeyShow()unsigned char i=0;int j=0;int q,u=0;SumDar_so=0;LSA=O; 给一个数码管提供位选LSB=O;LSC=O;while(i<=7)GPIO_KEY=Ox

13、Of;if(GPIO_KEY!=OxOf)/读取按键是否按下DelaylOmsf);/延时10ms进行消抖 if(GPIO_KEY!=OxOf)/再次检测键盘是否按F KeyDown();/读取键值 if(KeyValue<=9)/ 键值有效 TempDatai=KeyValue;/W按键输入的8位数存在寄存器中DisplayDatai=DIG_CODEKeyValue;/ 将查到的值送到显示数据 寄存器i+;DigDisplay();/ 显示DigDisplay();/ 显示DigDisplay();/ 显示year_soH=(int)(TempData0);从寄存器中读取公历年份ye

14、ar_soH=year_soH*10+(int)(TempDatal);year_so=(int)(TempData2);从寄存器中读取公历年份year_so=year_so*10+(int)(TempData3);month_so=(int)(TempData4); month_so=month_so*10+(int)(TempData5);/ 读取公历月 day_so=(int)(TempData 6);day_so=day_so*10+(int)(TempData7);/ 读取公历月 j=month_so-l;for(q=0;q<j;q+)u 二 so_m_dq;SumDar-so

15、=SumDar_so+u;SumDa r_so=Sum Da r_so+d ay_so;H=SumDar-so;if(j>l)/J>l需要考虑公历闰年 if(year_so%4=0) SumDar-so=SumDar_so+l;承函数名*函数功能*输 入*输 出:Turn:阳历转阴历:无:无void Turn()unsigned char Temp; unsigned char L_Temp; unsigned chary;unsigned char sy;unsigned char xy;unsigned char L_y; unsigned char L_sy;unsigned

16、 char L_xy; unsigned char ry;unsigned char Z;unsigned char F;unsigned char Z_y;unsigned char F_y;unsigned char Z_r;unsigned char F_r;int jkrnpT;intllJ2J3j4J5J6j7j8/l9/ll0/lllJ12/LastMonth;p=year_soH* 100+year_so;/年份 20"年Temp=(p-2000+l)*4;公历年份*4再去查表,存入转化暂存器y=DataTabTemp;/上半年的数据Temp+;sy=DataTabTe

17、mp;Te mp+;/下半年的数据xy=DataTabTemp;Te mp+;/闰月的月份和大小ry=DataTabTemp;/BCD码转十进制,求出差值n=10*(int)(y&0xf0)»4)+(int)(y&0x0f);/ 天数差值SumDar_lu=SumDar_so-n; /农历总天数k = (int)(ry&0xf0)»4);/ 闰月月份m = 30- (int)(ry&0x0f);闰月的天数Il=monthl2_lu(l/sy/xy);/农历 1 月多少天I2=monthl2_lu(2/sy,xy);/农历 1 月多少天I3=m

18、onthl2_lu(3/sy,xy);/农历 1 月多少天I4=monthl2_lu(4,sy/xy);/农历 1 月多少天I5=monthl2_lu(5/sy,xy);/农历 1 月多少天I6=monthl2u(6,s%xy);农历 1 月多少天I7=monthl2_lu(7/sy,xy);/农历 1 月多少天I8=monthl2u(&sy,xy);/农历 1 月多少天I9=monthl2_lu(9/sy,xy);/农历 1 月多少天I10=monthl2u(10,sy,xy);农历 1 月多少天lll=monthl2Ju(ll/syzxy);/农历 1 月多少天I12=monthl

19、2ju(12,syzxy);/农历 1 月多少天T=SumDar_so;if(T<n) /如果跨年L_Temp=(p-2000)*4;去年公历年份*4再去查表,存入转化暂存器L_y=DataTabL_Temp;/ 上半年的数据L_Temp+;L_sy=DataTabL_Temp;L_Temp+;/ F半年的数据L_xy=DataTabL_Temp;monthju=ll;跨年到去年的11月LastMonth=monthl2u(12,L_syL_xy);day Ju 二n-SumDar_so-LastM on th;LastMonth=monthl2u(l 丄_sy丄 _xy);dayu=L

20、astMonth-dayu; dayju=dayju+l; 2if (n)>0)&&(n-T)<=31)month_lu=12; 跨年到去年的12月LastMonth=monthl2u(12 丄_sy丄 _xy); dayJu=LastMonth-(n-T);else 没有跨年if(SumDarJu-ll)>0)if(SumDar_lu-l2-ll)>0)if(SumDarJu-l3-l2-ll)>0)if(SumDarJu-l4-l3-l2-ll)>0)if(SumDarJu-l5-l4-l3-l2-ll)>0)if(SumDarJu

21、-l6-l5-l4-l3-l2-ll)>0) if(SumDarJu-l7-l6-l5-l4-l3-l2-ll)>0) if(SumDar_lu-l8-l7-l6-l5-l4-l3-l2-ll)>0) if(SumDar_lu-l9-l8-l7-l6-l5-l4-l3-l2-ll)>0) if(SumDarJu-H0-l9-l8-l7-l6-l5-l4-l3-l2-ll)>0) if(SumDarJu-lll-H0-l9-l8-l7-l6-l5-l4-l3-l2-ll)>0)monthju=12;dayJu=SumDarJu-lll-H0-l9-l8-l7-

22、l6-l5-l4-l3-l2-ll;elsemonth _lu=ll;dayJu=SumDarJu-H0-l9-l8-l7-l6-l5-l4-l3-l2-ll;elsemonthu=10;day_lu=SumDarJu-l9-l8-l7-l6-l5-l4-l3-l2-ll;elsemonth Ju=9;dayJu=SumDarJu-l8-l7-l6-l5-l4-l3-l2-ll;elsemon thju=8; dayJu=SumDarJu-l7-l6-l5-l4-l3-l2-ll;elsemon thju=7;dayJu=SumDarJu-l6-l5-l4-l3-l2-ll;elsemonth

23、_lu=6;dayJu=SumDar_lu-l5-l4-l3-l2-ll;elsemonth lu=5;day_lu=SumDar_lu-l4-l3-l2-ll;elsemonthu=4; day_lu=SumDar_lu-l3-l2-ll;elsemonth_lu=3; day_lu=SumDar_lu-l2-ll;elsemonth_lu=2;day_lu=SumDar_lu-ll;elsemonth_lu=l;day_lu=SumDar_lu;if(k!=O)有农历闰月if(month_lu-k)>=l)/在第二个闰月,月减一,口不变if(day_lu>m) /跨月day_l

24、u=l;else/没夸,月减一,口不变monthu=monthu-l;正好在第一个闰月,月份不变显示程序T=SumDar_so;/if(SumDar_so<n) 如果跨年 if(T<n) /如果跨年if(year_so=0)/是 2000 年DisplayData0=DIG-CODEl;DisplayDatal=DIG-CODE9;DisplayData2=DIG_CODE ;DisplayData 3=DIG_CODE ;else 公历不是2000年yearju=year_so-l;DisplayData0=DIG_CODE2;DisplayDatal=DIG_CODE0;Z=

25、year_lu/10;F= year_lu%10;DisplayData2=DIGCODEZ;DisplayData3=DIGCODEF;else/没跨年yearju=year_so;DisplayData0=DIG-CODE2;DisplayData 1=DIG_CODE0;Z= year_lu/10;F= yearJu%10;DisplayData 2=DIG_CODEZ;DisplayData3=DIG_CODEF;Z_y= monthu/10;F_y= monthju%10;Z_ r=dayJu/10;F_r=day_lu%10;DisplayData4=DIG_CODEZ_y;Dis

26、playData5=DIG-CODEF_y;DisplayData6=DIG_CODE Z_r;DisplayData7=DIG_CODEF_r;:lntO() interrupt 0*函数功能:外部中断0的中断函数:无*输 出:无void lntO() interrupt 0外部中断0的中断函数DelaylOms();/延时10ms进行消抖if(K3=0)KV=1;承函数名*函数功能:monthl2u:查出那个农月多少天承输入:农历的月份,查表所得农历月份数据审输出:返回该农历月份天数int monthl2_lu(int month_a, unsigned char month_b,unsi

27、gned char month_c) switch(m on th_a)case l:if(month_b&0x40) return 29; else return 30;case 2:if(month_b&0x20) return 29; else return 30;case 3:if(month_b&0xl0) return 29; else return 30;case 4:if(month_b&0x04) return 29; else return 30;case 5:if(month_b&0x02) return 29; else retu

28、rn 30;case 6:if(month_b&0x01) return 29; else return 30;case 7:if(month_c&0x40) return 29; else return 30;case 8:if(month_c&0x20) return 29; else return 30;case 9:if(month_c&OxlO) return 29; else return 30;case 10:if(month_c&0x04) return 29; else return 30;case ll:if(month_c&

29、OxO2) return 29; else return 30;case 12:if(month_c&0x01) return 29; else return 30;case 13:return 1000;default:return 0;承函数名*函数功能*输 入*输 出:KeyDown:检测有按键按卞并读取键值:无:无*void KeyDown(void)char a=0;GPIO_KEY=OxOf;if(GPIO_KEY!=OxOf)/读取按键是否按FDelaylOms();/延时10ms进行消抖 if(GPIO_KEY!=OxOf)再次检测键盘是否按卜测试列GPIO_KEY=OXOF; switch(GPIO_KEY)case(0X07):KeyValue=O;break;case(OXOb):KeyValue=l;bre

温馨提示

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

评论

0/150

提交评论