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

📄 wannianli.lst

📁 0107、32x8 LED点阵屏电子钟设计制作资料
💻 LST
📖 第 1 页 / 共 2 页
字号:
 153   1              clock_out(ord);
 154   1              dd=clock_in();
 155   1              clock_Rst=0;
 156   1              clock_clk=1;
 157   1              return(dd);
 158   1      }
 159          //---------------------------------------常用时钟数据读取
 160          void read_clockS(void){
 161   1              mm = read_clock(0x83);//读取分钟数据
 162   1              hh = read_clock(0x85);//小时
 163   1              dd = read_clock(0x87);//日
 164   1              mo = read_clock(0x89);//月
 165   1              xq = read_clock(0x8b);//星期
 166   1              yy = read_clock(0x8d);//年
 167   1      }
 168          //*---------------------------------------DS1302写数据(底层协议)
 169          void write_clock(uchar ord, uchar dd){
 170   1              clock_clk=0;
 171   1              clock_Rst=0;
 172   1              clock_Rst=1;
 173   1              clock_out(ord);
 174   1              clock_out(dd);
 175   1              clock_Rst=0;
 176   1              clock_clk=1;
 177   1      }
 178          //--------------------------------------------------调时用加1程序
 179          void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
C51 COMPILER V7.50   WANNIANLI                                                             12/20/2005 21:39:34 PAGE 4   

 180   1        signed char address,item;
 181   1        signed char max,mini;
 182   1        if(sel==7)  {address=0x80; max=0;mini=0;}     //秒7
 183   1        if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟6
 184   1        if(sel==5)  {address=0x84; max=23;mini=0;}    //小时5
 185   1        if(sel==3)  {address=0x86; max=31;mini=1;}    //日3
 186   1        if(sel==2)  {address=0x88; max=12;mini=1;}    //月2
 187   1        if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1
 188   1        if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4  
 189   1        //读取1302某地址上的数值转换成10进制赋给item 
 190   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
 191   1              item++;//数值加1  
 192   1        if(item>max) item=mini;//查看数值有效范围   
 193   1        if(item<mini) item=max;           
 194   1        write_clock(0x8e,0x00);//允许写操作
 195   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 196   1        write_clock(0x8e,0x80);//写保护,禁止写操作  
 197   1      }
 198          //--------------------------------------------设置1302的初始时间
 199          void Init_1302(void){//(2005年12月20日12时00分00秒星期二)
 200   1              write_clock(0x8e,0x00);//允许写操作
 201   1              write_clock(0x8c,0x05);//年
 202   1              write_clock(0x8a,0x02);//星期
 203   1              write_clock(0x88,0x12);//月
 204   1              write_clock(0x86,0x20);//日
 205   1              write_clock(0x84,0x12);//小时
 206   1              write_clock(0x82,0x00);//分钟
 207   1              write_clock(0x80,0x00);//秒
 208   1              write_clock(0x90,0xa5);//充电   
 209   1              write_clock(0x8e,0x80);//禁止写操作
 210   1      }
 211          //--------------------------------------------扬声器--整点报时
 212          void Beep(void){//BELL 
 213   1              uchar a;//定义变量用于发声的长度设置
 214   1              Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 215   1              for(a=60;a>0;a--){//第一个声音的长度
 216   2                      Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
 217   2                      Delay(100);//音调设置延时
 218   2              }
 219   1              for(a=100;a>0;a--){//同上
 220   2                      Bell_Out = ~Bell_Out;
 221   2                      Delay(80);//
 222   2              }
 223   1              for(a=100;a>0;a--){//同上
 224   2                      Bell_Out = ~Bell_Out;
 225   2                      Delay(30);//
 226   2              }
 227   1      }
 228          //--------------------------------------------扬声器--设置报警
 229          void Beep_set(void){//BELL 
 230   1              uchar a;//定义变量用于发声的长度设置
 231   1              Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 232   1              for(a=250;a>0;a--){//第一个声音的长度
 233   2                      Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
 234   2                      Delay(20);//音调设置延时
 235   2              }
 236   1              for(a=100;a>0;a--){//同上
 237   2                      Bell_Out = ~Bell_Out;
 238   2                      Delay(80);//
 239   2              }
 240   1      }       
 241          //----------------------------------------扬声器--按键音
