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

下载本文档

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

文档简介

1、/* 实 验 名 : 动态显示数码管实验* 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4* 实验效果 : 数码管显示76543210。* 注 意 :*/#include#include#define GPIO_DIG P0/数码管显示#define GPIO_KEY P1/键盘sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;sbit K3=P32;/外部中断unsigned char code DataTab404=/日期差/上大小月/下大小月/闰月月份及大小0x46,0x43,0x21,0x00,/19990x35,0x15,0x51,0x00,

2、/20000x23,0x11,0x52,0x41,0x42,0x12,0x65,0x00,0x31,0x11,0x32,0x00,0x21,0x42,0x52,0x21,0x39,0x52,0x25,0x00,/20050x28,0x25,0x04,0x71,0x48,0x66,0x42,0x00,0x37,0x33,0x22,0x00,0x25,0x15,0x24,0x51,0x44,0x25,0x52,0x00,/20100x33,0x22,0x65,0x00,0x22,0x21,0x25,0x41,0x40,0x24,0x52,0x00,0x30,0x52,0x42,0x91,0x49,

3、0x55,0x05,0x00, /20150x38,0x26,0x44,0x00,0x27,0x53,0x50,0x60,0x46,0x53,0x24,0x00,0x35,0x25,0x54,0x00,0x24,0x41,0x52,0x41, /20200x42,0x45,0x25,0x00,0x31,0x24,0x52,0x00,0x21,0x51,0x12,0x21,0x40,0x55,0x11,0x00,0x28,0x32,0x21,0x61, /20250x47,0x26,0x61,0x00,0x36,0x13,0x31,0x00,0x25,0x05,0x31,0x51,0x43,0x

4、12,0x54,0x00,0x33,0x51,0x25,0x00, /20300x22,0x42,0x25,0x31,0x41,0x32,0x22,0x00,0x30,0x55,0x02,0x71,0x49,0x55,0x22,0x00,0x38,0x26,0x62,0x00, /20350x27,0x13,0x64,0x60,0x45,0x13,0x32,0x00,0x34,0x12,0x55,0x00,0x23,0x10,0x53,0x51,0x42,0x22,0x45,0x00, /20400x31,0x52,0x22,0x00,0x21,0x52,0x44,0x21,0x40,0x55

5、,0x44,0x00,0x29,0x26,0x50,0x71,0x47,0x26,0x64,0x00, /20450x36,0x25,0x32,0x00,0x25,0x23,0x32,0x50,0x44,0x44,0x55,0x00,0x32,0x24,0x45,0x00,0x22,0x55,0x11,0x30, /20500x41,0x33,0x10,0x00,0x31,0x55,0x40,0x81,0x49,0x55,0x50,0x00,0x38,0x46,0x64,0x00,0x27,0x45,0x65,0x60, /20550x45,0x05,0x32,0x00,0x34,0x45,0

6、x15,0x00,0x23,0x26,0x23,0x40,0x42,0x25,0x21,0x00,0x32,0x33,0x21,0x00, /20600x20,0x43,0x21,0x31,0x39,0x15,0x51,0x00,0x28,0x12,0x52,0x71,0x47,0x12,0x65,0x00,0x35,0x11,0x32,0x00, /20650x25,0x50,0x52,0x51,0x44,0x52,0x25,0x00,0x33,0x26,0x22,0x00,0x22,0x52,0x42,0x41,0x41,0x53,0x22,0x00, /20700x30,0x25,0x4

7、4,0x81,0x49,0x25,0x52,0x00,0x37,0x22,0x65,0x00,0x26,0x22,0x25,0x61,0x45,0x24,0x52,0x00, /20750x35,0x52,0x45,0x00,0x23,0x25,0x05,0x41,0x42,0x26,0x44,0x00,0x32,0x53,0x24,0x00,0x21,0x23,0x30,0x31, /20800x39,0x45,0x54,0x00,0x28,0x43,0x14,0x71,0x47,0x45,0x25,0x00,0x36,0x24,0x52,0x00,0x25,0x55,0x12,0x50,

8、/20850x44,0x55,0x11,0x00,0x33,0x26,0x50,0x00,0x23,0x52,0x61,0x41,0x40,0x13,0x31,0x00,0x29,0x05,0x51,0x81, /20900x48,0x12,0x55,0x00,0x37,0x11,0x25,0x00,0x26,0x45,0x25,0x60,0x45,0x52,0x22,0x00,0x35,0x55,0x21,0x00, /20950x24,0x25,0x42,0x41,0x42,0x26,0x62,0x00,0x31,0x13,0x52,0x00,0x20,0x03,0x32,0x21 /20

9、99;unsigned char code DIG_CODE17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char code so_m_d12=31,28,31,30,31,30,31,31,30,31,30,31;/公历该月的天数unsigned char DisplayData8;/用来存放要显示的8位数的值unsigned char TempData8;unsigned char

10、TurnData4;/转换用于取出数据表的四个数据unsigned char KeyValue;/用来存放读取到的键值unsigned char KV;char year_soH;char year_so;/公历年月日char month_so;char day_so;int SumDar_so;/char型位数不够,出现瓶颈char year_lu;/农历年月日char month_lu;char day_lu;int SumDar_lu;int n,H;void DigDisplay(); /动态显示函数void Delay10ms(); /延时10msvoid KeyDown(); /检

11、测按键函数void KeyShow(); /检测键值并显示void Turn();/阳历转换阴历/int LMP(int LP);int month12_lu(int month_a ,unsigned char month_b,unsigned char month_c);/* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void main()year_lu=0;/农历年月日month_lu=0;day_lu=0;KeyShow(); /设置INT0IT0=1;/跳变沿出发方式(下降沿)EX0=1;/打开INT0的中断允许。EA=1;/打开总中断w

12、hile(1) DigDisplay();/显示if(KV=1)/进中断Turn(); /转换程序 /* 函 数 名 : KeyShow* 函数功能 : 检测有按键按下并显示键值* 输 入 : 无* 输 出 : 无*/void KeyShow()unsigned char i=0;int j=0;int q,u=0;SumDar_so=0;LSA=0; /给一个数码管提供位选LSB=0;LSC=0;while(i=7)GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)/读取按键是否按下Delay10ms();/延时10ms进行消抖if(GPIO_KEY!=0x0f)/再次检测键盘

13、是否按下KeyDown();/读取键值if(KeyValue=9)/键值有效TempDatai=KeyValue;/将按键输入的8位数存在寄存器中DisplayDatai=DIG_CODEKeyValue;/将查到的值送到显示数据寄存器i+;DigDisplay();/显示DigDisplay();/显示 DigDisplay();/显示year_soH=(int)(TempData0); /从寄存器中读取公历年份year_soH=year_soH*10+(int)(TempData1);year_so=(int)(TempData2); /从寄存器中读取公历年份year_so=year_so

14、*10+(int)(TempData3);month_so=(int)(TempData4);month_so=month_so*10+(int)(TempData5);/读取公历月day_so=(int)(TempData6);day_so=day_so*10+(int)(TempData7);/读取公历月j=month_so-1;for(q=0;q1)/J1需要考虑公历闰年if(year_so%4=0)SumDar_so=SumDar_so+1; /* 函 数 名 : Turn* 函数功能 : 阳历转阴历* 输 入 : 无* 输 出 : 无*/ void Turn() unsigned c

15、har Temp;unsigned char L_Temp;unsigned char y;unsigned char sy;unsigned char xy;unsigned char L_y;unsigned char L_sy;unsigned 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 j,k,m,p,T;int l1,l2,l3,l4,l5,l6,l7,l8,l

16、9,l10,l11,l12,LastMonth;p=year_soH*100+year_so;/年份20*年Temp=(p-2000+1)*4;/公历年份*4再去查表,存入转化暂存器y=DataTabTemp;/上半年的数据Temp+;sy=DataTabTemp;Temp+;/下半年的数据xy=DataTabTemp;Temp+;/闰月的月份和大小ry=DataTabTemp;/BCD码转十进制,求出差值n=10*(int)(y&0xf0)4)+(int)(y&0x0f);/天数差值SumDar_lu=SumDar_so-n; /农历总天数k = (int)(ry&0xf0)4);/闰月月份

17、m =30 - (int)(ry&0x0f);/闰月的天数l1=month12_lu(1,sy,xy);/农历1月多少天l2=month12_lu(2,sy,xy);/农历1月多少天l3=month12_lu(3,sy,xy);/农历1月多少天l4=month12_lu(4,sy,xy);/农历1月多少天l5=month12_lu(5,sy,xy);/农历1月多少天l6=month12_lu(6,sy,xy);/农历1月多少天l7=month12_lu(7,sy,xy);/农历1月多少天l8=month12_lu(8,sy,xy);/农历1月多少天l9=month12_lu(9,sy,xy);

