




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、/* 實 驗 名 : 動態顯示數碼管實驗* 使用的IO : 數碼管使用P0,P2.2,P2.3,P2.4* 實驗效果 : 數碼管顯示76543210。* 注 意 :*/#include<reg51.h>#include<stdio.h>#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,
2、0x00,/19990x35,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,
3、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, /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,0x
4、00,0x25,0x05,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
5、,0x21,0x52,0x44,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, /20550
6、x45,0x05,0x32,0x00,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
7、,0x22,0x00, /20700x30,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,0
8、x52,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, /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,0x5
9、2,0x00,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
10、 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 year_lu;/農歷年月日char month_lu;char day_lu;int SumDar_lu;int n,H;void DigDisplay(); /動態顯示函數void Delay10m
11、s(); /延時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;/跳變沿出發方式(下降沿)E
12、X0=1;/打開INT0的中斷允許。EA=1;/打開總中斷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();/延
13、時10ms進行消抖if(GPIO_KEY!=0x0f)/再次檢測鍵盤是否按下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)(T
14、empData2); /從寄存器中讀取公歷年份year_so=year_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&
15、gt;1)/J>1需要考慮公歷閏年if(year_so%4=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;u
16、nsigned 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,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+;/閏月
17、的月份和大小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);/閏月的天數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,
18、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);/農歷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_T
19、emp=(p-2000)*4;/去年公歷年份*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;2
20、if(n)>0)&&(n-T)<=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)>
21、;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)>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;
22、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; elsemonth_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;d
23、ay_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_lu-l1;elsemonth_lu=1;day_lu=SumDar_lu;if(k!=0)/有農歷閏月if(month_lu-k)>=1)/在第二個閏月,月減一,日不變if(day_lu>m) /跨月 day_lu=1;
24、else/沒夸,月減一,日不變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_CODE
25、0;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;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_
26、CODEZ_y;DisplayData5=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* 函數功能 : 查出那個農月多少天* 輸 入 : 農歷的月份,查表所得農歷月份數據* 輸 出 : 返回該農歷月份天
27、數*/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(month_b&0x10) return 29; else return 30;case 4:if(month_b&0x04) return 29; else retu
28、rn 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(month_c&0x10) return 29; else return 30;case 10:if(month_c&0
29、x04) 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!=0x0f)/再次檢測鍵盤是否按下/測試列GPIO_KEY=0X0F;switch(GPIO_KEY)case(0X07):KeyValue=0;break;case(0X0b):KeyValue=1;break;case(0X0d):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州工貿職業學院《分鏡頭腳本》2023-2024學年第一學期期末試卷
- 幼兒輔導活動方案
- 廟會活動策劃方案
- 幼師搶答活動方案
- 年俗項目活動方案
- 建設城市活動方案
- 年會活動熱場活動方案
- 幼兒家庭活動方案
- 幼兒剪紙體驗活動方案
- 幼兒園樓梯戶外活動方案
- 新人教版八年級物理(下冊) 第十一章 功和機械能 第十一章 功與機械能復習課
- 東方航空無成人陪伴兒童乘機申請書
- 投資控股集團有限公司安全生產責任制暫行辦法
- 智慧工廠解決方案—燈塔工廠引領制造業數字化轉型-白皮書
- 2019-2020學年廣東省廉江市實驗學校北師大版五年級下冊期末復習數學試卷2
- 2019第五版新版PFMEA 注塑實例
- GB_T 40081-2021 電梯自動救援操作裝置(高清-現行)
- 情侶關系中禮物形象一致性的前因及其對禮物收送體驗的影響研究
- 《繪畫治療干預孤獨癥兒童情緒的個案研究》
- 小學音樂課題研究活動記錄
- 凈化工程施工組織設計方案方案(精華版)
評論
0/150
提交評論