C51 COMPILER V7.50   WANNIANLI                                                             12/20/2005 21:39:34 PAGE 5   

 242          void Beep_key(void){
 243   1              uchar a;//定义变量用于发声的长度设置
 244   1              Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 245   1              for(a=100;a>0;a--){//声音的长度
 246   2                      Bell_Out = ~Bell_Out;
 247   2                      Delay(50);//音调设置延时
 248   2              }
 249   1      }
 250          //----------------------------------------32个寄存器清空(0x00)
 251          void clearRAM (void){//寄存器清空函数
 252   1              uchar a;//定义变量用于清空数据指针
 253   1              for(a=0;a<32;a++){//指向32个寄存器
 254   2                      Ledplay[a] = 0;//将指向的寄存器清空
 255   2              }
 256   1      }
 257          //----------------------------------------将字符装入显示寄存器
 258          void putin (uchar u){//字符载入函数
 259   1              uchar a = 0;//定义变量用于数据提取指针
 260   1              do{             
 261   2                      Ledplay[bn] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
 262   2                      a++;//换下一个提取字节  
 263   2                      bn++;//换下一个显示缓冲字节                     
 264   2              }
 265   1              while(no[u][a] != 0);//当显示数据为0时结束循环
 266   1              bn++;//换下一个显示缓冲字节
 267   1              Ledplay[bn] = 0;//显示一列的空位,便于字符区分  
 268   1      }
 269          //------------------------------------调时切换
 270          void setput (uchar k){
 271   1              switch(k){//K为0调整日期,K为1调整时间,K为2调整年和星期
 272   2                      case 0:{
 273   3                              read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
 274   3                              clearRAM();//清空显示缓冲区数据
 275   3                              bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
 276   3                              putin(mo/16);//显示月值(十位)
 277   3                              putin(mo%16);//显示月值(个位)
 278   3                              putin(18);//显示横杠“-”
 279   3                              putin(dd/16);//显示日值(十位)
 280   3                              putin(dd%16);//显示日值(个位)
 281   3                      }break; 
 282   2                      case 1:{
 283   3                              read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
 284   3                              clearRAM();//清空显示缓冲区数据
 285   3                              bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
 286   3                              putin(hh/16);//显示小时值(十位)
 287   3                              putin(hh%16);//显示小时值(个位)
 288   3                              putin(17);//显示冒号“:”
 289   3                              putin(mm/16);//显示分钟值(十位)
 290   3                              putin(mm%16);//显示分钟值(个位)
 291   3                      }break; 
 292   2                      case 2:{
 293   3                              read_clockS();//调用时钟芯片驱动函数,读出时钟数据并放入相应的寄存器
 294   3                              clearRAM();//清空显示缓冲区数据
 295   3                              bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
 296   3                              putin(yy/16);//显示年(十位)
 297   3                              putin(yy%16);//显示年(个位)
 298   3                              putin(20);//显示“Y”表示年
 299   3                              putin(xq+9);//显示星期数据
 300   3                      }break;
 301   2                      default:{//数据不附时退出
 302   3                      }
 303   2              }
C51 COMPILER V7.50   WANNIANLI                                                             12/20/2005 21:39:34 PAGE 6   

 304   1              Beep_key();//按键音
 305   1      }
 306          //----------------------------------------32*8点阵显示驱动
 307          void display (void){//点阵屏驱动函数
 308   1              uchar ac,aa=7;//定义两个数据变量
 309   1              for(ac=0x28;ac<0x30;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)         
 310   2                      Led_E  = ac;//用ac值驱动使能列信号              
 311   2                      Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏(嵌入DL汇编是为了翻转字节数据,如果接线正确可省

⌨️ 快捷键说明

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