18、/农历1月多少天l10=month12_lu(10,sy,xy);/农历1月多少天l11=month12_lu(11,sy,xy);/农历1月多少天l12=month12_lu(12,sy,xy);/农历1月多少天T=SumDar_so;if(T31)month_lu=11; /跨年到去年的11月LastMonth=month12_lu(12,L_sy,L_xy);day_lu=n-SumDar_so-LastMonth;LastMonth=month12_lu(1,L_sy,L_xy);day_lu=LastMonth-day_lu; day_lu=day_lu+1;2if(n)0)&(n-

19、T)0)if(SumDar_lu-l2-l1)0)if(SumDar_lu-l3-l2-l1)0)if(SumDar_lu-l4-l3-l2-l1)0)if(SumDar_lu-l5-l4-l3-l2-l1)0) if(SumDar_lu-l6-l5-l4-l3-l2-l1)0)if(SumDar_lu-l7-l6-l5-l4-l3-l2-l1)0)if(SumDar_lu-l8-l7-l6-l5-l4-l3-l2-l1)0)if(SumDar_lu-l9-l8-l7-l6-l5-l4-l3-l2-l1)0)if(SumDar_lu-l10-l9-l8-l7-l6-l5-l4-l3-l2-l1

20、)0)if(SumDar_lu-l11-l10-l9-l8-l7-l6-l5-l4-l3-l2-l1)0)month_lu=12;day_lu=SumDar_lu-l11-l10-l9-l8-l7-l6-l5-l4-l3-l2-l1;elsemonth_lu=11;day_lu=SumDar_lu-l10-l9-l8-l7-l6-l5-l4-l3-l2-l1;elsemonth_lu=10;day_lu=SumDar_lu-l9-l8-l7-l6-l5-l4-l3-l2-l1;elsemonth_lu=9;day_lu=SumDar_lu-l8-l7-l6-l5-l4-l3-l2-l1; el

21、semonth_lu=8;day_lu=SumDar_lu-l7-l6-l5-l4-l3-l2-l1;elsemonth_lu=7;day_lu=SumDar_lu-l6-l5-l4-l3-l2-l1;elsemonth_lu=6;day_lu=SumDar_lu-l5-l4-l3-l2-l1;elsemonth_lu=5;day_lu=SumDar_lu-l4-l3-l2-l1;elsemonth_lu=4;day_lu=SumDar_lu-l3-l2-l1;elsemonth_lu=3;day_lu=SumDar_lu-l2-l1;elsemonth_lu=2;day_lu=SumDar_

22、lu-l1;elsemonth_lu=1;day_lu=SumDar_lu;if(k!=0)/有农历闰月if(month_lu-k)=1)/在第二个闰月,月减一,日不变if(day_lum) /跨月 day_lu=1;else/没夸,月减一,日不变month_lu=month_lu-1;/正好在第一个闰月,月份不变/显示程序T=SumDar_so;/if(SumDar_son) /如果跨年if(Tn) /如果跨年if(year_so=0)/是2000年 DisplayData0=DIG_CODE1; DisplayData1=DIG_CODE9; DisplayData2=DIG_CODE9;

23、 DisplayData3=DIG_CODE9;else /公历不是2000年year_lu=year_so-1;DisplayData0=DIG_CODE2;DisplayData1=DIG_CODE0;Z= year_lu/10;F= year_lu%10;DisplayData2=DIG_CODEZ;DisplayData3=DIG_CODEF;else/没跨年year_lu=year_so; DisplayData0=DIG_CODE2;DisplayData1=DIG_CODE0;Z= year_lu/10;F= year_lu%10;DisplayData2=DIG_CODEZ;D

24、isplayData3=DIG_CODEF;Z_y= month_lu/10;F_y= month_lu%10;Z_r=day_lu/10;F_r=day_lu%10;DisplayData4=DIG_CODEZ_y;DisplayData5=DIG_CODEF_y;DisplayData6=DIG_CODEZ_r;DisplayData7=DIG_CODEF_r; /* 函 数 名 : Int0()interrupt 0* 函数功能 : 外部中断0的中断函数* 输 入 : 无* 输 出 : 无*/void Int0()interrupt 0/外部中断0的中断函数Delay10ms();/延时

25、10ms进行消抖if(K3=0) KV=1;/* 函 数 名 : month12_lu* 函数功能 : 查出那个农月多少天* 输 入 : 农历的月份,查表所得农历月份数据* 输 出 : 返回该农历月份天数*/int month12_lu(int month_a, unsigned char month_b,unsigned char month_c)switch(month_a)case 1:if(month_b&0x40) return 29; else return 30;case 2:if(month_b&0x20) return 29; else return 30;case 3:if

26、(month_b&0x10) 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 return 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

27、(month_c&0x10) return 29; else return 30;case 10:if(month_c&0x04) return 29; else return 30;case 11:if(month_c&0x02) 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=0x0f;if(GPIO_KEY!=0x0f)/读取按键是否按下Delay10ms();/延时10ms进行消抖if(GPIO_KEY!=0x0

温馨提示

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

最新文档

评论

0/150

提交评论