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

📄 lcd1602.lst

📁 基于51单片机的万年历
💻 LST
📖 第 1 页 / 共 3 页
字号:
 199          
 200          //------------------------------------
 201          //时分秒显示子函数
 202          void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数
 203          {
 204   1              uchar gw,sw;
 205   1              gw=dat%10;//取得个位数字
 206   1              sw=dat/10;//取得十位数字
 207   1              write_1602com(er+add);//er是头文件规定的值0x80+0x40
 208   1              write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
 209   1              write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
 210   1                                      
 211   1      }
 212          
 213          //-------------------------------------
 214          //年月日显示子函数
 215          void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数
 216          
 217          {
 218   1              uchar gw,sw;
 219   1              gw=dat%10;//取得个位数字
 220   1              sw=dat/10;//取得十位数字
 221   1              write_1602com(yh+add);//设定显示位置为第一个位置+add
 222   1              write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
 223   1              write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
 224   1              
 225   1      }
 226          
 227          //-------------------------------------------
 228          void write_week(uchar week)//写星期函数
 229          {
 230   1              write_1602com(yh+0x0c);//星期字符的显示位置
 231   1              switch(week)
 232   1              {
 233   2                      case 1:write_1602dat('M');//星期数为1时,显示
 234   2                                 write_1602dat('O');
 235   2                                 write_1602dat('N');
 236   2                                 break;
 237   2                 
 238   2                      case 2:write_1602dat('T');//星期数据为2时显示
 239   2                                 write_1602dat('U');
 240   2                                 write_1602dat('E');
 241   2                                 break;
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 5   

 242   2                      
 243   2                      case 3:write_1602dat('W');//星期数据为3时显示
 244   2                                 write_1602dat('E');
 245   2                                 write_1602dat('D');
 246   2                                 break;
 247   2                      
 248   2                      case 4:write_1602dat('T');//星期数据为4是显示
 249   2                                 write_1602dat('H');
 250   2                                 write_1602dat('U');
 251   2                                 break;
 252   2                      
 253   2                      case 5:write_1602dat('F');//星期数据为5时显示
 254   2                                 write_1602dat('R');
 255   2                                 write_1602dat('I');
 256   2                                 break;
 257   2                      
 258   2                      case 6:write_1602dat('S');//星期数据为6时显示
 259   2                                 write_1602dat('T');
 260   2                                 write_1602dat('A');
 261   2                                 break;
 262   2                      
 263   2                      case 7:write_1602dat('S');//星期数据为7时显示
 264   2                                 write_1602dat('U');
 265   2                                 write_1602dat('N');
 266   2                                 break;
 267   2      
 268   2      }
 269   1      
 270   1      }
 271          
 272          
 273          //****************键盘扫描有关函数**********************
 274          
 275          void keyscan()
 276          {
 277   1              if(key1==0)//---------------key1为功能键(设置键)--------------------
 278   1              {
 279   2              delay(9);//延时,用于消抖动
 280   2              if(key1==0)//延时后再次确认按键按下
 281   2              {
 282   3          buzzer=0;//蜂鸣器短响一次
 283   3          delay(20);
 284   3          buzzer=1;
 285   3              while(!key1);
 286   3              key1n++;
 287   3              if(key1n==9)
 288   3                      key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
 289   3              switch(key1n)
 290   3              {
 291   4              
 292   4              case 1: TR0=0;//关闭定时器
 293   4                              //TR1=0;
 294   4                              write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标
 295   4                              write_1602com(0x0f);//设置光标为闪烁
 296   4                              temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302
 297   4                              write_1302(0x8e,0x00);
 298   4                              write_1302(0x80,0x80|temp);//miao
 299   4                            write_1302(0x8e,0x80);
 300   4                              break;
 301   4              case 2:  write_1602com(er+6);//按2次fen位置显示光标
 302   4                              
 303   4                           //write_1602com(0x0f);
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 6   

 304   4                              break;
 305   4              case 3: write_1602com(er+3);//按动3次,shi
 306   4                           //write_1602com(0x0f);
 307   4                              break;
 308   4              case 4: write_1602com(yh+0x0e);//按动4次,week
 309   4                           //write_1602com(0x0f);
 310   4                              break;
 311   4              case 5: write_1602com(yh+0x0a);//按动5次,ri
 312   4                           //write_1602com(0x0f);
 313   4                              break;
 314   4              case 6: write_1602com(yh+0x07);//按动6次,yue
 315   4                           //write_1602com(0x0f);
 316   4                              break;
 317   4              case 7: write_1602com(yh+0x04);//按动7次,nian
 318   4                           //write_1602com(0x0f);
 319   4                              break;
 320   4              case 8:
 321   4                              write_1602com(0x0c);//按动到第8次,设置光标不闪烁
 322   4                              TR0=1;//打开定时器
 323   4               temp=(miao)/10*16+(miao)%10;
 324   4                         write_1302(0x8e,0x00);
 325   4                         write_1302(0x80,0x00|temp);//miao数据写入DS1302
 326   4                         write_1302(0x8e,0x80);
 327   4                  break;                                                                                                                      
 328   4                              
 329   4              }
 330   3              
 331   3              
 332   3      
 333   3              }
 334   2      
 335   2              }
 336   1      //------------------------------加键key2----------------------------            
 337   1              if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零)
 338   1              {
 339   2      
 340   2              if(key2==0)  //上调键
 341   2              {
 342   3              delay(10);
 343   3              if(key2==0)
 344   3              {
 345   4          buzzer=0;//蜂鸣器短响一次
 346   4          delay(20);
 347   4          buzzer=1;
 348   4              while(!key2);
 349   4              switch(key1n)
 350   4              {
 351   5              case 1:miao++;//设置键按动1次,调秒
 352   5                              if(miao==60)
 353   5                                      miao=0;//秒超过59,再加1,就归零
 354   5                              write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数
 355   5                              temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
 356   5                              write_1302(0x8e,0x00); //允许写,禁止写保护 
 357   5                              write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
 358   5                              write_1302(0x8e,0x80); //打开写保护
 359   5                              write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回
 360   5                              //write_1602com(0x0b);
 361   5                              break;
 362   5              case 2:fen++;
 363   5                              if(fen==60)
 364   5                                      fen=0;
 365   5                              write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 7   

 366   5                              temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
 367   5                              write_1302(0x8e,0x00);//允许写,禁止写保护 
 368   5                              write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
 369   5                              write_1302(0x8e,0x80);//打开写保护
 370   5                              write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
 371   5                              break;
 372   5              case 3:shi++;
 373   5                              if(shi==24)
 374   5                                      shi=0;
 375   5                              write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据
 376   5                              temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
 377   5                              write_1302(0x8e,0x00);//允许写,禁止写保护 
 378   5                              write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
 379   5                              write_1302(0x8e,0x80);//打开写保护
 380   5                              write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 381   5                              break;
 382   5              case 4:week++;
 383   5                              if(week==8)
 384   5                                      week=1;
 385   5                  write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
 386   5                                      write_week(week);//指定周数据显示内容
 387   5                  temp=(week)/10*16+(week)%10;//十进制转换成DS1302要求的DCB码
 388   5                              write_1302(0x8e,0x00);//允许写,禁止写保护 
 389   5                              write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
 390   5                              write_1302(0x8e,0x80);//打开写保护
 391   5                                 write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 392   5                              break;
 393   5              case 5:ri++;
 394   5                              if(ri==32)
 395   5                                      ri=1;
 396   5                              write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据
 397   5                              temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
 398   5                              write_1302(0x8e,0x00);//允许写,禁止写保护
 399   5                              write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
 400   5                              write_1302(0x8e,0x80);//打开写保护
 401   5                              write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
 402   5                              break;
 403   5              case 6:yue++;
 404   5                              if(yue==13)
 405   5                                      yue=1;

⌨️ 快捷键说明

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