⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wannianli.lst

📁 万年历,可以在单片机等各种微控制器上显示年月日小时分钟秒,比较准确.可以适当的修改加入你自己的东西
💻 LST
📖 第 1 页 / 共 5 页
字号:
 953   1        if(sel==2)  {address=0x88; max=12;mini=1;}    //月
 954   1        if(sel==1)  {address=0x8c; max=99; mini=0;}    //年
 955   1        if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期
 956   1        
 957   1        //读取1302某地址上的数值转换成10进制赋给item 
 958   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
 959   1        if(sel_1==0) 
 960   1              item++;  
 961   1        else
 962   1              item--;
 963   1        if(item>max) item=mini;   
 964   1        if(item<mini) item=max;
 965   1                 
 966   1        write_clock(0x8e,0x00);//允许写操作
 967   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 968   1        write_clock(0x8e,0x80);//写保护,禁止写操作  
 969   1      }
 970          
 971          /******************************************************************************/
 972          void id_case2_key(void)//id为1时的下一级选择
 973          {
 974   1              if(Add_Key == 0) //增加1
 975   1          {
 976   2              Delay(100);
 977   2              if(Add_Key == 0)
 978   2                      {
 979   3                              Set_Bell(id2,0);  //调用Set_Bell函数
 980   3                              backled_flag = 1;//开始记数
 981   3                              timecount2 = 0;
 982   3                      }
 983   2                      while(Add_Key ==0);//等待键松开
 984   2          }
 985   1              if(Dec_Key == 0)  //减少1
 986   1          {
 987   2              Delay(100);
 988   2              if(Dec_Key == 0)
 989   2                      {
 990   3                              Set_Bell(id2,1);  //调用Set_Bell函数
 991   3                              backled_flag = 1;//开始记数
 992   3                              timecount2 = 0;
 993   3                      }
 994   2                      while(Dec_Key ==0);//等待键松开
 995   2            }
 996   1      }
 997          
 998          /******************************************************************************/
 999          void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目并写入
1000          {
1001   1        signed char address,item;
1002   1        signed char max,mini;
1003   1        if(sel==4)  {address=0xc6; max=59;mini=0;}    //秒
1004   1        if(sel==3)  {address=0xc4; max=59;mini=0;}    //分
1005   1        if(sel==2)  {address=0xc2; max=23; mini=0;}   //时
1006   1        if(sel==1)                                                                    //标志位
1007   1        {
1008   2              address=0xc8;//for read
C51 COMPILER V7.50   WANNIANLI                                                             05/23/2006 13:38:52 PAGE 18  

1009   2              if(Add_Key ==0 || Dec_Key ==0)
1010   2              Bell_Swh=~Bell_Swh;
1011   2              write_clock(address,Bell_Swh);
1012   2        }    //开关
1013   1      
1014   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
1015   1        if(sel_1==0) 
1016   1              item++;  
1017   1        else
1018   1              item--;
1019   1        if(item>max) item=mini;   
1020   1        if(item<mini) item=max;
1021   1      
1022   1        write_clock(0x8e,0x00);//允许写操作
1023   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
1024   1        write_clock(0x8e,0x80);//写保护,禁止写操作 
1025   1      }
1026          
1027          /******************************************************************************/
1028          void Timer0_Init(void)//定时器0初始化
1029          {
1030   1              TMOD=0x01;
1031   1              TH0=(65535-50000)/256;
1032   1              TL0=(65535-50000)%256;
1033   1              EA=1;
1034   1              ET0=1; 
1035   1              TR0=1;
1036   1      }
1037          
1038          /******************************************************************************/
1039          void Timer0(void) interrupt 1 using 1//中断入口,冒号闪烁
1040          {
1041   1              static unsigned char timecount = 0;
1042   1      
1043   1              TH0=(65535-50000)/256; //50ms定时
1044   1              TL0=(65535-50000)%256;  
1045   1              timecount++;
1046   1              if(timecount > 9)//500MS
1047   1              {
1048   2              timecount = 0;    
1049   2              flag = ~flag;          
1050   2          }
1051   1      
1052   1              if(backled_flag == 1)//按键触发背光被点亮
1053   1              {
1054   2                      timecount2++;
1055   2                      if(timecount2 == 200)//3S
1056   2                      {
1057   3                              timecount2 =0;//清0
1058   3                              backled_flag =0;
1059   3                              Bak_Light = led_off;//LED背光熄灭
1060   3                      }
1061   2                      else 
1062   2                              Bak_Light = led_on;
1063   2              }
1064   1      
1065   1              if(Delaytime != 0)
1066   1                      Delaytime--;//延时函数用
1067   1      }
1068          
1069          /******************************************************************************/
1070          void Init_1302(void)//设置1302的初始时间
C51 COMPILER V7.50   WANNIANLI                                                             05/23/2006 13:38:52 PAGE 19  

