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

下载本文档

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

文档简介

1、,* 实验名:动态显示数码管实验* 使用的IO :数码管使用P0,P22P23P2.4* 实验效果:数码管显示76543210。* 注 意 :*/#include<reg51.h>#include<stdio.h>#define GPIO_DIG P0/ 数码管显示#define GPIO_KEY P/ 键盘sbit LSA=P2A2;sbit LSB=P2A3;sbit LSC=P2A4;sbit K3=P3A2; 外部中断unsigned char code DataTab404=日期差上大小月下大小月闰月月份及大小0x46,0x43,0x21,0x00,/1999

2、0x35,0x15,0x51,0x00, 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,0x3

3、0,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,/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,0x

4、05,0x31,0x51,0x43,0x12,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,0x

5、44,0x21,0x40,0x55,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,0x

6、00,0x34,0x45,0x15,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,1/20700

7、x30,0x25,0x44,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, 0x2

8、5,0x55,0x12,0x50,/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,0x0

9、0, 0x20,0x03,0x32,0x21/2099; 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 cha

10、r 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 year_lu;农历年月日char month_lu;char day_lu;int SumDar_lu;int n,H;void DigDisplay(); 动态显示函数void Delay10ms();

11、延时 10msvoid KeyDown();/检测按键函数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;

12、/打开总中断while(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

14、_so*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;q<j;q+)u=so_m_dq;SumDar_so=SumDar_so+u;SumDar_so=SumDar_so+day_so;H=SumDar_so;if(j>1)/J>1需要考虑公历闰年if(year_so%4

15、=0)SumDar_so=SumDar_so+1;函数名 函数功能/*Turn阳历转阴历无无* /void Turn()unsigned char 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

16、char Z_r;unsigned char F_r; int j,k,m,p,T;int l1,l2,l3,l4,l5,l6,l7,l8,l9,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)&

17、gt;>4)+(int)(y&0x0f);天数差值SumDar_lu=SumDar_so-n; 农历总天数k = (int)(ry&0xf0)>>4); 闰月月份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 月多

18、少天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);/ 农历 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(T<n) /如果跨年 L_Temp=(p-2000)*4;去年公历年份*

19、4再去查表,存入转化暂存器L_y=DataTabL_Temp;上半年的数据L_Temp+;L_sy=DataTabL_Temp;L_Temp+;下半年的数据L_xy=DataTabL_Temp;if (n-T)>31)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-T)&

20、lt;=31)month_lu=12;跨年到去年的 12月LastMonth=month12_lu(12,L_sy,L_xy); day_lu=LastMonth-(n-T);else /没有跨年if(SumDar_lu-l1)>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-

21、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)>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; else month_lu=11;day_lu=Sum

22、Dar_lu-l10-l9-l8-l7-l6-l5-l4-l3-l2-l1; else month_lu=10;day_lu=SumDar_lu-l9-l8-l7-l6-l5-l4-l3-l2-l1; else month_lu=9;day_lu=SumDar_lu-l8-l7-l6-l5-l4-l3-l2-l1; else month_lu=8; day_lu=SumDar_lu-l7-l6-l5-l4-l3-l2-l1; else month_lu=7; day_lu=SumDar_lu-l6-l5-l4-l3-l2-l1; else month_lu=6; day_lu=SumDar_l

23、u-l5-l4-l3-l2-l1;elsemonth_lu=5;day_lu=SumDar_lu-l4-l3-l2-l1; else month_lu=4; day_lu=SumDar_lu-l3-l2-l1;elsemonth_lu=3;day_lu=SumDar_lu-l2-l1;elsemonth_lu=2;day_lu=SumDar_lu-l1;elsemonth_lu=1; day_lu=SumDar_lu;if(k!=0)有农历闰月if(month_lu-k)>=1)在第二个闰月,月减一,日不变if(day_lu>m) 跨月day_lu=1;else没夸,月减一,日不变

24、month_lu=month_lu-1;正好在第一个闰月,月份不变/显示程序T=SumDar_so;/ if(SumDar_so<n) / 如果跨年if(T<n) /如果跨年if(year_so=0) 是 2000 年DisplayData0=DIG_CODE1;DisplayData1=DIG_CODE9;DisplayData2=DIG_CODE9;DisplayData3=DIG_CODE9;else/公历不是2000年year_lu=year_so-1;DisplayData0=DIG_CODE2;DisplayData1=DIG_CODE0;Z= year_lu/10;F

25、= 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;DisplayData3=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;DisplayDat

26、a5=DIG_CODEF_y;DisplayData6=DIG_CODEZ_r;DisplayData7=DIG_CODEF_r;/*函数名:Int0() interrupt 0* 函数功能:外部中断0的中断函数* 输入:无* 输出:无* /void Int0() interrupt 0外部中断0的中断函数Delay10ms();/延时10ms进行消抖if(K3=0)KV=1;/* 函数名:month12_lu* 函数功能:查出那个农月多少天* 输入:农历的月份,查表所得农历月份数据* 输出:返回该农历月份天数* /int month12_lu(int month_a, unsigned ch

27、ar 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(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 2

28、9; 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(month_c&0x10) return 29; else return 30;case 10:if(month_c&0x04) return 29; else return 30;case 11:if(

29、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*函数功能:检测有按键按T并读取键值*输入:无*输出:无*/void KeyDown(void) char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)读取按键是否按下 Delay10ms();/ 延日1 10ms 进行消抖 if(GPIO_KEY!=0x0f)再次检测键盘是否按下 /测试列GPIO_KEY=0X0F; switch(GPIO_KEY) case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;b

温馨提示

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

评论

0/150

提交评论