1071          {
1072   1              write_clock(0x8e,0x00);//允许写操作
1073   1              write_clock(0x8c,0x06);//年
1074   1              write_clock(0x8a,0x07);//星期
1075   1              write_clock(0x88,0x01);//月
1076   1              write_clock(0x86,0x01);//日
1077   1              write_clock(0x84,0x12);//小时
1078   1              write_clock(0x82,0x00);//分钟
1079   1              write_clock(0x80,0x00);//秒
1080   1              write_clock(0x90,0xa5);//充电   
1081   1              write_clock(0x8e,0x80);//禁止写操作
1082   1      }
1083          
1084          /******************************************************************************/
1085          void Lcd_Mark1(void)//在预定的位置上写入汉字
1086          {
1087   1              Clr_Scr();//清屏
1088   1              frame();//显示边框
1089   1              Mcs=1;Scs=0;
1090   1              Disp_Chinese(5,8,shi);//显示室温,星期,年, . ,℃
1091   1              Disp_Chinese(5,24,wen);
1092   1              Disp_Chinese(3,8,xing);
1093   1              Disp_Chinese(3,24,qi);
1094   1              Disp_Chinese(1,40,nian);
1095   1              Disp_Digit(5,56,point);
1096   1              Mcs=0;Scs=1;
1097   1              Disp_Chinese(5,8,sheshidu);
1098   1              if(Bell_Swh == 1)//闹钟为开
1099   1              {       
1100   2                      Mcs=0;Scs=1;
1101   2                      Disp_Chinese(5,40,biaozhi);//显示闹钟图标
1102   2              }
1103   1      }
1104          
1105          /******************************************************************************/
1106          void Lcd_Mark2(void)
1107          {
1108   1              Clr_Scr();//清屏
1109   1              frame();//显示边框
1110   1              
1111   1              Mcs=1;Scs=0;//显示闹钟设定等几个汉字
1112   1              Disp_Chinese(2,16,nao);
1113   1              Disp_Chinese(2,32,zhong);
1114   1              Disp_Chinese(2,48,she);
1115   1              Mcs=0;Scs=1;
1116   1              Disp_Chinese(2,0,ding);
1117   1              Disp_Digit(4,0,maohao);//显示:
1118   1              Disp_Digit(4,24,maohao);        
1119   1      }
1120          
1121          /******************************************************************************/
1122          void Beep(void)//BELL 蜂明器发声,整点报警
1123          {
1124   1              Bell_Out = bell_on;
1125   1              Delay_int(5);//250ms
1126   1              Bell_Out = bell_off;
1127   1              Delay_int(15);//750
1128   1      }
1129                  
1130          /*****************************************************************************/
1131          void Bell_now(void)
1132          {
C51 COMPILER V7.50   WANNIANLI                                                             05/23/2006 13:38:52 PAGE 20  

1133   1              Bell_Out = bell_on;
1134   1              Delay_int(5);//for 250ms
1135   1              Bell_Out = bell_off;
1136   1              Delay_int(1);//50ms
1137   1              Bell_Out = bell_on;
1138   1              Delay_int(3);//150ms
1139   1              Bell_Out = bell_off;
1140   1              Delay_int(8);//400ms
1141   1      }
1142          
1143          /******************************************************************************/
1144          void main(void) //主函数 
1145          {
1146   1              //初始化状态
1147   1              Bell_Out = bell_off;//蜂明器关闭
1148   1              Bak_Light = led_on;//开机背光开
1149   1      
1150   1              Timer0_Init();
1151   1              Init_lcd();//设置液晶显示器
1152   1      
1153   1              Clr_Scr();//清屏
1154   1              Disp_Img(logo); //显示湘灵电子LOGO开机画面
1155   1              Delay12864(60000);//Delay 4s
1156   1      
1157   1              Bak_Light = led_off;//关闭背光
1158   1              Bell_Swh = read_clock(0xc9);//读取开,关的状态
1159   1              Lcd_Mark1();
1160   1      
1161   1              while(1)//主循环
1162   1              {       
1163   2                      //设置时钟的初始值,显示05年1月1号星期六12:00:00
1164   2                      if(Sysset_Key == 0 )//按下系统复位键,S4
1165   2                      {
1166   3                              Delay(100);//延时消抖
1167   3                              if(Sysset_Key == 0 )
1168   3                              {
1169   4                                      backled_flag = 1;//开始记数
1170   4                                      timecount2 = 0;
1171   4                                      Init_1302();//初始化时钟
1172   4                              }
1173   3                      }
1174   2      
1175   2                      if(Add_Key == 0 && Dec_Key ==0 )//进入闹钟设置界面
1176   2                      {
1177   3                              Delay12864(100);
1178   3                              if(Add_Key == 0 && Dec_Key ==0)
1179   3                              {
1180   4                                      backled_flag = 1;//开始记数
1181   4                                      timecount2 = 0;
1182   4                                      Lcd_Mark2();
1183   4                                      if(Bell_Swh == 0){Mcs=0;Scs=1;Disp_Chinese(2,32,guan);}//关
1184   4                                      else  {Mcs=0;Scs=1;Disp_Chinese(2,32,kai);}
1185   4                                      while(1)
1186   4                                      {       
1187   5                                              if (OK_Key == 0) // 设置和选择项目键
1188   5                                      {       
1189   6                                                      Delay(1000);
1190   6                                              if(OK_Key == 0)
1191   6                                                      {
1192   7                                                              backled_flag = 1;//开始记数
1193   7                                                              timecount2 = 0;
1194   7                                                              id2++;if(id2>5) id2=0;
C51 COMPILER V7.50   WANNIANLI                                                             05/23/2006 13:38:52 PAGE 21  

1195   7                                                      }
1196   6                                              while(OK_Key == 0);//等待键松开   
1197   6                                          }
1198   5                                          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -