找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8633|回复: 36
打印 上一主题 下一主题
收起左侧

时间温度控制系统(128*64LCD+ds1302+ds18b20)

  [复制链接]
跳转到指定楼层
楼主
ID:70481 发表于 2014-12-16 17:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主要功能:
           温度计 时钟 闹铃 密码锁 篮球器 计算器 温度控制 键盘锁 系统设置等。

时间温度控制系统原理图及元器件.pdf (312.48 KB, 下载次数: 216) 时间温度控制系统源代码.zip (225.76 KB, 下载次数: 197)

下面是源代码
  1. /**************************************************************************************
  2. 程序名称:
  3.            时间 温度控制系统(128*64LCD+ds1302+ds18b20)
  4. 主要功能:
  5.            温度计 时钟 闹铃 密码锁 篮球器 计算器 温度控制 键盘锁 系统设置等。
  6. 主要说明:
  7.            程序全部定义在一个C文件中。
  8. 作者:   
  9.            JZHG
  10. 时间:   
  11.            2011.12.19
  12. 版本:   
  13.            JZHG-V1.0
  14. /**************************************************************************************/
  15. #include<reg52.h>
  16. #include<intrins.h>
  17. #define uchar unsigned char
  18. #define uint unsigned int
  19. #define time_count 0x3cb0 //时间计数
  20. #define close 1           //开始标志
  21. #define open 0            //结束标志
  22. #define keyboard P1       //键盘数据口
  23. /*****************状态控制及温感器总线定义*****************************/

  24. sbit b20_io=P0^0; //ds18b20总线
  25. sbit pw_oc=P0^4;  //密码锁开启控制灯
  26. sbit buzzer=P0^5; //喇叭端口
  27. sbit lcd_bl=P0^6;  //背光控制端口
  28. sbit als_th=P3^6;  //上限温度警报
  29. sbit als_tl=P3^7;  //下限温度警报

  30. /******************LCD12864定义**************************/

  31. #define lcd_data P2//lcd数据口
  32. #define comm 0     //lcd指令
  33. #define dat  1     //lcd数据
  34. sbit lcd_rst=P0^7; //lcd复位
  35. sbit lcd_e  =P3^0; //lcd使能
  36. sbit lcd_rw =P3^1; //lcd读写
  37. sbit lcd_rs =P3^2; //lcd数据指令
  38. sbit busy   =P2^7; //忙碌位

  39. /*****************ds1302定义**************************/

  40. sbit d02_rst =P0^1;  //ds1302使能
  41. sbit d02_data=P0^2;  //ds1302数据
  42. sbit d02_sclk=P0^3;  //ds1302时钟

  43. #define d02_wrc    0x8e //ds1302读写控制
  44. #define d02_year   0x8c //年
  45. #define d02_weeks  0x8a //星期
  46. #define d02_month  0x88 //月
  47. #define d02_day    0x86 //日
  48. #define d02_hour   0x84 //时
  49. #define d02_minute 0x82 //分
  50. #define d02_second 0x80 //秒
  51. #define d02_signs  0xc0 //系统状态(记录设计标记)
  52. #define d02_passw  0xc2 //密码寄存器首位(有3位下位地址加2,初始值为741456)
  53. #define d02_alm    0xc8 //闹铃时间小时位(下位为分钟下位加2)
  54. #define d02_temp   0xcc //温度上限警报(有两位下位加2)
  55. #define d02_initsi 0xd4 //1302初始化标志(为0xb4,说明已经初始化)
  56. #define ret_ds1302()   d02_rst=0;d02_sclk=0;d02_rst=1 //1302读写复位
  57. #define end_ds1302()   d02_sclk=1;d02_rst=0           //1302读写结束

  58. /*================================= 全局变量定义 ==================================*/


  59. typedef struct          // 定义时间类型
  60. {
  61.   uchar hour;
  62.   uchar minute;
  63.   uchar second;
  64. }time;

  65. typedef struct          // 定义日期类型
  66. {
  67.   uchar year;
  68.   uchar month;
  69.   uchar day;
  70.   uchar week;
  71. }date;

  72. typedef union           // 定义温度类型
  73. {
  74.   int temp_data;
  75.   uchar t_data[2];
  76. }trdata;

  77. trdata  bdata  temp;             // 温度警报值暂存  
  78. date    idata  today={'8',1,1,1};    // 日期暂存
  79. time    idata  now={0x12,0,0} , save_time={0x12,0,0};
  80.               // 时间暂存(now是读出时间暂存 save_time上一时间暂存)
  81. uchar   idata  time_tick=20,time_tick1=20,alarm_time[2],als_temp[2],
  82.               // T0中断数,     T1中断数,     闹铃时间,   警报温度
  83.                bl_delay=15,temp_delay=5,opera[2][12],resu[12],
  84.               // 背光时间,  温度更新时间, 计算器数据寄存, 结果寄存
  85.                i,j,save1,temp_min=0;
  86.                // 计算器i/j下标,中间暂存,温度更新(分)



  87. uchar  bdata   signs=0;      // 系统标记寄存器
  88.   sbit bl1=signs^7;          // bl1,bl0背光选择位(00 延时,01 常开,10 关闭)
  89.   sbit bl0=signs^6;         
  90.   sbit di1=signs^5;          // di1,di0显示模式(00模式1,01模式2,10模式3)
  91.   sbit di0=signs^4;         
  92.   sbit meu=signs^3;          // 菜单显示方式(0 图片,1 文字)
  93.   sbit keb=signs^2;          // 键盘锁(0 无锁,1加锁)
  94.   sbit alm=signs^1;          // 闹钟启动位(0 关闭,1开启)
  95.   sbit als=signs^0;          // 报警启动位(0 启动,1关闭)



  96. uint   bdata   run_signs=0;     // 运行标记寄存器
  97.   sbit ds18b20=run_signs^0;     // 温感器存在标记(0不存在,1存在)
  98.   sbit temp_pn=run_signs^1;     // 温度正负号标记(0正,1负)
  99.   sbit temprun=run_signs^2;     // 温感器运行标记(0否,1启动)
  100.   sbit nba_tim=run_signs^3;     // 篮球计时器标记(0关闭,1启动)
  101.   sbit adju_si=run_signs^4;     // 数字更改连续标记(1连续)
  102.   sbit cal_del=run_signs^5;     // 计算器显示点标记(0没有显示)
  103.   sbit cal_run=run_signs^6;     // 计算完毕标记(1有效)
  104.   sbit oth_run=run_signs^7;     // 其他标记
  105.   sbit alm_run=run_signs^8;     // 闹钟时间到达标记(1有效)
  106.   sbit dis_sig=run_signs^9;     // 显示时间标记(1有效)
  107.   sbit lock_op=run_signs^10;    // 关锁时间到标记(1有效)
  108.   sbit b20time=run_signs^11;    // 温感器重新读温度标记(1有效)
  109.   sbit t0_isr =run_signs^12;    // TO中断标记(1有效(1s)
  110.   sbit thl_als=run_signs^13;    // 温度警报标记
  111.   sbit init_d2=run_signs^14;    // 模式2初始显示
  112.   sbit buzstop=run_signs^15;    // 蜂鸣器停止标记




  113. /*================================= 字体显示代码 ==================================*/

  114. uchar code weeks[7][2]={"一","二","三","四","五","六","日"}; // 星期                //图片中文
  115. uchar code menu_cn[6][8]={"调    整","工    具","设    置","保    密","版    本","退    出"};
  116. uchar code menu_cn_2[6][6]={"调  整","工  具","设  置","保  密","版  本","退  出"};// 菜单文字
  117. uchar code selected[2][16]={{"进入【      】\x04 "},{"设置【    】\x10 \x04 "}}; // 选框
  118. uchar code secrets_menu[4][6]={"开  锁","更  改","初始化","退  出"};           // 保密菜单中文
  119. uchar code tool_menu[5][6]={"计算器","温度计","闹  铃","篮球器","退  出"};     // 工具菜单中文
  120. uchar code char_num[10]={"0123456789"};  // 数字显示代码                             // 每月天数
  121. uchar code dayofmonth[12]={0x31,0x28,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0x31,0x30,0x31};
  122. uchar code key_code[]={0xD7,0x7E,0x7D,0x7B,0xBE,0xBD,0xBB,0xDE,0xDD,0xDB,0xB7,0x77,0xEE,0xED,0xEB,0xE7};
  123. uchar code ksp[4]={0x7F,0xBF,0xDF,0xEF};     // 按键扫描代码
  124. uchar code tool_cal[4][2]={"+ ","- ","* ","/ "}; // 运算符号
  125. uchar code alm_sign[2][2]={"关","开"};           // 闹铃开关
  126. uchar code set_bl_dm[2][3][4]={{"30秒","常开","关闭"},{"模01","模02","模03"}};
  127. uchar code set_mka[3][2][4]={{"图片","文字"},{"解锁","加锁"},{"开启","关闭"}};
  128. uchar code nba_oppo[8][2]={"红","白","蓝","绿","紫","灰","黄","黑"};
  129. uchar code set_menu[6][4]={"背光","显示","菜单","键盘","警报","退出"};


  130. uchar code version[9][16]={   // 版本信息
  131.                             {"湖南科技经贸学院"},
  132.                             {"电子信息工程学院"},
  133.                             {"11年电子技能大赛"},
  134.                             {"    —10电子01班"},
  135.                             {"作者:蒋志高    "},
  136.                             {"版本:JZHG-V1.0 "},
  137.                             {"    2011/12/19  "},
  138.                             {"谢谢你的使用!  "},
  139.                             {"        (ok)\x10"},
  140.                                     };


  141. uchar code timer_tips[12][16]={ // 篮球器使用说明
  142.                             {"使用方法:      "},
  143.                             {"  (+)(-)与(*)(/)"},
  144.                             {"分别是两方的分数"},
  145.                             {"加与减,(7)键回退"},
  146.                             {"一秒,(8)键24秒复"},
  147.                             {"位,(9)键暂停与开"},
  148.                             {"始;暂停状态下:"},
  149.                             {"按两次(OK)键可返"},
  150.                             {"回时钟模式-2界面"},
  151.                             {",(OK)键返回程序"},
  152.                             {"界面,(./S)键两次"},
  153.                             {"退出程序.      \x1f"}};



  154. /*================================= 操作导航代码 ==================================*/


  155. typedef struct          // 定义主菜单操作索引
  156. {
  157.   uchar shaft_num;
  158.   uchar left_num;
  159.   uchar right_num;
  160. }menu_index;

  161. typedef struct          // 定义导航更改索引
  162. {
  163.   uchar lnum;
  164.   uchar rnum;
  165. }index;

  166. menu_index code index_m[6]={{3,5,1},{4,0,2},{5,1,3},{0,2,4},{1,3,5},{2,4,0}}; // 菜单导航
  167. index code index_t[6]={{4,1},{0,2},{1,3},{2,4},{3,0}};       // 工具导航
  168. index code index_p[5]={{3,1},{0,2},{1,3},{2,0}};             // 保密导航
  169. index code index_s[6]={{5,1},{0,2},{1,3},{2,4},{3,5},{4,0}}; // 设置导航
  170. index code index_a[7]={{0x81,0x91},{0x83,0x91},{0x85,0x91},{0x89,0x81},
  171.                         {0x8b,0x81},{0x8d,0x81},{0x8f,0x91}};       // 调整下的坐标
  172. index code index_temp_set[3]={{0x8b,0x81},{0x8b,0x91},{0x8f,0x91}}; // 温度设定下的坐标
  173. index code index_alm[3]={{0x8c,0x81},{0x8e,0x81},{0x8f,0x91}};      // 闹铃更改坐标
  174. index code index_cal[3]={{0x86,0x90},{0x8e,0x80},{0x8e,0x90}};      // 计算器操作坐标
  175. uchar code index_nba[4]={0x93,0x97,0x8b,0x8f};                      // 篮球器设置导航





  176. /*========================== 菜单图片(宽度x高度=32*24)=============================*/

  177. uchar code menu_pic[6][96]={
  178.     {// 调整
  179.      0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,
  180.      0x40,0x00,0x00,0x82,0x47,0xFF,0xE1,0xC2,0x47,0xFF,0xF3,0xE2,0x47,0x38,0x68,0x02,
  181.      0x46,0xDF,0x68,0x82,0x46,0xDF,0x69,0xC2,0x46,0xDE,0xE8,0x82,0x46,0xDD,0xE8,0x02,
  182.      0x46,0xDD,0xE8,0x02,0x47,0x3D,0xE8,0x02,0x47,0xFF,0xE8,0x02,0x47,0xFF,0xE9,0xC2,
  183.      0x42,0x00,0x18,0x02,0x41,0xFF,0xF3,0xE2,0x40,0x00,0x01,0xC2,0x40,0x00,0x00,0x82,
  184.      0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00},
  185.    
  186.     {// 工具                           
  187.      0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x00,0x03,0x82,
  188.      0x41,0xF0,0x07,0xC2,0x43,0xFF,0xCF,0xE2,0x47,0x3F,0xFE,0x02,0x47,0x3F,0xFE,0x02,
  189.      0x43,0xFF,0xCF,0xE2,0x41,0xF0,0x0F,0xC2,0x40,0x00,0x03,0x82,0x40,0x00,0x00,0x02,
  190.      0x40,0x00,0x03,0xC2,0x40,0x00,0x03,0xC2,0x41,0x80,0x01,0x82,0x43,0xFF,0xF3,0xC2,
  191.      0x47,0xFF,0xFF,0xE2,0x47,0xFF,0xFF,0xE2,0x43,0xFF,0xF3,0xC2,0x41,0x80,0x01,0x82,
  192.      0x40,0x00,0x01,0x82,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00},
  193.    
  194.     {// 设置
  195.      0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x43,0x18,0x00,0x02,
  196.      0x44,0xA4,0x0E,0x02,0x44,0xA4,0x1F,0x02,0x43,0x24,0x3F,0x02,0x40,0x00,0x7F,0x02,
  197.      0x40,0xF0,0xFC,0x02,0x43,0xF9,0xF0,0x02,0x43,0x03,0xE0,0x02,0x46,0x77,0x80,0x02,
  198.      0x46,0x7F,0x00,0x02,0x46,0x7E,0x00,0x02,0x46,0x7C,0x00,0x02,0x47,0x3D,0x00,0x02,
  199.      0x43,0x1D,0x81,0x22,0x43,0x81,0xB2,0x42,0x41,0xC3,0x4F,0xE2,0x40,0xFE,0x4A,0x42,
  200.      0x40,0x3C,0x32,0x42,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00},
  201.    
  202.     {// 保密
  203.      0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0xFC,0x03,0x02,
  204.      0x41,0xFE,0x1F,0x02,0x43,0x87,0x03,0x82,0x43,0x03,0x03,0x02,0x43,0x03,0x03,0x02,
  205.      0x43,0x03,0x0F,0x02,0x43,0x03,0x03,0x02,0x43,0x03,0x03,0x02,0x47,0xFF,0x83,0x02,
  206.      0x47,0xFF,0x83,0x02,0x47,0xCF,0x83,0x02,0x47,0x87,0x83,0x02,0x47,0xCF,0x83,0x02,
  207.      0x47,0xCF,0x87,0x82,0x47,0xCF,0x8F,0xC2,0x47,0xCF,0x9C,0xE2,0x47,0xFF,0x8F,0xC2,
  208.      0x43,0xFF,0x07,0x82,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00},
  209.    
  210.     {// 版本
  211.      0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x00,0x00,0x02,
  212.      0x40,0x0F,0x00,0x62,0x40,0x1D,0x80,0xF2,0x40,0x38,0x41,0xF2,0x40,0x70,0x23,0xE2,
  213.      0x40,0xE2,0x17,0xC2,0x41,0xE4,0x4F,0x82,0x41,0xF0,0x9F,0x02,0x41,0x59,0x16,0x02,
  214.      0x42,0x4C,0x1D,0x02,0x42,0x46,0x20,0x82,0x42,0x47,0x00,0x42,0x44,0x43,0x80,0xC2,
  215.      0x44,0x44,0xC1,0xC2,0x44,0xC8,0x63,0x82,0x45,0x50,0x37,0x02,0x46,0x60,0x1E,0x02,
  216.      0x40,0x40,0x0C,0x02,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00},
  217.    
  218.     {// 退出
  219.      0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x40,0x00,0x00,0x02,0x40,0x40,0xFF,0xE2,
  220.      0x40,0x60,0x80,0x62,0x43,0xF0,0x80,0xA2,0x43,0xF0,0x81,0x22,0x40,0x60,0x82,0x22,
  221.      0x40,0x40,0x84,0x22,0x40,0x00,0x88,0x22,0x40,0x00,0x88,0x22,0x47,0xFF,0xF8,0x22,
  222.      0x47,0xFF,0xF8,0x22,0x46,0x2A,0x2A,0x22,0x46,0xE3,0x78,0x22,0x46,0x77,0x78,0x22,
  223.      0x46,0xE3,0x78,0x62,0x46,0x2A,0x38,0x82,0x47,0xFF,0xF9,0x02,0x47,0xFF,0xFA,0x02,
  224.      0x40,0x00,0x0C,0x02,0x40,0x00,0x00,0x02,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,}};




  225. /*================ 显示模式2数字及温度符号图片(宽度x高度=16*32)=====================*/

  226. uchar code mode_2num[11][64]={
  227.     {// 图片数字0
  228.      0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  229.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x40,0x02,0x00,0x00,
  230.      0x40,0x02,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  231.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x6F,0xF6,0x5F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},
  232.    
  233.     {// 图片数字1
  234.      0x00,0x00,0x00,0x20,0x00,0x60,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,
  235.      0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x20,
  236.      0x00,0x60,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,
  237.      0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00},
  238.    
  239.     {// 图片数字2
  240.      0x00,0x00,0x3F,0xFC,0x1F,0xFA,0x0F,0xF6,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  241.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x1F,0xFA,0x3F,0xFC,
  242.      0x5F,0xF8,0x60,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,
  243.      0x70,0x00,0x70,0x00,0x70,0x00,0x6F,0xF8,0x5F,0xFC,0x3F,0xFE,0x00,0x00,0x00,0x00},
  244.    
  245.     {// 图片数字3
  246.      0x00,0x00,0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  247.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x1F,0xFA,0x3F,0xFC,
  248.      0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  249.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x1F,0xF6,0x3F,0xFA,0x7F,0xFC,0x00,0x00,0x00,0x00},
  250.    
  251.     {// 图片数字4
  252.      0x00,0x00,0x40,0x02,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  253.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x5F,0xFA,0x3F,0xFC,
  254.      0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  255.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00},
  256.    
  257.     {// 图片数字5
  258.      0x00,0x00,0x3F,0xFC,0x5F,0xF8,0x6F,0xF0,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,
  259.      0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x5F,0xF8,0x3F,0xFC,
  260.      0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  261.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x0F,0xF6,0x1F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},
  262.    
  263.     {// 图片数字6
  264.      0x00,0x00,0x3F,0xFC,0x5F,0xF8,0x6F,0xF0,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,
  265.      0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x5F,0xF8,0x3F,0xFC,
  266.      0x5F,0xFA,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  267.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x6F,0xF6,0x5F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},
  268.    
  269.     {// 图片数字7
  270.      0x00,0x00,0x7F,0xFC,0x3F,0xFA,0x1F,0xF6,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  271.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,
  272.      0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  273.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00},
  274.    
  275.     {// 图片数字8
  276.      0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  277.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x5F,0xFA,0x3F,0xFC,
  278.      0x5F,0xFA,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  279.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x6F,0xF6,0x5F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},
  280.    
  281.     {// 图片数字9
  282.      0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  283.      0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x5F,0xFA,0x3F,0xFC,
  284.      0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
  285.      0x00,0x0E,0x00,0x0E,0x00,0x0E,0x1F,0xF6,0x3F,0xFA,0x7F,0xFC,0x00,0x00,0x00,0x00},
  286.    
  287.     {// 温度符号
  288.      0x00,0x00,0x00,0x00,0x70,0xE0,0x53,0xF0,0x77,0xFA,0x0E,0x0E,0x0C,0x06,0x18,0x06,
  289.      0x18,0x02,0x38,0x02,0x30,0x00,0x30,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,
  290.      0x60,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x38,0x00,0x18,0x02,0x18,0x02,
  291.      0x0C,0x06,0x0E,0x06,0x07,0x0E,0x03,0xFA,0x00,0xF0,0x00,0x60,0x00,0x00,0x00,0x00}};





  292. /*===================== 显示模式3数字图片(宽度x高度=24*32)=========================*/

  293. uchar code mode_3num[10][96]={
  294.     {// 图片数字0
  295.      0x00,0x7E,0x00,0x01,0xE7,0x80,0x03,0xC3,0xC0,0x07,0x81,0xE0,0x0F,0x80,0xF0,0x0F,
  296.      0x00,0xF0,0x1F,0x00,0xF8,0x1E,0x00,0xF8,0x3E,0x00,0x78,0x3E,0x00,0x7C,0x3E,0x00,
  297.      0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,
  298.      0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,
  299.      0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x78,0x1E,0x00,0xF8,0x1F,0x00,0xF8,0x0F,0x00,
  300.      0xF0,0x0F,0x81,0xF0,0x07,0x81,0xE0,0x03,0xC3,0xC0,0x01,0xE7,0x80,0x00,0x7E,0x00},

  301.     {// 图片数字1
  302.      0x00,0x0C,0x00,0x00,0x1C,0x00,0x00,0x7C,0x00,0x07,0xFC,0x00,0x00,0x3C,0x00,0x00,
  303.      0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,
  304.      0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,
  305.      0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,
  306.      0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,
  307.      0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3E,0x00,0x00,0x7F,0x00,0x07,0xFF,0xF0},
  308.                
  309.     {// 图片数字2
  310.      0x00,0xFF,0x00,0x03,0xC7,0xC0,0x07,0x01,0xE0,0x0E,0x00,0xF0,0x1E,0x00,0xF8,0x1E,
  311.      0x00,0xF8,0x3E,0x00,0x78,0x3E,0x00,0x78,0x3F,0x00,0x78,0x3F,0x00,0x78,0x1F,0x00,
  312.      0xF8,0x00,0x00,0xF8,0x00,0x00,0xF0,0x00,0x01,0xF0,0x00,0x03,0xE0,0x00,0x03,0xC0,
  313.      0x00,0x07,0x80,0x00,0x0F,0x00,0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x78,0x00,0x00,
  314.      0xF0,0x00,0x01,0xE0,0x00,0x03,0xC0,0x00,0x07,0x80,0x1C,0x07,0x00,0x1C,0x0E,0x00,
  315.      0x38,0x1C,0x00,0x38,0x3C,0x00,0x78,0x3F,0xFF,0xF8,0x3F,0xFF,0xF8,0x3F,0xFF,0xF8},

  316.     {// 图片数字3
  317.      0x00,0xFE,0x00,0x07,0x87,0x80,0x0F,0x03,0xC0,0x1E,0x01,0xE0,0x1E,0x01,0xF0,0x1E,
  318.      0x01,0xF0,0x1F,0x00,0xF0,0x1F,0x00,0xF0,0x1E,0x00,0xF0,0x00,0x00,0xF0,0x00,0x01,
  319.      0xF0,0x00,0x01,0xF0,0x00,0x03,0xE0,0x00,0x03,0xC0,0x00,0x0F,0x00,0x00,0xFE,0x00,
  320.      0x00,0x07,0x80,0x00,0x01,0xE0,0x00,0x00,0xF0,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,
  321.      0x00,0x78,0x00,0x00,0x7C,0x1E,0x00,0x7C,0x3F,0x00,0x7C,0x3F,0x00,0x7C,0x3F,0x00,
  322.      0x78,0x3E,0x00,0xF8,0x1E,0x00,0xF0,0x0F,0x01,0xE0,0x07,0x87,0xC0,0x01,0xFF,0x00},

  323.     {// 图片数字4
  324.      0x00,0x03,0xC0,0x00,0x03,0xC0,0x00,0x07,0xC0,0x00,0x0F,0xC0,0x00,0x0F,0xC0,0x00,
  325.      0x1F,0xC0,0x00,0x3F,0xC0,0x00,0x3F,0xC0,0x00,0x77,0xC0,0x00,0x77,0xC0,0x00,0xE7,
  326.      0xC0,0x01,0xC7,0xC0,0x01,0xC7,0xC0,0x03,0x87,0xC0,0x07,0x07,0xC0,0x07,0x07,0xC0,
  327.      0x0E,0x07,0xC0,0x1E,0x07,0xC0,0x1C,0x07,0xC0,0x38,0x07,0xC0,0x38,0x07,0xC0,0x7F,
  328.      0xFF,0xFE,0x7F,0xFF,0xFE,0x00,0x07,0xC0,0x00,0x07,0xC0,0x00,0x07,0xC0,0x00,0x07,
  329.      0xC0,0x00,0x07,0xC0,0x00,0x07,0xC0,0x00,0x07,0xC0,0x00,0x07,0xE0,0x00,0x7F,0xFE},

  330.     {// 图片数字5
  331.      0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x0F,0xFF,0xF8,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,
  332.      0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,
  333.      0x00,0x0E,0x7F,0x00,0x0D,0xFF,0xC0,0x0F,0xC3,0xE0,0x1F,0x01,0xF0,0x1E,0x00,0xF8,
  334.      0x1E,0x00,0xF8,0x00,0x00,0x78,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,
  335.      0x00,0x7C,0x1E,0x00,0x7C,0x3F,0x00,0x7C,0x3F,0x00,0x78,0x3F,0x00,0x78,0x3E,0x00,
  336.      0xF8,0x1E,0x00,0xF0,0x1E,0x01,0xF0,0x0E,0x01,0xE0,0x07,0x87,0xC0,0x00,0xFF,0x00},

  337.     {// 图片数字6
  338.      0x00,0x3F,0xC0,0x00,0xF1,0xE0,0x03,0xC1,0xF0,0x07,0x81,0xF8,0x07,0x01,0xF8,0x0F,
  339.      0x00,0xF0,0x1F,0x00,0x00,0x1E,0x00,0x00,0x1E,0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,
  340.      0x00,0x3E,0x00,0x00,0x3E,0x3F,0x80,0x3E,0xFF,0xE0,0x3F,0xE3,0xF0,0x3F,0x80,0xF8,
  341.      0x3F,0x00,0xF8,0x3F,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x7C,0x3E,0x00,0x3C,0x3E,
  342.      0x00,0x3C,0x3E,0x00,0x3C,0x3E,0x00,0x3C,0x3E,0x00,0x7C,0x1E,0x00,0x7C,0x1F,0x00,
  343.      0x78,0x0F,0x00,0x78,0x0F,0x80,0xF0,0x07,0xC0,0xE0,0x03,0xE3,0xC0,0x00,0xFF,0x00},

  344.     {// 图片数字7
  345.      0x1F,0xFF,0xFC,0x1F,0xFF,0xFC,0x1F,0xFF,0xF8,0x1F,0x00,0x38,0x1C,0x00,0x70,0x1C,
  346.      0x00,0xE0,0x38,0x00,0xE0,0x38,0x01,0xC0,0x00,0x01,0xC0,0x00,0x03,0x80,0x00,0x03,
  347.      0x80,0x00,0x07,0x80,0x00,0x07,0x00,0x00,0x0F,0x00,0x00,0x0E,0x00,0x00,0x1E,0x00,
  348.      0x00,0x1E,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00,0x7C,0x00,0x00,
  349.      0x78,0x00,0x00,0x78,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,
  350.      0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x78,0x00},

  351.     {// 图片数字8
  352.      0x00,0xFF,0x00,0x07,0xC3,0xC0,0x0F,0x00,0xE0,0x1E,0x00,0xF0,0x1E,0x00,0x78,0x3C,
  353.      0x00,0x78,0x3C,0x00,0x78,0x3C,0x00,0x7C,0x3E,0x00,0x78,0x3E,0x00,0x78,0x1F,0x00,
  354.      0x78,0x1F,0x80,0xF0,0x0F,0xE1,0xE0,0x07,0xFB,0xC0,0x01,0xFF,0x80,0x01,0xFF,0x80,
  355.      0x07,0xBF,0xC0,0x0F,0x0F,0xE0,0x1E,0x03,0xF0,0x3E,0x01,0xF8,0x3C,0x00,0xF8,0x3C,
  356.      0x00,0x7C,0x7C,0x00,0x7C,0x78,0x00,0x3C,0x78,0x00,0x3C,0x7C,0x00,0x3C,0x3C,0x00,
  357.      0x78,0x3C,0x00,0x78,0x1E,0x00,0x70,0x0F,0x00,0xE0,0x07,0xC3,0xC0,0x01,0xFF,0x00},

  358.     {// 图片数字9
  359.      0x01,0xFE,0x00,0x07,0xC7,0x80,0x0F,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x00,0xF0,0x3E,
  360.      0x00,0xF8,0x3C,0x00,0x78,0x3C,0x00,0x78,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x7C,0x00,
  361.      0x7C,0x7C,0x00,0x7C,0x7C,0x00,0x7C,0x3C,0x00,0xFC,0x3E,0x00,0xFC,0x3E,0x01,0xFC,
  362.      0x1F,0x03,0xFC,0x1F,0x8F,0xFC,0x0F,0xFF,0x7C,0x03,0xFC,0x7C,0x00,0x00,0x7C,0x00,
  363.      0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0xF0,0x00,0x01,0xF0,0x0F,0x01,
  364.      0xE0,0x1F,0x01,0xE0,0x1F,0x03,0xC0,0x1F,0x07,0x80,0x0F,0x9F,0x00,0x03,0xFC,0x00}};




  365. /*========================== 标记及点图片(宽度x高度=16*16)===========================*/


  366. uchar code running[7][32]={
  367.      {// 警报标记16*16
  368.       0x00,0x00,0x00,0x39,0x00,0x7B,0x00,0xFE,0x01,0xDC,0x0F,0x98,0x0F,0x18,0x0C,0x1F,
  369.       0x0C,0x1F,0x0F,0x18,0x0F,0x98,0x01,0xDC,0x00,0xFE,0x00,0x7B,0x00,0x39,0x00,0x00,},
  370.      {// 闹铃开启标记16*16
  371.       0x00,0x00,0x00,0x40,0x00,0xE0,0x01,0xB0,0x01,0xB0,0x03,0x18,0x03,0x18,0x06,0x0C,
  372.       0x0C,0x06,0x0C,0xE6,0x1B,0x1B,0x0C,0x06,0x06,0x0C,0x03,0xF8,0x00,0xE0,0x00,0x00},
  373.      {// 键盘锁标记16*16
  374.       0x00,0x00,0x01,0xF8,0x03,0xFC,0x03,0x0C,0x03,0x0C,0x03,0x0C,0x03,0xFC,0x06,0x96,
  375.       0x0E,0xA7,0x0E,0xC7,0x0E,0xA7,0x0E,0x97,0x07,0xFE,0x03,0xFC,0x01,0xF8,0x00,0x00,},
  376.      {// 温度计标记16*16
  377.       0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
  378.       0x01,0x90,0x01,0x98,0x01,0x9C,0x01,0x9E,0x01,0x9C,0x00,0x18,0x00,0x10,0x00,0x00},
  379.      {// 模式3点16*16
  380.       0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
  381.       0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  382.      {// 模式2点16*16
  383.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
  384.       0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},   
  385.      {// 篮球器运行标记16*16
  386.       0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x90,
  387.       0x01,0x98,0x01,0x9C,0x01,0x9E,0x01,0x9C,0x01,0x98,0x01,0x90,0x00,0x00,0x00,0x00}};


  388. /*========================== 菜单按钮图片(宽度x高度=16*8)============================*/

  389. uchar code menu_key[]=
  390.      {//菜单按钮
  391.       0x7F,0xFE,0x81,0x81,0x83,0xC1,0x87,0xE1,0x8F,0xF1,0x9F,0xF9,0x80,0x01,0x7F,0xFE
  392.      };





  393. /*=====================================================================================
  394. 函数名称:定时器中断处理与初始化,延时
  395. 功能描述:时钟更新、篮球器计时
  396. 全局变量:time_tick、time_tick1、resu[2]、resu[3]、resu[4]、temp_delay、temp_min
  397. 参数说明:无
  398. 返回说明:t0_isr(中断标记)、b20time(温度更新标记)
  399. 设 计 人:JZHG
  400. 版    本:1.0
  401. 说    明:
  402. ======================================================================================*/


  403. /*延时(一次10个机器周期不等) 参数格式:延时数*/
  404. void delay(unsigned int det)
  405. {
  406.   while(det--);
  407. }



  408. /*1s延时*/
  409. void delay_pw()
  410. {
  411.   delay(60000);
  412.   delay(60000);
  413. }


  414. /*6个周期  6us */
  415. void  delay_b20(uchar n)
  416. {  
  417.   while(n--);
  418. }



  419. /*主时钟中断处理*/
  420. void time0_isr(void) interrupt  1  using 1
  421. {
  422.   TR0=0;
  423.   TL0=(time_count&0x00FF);
  424.   TH0=(time_count>>8);
  425.   TR0=1;
  426.   if(--time_tick)  return;
  427.   time_tick=20;
  428.   t0_isr=1;
  429.   if(nba_tim&!oth_run)     // 当在篮球器界面时 nba_tim==1、oth_run==0
  430.   {
  431.     if(resu[3]==0)
  432.     {
  433.       resu[3]=59;
  434.       if(resu[2]>0) resu[2]--;
  435.     }
  436.     else resu[3]--;
  437.     if(resu[2]==0&resu[3]==0)  // 比赛时间到后停止
  438.     {
  439.       TR0=0;TR1=0;EA=0;
  440.     }
  441.     return;
  442.   }
  443.   if((++temp_min)==60)    // 实现温度的更新
  444.   {
  445.     temp_min=0;
  446.     temp_delay--;
  447.     if(temp_delay==0)
  448.     {
  449.       b20time=1;temp_delay=5;
  450.     }
  451.   }
  452. }


  453. /*24时钟中断处理*/
  454. void time1_isr(void) interrupt  3  using 2
  455. {
  456.   TR1=0;
  457.   TL1=(time_count&0x00FF);
  458.   TH1=(time_count>>8);
  459.   TR1=1;
  460.   if(--time_tick1) return;
  461.   time_tick1=20;
  462.   if(resu[4]>0)resu[4]--;     //  篮球器24秒中断
  463.   t0_isr=1;
  464.   if(resu[4]==0)
  465.   { TR0=0;TR1=0;EA=0;}
  466. }


  467. /*定时器初始化*/
  468. void time_init()            
  469. {
  470.   EA=0;
  471.   TR0=0;
  472.   TR1=0;
  473.   TMOD=0x11;
  474.   TL0=(time_count&0x00FF);
  475.   TH0=(time_count>>8);
  476.   TL1=(time_count&0x00FF);
  477.   TH1=(time_count>>8);
  478.   IE=0;
  479.   ET0=1;
  480.   ET1=1;
  481. }



  482. /*=====================================================================================
  483. 函数名称:LCD驱动
  484. 功能描述:基本驱动(写1个字节、清屏、初始化)
  485. 全局变量:无
  486. 参数说明:dat_comm(0:命令 1:数据),content(数值)
  487. 返回说明:无返回值
  488. 设 计 人:JZHG
  489. 版    本:1.0
  490. 说    明:
  491. ======================================================================================*/


  492. /*检查忙碌位*/
  493. void chk_busy (void)
  494. {
  495.   lcd_data = 0xff;
  496.   lcd_rs = 0;    // 命令
  497.   lcd_rw = 1;    // 读
  498.   lcd_e = 1;
  499.   while(busy==1);
  500.   lcd_e = 0;
  501. }


  502. /*写LCD 参数格式:0:命令,1:数值 ,数据*/
  503. void wr_lcd (uchar dat_comm,uchar content)
  504. {
  505.   chk_busy ();
  506.   lcd_rs=dat_comm;
  507.   lcd_rw = 0;         // 写
  508.   lcd_data=content;   // 输出数据或命令
  509.   lcd_e=1;            
  510.   lcd_e=0;
  511. }


  512. /*清绘图*/
  513. void clrgdram(void)
  514. {
  515.   uchar i,j;
  516.   for(j=0;j<32;j++)
  517.   {
  518.     wr_lcd(comm,0x34);
  519.     wr_lcd(comm,0x80+j);
  520.     wr_lcd(comm,0x80);
  521.     wr_lcd(comm,0x30);
  522.     for(i=0;i<32;i++)
  523.       wr_lcd(dat,0x00);  // 写入0x00
  524.    }
  525.   wr_lcd(comm,0x36);
  526. }


  527. /*清除显示*/
  528. void clear_dis(void)
  529. {
  530.   wr_lcd(comm,0x30);
  531.   wr_lcd(comm,0x01);  // 清屏,地址指针指向00H
  532.   clrgdram();         // 请绘图RAM
  533. }



  534. /*开机LCD初始化*/
  535. void init_lcd (void)
  536. {
  537.   lcd_rst=1;
  538.   wr_lcd(comm,0x30);  // 30---基本指令动作  
  539.   wr_lcd(comm,0x06);  // 光标的移动方向
  540.   wr_lcd(comm,0x0c);  // 开显示,关游标
  541.   clear_dis();
  542. }





  543. /*=====================================================================================
  544. 函数名称:DS1302驱动
  545. 功能描述:基本驱动(读写数据、读写日期,时间、初始化)
  546. 全局变量:无
  547. 参数说明:w_adder(写地址),r_adder(读地址),w_data(写入数据)
  548. 返回说明:返回读取的数据
  549. 设 计 人:JZHG
  550. 版    本:1.0
  551. 说    明:上升沿写入数值,下降沿读出数值,没用设立后背电池充电
  552. ======================================================================================*/


  553. /*向1302写数据 参数格式:地址,数据*/
  554. void w1302(uchar w_adder,uchar w_data)
  555. {
  556.   uchar d;
  557.   ret_ds1302();
  558.   for(d=0;d<16;d++)
  559.   {
  560.     if(d==8) w_adder=w_data;
  561.     d02_data=(bit)(w_adder&0x01);
  562.     d02_sclk=0;      // 上升沿
  563.     w_adder>>=1;
  564.     d02_sclk=1;
  565.   }
  566.   end_ds1302();   
  567. }



  568. /*接收1302一个字节的数据 参数格式:读地址*/
  569. uchar r1302(uchar r_adder)
  570. {
  571.   uchar d=0;
  572.   ret_ds1302();
  573.   for(d=0;d<8;d++)   // 写地址
  574.   {
  575.     d02_data=(bit)(r_adder&0x01);
  576.     d02_sclk=0;
  577.     r_adder>>=1;
  578.     d02_sclk=1;
  579.   }
  580.   r_adder=0;
  581.   for(d=0;d<8;d++)   // 读数据
  582.   {
  583.     d02_data=1;
  584.     d02_sclk=1;      // 下降沿
  585.     r_adder>>=1;
  586.     d02_sclk=0;
  587.     if(d02_data) r_adder|=0x80;
  588.   }
  589.   end_ds1302();
  590.   return(r_adder);
  591. }



  592. /*写入时间与日期*/
  593. void wds1302_time_date(void)
  594. {
  595.   w1302(d02_wrc,0x00);               // 写允许
  596.   w1302(0x90,0xa5);                  // 单二极管2K电阻充电
  597.   w1302(d02_year,today.year);        // 年
  598.   w1302(d02_weeks,today.week);       // 星期
  599.   w1302(d02_month,today.month);      // 月
  600.   w1302(d02_day,today.day);          // 日
  601.   w1302(d02_hour,0x7f&now.hour);     // 时
  602.   w1302(d02_minute,now.minute);      // 分
  603.   w1302(d02_second,0x7f&now.second); // 秒
  604.   w1302(d02_wrc,0x80);               // 写禁止
  605. }




  606. /*初始化写DS1302 RAM*/
  607. void init_wds1302_ram(void)
  608. {
  609.   w1302(d02_wrc,0x00);
  610.   w1302(0x90,0xa5);         // 单二极管2K电阻充电
  611.   w1302(d02_signs,0x00);    // 状态寄存
  612.   w1302(d02_passw,0x62);    // 密码储存首位
  613.   w1302(d02_passw+2,0x18);  // 初始值为:741456
  614.   w1302(d02_passw+4,0x29);  // 密码最后一位
  615.   w1302(d02_alm,0x12);      // 闹铃时(12小时)
  616.   w1302(d02_alm+2,0x00);    // 闹铃分(0分)
  617.   w1302(d02_temp,0xff);     // 温度上限(255为关闭)   
  618.   w1302(d02_temp+2,0xff);   // 温度下限(关闭)
  619.   w1302(d02_initsi,0xb4);   // 是否要初始化标记(0xb4为已经初始化)
  620.   w1302(d02_wrc,0x80);
  621. }

  622. /*写DS1302一字节的RAM*/
  623. void wds1302_data(uchar adder,uchar _data)
  624. {
  625.   w1302(d02_wrc,0x00);
  626.   w1302(adder,_data);
  627.   w1302(d02_wrc,0x80);
  628. }


  629. /*读取日期*/
  630. void rds1302_date(void)
  631. {
  632.   
  633.   today.year=r1302(d02_year+1);   
  634.   today.week=r1302(d02_weeks+1);
  635.   today.month=r1302(d02_month+1);
  636.   today.day=r1302(d02_day+1);  
  637. }


  638. /*读取时间*/
  639. void rds1302_time(void)
  640. {
  641.   now.hour=(r1302(d02_hour+1));
  642.   now.minute=r1302(d02_minute+1);
  643.   now.second=r1302(d02_second+1);
  644.   if(now.hour==alarm_time[0]&&now.minute==alarm_time[1]) alm_run=1;
  645.   else                                      // 闹铃时间比较
  646.   {
  647.     alm_run=0;buzstop=0;buzzer=close;
  648.   }
  649. }                       

  650. /*开机读数据*/
  651. void rds1302_data(void)
  652. {
  653.   signs=r1302(d02_signs+1);
  654.   alarm_time[0]=r1302(d02_alm+1);
  655.   alarm_time[1]=r1302(d02_alm+3);
  656.   als_temp[0]=r1302(d02_temp+1);
  657.   als_temp[1]=r1302(d02_temp+3);           
  658. }


  659. /*DS1302初始化*/
  660. void init_ds1302(void)
  661. {
  662.   wds1302_time_date();
  663.   init_wds1302_ram();
  664. }


  665. /*=====================================================================================
  666. 函数名称:DS18b20驱动
  667. 功能描述:基本驱动(读写数据、数据转换、初始化)
  668. 全局变量:无
  669. 参数说明:无
  670. 返回说明:返回读取的数据
  671. 设 计 人:JZHG
  672. 版    本:1.0
  673. 说    明:调试中。。。
  674. ======================================================================================*/



  675. /*18B20初始化*/
  676. void init_ds18b20()
  677. {
  678.   b20_io=1;
  679.   delay_b20(8);
  680.   b20_io=0;
  681.   delay_b20(120);       // 延时≥480us
  682.   b20_io=1;
  683.   delay_b20(12);        // 拉高为高电平后在15—60us出现低电平,并维持60—240us
  684.   ds18b20=~b20_io;
  685.   delay_b20(40);   
  686. }


  687. /*向18B20发送一个字节*/
  688. void send18b20_byte(uchar data_send)
  689. {
  690.   uchar d=0;
  691.   for (d=0;d<8;d++)
  692.   {
  693.     b20_io=0;                   // 拉低电平后向总线写入一个位,15us后18B20接收  
  694.     b20_io=data_send&0x01;      
  695.     delay_b20(10);              // 延时60us后完成一次
  696.     b20_io=1;
  697.     data_send>>=1;              // 下位开始
  698.   }
  699. }


  700. /*从18B20读出温度值 12位分辨率*/  
  701. void receive18b20(void)
  702. {
  703.   uchar n=1,d;
  704.   for (d=0;d<16;d++)
  705.   {
  706.     if(d==8) n=0;
  707.     b20_io=0;                     // 拉低总线
  708.     temp.t_data[n]>>=1;            
  709.     b20_io=1;                     // 拉高总线
  710.     if(b20_io)                    // 读入总线数值
  711.       temp.t_data[n]|=0x80;
  712.     delay_b20(10);                // 等待60us
  713.   }

  714. }


  715. /*数据转化*/
  716. void conversion_t(void)
  717. {
  718.   uchar save=0,save1=0;
  719.   if(temp.temp_data<0)           // 判断数值符号
  720.     {temp_pn=1;temp.temp_data=~temp.temp_data+1;}
  721.   else temp_pn=0;
  722.   if(temp.t_data[1]&0x01==1) save+=6;       // 小数点后的值转变
  723.   if((temp.t_data[1]>>1)&0x01==1) save+=12;
  724.   if((temp.t_data[1]>>2)&0x01==1) save+=25;
  725.   if((temp.t_data[1]>>3)&0x01==1) save+=50;
  726.   temp.temp_data>>=4;
  727.   save1=temp.temp_data&0x00ff;              // 整数部分数值
  728.   temp.t_data[0]=save1;
  729.   temp.t_data[1]=save;
  730.   thl_als=1;
  731.   if(save1>=(als_temp[0]&0x7f))      // 温度比较
  732.   {
  733.     if(!temp_pn||(temp_pn&(als_temp[0]&0x80)!=0)){ als_th=open;als_tl=close;}
  734.   }
  735.   else if(save1<(als_temp[1]&0x7f)&&als_temp[1]!=255)
  736.   {
  737.     if(!temp_pn||(temp_pn&(als_temp[1]&0x80)!=0)) {als_tl=open;als_th=close;}
  738.   }
  739.   else {als_th=als_tl=close;thl_als=0;buzstop=0;buzzer=close;}
  740. }



  741. /*18b20功能*/
  742. void ds18b20_func(void)
  743. {
  744.   EA=0;
  745.   TR0=0;
  746.   temp.temp_data=0;
  747.   init_ds18b20();
  748.   send18b20_byte(0xcc); // 跳过ROM
  749.   send18b20_byte(0x44); // 温度转换
  750.   delay_pw();
  751.   init_ds18b20();
  752.   send18b20_byte(0xcc);
  753.   send18b20_byte(0xbe); // 读RAM
  754.   receive18b20();       // 读取温度值
  755.   conversion_t();       // 数值转换
  756.   EA=1;
  757.   TR0=1;
  758. }



  759. /*=====================================================================================
  760. 函数名称:画面构造
  761. 功能描述:界面1、2、3,图片菜单,反白,标头,16*16(32)图片
  762. 全局变量:无
  763. 参数说明:函数说明
  764. 返回说明:无
  765. 设 计 人:JZHG
  766. 版    本:1.0
  767. 说    明:X坐标每一格每次16点
  768. ======================================================================================*/


  769. /*反白或显示图片 参数格式:(H)8bit数据,(L)8bit数据,X0坐标(16bit),Y0坐标(1bit),X坐标(16bit),Y坐标(1bit)*/
  770. void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
  771. {
  772.   uchar i,j;
  773.   for(j=0;j<yl;j++)
  774.   {
  775.     for(i=0;i<xl;i++)
  776.     {
  777.       wr_lcd(comm,0x34);     // 扩展功能
  778.       wr_lcd(comm,y0+j);     // 写Y坐标
  779.       wr_lcd(comm,x0+i);     // 写X坐标
  780.       wr_lcd(comm,0x30);     // 普通功能
  781.       wr_lcd(dat,data1);
  782.       wr_lcd(dat,data2);
  783.     }
  784.   }
  785.   wr_lcd(comm,0x36);         // 开绘图显示
  786. }



  787. /*显示字体 参数格式: 显示位置(0x80-0x9f),显示个数,显示内容指针*/
  788. void display_cnasc(uchar dis_bit,uchar num,uchar *cnasc)
  789. {
  790.   wr_lcd(comm,0x30);         // 普通功能
  791.   wr_lcd(comm,dis_bit);      // 写地址
  792.   while(num>0)
  793.   {
  794.     wr_lcd(dat,*(cnasc++));
  795.     wr_lcd(dat,*(cnasc++));
  796.     num--;
  797.   }
  798. }



  799. /*导航标头显示*/
  800. void dis_title(void)
  801. {
  802.   display_cnasc(0x80,1,"\x15 ");
  803.   display_cnasc(0x90,1,"┏");
  804.   display_cnasc(0x97,1,"┓");
  805.   display_cnasc(0x98,1,"┗");
  806.   display_cnasc(0x9f,1,"┛");
  807.   display_cnasc(0x92,1,"\x1e ");
  808.   display_cnasc(0x9a,1,"\x1f ");
  809.   con_disp(0xff,0xff,0x80,0x80,3,16);
  810.   con_disp(0xef,0xef,0x83,0x80,1,16);
  811.   con_disp(0xde,0xf7,0x84,0x80,1,16);
  812.   con_disp(0x76,0xdb,0x85,0x80,1,16);
  813.   con_disp(0x55,0x55,0x86,0x80,1,16);
  814.   con_disp(0x55,0x55,0x87,0x80,1,16);   
  815. }


  816. /*图片显示标头*/
  817. void dis_title_pic(void)
  818. {
  819.   display_cnasc(0x80,2,"〓〓");
  820.   display_cnasc(0x86,2,"〓〓");
  821. }


  822. /*功能实现显示标头*/
  823. void dis_title_e(void)
  824. {
  825.   display_cnasc(0x80,1," \x15");
  826.   con_disp(0xff,0xff,0x80,0x80,1,16);
  827.   con_disp(0xff,0xc7,0x81,0x80,1,16);
  828.   con_disp(0xff,0xff,0x82,0x80,3,16);
  829.   con_disp(0xe3,0xff,0x85,0x80,1,16);
  830.   con_disp(0xff,0xff,0x86,0x80,2,16);
  831. }



  832. /*显示菜单图片  格式:图片反显(1)或正常显示(0),显示图片的号码*/
  833. void anti_nor_pic (uchar cpl_sign,uchar menu_num)
  834. {
  835.   uchar i,j,x,y;
  836.   x=menu_num*3;    // 计算图片显示坐标
  837.   if(x>6) x--;
  838.   if(menu_num<3) y=16;  // 上下半屏显示
  839.   else y=8;
  840.   if(cpl_sign==1) display_cnasc(0x82,4,menu_cn[menu_num]);
  841.   for(j=0;j<24;j++)
  842.   {
  843.    for(i=0;i<2;i++)
  844.    {
  845.      wr_lcd(comm,0x34);
  846.      wr_lcd(comm,0x80+y);
  847.      wr_lcd(comm,0x80+x+i);  // 分两次显示 16bit
  848.      wr_lcd(comm,0x30);
  849.      if(cpl_sign==1)          // 图片反选
  850.      {
  851.        wr_lcd(dat,~menu_pic[menu_num][j*4+i*2]);
  852.        wr_lcd(dat,~menu_pic[menu_num][j*4+i*2+1]);
  853.      }
  854.      else                     // 正常显示
  855.      {
  856.        wr_lcd(dat,menu_pic[menu_num][j*4+i*2]);
  857.        wr_lcd(dat,menu_pic[menu_num][j*4+i*2+1]);
  858.      }
  859.    }
  860.    y++;
  861.    if(y==32&&menu_num<3) {x+=8;y=0;}  // 上下屏切换
  862.   }
  863.   wr_lcd(comm,0x36);
  864. }




  865. /*状态16*16图片  格式:反色(1)或正常0,X坐标,Y坐标,状态编码(16*16)*/
  866. void dis_run_state(uchar cpl,uchar x0,uchar y0,uchar state_num)
  867. {
  868.   uchar j;
  869.   for(j=0;j<16;j++)
  870.   {
  871.     wr_lcd(comm,0x34);  // 扩展功能
  872.     wr_lcd(comm,y0++);  // 写Y地址
  873.     wr_lcd(comm,x0);    // 写X地址
  874.     wr_lcd(comm,0x30);  // 普通功能
  875.     if(cpl==1)          // 写数据
  876.     {
  877.       wr_lcd(dat,~running[state_num][j*2]);
  878.       wr_lcd(dat,~running[state_num][j*2+1]);
  879.     }
  880.     else
  881.     {
  882.       wr_lcd(dat,running[state_num][j*2]);
  883.       wr_lcd(dat,running[state_num][j*2+1]);
  884.     }
  885.   }
  886.   wr_lcd(comm,0x36);
  887. }



  888. /*显示菜单按钮  参数格式:反色(1)或正常(0)*/
  889. void dis_menu_key(uchar d)
  890. {
  891.   if(d==1)
  892.   {
  893.     for(d=0;d<8;d++)                                  // 显示菜单按钮
  894.       con_disp(~menu_key[d*2],~menu_key[d*2+1],0x9f,0x97+d,1,1);
  895.   }
  896.   else
  897.   {
  898.     for(d=0;d<8;d++)                                  // 显示菜单按钮
  899.       con_disp(menu_key[d*2],menu_key[d*2+1],0x9f,0x97+d,1,1);
  900.   }
  901. }




  902. /*显示模式3的界面*/
  903. void dis_mode3(void)
  904. {
  905.   uchar i,j,h,l,x_0=0x80,y_0=0x90;
  906.   h=now.hour>>4;       // 分离十位 个位
  907.   l=now.hour&0x0f;
  908.   for(j=0;j<2;j++)
  909.   {
  910.     for(i=0;i<32;i++)  // 十位个位一起读入
  911.     {
  912.       wr_lcd(comm,0x34);
  913.       wr_lcd(comm,y_0++);
  914.       wr_lcd(comm,x_0);
  915.       wr_lcd(comm,0x30);
  916.       wr_lcd(dat,mode_3num[h][i*3]);  // 连续写数据,X坐标自动加1
  917.       wr_lcd(dat,mode_3num[h][i*3+1]);
  918.       wr_lcd(dat,mode_3num[h][i*3+2]);
  919.       wr_lcd(dat,mode_3num[l][i*3]);
  920.       wr_lcd(dat,mode_3num[l][i*3+1]);
  921.       wr_lcd(dat,mode_3num[l][i*3+2]);
  922.       if(y_0==0xa0){x_0=x_0+8;y_0=0x80;}
  923.     }
  924.     x_0=0x84,y_0=0x90;
  925.     h=now.minute>>4;   // 分离十位 个位
  926.     l=now.minute&0x0f;
  927.   }
  928.   dis_run_state(0,0x83,0x90,4); // 显示点
  929.   dis_run_state(0,0x8b,0x80,4);                    
  930.   y_0=0x80;            // 显示状态标记
  931.   if(keb) {dis_run_state(0,0x87,y_0,2);y_0+=16;}
  932.   if(alm) {dis_run_state(0,0x87,y_0,1);y_0+=16;}
  933.   if(y_0<0xa0&&!als){dis_run_state(0,0x87,y_0,0);}
  934.   if(y_0==0xa0&&!als){dis_run_state(0,0x8f,0x80,0);}
  935.   dis_menu_key(0);
  936. }




  937. /*显示模式1和2的共用部分*/
  938. void mode1_2_union(void)
  939. {
  940.   uchar x=0x9b;
  941.   display_cnasc(0x98,2,"星期");
  942.   if(nba_tim) dis_run_state(0,x,0x90,6);
  943.   if(keb) {dis_run_state(0,x,0x90,2);x++;}    // 显示标记
  944.   if(alm) {dis_run_state(0,x,0x90,1);x++;}
  945.   if(!als){dis_run_state(0,x,0x90,0);}
  946.   dis_menu_key(0);                           // 显示菜单按钮
  947. }


  948. /*显示模式2的日期*/
  949. void dis_date_mode2(uchar d)
  950. {
  951.   uchar save[2];
  952.   display_cnasc(d+2,1,"年");
  953.   display_cnasc(d+4,1,"月");
  954.   display_cnasc(d+6,1,"日");
  955.   display_cnasc(0x9a,1,weeks[today.week]);  // 显示星期
  956.   save[0]=char_num[today.year>>4];          // 将显示的数值存到数组中
  957.   save[1]=char_num[today.year&0x0f];
  958.   display_cnasc(d+1,1,save);
  959.   save[0]=char_num[today.month>>4];
  960.   save[1]=char_num[today.month&0x0f];
  961.   display_cnasc(d+3,1,save);
  962.   save[0]=char_num[today.day>>4];
  963.   save[1]=char_num[today.day&0x0f];
  964.   display_cnasc(d+5,1,save);
  965. }

  966. /*显示模式2的时间数字显示  16*32*/
  967. void num2_asc_dis(uchar num,uchar x_0)
  968. {
  969.   uchar i,y_0=0x90;
  970.   for(i=0;i<32;i++)  // 十位个位一起读入
  971.   {
  972.     wr_lcd(comm,0x36);
  973.     wr_lcd(comm,y_0++);
  974.     wr_lcd(comm,x_0);
  975.     wr_lcd(comm,0x30);
  976.     wr_lcd(dat,mode_2num[num][i*2]);
  977.     wr_lcd(dat,mode_2num[num][i*2+1]);
  978.     if(i==15){x_0+=8;y_0=0x80;}
  979.   }
  980.   wr_lcd(comm,0x36);
  981. }

  982. /*显示模式2的时间*/
  983. void dis_time_mode2(void)
  984. {
  985.   uchar h,l;
  986.   if(now.hour!=save_time.hour||init_d2)
  987.   {
  988.     h=now.hour>>4;    // 分离十位 个位
  989.     l=now.hour&0x0f;
  990.     num2_asc_dis(h,0x80);
  991.     num2_asc_dis(l,0x80+1);
  992.   }
  993.   if(now.minute!=save_time.minute||init_d2)
  994.   {
  995.     h=now.minute>>4;    // 分离十位 个位
  996.     l=now.minute&0x0f;
  997.     num2_asc_dis(h,0x83);
  998.     num2_asc_dis(l,0x83+1);
  999.   }
  1000.   if(now.second!=save_time.second||init_d2)
  1001.   {
  1002.     h=now.second>>4;    // 分离十位 个位
  1003.     l=now.second&0x0f;
  1004.     num2_asc_dis(h,0x86);
  1005.     num2_asc_dis(l,0x86+1);
  1006.   }
  1007.   if(init_d2)
  1008.   {
  1009.     dis_run_state(0,0x82,0x90,5); // 显示点
  1010.     dis_run_state(0,0x8a,0x80,5);
  1011.     dis_run_state(0,0x85,0x90,5); // 显示点
  1012.     dis_run_state(0,0x8d,0x80,5);
  1013.   }
  1014. }


  1015. /*显示模式2的界面*/
  1016. void dis_mode2(void)
  1017. {
  1018.   dis_date_mode2(0x81);       // 显示日期
  1019.   display_cnasc(0x81,1,"20");
  1020.   dis_time_mode2();           // 显示时间
  1021.   mode1_2_union();
  1022. }


  1023. /*显示模式1的日期*/
  1024. void dis_date_mode1(void)
  1025. {
  1026.   uchar save[2];
  1027.   display_cnasc(0x80,3,"日期:");
  1028.   display_cnasc(0x90,3,"时间:");
  1029.   display_cnasc(0x88,3,"温度:");
  1030.   display_cnasc(0x9a,1,weeks[today.week]);  // 显示星期
  1031.   display_cnasc(0x83,1,"20");
  1032.   save[0]=char_num[today.year>>4];            
  1033.   save[1]=char_num[today.year&0x0f];
  1034.   display_cnasc(0x84,1,save);
  1035.   save[0]='/';
  1036.   save[1]=char_num[today.month>>4];
  1037.   display_cnasc(0x85,1,save);
  1038.   save[0]=char_num[today.month&0x0f];
  1039.   save[1]='/';
  1040.   display_cnasc(0x86,1,save);
  1041.   save[0]=char_num[today.day>>4];
  1042.   save[1]=char_num[today.day&0x0f];
  1043.   display_cnasc(0x87,1,save);
  1044.   mode1_2_union();
  1045. }


  1046. /*显示模式1的时间*/
  1047. void dis_time_mode1(void)
  1048. {
  1049.   uchar save[2];
  1050.   save[0]=char_num[now.hour>>4];
  1051.   save[1]=char_num[now.hour&0x0f];
  1052.   display_cnasc(0x93,1,save);
  1053.   save[0]=':';
  1054.   save[1]=char_num[now.minute>>4];
  1055.   display_cnasc(0x94,1,save);
  1056.   save[0]=char_num[now.minute&0x0f];
  1057.   save[1]=':';
  1058.   display_cnasc(0x95,1,save);
  1059.   save[0]=char_num[now.second>>4];
  1060.   save[1]=char_num[now.second&0x0f];
  1061.   display_cnasc(0x96,1,save);
  1062. }


  1063. /*显示模式1的温度*/
  1064. void dis_temp_mode1(void)
  1065. {
  1066.   uchar save[2];
  1067.   if(ds18b20)
  1068.   {
  1069.      if(temp.t_data[0]>99)
  1070.      {
  1071.         save[0]=char_num[temp.t_data[0]/100];
  1072.         save[1]=char_num[(temp.t_data[0]/10)%10];
  1073.         display_cnasc(0x8b,1,save);
  1074.         save[0]=char_num[temp.t_data[0]%10];
  1075.         save[1]='.';
  1076.         display_cnasc(0x8c,1,save);
  1077.         save[0]=char_num[temp.t_data[1]/10];
  1078.         save[1]=' ';
  1079.         display_cnasc(0x8d,1,save);
  1080.         display_cnasc(0x8e,1,"℃");
  1081.       }
  1082.       else
  1083.       {
  1084.         if(temp_pn) display_cnasc(0x8a,1,":-");
  1085.         else  display_cnasc(0x8a,1,":");
  1086.         save[0]=char_num[temp.t_data[0]/10];
  1087.         save[1]=char_num[temp.t_data[0]%10];
  1088.         display_cnasc(0x8b,1,save);
  1089.         save[0]='.';
  1090.         save[1]=char_num[temp.t_data[1]/10];
  1091.         display_cnasc(0x8c,1,save);
  1092.         display_cnasc(0x8d,1,"℃");
  1093.       }
  1094.     }
  1095.   else display_cnasc(0x8b,3,"FF.F℃");
  1096. }



  1097. /*显示模式1的界面*/
  1098. void dis_mode1(void)
  1099. {
  1100.   dis_date_mode1();
  1101.   dis_time_mode1();
  1102.   dis_temp_mode1();
  1103. }



  1104. /*篮球器时间显示*/
  1105. void nba_dis_time(void)
  1106. {
  1107.   uchar d,dis[2];
  1108.   for(d=2;d<4;d++)
  1109.   {
  1110.     dis[0]=char_num[resu[d]/10];
  1111.     dis[1]=char_num[resu[d]%10];
  1112.     display_cnasc(0x81+d*2,1,dis);
  1113.   }
  1114.   display_cnasc(0x86,1,": ");
  1115.   if(resu[0]==1)
  1116.   {
  1117.     dis[0]='\x07';
  1118.     dis[1]=char_num[resu[4]/10];
  1119.     display_cnasc(0x93,1,dis);
  1120.     dis[1]='\x07';
  1121.     dis[0]=char_num[resu[4]%10];
  1122.     display_cnasc(0x94,1,dis);
  1123.   }
  1124. }


  1125. /*=====================================================================================
  1126. 函数名称:键盘扫描
  1127. 功能描述:读取键盘操作数据及部分状态的实现
  1128. 全局变量:dis_sig  t0_isr  temprun  b20time  alm_run als_temp   buzstop  als
  1129.            lock_op  nba_tim
  1130. 参数说明:无
  1131. 返回说明:键盘锁与密码锁时间到达后返回 255
  1132. 设 计 人:JZHG   
  1133. 版    本:1.0
  1134. 说    明:
  1135. ======================================================================================*/

  1136. /*扫描键盘*/
  1137. uchar  keypad_scan()
  1138. {
  1139.   uchar key,dis[2];
  1140.   keyboard=0xf0;
  1141.   while (keyboard==0xf0)     // 等待按键按下
  1142.   {  

  1143.   /*--------------------- 背光灯关闭延时 -----------------------*/
  1144.    
  1145.     delay(1000);                     
  1146.     if((++dis[0])==0&&bl_delay!=0) bl_delay--;  // 当有按键按下bl_delay重新赋值     
  1147.     if(bl_delay==0&&!bl0) lcd_bl=close;         // 背光时间到且不是常开模式时关闭背光

  1148.       
  1149.   /*----------------------- 键盘锁延时 -------------------------*/  

  1150.     if(keb&&dis_sig&&bl_delay==0&&resu[11]<2) resu[11]++; // 当有按键按下j清零
  1151.     if(bl_delay==0) bl_delay=15;


  1152.   /*--------------------- 密码锁30秒锁延时 ---------------------*/      

  1153.     if(lock_op)                     
  1154.     {
  1155.       if((++i)==0) save1++;     
  1156.       if(save1==15) return(255);
  1157.     }
  1158.    

  1159.   /*---------------------- 时钟界面时间显示 ---------------------*/
  1160.    
  1161.     if(dis_sig&&t0_isr||nba_tim&&oth_run)     // 正常时钟界面与篮球器返回时钟界面显示
  1162.     {   
  1163.       rds1302_date();       // 读出日期
  1164.       rds1302_time();       // 读出时间
  1165.       if(di0)               // 模式2
  1166.       {
  1167.         dis_time_mode2();
  1168.         if(now.hour==0&&now.minute==0&&now.second==0)   dis_date_mode2(0x81);
  1169.       }
  1170.       else if(di1)          // 模式3
  1171.       {
  1172.         if(now.hour!=save_time.hour||now.minute!=save_time.minute)   // 时,分变化后显示
  1173.           dis_mode3();     
  1174.       }
  1175.       else
  1176.       {
  1177.         dis_time_mode1();   // 模式1
  1178.         if(now.hour==0&&now.minute==0&&now.second==0) dis_date_mode1();
  1179.       }
  1180.       save_time=now;        // 重新记录作下次比较
  1181.       t0_isr=0;
  1182.     }
  1183.   
  1184.   
  1185.   /*-------------------- 温度计提示按键操作 ----------------------*/
  1186.    
  1187.     if(temprun)
  1188.     {
  1189.       if(!oth_run)
  1190.       {
  1191.         display_cnasc(0x96,2," key");    // 温度计时提示按键操作
  1192.         for(dis[1]=0;dis[1]<250;dis[1]++)
  1193.         {
  1194.           delay(1000);
  1195.           if(keyboard!=0xf0)
  1196.           {
  1197.             keyboard=0x7f;
  1198.             if(keyboard==0x7d) return 0x7d;
  1199.             else  keyboard=0xf0;
  1200.           }
  1201.         }
  1202.         oth_run=1;
  1203.         display_cnasc(0x96,2,"    ");
  1204.       }
  1205.     }
  1206.   
  1207.   
  1208.    /*------------------------ 蜂鸣器警报 --------------------------*/

  1209.    
  1210.     if(((alm_run&&alm)||thl_als)&&!buzstop) // 温度,闹铃蜂鸣器警报
  1211.     {                                       // 有按键按下时停止
  1212.       if(now.second==0) lcd_bl=close;
  1213.       delay(15000);                         // 读出温度时间比较
  1214.       if(keyboard!=0xf0) break;
  1215.       delay(15000);
  1216.       if(keyboard!=0xf0) break;
  1217.       delay(15000);
  1218.       if(keyboard!=0xf0) break;
  1219.       delay(15000);
  1220.       if(alm_run)  lcd_bl=!lcd_bl;          // 只在闹铃功能闪
  1221.       if(!als)buzzer=!buzzer;               // 警报开启后蜂鸣器开启            
  1222.     }


  1223.   /*----------------------- 温度刷新显示 -------------------------*/

  1224.    
  1225.     if((temprun&&oth_run)||(b20time&&!di0&&!di1&&dis_sig))    // 温度计功能于模式1界面
  1226.     {  
  1227.      
  1228.         ds18b20_func();                           // 温度检测功能
  1229.         oth_run=0;                                // 作交替标记用
  1230.         if(temprun) return 20;                    // 温度计开启后返回
  1231.         if(b20time){ dis_temp_mode1();b20time=0;} // 时钟界面5分钟更新一次,T0计时
  1232.     }

  1233.   
  1234.    
  1235.    /*------------------------ 篮球器显示时间 ------------------------*/
  1236.    
  1237.     if(nba_tim&!oth_run)        // 当篮球器模式下 oth_run==0为篮球器计时状态
  1238.     {
  1239.       if(EA) display_cnasc(0x8b,2," R\x10 ");  // 显示运行状态
  1240.       else  display_cnasc(0x8b,2," S! ");
  1241.       if(t0_isr)
  1242.       {                                        // 更新时间
  1243.         nba_dis_time();
  1244.         if(resu[2]==0&&resu[3]==0)             // 判断比赛情况
  1245.         {
  1246.           resu[6]++;
  1247.           if(resu[6]<resu[1])  display_cnasc(0x85,3,"休息  ");
  1248.           else  display_cnasc(0x85,3,"完结  ");
  1249.         }
  1250.         if(resu[4]==0||(resu[2]==0&&resu[3]==0))  // 时间到达警报
  1251.         {
  1252.            buzzer=open;
  1253.            delay_pw();
  1254.            if(resu[2]==0&&resu[3]==0)  // 24秒 总时间警报
  1255.            {
  1256.              delay_pw();
  1257.            }
  1258.            buzzer=close;
  1259.            if(resu[4]==0) resu[4]=24;  // 重新赋值
  1260.         }
  1261.         t0_isr=0;                      // 清零等下次中断产生
  1262.       }
  1263.     }
  1264.   }

  1265.               
  1266.                     /*===== 以上等待按键 =====*/



  1267.   /*------------------------- 按键按下后 --------------------------*/

  1268.   
  1269.   delay(8000);               // 消抖振
  1270.   if(!lock_op)bl_delay=15;   // 背光时间赋值
  1271.   if(bl1) lcd_bl=close;      // 不在背光灯关闭时亮起
  1272.   else lcd_bl=open;
  1273.   if(alm_run|thl_als) {buzstop=1;buzzer=close;}
  1274.   if(keb&&dis_sig)
  1275.   {
  1276.     if(resu[11]==2) return 255;  // 要求输入密码   
  1277.     else resu[11]=0;             // 时间不到时重新计时
  1278.   }
  1279.   do
  1280.   {     
  1281.     for(dis[0]=0;dis[0]<=3;dis[0]++)
  1282.     {
  1283.       keyboard=ksp[dis[0]];
  1284.       if(keyboard!=ksp[dis[0]])
  1285.       {
  1286.         key=keyboard;
  1287.         if(key!=ksp[dis[0]]) return(key);
  1288.       }
  1289.     }
  1290.   }while(1);
  1291. }


  1292. /*读键盘数据*/
  1293. uchar  gotkey()
  1294. {
  1295.   uchar  save,n;
  1296.   keyboard=0xf0;
  1297.   while(keyboard!=0xf0);    // 等待键盘松开
  1298.   delay(5000);              // 消抖阵
  1299.   if(adju_si)               // 连写输入
  1300.   {
  1301.     adju_si=0;
  1302.     for(n=0;n<60;n++)
  1303.     {
  1304.       delay(2000);
  1305.       if(keyboard!=0xf0)
  1306.       {
  1307.         adju_si=1;          // 在更改时,在此时间内可连成多位数
  1308.         break;
  1309.       }
  1310.     }
  1311.   }         
  1312.   save=keypad_scan();       // 扫描键盘
  1313.   if(save==255) return 255; // 要求输入键盘锁密码或延时时间到达
  1314.   for (n=0;n<16;n++)
  1315.   {  
  1316.     if(save==key_code[n])
  1317.        return(n);
  1318.   }
  1319.   return(20);
  1320. }



  1321. /*=====================================================================================
  1322. 函数名称:导航
  1323. 功能描述:主菜单 工具导航  保存提示
  1324. 全局变量:无
  1325. 参数说明:
  1326. 返回说明:无
  1327. 设 计 人:JZHG
  1328. 版    本:1.0
  1329. 说    明:
  1330. ======================================================================================*/


  1331. /*按键按下显示 参数格式:k 按钮的显示地址*/
  1332. void key_dis(uchar k)
  1333. {
  1334.   display_cnasc(k,1,"\x04 ");
  1335.   delay(10000);
  1336.   if(k==0x92||k==0x96) display_cnasc(k,1,"\x1e ");
  1337.   else display_cnasc(k,1,"\x1f ");
  1338. }



  1339. /*确定按键按下显示*/
  1340. void enter_dis(void)
  1341. {
  1342.   display_cnasc(0x8f,1," \x09");
  1343.   delay(15000);
  1344. }



  1345. /*主菜单导航*/
  1346. uchar dis_menu(void)
  1347. {
  1348.   uchar d,save,key;
  1349.   if(meu)
  1350.   {  
  1351.     display_cnasc(0x81,2,"菜单");
  1352.     dis_title();
  1353.     display_cnasc(0x88,8,selected[0]);
  1354.     con_disp(0xff,0xff,0x8a,0x80,5,16);
  1355.   }
  1356.   else    // 显示图片菜单
  1357.   {
  1358.     dis_title_pic();
  1359.     for(d=0;d<6;d++)  
  1360.       anti_nor_pic(0,d);
  1361.     anti_nor_pic(1,0);
  1362.   }      
  1363.   save=d=0;
  1364.   do
  1365.   {                                                                           
  1366.     if(meu)   // 操作指示更新
  1367.     {     
  1368.       display_cnasc(0x93,3,menu_cn_2[index_m[save].right_num]);
  1369.       display_cnasc(0x8b,3,menu_cn_2[save]);
  1370.       display_cnasc(0x9b,3,menu_cn_2[index_m[save].left_num]);
  1371.     }
  1372.     else
  1373.     {
  1374.       anti_nor_pic(0,d);     
  1375.       anti_nor_pic(1,save);
  1376.     }
  1377.     d=save;               // 保存上一索引
  1378.     while(1)
  1379.     {
  1380.       key=gotkey();
  1381.       if(key==11||(key==3&&meu))
  1382.       {
  1383.         if(meu) enter_dis();
  1384.         break;
  1385.       }
  1386.       else if(meu)
  1387.       {                                 
  1388.         if(key==2)
  1389.         {
  1390.           save=index_m[d].left_num;
  1391.           key_dis(0x9a);
  1392.           break;
  1393.         }
  1394.         if(key==5)
  1395.         {
  1396.           save=index_m[d].right_num;
  1397.           key_dis(0x92);
  1398.           break;
  1399.         }
  1400.         if((key==1&&meu))
  1401.         {
  1402.           d=5;
  1403.           break;
  1404.         }
  1405.       }
  1406.       else
  1407.       {
  1408.         if(key==3){save=index_m[d].left_num; break;} // 根据导航键寻找索引
  1409.         if(key==1){save=index_m[d].right_num; break;}
  1410.         if(key==2||key==5){save=index_m[d].shaft_num; break;}  
  1411.       }
  1412.     }
  1413.     if(key==11||((key==1|key==3)&&meu)) break;
  1414.   }while(1);
  1415.   return d;
  1416. }



  1417. /*工具导航*/
  1418. uchar tool_func(void)
  1419. {
  1420.   uchar save,d,key;
  1421.   display_cnasc(0x81,2,"工具");
  1422.   dis_title();
  1423.   display_cnasc(0x88,8,selected[0]);
  1424.   con_disp(0xff,0xff,0x8a,0x80,5,16);
  1425.   d=0;
  1426.   save=0;
  1427.   do
  1428.   {   
  1429.     display_cnasc(0x93,3,tool_menu[index_t[save].lnum]);
  1430.     display_cnasc(0x8b,3,tool_menu[save]);
  1431.     display_cnasc(0x9b,3,tool_menu[index_t[save].rnum]);
  1432.     d=save;
  1433.     while(1)
  1434.     {
  1435.       key=gotkey();
  1436.       if(key==1){ d=4;break;}               // 根据按键寻找索引
  1437.       if(key==11||key==3){enter_dis();break;}
  1438.       if(key==2){save=index_t[d].rnum; key_dis(0x9a);break;}
  1439.       if(key==5){save=index_t[d].lnum; key_dis(0x92);break;}
  1440.     }
  1441.     if(key==11||key==3||key==1) break;
  1442.   }while(1);
  1443.   return d;
  1444. }




  1445. /*更改后提示保存*/
  1446. void save_y_or_n(void)
  1447. {
  1448.   uchar key;
  1449.   clear_dis();
  1450.   oth_run=0;      
  1451.   display_cnasc(0x92,5,"是否保存? ");
  1452.   display_cnasc(0x89,6,"Y(OK)\\N(./S)");
  1453.   while(1)
  1454.   {
  1455.     key=gotkey();
  1456.     if(key==11)
  1457.     {
  1458.       display_cnasc(0x9a,5,"保存成功! ");
  1459.       delay(50000);
  1460.       oth_run=1;     // 要求保存时oth_run标记为1
  1461.       return;
  1462.     }
  1463.     if(key==10) return;
  1464.   }
  1465. }


  1466. /*=====================================================================================
  1467. 函数名称:调整功能
  1468. 功能描述:时间日期调整
  1469. 全局变量:today  now
  1470. 参数说明:见函数
  1471. 返回说明:无
  1472. 设 计 人:JZHG
  1473. 版    本:1.0
  1474. 说    明:
  1475. ======================================================================================*/


  1476. /*调整功能显示时间*/
  1477. void asjust_time()
  1478. {
  1479.   uchar save[2];
  1480.   display_cnasc(0x8a,1,"时");
  1481.   display_cnasc(0x8c,1,"分");
  1482.   display_cnasc(0x8e,1,"秒");
  1483.   save[0]=char_num[now.hour>>4];
  1484.   save[1]=char_num[now.hour&0x0f];
  1485.   display_cnasc(0x89,1,save);
  1486.   save[0]=char_num[now.minute>>4];
  1487.   save[1]=char_num[now.minute&0x0f];
  1488.   display_cnasc(0x8b,1,save);
  1489.   save[0]=char_num[now.second>>4];
  1490.   save[1]=char_num[now.second&0x0f];
  1491.   display_cnasc(0x8d,1,save);
  1492. }


  1493. /*调整功能月天数比较*/
  1494. uchar monthday(uchar year,uchar month)
  1495. {
  1496.   if(month==2&&year%4==0)
  1497.     return(29);
  1498.   else
  1499.   { year=month&0x0f;
  1500.     month>>=4;
  1501.     month=month*10+year;   
  1502.     return(dayofmonth[month-1]);}
  1503. }



  1504. /*星期推算*/
  1505. void weeks_day()
  1506. {
  1507.   uchar d,buffer,day=4;
  1508.   if(today.month>1)
  1509.   {
  1510.     buffer=(today.month>>4);   // 将BCD码转为十进制
  1511.     buffer=buffer*10;
  1512.     buffer+=(today.month&0x0f);
  1513.     for(d=0;d<buffer-1;d++)
  1514.     {
  1515.       today.week=(dayofmonth[d]>>4);
  1516.       today.week=today.week*10;
  1517.       today.week+=(dayofmonth[d]&0x0f);
  1518.       day+=(today.week%7);
  1519.     }
  1520.   }
  1521.   buffer=(today.year>>4);
  1522.   buffer*=10;
  1523.   buffer+=(today.year&0x0f);
  1524.   if(today.year!=0)
  1525.   {
  1526.     day+=((buffer-1)/4)+buffer+1;
  1527.   }
  1528.   if(buffer%4==0&&today.month>2) day++;
  1529.   buffer=today.day>>4;
  1530.   buffer*=10;
  1531.   buffer+=(today.day&0x0f);
  1532.   today.week=(day+buffer)%7;
  1533. }



  1534. /*调整功能*/
  1535. void adjust_func(void)
  1536. {
  1537.   uchar d,save,b=0;
  1538.   dis_title_e();
  1539.   display_cnasc(0x82,3,menu_cn_2[0]);
  1540.   rds1302_date();
  1541.   rds1302_time();
  1542.   dis_date_mode2(0x90);
  1543.   display_cnasc(0x9a,1,"  ");
  1544.   asjust_time();
  1545.   display_cnasc(0x9f,1,"→");
  1546.   display_cnasc(0x90,1,"『");
  1547.   display_cnasc(0x8f,1,"』");
  1548.   d=0;save=0;
  1549.   adju_si=0;
  1550.   do
  1551.   {
  1552.     con_disp(0x00,0x00,index_a[d].lnum,index_a[d].rnum,1,13);
  1553.     con_disp(0xff,0xff,index_a[save].lnum,index_a[save].rnum,1,13);
  1554.     d=save;
  1555.     while(1)
  1556.     {
  1557.       save=gotkey();
  1558.       if(save>=0&&save<10)
  1559.       {
  1560.         switch(d)
  1561.         {
  1562.           case 0: if(adju_si) // adju_si==1时两次输入连成一个数
  1563.                   {
  1564.                     today.year<<=4;
  1565.                     today.year+=save;adju_si=0;
  1566.                   }
  1567.                   else
  1568.                   {
  1569.                     today.year=save;adju_si=1;
  1570.                   }
  1571.                   break;
  1572.           case 1: if(adju_si)
  1573.                   {
  1574.                     today.month<<=4;today.month+=save;
  1575.                     if(today.month>0x12) today.month=save;
  1576.                     else adju_si=0;
  1577.                   }
  1578.                   else  
  1579.                   {
  1580.                     today.month=save;adju_si=1;
  1581.                   }
  1582.                   break;
  1583.           case 2: if(adju_si)
  1584.                   {
  1585.                     today.day<<=4;today.day+=save;  // 月天数比较
  1586.                     if(today.year%4==0&&today.month==2&&today.day==29) ;
  1587.                     else if(today.day>monthday(today.year,today.month))
  1588.                       today.day=save;
  1589.                     else adju_si=0;
  1590.                   }
  1591.                   else  {today.day=save;adju_si=1;}
  1592.                   break;
  1593.           case 3: if(adju_si)
  1594.                   {
  1595.                     now.hour<<=4;now.hour+=save;
  1596.                     if(now.hour>0x23) now.hour=save;
  1597.                     else adju_si=0;
  1598.                   }
  1599.                   else  {now.hour=save;adju_si=1;}
  1600.                   break;
  1601.           case 4: if(adju_si)
  1602.                   {
  1603.                     now.minute<<=4;now.minute+=save;
  1604.                     if(now.minute>0x59) now.minute=save;
  1605.                     else adju_si=0;
  1606.                   }
  1607.                   else  {now.minute=save;adju_si=1;}
  1608.                   break;
  1609.           case 5: if(adju_si)
  1610.                   {
  1611.                     now.second<<=4;now.second+=save;
  1612.                     if(now.second>0x59) now.second=save;
  1613.                     else adju_si=0;
  1614.                   }
  1615.                   else  {now.second=save;adju_si=1;}
  1616.                   break;
  1617.         }
  1618.         if(today.day>monthday(today.year,today.month)) today.day=1; // 更改月份时判断天数
  1619.         if(today.month==0) today.month=1;
  1620.         if(today.day==0) today.day=1;
  1621.         if(d<3) dis_date_mode2(0x90);   // 更新显示
  1622.         else asjust_time();
  1623.         display_cnasc(0x9a,1,"  ");     // 消去星期显示
  1624.       }
  1625.       if(save==11){save=d+1;adju_si=0;break;}
  1626.       if(save==10&&d!=0){save=d-1;adju_si=0;break;}
  1627.     }
  1628.     if(save==7&d==6) break;
  1629.   }while(1);
  1630.   weeks_day();    // 计算星期
  1631.   save_y_or_n();  // 需要保存时oth_run设为1
  1632.   if(oth_run) wds1302_time_date();
  1633. }




  1634. /*=====================================================================================
  1635. 函数名称:计算器功能
  1636. 功能描述:10位带符号数的加减乘除运算
  1637. 全局变量:opera  resu  i  j
  1638. 参数说明:见函数
  1639. 返回说明:无
  1640. 设 计 人:JZHG
  1641. 版    本:1.0
  1642. 说    明:
  1643. ======================================================================================*/



  1644. /*清寄存器  参数格式:m=2时结果寄存器,当m=1时操作数1,当m=0时操作数0(1),
  1645.                         n=1时,只清寄存器不清显示, 0两清*/
  1646. void removal_data(uchar m,uchar n)
  1647. {
  1648.   uchar l;      // 当n=1时,只清寄存器不清显示, 0两清
  1649.   if(m==2)      // 当m=2时结果寄存器
  1650.   {             // 当m=1时操作数1
  1651.     if(n==0)    // 当m=0时操作数0 ,1
  1652.       for(l=0;l<6;l++)
  1653.         display_cnasc(0x98+l,1,"  ");
  1654.     for(l=0;l<12;l++)
  1655.       resu[l]=0;
  1656.   }
  1657.   while(m<2)
  1658.   {
  1659.     if(n==0)
  1660.     {
  1661.       if(m==0)
  1662.       {  
  1663.         for(l=0;l<6;l++)
  1664.           display_cnasc(0x90+l,1,"  ");
  1665.           display_cnasc(0x95,1," 0");
  1666.       }
  1667.       else
  1668.          for(l=0;l<6;l++)
  1669.             display_cnasc(0x88+l,1,"  ");
  1670.     }
  1671.     for(l=0;l<12;l++)
  1672.       opera[m][l]=0;
  1673.     m++;
  1674.   }
  1675. }




  1676. /*显示数值  参数格式:显示首地址*/
  1677. void dis_cdata(uchar ass)
  1678. {
  1679.   uchar p,d,save[2];
  1680.   if(i==0&&opera[0][0]==1)      // 显示符号
  1681.   {
  1682.     if(cal_run)  display_cnasc(0x98,1,"=-");
  1683.     else  display_cnasc(0x90,1," -");
  1684.   }
  1685.   d=opera[ i][11];               // 计算位数
  1686.   if(opera[ i][10]!=0&&opera[ i][10]!=opera[ i][11]+1) d++;
  1687.   save[0]=d/2;ass=ass-save[0]+5;    // 计算显示的开始位置
  1688.   p=1;
  1689.   cal_del=0;                    // 显示点标记 (0为没有显示)
  1690.   if(d%2==1)                    // 对位数位奇数先处理首位
  1691.   {
  1692.     save[0]=' ';
  1693.     save[1]=char_num[opera[ i][1]];
  1694.     display_cnasc(ass,1,save);
  1695.     p++;
  1696.   }
  1697.   ass++;                        // 显示地址加一
  1698.   while(p<=opera[ i][11])
  1699.   {                                             
  1700.     if(opera[ i][10]==p&&(!cal_del)) {   // 显示点且作标记
  1701.       save[0]='.';cal_del=1;}
  1702.     else {
  1703.       save[0]=char_num[opera[ i][p]]; p++;}
  1704.     if(opera[ i][10]==p&&(!cal_del)) {
  1705.       save[1]='.';cal_del=1;}
  1706.     else{
  1707.       save[1]=char_num[opera[ i][p]];p++;}
  1708.     display_cnasc(ass,1,save);
  1709.     ass++;
  1710.   }
  1711. }   


  1712. /*从键盘中写入数据*/   
  1713. char input_data()
  1714. {
  1715.   uchar save=20,c;
  1716.   for(;i<2;i++)
  1717.   {
  1718.     while(1)
  1719.     {
  1720. pp:   save=gotkey();    // 读键盘
  1721.       if(save==20) continue;
  1722.       if(save==11)      // 按键为确定时,选择计算或删除
  1723.       {
  1724.         c=save=0;
  1725.         while(1)        // 反色选择
  1726.         {
  1727.           con_disp (0x00,0x00,index_cal[save].lnum,index_cal[save].rnum,2,16);
  1728.           con_disp (0xff,0xff,index_cal[c].lnum,index_cal[c].rnum,2,16);   
  1729.           save=gotkey();
  1730.           if(save==10)
  1731.           {
  1732.             save=c;
  1733.             if(++c==3) c=0;
  1734.           }
  1735.           else if(save==11)
  1736.           {
  1737.             if(c==0) save=11;
  1738.             else if(c==1) save=16;
  1739.             else  return 0;
  1740.             break;
  1741.           }
  1742.           else break;
  1743.         }
  1744.         con_disp (0x00,0x00,index_cal[c].lnum,index_cal[c].rnum,2,16);      
  1745.       }
  1746.       if(save>=0&&save<=9&&j<10)
  1747.       {
  1748.         if(i==1&&opera[1][0]==15&&j>8) goto pp;
  1749.         if(j==2&&opera[ i][1]==0&&opera[ i][10]==0)
  1750.           opera[ i][1]=save;     // 防止小数位不在时首位为零
  1751.         else{
  1752.           opera[ i][j]=save;opera[ i][11]=j;j++;}
  1753.         if(i==0)                // 显示
  1754.           dis_cdata(0x90);
  1755.         else
  1756.           dis_cdata(0x88);
  1757.       }
  1758.       else if(save==10&&j<10)   
  1759.       {
  1760.         if(opera[ i][10]==0)     // 小数点空时保存
  1761.         {
  1762.           if(opera[ i][11]==0) {opera[ i][10]=2;j++;}
  1763.           else  opera[ i][10]=j;
  1764.         }
  1765.       }
  1766.       else if(save==16)
  1767.       {                           // 删除数据
  1768.         removal_data(i,0);j=1;
  1769.         if(i!=0){i--;j=10;}
  1770.       }
  1771.       else if(i==1&&opera[1][11]!=0&&save>11&&save<16)
  1772.       { save1=save;break; }         // 连续计算时保存运算符
  1773.       else if(save==11&&opera[1][11]==0) continue;// 操作数1为0时不理会
  1774.       else if(save==11&&opera[1][11]!=0)  break;
  1775.       else if((i==0||i==1&&j==1)&&save>11&&save<16){i=0; break;}   
  1776.        // 当操作数0由运算符结束输入,再按符号键更改
  1777.       else continue;
  1778.     }
  1779.     if(opera[ i][10]>opera[ i][11]||opera[ i][10]==0)
  1780.       opera[ i][10]=opera[ i][11]+1;  // 整数时小数位保存到最后
  1781.     while(opera[ i][11]>=opera[ i][10]&&opera[ i][opera[ i][11]]==0)
  1782.       opera[ i][11]--;               // 去除小数点后多余的0
  1783.     if(i==0)
  1784.     {
  1785.       opera[1][0]=save;         // 保存运算符并显示
  1786.       display_cnasc(0x88,1,tool_cal[save-12]);
  1787.     }
  1788.     if(opera[0][11]==0) display_cnasc(0x95,1," 0");
  1789.     j=1;
  1790.     while(j<=opera[ i][11]&&opera[ i][j]==0) j++;//判断是否操作数是否全为0
  1791.     j--;
  1792.     if(j==opera[ i][11]) opera[ i][11]=0;
  1793.     j=1;
  1794.   }
  1795.   return 1;
  1796. }


  1797. /****************************************************************************************
  1798. 功能:  乘法运算
  1799. 描述:  结果由右到左保存
  1800. 参数:  i , j , opera[ i][j],p,q,r,k,save1
  1801. 返回值:1(成功),0(结果位0),-1(溢出)
  1802. /****************************************************************************************/

  1803. char multiplication()
  1804. {
  1805.   uchar p,q,r,k,save1=0; // p指向操作数0 ,q指向操作数1,r指向结果
  1806.   if(opera[0][11]==0||opera[1][11]==0) return 0;
  1807.   resu[10]=opera[0][11]+opera[1][11]-opera[0][10]-opera[1][10]+2; // RESU记录小数点后的位数
  1808.   q=opera[1][11];                   // 记录操1的位数
  1809.   r=9;
  1810.   opera[1][11]=1;
  1811.   k=1;
  1812.   while(opera[1][k]==0) {opera[1][11]=opera[1][11]+1;k++;}  // 去除前端的0
  1813.   k=1;
  1814.   while(opera[0][k]==0) k++;            // 去除前端的0
  1815.   resu[11]=9;
  1816.   for(resu[0]=9;q>=opera[1][11];q--,resu[0]--)
  1817.   {
  1818.     if(opera[1][q]==0) continue;        // 操1此位数为0时直接比较
  1819.     for(p=opera[0][11],r=resu[0];p>=k;p--)
  1820.     {
  1821.       save1=opera[0][p]*opera[1][q];        // 将相乘后的数保存
  1822.       resu[r]+=(save1%10);//将缓存中的数取余后加到结果中R指向的位
  1823.       save1/=10;
  1824.       save1=save1+(resu[r]/10);         // 保存进位的数
  1825.       resu[r]%=10;                  // 重新写入
  1826.       if(r==1)  //结果有溢出时移位
  1827.       {
  1828.         if(save1==0&&p==k) break;   // 计算到最后位且没进位跳出
  1829.         else if(resu[10]>0)     // 要求有小数存在
  1830.         {
  1831.           for(r=9;r>1;r--) resu[r]=resu[r-1];
  1832.           r=1;
  1833.           resu[r]=save1;
  1834.           resu[11]=1;
  1835.           resu[10]--;
  1836.           resu[0]++;
  1837.         }   
  1838.         else   return -1;           // 否则溢出
  1839.       }
  1840.       if(r>1&&(r-1)<resu[11])           // 保存结果位的最高位
  1841.       {
  1842.         if(save1!=0) resu[11]=r-1;
  1843.         else resu[11]=r;
  1844.       }
  1845.       if(r>1){ r--;resu[r]+=save1;}// 当R为1时只需要移位记录结果
  1846.     }
  1847.   }
  1848.   while(resu[resu[11]]==0) resu[11]++;  // 去除前端的0
  1849.   resu[0]=opera[0][0];              // 保存符号位
  1850.   removal_data(0,1);                    // 清数据不清显示
  1851.   if(resu[10]>8)   //如果小数点后的数有9 位或以上时,需后移到使小数点放到2的位置  
  1852.   {
  1853.     save1=resu[10]-10+resu[11];         // 记录后移位数
  1854.     if(save1>7)  return 0;   //当后移的数大于有效数字的位数时结果为0
  1855.     else    // 否则按需移位
  1856.     {
  1857.       for(p=save1+2,r=resu[11];p<10;p++,r++) opera[0][p]=resu[r];
  1858.       opera[0][10]=2;opera[0][11]=9;opera[0][0]=resu[0];
  1859.     }       // 因有效数小于小数点后的数,所以首位为0  
  1860.   }
  1861.   else      //如果小数点后的数在8位以内时分两种情况
  1862.   {
  1863.     opera[0][0]=resu[0];  
  1864.     save1=10-resu[11];  // 记录有效位数
  1865.     if(resu[10]>=save1)     // 小数的在有效数字的左边
  1866.     {   
  1867.       for(p=resu[10]+1,r=9;r>=resu[11];p--,r--)
  1868.         opera[0][p]=resu[r];    // 从小数点的最后一位开始
  1869.       opera[0][10]=2;opera[0][11]=resu[10]+1;
  1870.     }
  1871.     else                // 小数点在有效数字内
  1872.     {  
  1873.       for(p=1,r=resu[11];r<10;p++,r++) opera[0][p]=resu[r];
  1874.         opera[0][11]=10-resu[11];
  1875.       if(resu[10]==0) opera[0][10]=opera[0][11]+1;
  1876.       else opera[0][10]=opera[0][11]-resu[10]+1;
  1877.     }
  1878.   }
  1879.   while(opera[0][11]>=opera[0][10]&&opera[0][opera[0][11]]==0)
  1880.     opera[0][11]--;     // 去除小数点后多余的0
  1881.   return 1;
  1882. }


  1883. /****************************************************************************************
  1884. 功能:  除法运算
  1885. 描述:  结果由左到右保存
  1886. 参数:  i , j , opera[ i][j]
  1887. p,q,r, remainde, divisor, decimal
  1888. 返回值:1(成功),0(结果位0),-1(溢出)
  1889. *****************************************************************************************/

  1890. char divider()
  1891. {
  1892.   unsigned long int divisor=0,remainder=0;
  1893.   uchar p,q,r;
  1894.   char decimal=0;
  1895.   if(opera[1][11]==0) return -1;
  1896.   if(opera[0][11]==0) return 0;
  1897.   for(r=1;r<12;r++)     // 判断两数是否相等
  1898.   {
  1899.     if(opera[0][r]!=opera[1][r]) break;
  1900.   }
  1901.   if(r==12)
  1902.   {
  1903.     p=opera[0][0];
  1904.     removal_data(0,1);
  1905.     opera[0][0]=r;
  1906.     opera[0][1]=1;
  1907.     opera[0][10]=2;
  1908.     opera[0][11]=1;
  1909.     return 1;
  1910.   }  
  1911.   decimal=(opera[0][11]-opera[0][10])-(opera[1][11]-opera[1][10]);
  1912.   // 记录两操作数小数点后位数的差
  1913.   if(decimal>0)     // 若操0大于操1时重新记录小数点的位置
  1914.   {
  1915.     opera[0][10]=opera[0][11]-decimal+1;
  1916.     resu[10]=opera[0][10];
  1917.   }
  1918.   else      // 否则小数点后没有数,记录有效数的位数
  1919.   {
  1920.     opera[0][11]-=decimal;
  1921.     opera[0][10]=opera[0][11]+1;
  1922.     resu[10]=opera[0][10];
  1923.   }
  1924.   q=1;
  1925.   divisor=0;
  1926.   while(q<=opera[1][11]) // 将操1的数整形化
  1927.   {
  1928.     divisor=divisor*10+opera[1][q];q++;
  1929.   }
  1930.   if(divisor==1)   
  1931.   {
  1932.     if(resu[10]>10) return -1;
  1933.     else return 1;
  1934.   }
  1935.   r=1;p=1;
  1936.   remainder=(unsigned long int)opera[0][1]; // 先对余数寄存器附初值
  1937.   do
  1938.   {   
  1939.     if(r>9)  // 结果位已经到达最后1位
  1940.     {  
  1941.       if(resu[1]==0&&resu[10]!=2) // 判断是否有得移位
  1942.       {     
  1943.         for(r=1;r<9;r++) resu[r]=resu[r+1];
  1944.         resu[9]=0;
  1945.         if(resu[10]!=0) resu[10]--;
  1946.         r=9;
  1947.       }
  1948.       else if(p>=opera[0][11]||p>=opera[0][10])  break; // 如果计算到最后一位,或者有小数点存在时结束
  1949.       else return -1; // 否则错误
  1950.     }
  1951.     resu[r]=(uchar)(remainder/divisor); // 保存结果
  1952.     remainder=(remainder%divisor);      // 重新写入余数
  1953.     p++;r++;     
  1954.     if(p>opera[0][11]&&remainder==0) break; // 除尽后跳出
  1955.     else if(p<=opera[0][11]&&p<10)      // 余数*10后加后一位
  1956.       {remainder=remainder*10+opera[0][p];}
  1957.     else   remainder=remainder*10;   //超出后余数*10
  1958.   }while(1);
  1959.   resu[11]=r-1;
  1960.   resu[0]=opera[0][0];
  1961.   removal_data(0,1);
  1962.   r=1;   
  1963.   while(resu[r]==0&&resu[10]!=(r+1)&&r<resu[11]) r++;
  1964. //去除结果前端的0
  1965.   if(r==resu[11]) return 0;
  1966.   resu[10]=resu[10]-r+1;
  1967.   p=1;
  1968.   while(r<=resu[11]){opera[0][p]=resu[r];r++;p++;}
  1969.   opera[0][0]=resu[0];opera[0][10]=resu[10];opera[0][11]=p-1;
  1970.   while(opera[0][11]>=opera[0][10]&&opera[0][opera[0][11]]==0)
  1971.     opera[0][11]--;
  1972.   return 1;
  1973. }


  1974. /****************************************************************************************
  1975. 功能:  加法运算
  1976. 描述:  以小数点位中心两边相加
  1977. 参数:  i , j , opera[ i][j],p,q,r
  1978. 返回值:1(成功),0(结果位0),-1(溢出)
  1979. /****************************************************************************************/

  1980. char adder()
  1981. {
  1982.   uchar p,q,r;
  1983.   if(opera[0][11]==0&&opera[1][11]==0)   return 0;
  1984.   else if(opera[0][11]==0)
  1985.     {for(q=0;q<12;q++) opera[0][q]=opera[1][q];return 1;}
  1986.   else if(opera[1][11]==0) return 1;
  1987.   else
  1988.   {
  1989.     p=opera[0][10]-1;
  1990.     q=opera[1][10]-1;
  1991.     p>q?(r=p):(r=q);
  1992.     resu[10]=r+1;       // 小数点位保存
  1993.     resu[0]=opera[0][0];    // 保存符号位
  1994.     while(r>0)          // 将小数点前的数相应相加后放到结果中
  1995.     {
  1996.       if(p>0&&q>0){resu[r]=opera[0][p]+opera[1][q];p--;q--;}
  1997.       else if(p>0&&q==0){resu[r]=opera[0][p];p--;}
  1998.       else  {resu[r]=opera[1][q];q--;}
  1999.       r--;
  2000.     }
  2001.     r=resu[10];
  2002.     p=opera[0][10];
  2003.     q=opera[1][10];
  2004.     while(r<10)         // 将小数点后的数放到结果中
  2005.     {
  2006.       if(p>opera[0][11]&&q>opera[1][11]) break;
  2007.       else if(p<=opera[0][11]&&q<=opera[1][11])
  2008.         {resu[r]=opera[0][p]+opera[1][q];p++;q++;}
  2009.       else if(p<=opera[0][11]&&q>opera[1][11])
  2010.         {resu[r]=opera[0][p];p++;}
  2011.       else  {resu[r]=opera[1][q];q++;}
  2012.       r++;
  2013.     }
  2014.     r--;
  2015.     resu[11]=r;
  2016.     p=0;
  2017.     while(r>0)          // 由右到左将大于9的数进位
  2018.     {
  2019.       resu[r]+=p;           // p为进位标记
  2020.       p=0;
  2021.       if(resu[r]>9) {resu[r]-=10;p=1;}
  2022.       r--;
  2023.     }
  2024.     if(p==1)                // 溢出移位
  2025.     {
  2026.       if(resu[10]==10) return -1;
  2027.       else {
  2028.         for(r=9;r>1;r--) resu[r]=resu[r-1];
  2029.         resu[1]=1;resu[10]++;}
  2030.     }
  2031.    removal_data(0,1);
  2032.    r=0;
  2033.    while(r<12){opera[0][r]=resu[r];r++;}
  2034.    while(opera[0][11]>=opera[0][10]&&opera[0][opera[0][11]]==0)
  2035.      opera[0][11]--;
  2036.    return 1;
  2037.   }
  2038. }

  2039. /****************************************************************************************
  2040. 功能:  减法运算
  2041. 描述:  先比较两操作数的大小用one ,two互换
  2042. 参数:  i , j , opera[ i][j],p,q,r,one,two
  2043. 返回值:1(成功),0(结果位0),-1(溢出)
  2044. /****************************************************************************************/

  2045. char subtraction()
  2046. {
  2047.   uchar p,q,r,one,two;
  2048.   if(opera[0][11]==0&&opera[1][11]==0)   return 0;
  2049.   else if(opera[0][11]==0)
  2050.   {
  2051.     for(q=1;q<12;q++)
  2052.     opera[0][q]=opera[1][q];
  2053.     opera[0][0]=!opera[0][0];return 1;
  2054.   }
  2055.   else if(opera[1][11]==0) return 1;
  2056.   else
  2057.   { // 比较大小(大放到one)
  2058.     if(opera[0][10]>opera[1][10]){one=0;two=1;}
  2059.     else if(opera[1][10]>opera[0][10]) {one=1;two=0;}
  2060.     else
  2061.     {
  2062.       r=1;
  2063.       while(r<10&&opera[0][r]==opera[1][r]) r++;
  2064.       if(r==10) {removal_data(0,1);return 0;}
  2065.       opera[0][r]>opera[1][r]?(one=0,two=1):(one=1,two=0);
  2066.     }
  2067.     p=opera[one][10]-1;
  2068.     q=opera[two][10]-1;
  2069.     r=p;            // 保存小数点前的数
  2070.     resu[10]=r+1;   // 保存小数点位
  2071.     resu[0]=0;      // 用作借位标记
  2072.     while(r>0)      // 小数点前相减
  2073.     {
  2074.       if(p>0&&q>0)
  2075.       {
  2076.         opera[two][q]+=resu[0];
  2077.         resu[0]=0;
  2078.         if(opera[one][p]>=opera[two][q])
  2079.           resu[r]=opera[one][p]-opera[two][q];
  2080.         else
  2081.         {
  2082.           resu[0]=1;
  2083.           resu[r]=10+opera[one][p]-opera[two][q];
  2084.         }
  2085.         p--;q--;
  2086.       }
  2087.       else
  2088.       {     
  2089.         if(opera[one][p]<resu[0])
  2090.           {resu[r]=10+opera[one][p]-resu[0];}
  2091.         else
  2092.           {resu[r]=opera[one][p]-resu[0];resu[0]=0;p--;}
  2093.       }
  2094.       r--;
  2095.     }
  2096.     r=resu[10];
  2097.     p=opera[one][10];
  2098.     q=opera[two][10];
  2099.     while(r<10)     // 将小数点后的数放到结果中
  2100.     {
  2101.       if(p>opera[one][11]&&q>opera[two][11]) break;
  2102.       else if(p<=opera[one][11]&&q<=opera[two][11])
  2103.       {
  2104.         if(opera[one][p]>=opera[two][q])  resu[r]=opera[one][p]-opera[two][q];
  2105.         else
  2106.         {
  2107.           resu[r]=10+opera[one][p]-opera[two][q];
  2108.           resu[0]=r;
  2109.           for(r-=1;r>0;r--) // 向前借位
  2110.           {
  2111.             if(resu[r]==0) resu[r]=9;
  2112.             else{resu[r]-=1;break;}
  2113.           }
  2114.           r=resu[0];   
  2115.         }
  2116.         p++;q++;
  2117.       }                        
  2118.       else if(p<=opera[one][11]&&q>opera[two][11])
  2119.         {resu[r]=opera[one][p];p++;}
  2120.       else  
  2121.       {
  2122.         resu[r]=10-opera[two][q];  
  2123.         resu[0]=r;
  2124.         for(r-=1;r>0;r--)
  2125.         {
  2126.           if(resu[r]==0) resu[r]=9;
  2127.           else{ resu[r]-=1;break;}
  2128.         }
  2129.         r=resu[0];
  2130.         q++;   
  2131.       }
  2132.       if(r==9)      // 结果溢出移位
  2133.       {
  2134.         if(resu[1]==0&&resu[10]!=2)
  2135.         {
  2136.           for(r=1;r<9;r++) resu[r]=resu[r+1];
  2137.           resu[10]--;resu[9]=0;r=8;
  2138.         }
  2139.       }
  2140.       r++;
  2141.     }
  2142.     r--;
  2143.     resu[11]=r;
  2144.     if(one==0)resu[0]=opera[0][0];  // 符号位写入
  2145.     else resu[0]=!opera[0][0];
  2146.     removal_data(0,1);
  2147.     r=1;
  2148.     while(resu[r]==0&&resu[10]!=(r+1)) r++; // 去除前端0
  2149.     resu[10]=resu[10]-r+1;          // 重新写入小数点
  2150.     p=1;
  2151.     while(r<=resu[11]){opera[0][p]=resu[r];r++;p++;}
  2152.     opera[0][0]=resu[0];opera[0][10]=resu[10];opera[0][11]=p-1;
  2153.     while(opera[0][11]>=opera[0][10]&&opera[0][opera[0][11]]==0) opera[0][11]--;
  2154.     return 1;
  2155.   }
  2156. }


  2157. /****************************************************************************************
  2158. 功能:  计算器主函数
  2159. 描述:  根据符号位,运算符调用函数
  2160. 参数:  state,save
  2161. 返回值:无
  2162. ****************************************************************************************/


  2163. void calculator(void)
  2164. {
  2165.   char data state;
  2166.   uchar data save;
  2167.   save1=0;
  2168.   dis_title_e();
  2169.   display_cnasc(0x82,3,tool_menu[0]);
  2170.   display_cnasc(0x96,2,"等于");
  2171.   display_cnasc(0x8e,2,"删除");
  2172.   display_cnasc(0x9e,2,"退出");
  2173.   removal_data(2,0);    // 0为清除显示
  2174.   removal_data(0,0);
  2175.   i=0;j=1;
  2176.   while(1)
  2177.   {
  2178.     cal_run=0;
  2179.     state=input_data();
  2180.     if(state==1)  // 根据opera[1][0]的数值调用程序
  2181.     {
  2182.       if(opera[1][0]==12&&opera[0][0]==0||opera[1][0]==13&&opera[0][0]==1)
  2183.         state=adder();
  2184.       else if(opera[1][0]==12&&opera[0][0]==1||opera[1][0]==13&&opera[0][0]==0)
  2185.         state=subtraction();
  2186.       else if(opera[1][0]==14) state=multiplication();
  2187.       else state=divider();
  2188.     }
  2189.     if(state==0)  return;
  2190.     i=0;j=1;
  2191.     cal_run=1;
  2192.     switch(state)
  2193.     {
  2194.       case -1:                      // 结果溢出
  2195.               removal_data(2,0);
  2196.               removal_data(0,0);  
  2197.               display_cnasc(0x8a,3,"溢出!!");
  2198.               save1=0;
  2199.               break;
  2200.       case  0:                      // 结果为零
  2201.               if(save1==0)
  2202.               {
  2203.                 removal_data(2,1);
  2204.                 removal_data(0,1);
  2205.                 display_cnasc(0x98,1,"= ");
  2206.                 display_cnasc(0x9d,1," 0");
  2207.               }
  2208.               break;                // 结果显示
  2209.       case  1:
  2210.               if(save1==0)
  2211.               {
  2212.                 cal_run=1;
  2213.                 display_cnasc(0x98,1,"= ");
  2214.                 dis_cdata(0x98);
  2215.               }
  2216.               break;
  2217.     }
  2218.     if(save1==0) save=gotkey();  // save1记录连续计算符
  2219.     cal_run=0;  
  2220.     if((save>11&&save<16&&state==1)||save1!=0)
  2221.     {
  2222.       removal_data(2,0);
  2223.       removal_data(1,0);
  2224.       display_cnasc(0x90,6,"               ");
  2225.       if(opera[0][11]==0) display_cnasc(0x95,1," 0");
  2226.       else dis_cdata(0x90);
  2227.       if(save1!=0)save=save1;
  2228.       save1=0;
  2229.       display_cnasc(0x88,1,tool_cal[save-12]);
  2230.       opera[1][0]=save;
  2231.       i=1;j=1;
  2232.     }
  2233.     else if(save>=0&&save<10&&state==1)
  2234.     {
  2235.       removal_data(2,0);
  2236.       removal_data(0,0);
  2237.       opera[0][1]=save;
  2238.       opera[0][11]++;
  2239.       dis_cdata(0x90);
  2240.       i=0;j=2;
  2241.     }
  2242.     else if(save==10)
  2243.     {  
  2244.       removal_data(2,0);
  2245.       removal_data(0,0);
  2246.       opera[ i][10]=2;
  2247.       opera[ i][11]=1;
  2248.       j=2;
  2249.     }
  2250.     else
  2251.     {
  2252.       removal_data(2,0);
  2253.       removal_data(0,0);
  2254.     }
  2255.   }                                                     
  2256. }
  2257.   

  2258. /*=====================================================================================
  2259. 函数名称:温度功能
  2260. 功能描述:连续检查温度
  2261. 全局变量:temprun  oth_run  als_temp  adju_si
  2262. 参数说明:见函数
  2263. 返回说明:无
  2264. 设 计 人:JZHG
  2265. 版    本:1.0
  2266. 说    明:
  2267. ======================================================================================*/


  2268. /*温度显示*/
  2269. uchar temp_func_dis(void)
  2270. {
  2271.   uchar save[2],k;
  2272.    clear_dis();
  2273.   dis_title_e();
  2274.   display_cnasc(0x82,3,"温度计");  
  2275.   display_cnasc(0x98,3,"设定");
  2276.   display_cnasc(0x9e,3,"退出");
  2277.   display_cnasc(0x8e,1," \x1f");
  2278.   num2_asc_dis(10,0x85);
  2279.   temprun=1;
  2280.   while(1)
  2281.   {
  2282.     if(ds18b20)
  2283.     {
  2284.       if(temp.t_data[0]>99)   // 温度值大于99时
  2285.       {
  2286.         save[0]=temp.t_data[0]/100;
  2287.         save[1]=(temp.t_data[0]/10)%10;
  2288.         num2_asc_dis(save[0],0x80);
  2289.         num2_asc_dis(save[1],0x81);
  2290.         save[0]=char_num[temp.t_data[0]%10];
  2291.         num2_asc_dis(save[0],0x82);
  2292.       }
  2293.       else                   // 温度小于100
  2294.       {
  2295.         con_disp(0x00,0x00,0x80,0x90,1,16);
  2296.         con_disp(0x00,0x00,0x88,0x90,1,16);
  2297.         if(temp_pn) con_disp(0x3f,0xfc,0x80,0x9d,1,3);
  2298.         else  con_disp(0x00,0x00,0x80,0x9d,1,3);
  2299.         save[0]=temp.t_data[0]/10;
  2300.         save[1]=temp.t_data[0]%10;
  2301.         num2_asc_dis(save[0],0x81);
  2302.         num2_asc_dis(save[1],0x82);
  2303.       }
  2304.       save[0]='.';
  2305.       save[1]=char_num[temp.t_data[1]/10];
  2306.       display_cnasc(0x8b,1,save);
  2307.       save[0]=char_num[temp.t_data[1]%10];
  2308.       if(save[0]=='1') save[1]='2';        // 补偿精度
  2309.       else if(save[0]=='7') save[1]='5';
  2310.       else if(save[0]=='8'||save[0]=='1') save[1]='7';
  2311.       else save[1]='0';
  2312.       display_cnasc(0x8c,1,save);
  2313.     }
  2314.     else
  2315.     {
  2316.       clear_dis();
  2317.       display_cnasc(0x92,4,"没有发现");
  2318.       display_cnasc(0x8c,4,"温感器!");
  2319.       delay_pw();
  2320.       delay_pw();
  2321.       delay_pw();
  2322.       temprun=0;
  2323.       return 0;
  2324.     }
  2325.     k=gotkey();
  2326.     if(k==2)     // 进入设置菜单
  2327.     {
  2328.       display_cnasc(0x8e,1," \x04");
  2329.       delay(35000);
  2330.       display_cnasc(0x8e,1," \x1e");
  2331.       display_cnasc(0x9a,4,"\x11 (ok) \x10");
  2332.       return 1;
  2333.     }
  2334.   }
  2335. }

  2336. /*警报温度设置*/
  2337. uchar temp_func_set(void)
  2338. {
  2339.   uchar save[2];
  2340.   temprun=0;
  2341.   oth_run=0;
  2342.   rds1302_data();
  2343.   while(1)
  2344.   {  
  2345.     if(oth_run)
  2346.     {
  2347.       con_disp (0x00,0x00,0x88,0x90,2,16);
  2348.       con_disp (0xff,0xff,0x8e,0x90,2,16);
  2349.     }
  2350.     else
  2351.     {
  2352.       con_disp (0xff,0xff,0x88,0x90,2,16);
  2353.       con_disp (0x00,0x00,0x8e,0x90,2,16);
  2354.     }   
  2355.     save[0]=gotkey();
  2356.     if(save[0]==1||save[0]==3) oth_run=!oth_run;
  2357.     if(save[0]==5) return 1;
  2358.     if(save[0]==11)
  2359.     {  
  2360.       if(oth_run) return 0;
  2361.       else  
  2362.       {
  2363.         clear_dis();
  2364.         dis_title_e();
  2365.         save[1]=save[0]=0;
  2366.         oth_run=0;
  2367.         dis_title_e();
  2368.         display_cnasc(0x82,3,"设  定");
  2369.         display_cnasc(0x90,5,"警报温度:");
  2370.         display_cnasc(0x88,7,"高于【    】℃");
  2371.         display_cnasc(0x98,8,"低于【    】℃ \x10");
  2372.         while(1)
  2373.         {
  2374.           if(save[1]==2) con_disp(0x00,0x00,index_temp_set[save[1]].lnum,index_temp_set[save[1]].rnum,2,13);
  2375.           else con_disp(0x00,0x00,index_temp_set[save[1]].lnum,index_temp_set[save[1]].rnum,2,13);
  2376.           if(save[0]==2) con_disp(0x0f,0xff,index_temp_set[save[0]].lnum,index_temp_set[save[0]].rnum,1,13);
  2377.           else con_disp(0xff,0xff,index_temp_set[save[0]].lnum,index_temp_set[save[0]].rnum,2,13);
  2378.           save[1]=save[0];
  2379.           adju_si=0;
  2380.           oth_run=0;
  2381.           while(1)
  2382.           {
  2383.             for(i=0;i<2;i++)
  2384.             {
  2385.               j=0x8b+i*16;
  2386.               if(als_temp[ i]==255) display_cnasc(j,2," off"); // 255值为关闭值
  2387.               else
  2388.               {
  2389.                 save1=save[1];
  2390.                 if(als_temp[ i]>127)  // 当数值大于127时温度值为负数
  2391.                 {
  2392.                   display_cnasc(j,1,"- ");
  2393.                   save[0]=char_num[(als_temp[ i]-128)/10];
  2394.                   save[1]=char_num[(als_temp[ i]-128)%10];
  2395.                   display_cnasc(j+1,1,save);
  2396.                 }
  2397.                 else
  2398.                 {
  2399.                   save[0]=' ';
  2400.                   save[1]=char_num[als_temp[ i]/100];
  2401.                   if(save[1]=='0') save[1]=' ';
  2402.                   display_cnasc(j,1,save);
  2403.                   save[0]=char_num[als_temp[ i]/10%10];
  2404.                   save[1]=char_num[als_temp[ i]%10];
  2405.                   display_cnasc(j+1,1,save);
  2406.                 }
  2407.                 save[1]=save1;
  2408.               }
  2409.             }      
  2410.             save[0]=gotkey();
  2411.             do         // 输入符号等待数值输入或下一位
  2412.             {
  2413.               if(save[0]==13){ oth_run=1;display_cnasc(0x8b+save[1]*16,2,"-   ");}
  2414.               else if(save[0]==12){ oth_run=0;display_cnasc(0x8b+save[1]*16,2,"    ");}
  2415.               else break;
  2416.               save[0]=gotkey();
  2417.               if(save[0]>=0&&save[0]<10||save[0]==11) break;
  2418.             }while(1);
  2419.             if(save[0]==14){ als_temp[save[1]]=255;}  // 乘号直接将警报温度关闭
  2420.             if(save[0]>=0&&save[0]<10&&save[1]<2)
  2421.             {
  2422.               if(adju_si)
  2423.               {
  2424.                 adju_si=0;
  2425.                 if(oth_run) als_temp[save[1]]&=0x7f;  // 消去符号位
  2426.                 if(als_temp[save[1]]>24&&!oth_run) als_temp[save[1]]=240;
  2427.                 else als_temp[save[1]]=als_temp[save[1]]*10+save[0];
  2428.                 if(oth_run&&als_temp[save[1]]>50) als_temp[save[1]]=50;         
  2429.                 if(!oth_run&&als_temp[save[1]]>120) als_temp[save[1]]=120;
  2430.                 if(!oth_run&&als_temp[save[1]]<100) adju_si=1;  // 根据数值打开连写
  2431.                 if(oth_run&&als_temp[save[1]]<10)  adju_si=1;
  2432.               }
  2433.               else
  2434.               {
  2435.                 als_temp[save[1]]=save[0];
  2436.                 adju_si=1;
  2437.               }
  2438.               if(oth_run) als_temp[save[1]]=als_temp[save[1]]|0x80;  // 写入符号
  2439.               else als_temp[save[1]]=als_temp[save[1]]&0x7f;
  2440.             }                  
  2441.             if(save[0]==11)
  2442.             {
  2443.               if(als_temp[1]!=255&&als_temp[0]!=255)       // 上下限温度调整
  2444.               {
  2445.                 if(save[1]==0&&als_temp[0]<als_temp[1]){als_temp[0]=als_temp[1];}
  2446.                 if(save[1]==1&&als_temp[1]>als_temp[0]){als_temp[1]=als_temp[0];}
  2447.               }
  2448.               save[0]=save[1]+1;adju_si=0;break;}
  2449.             if(save[0]==10&&save[1]!=0) {save[0]=save[1]-1;adju_si=0;break;}
  2450.           }
  2451.           oth_run=0;
  2452.           if(save[0]==3&&save[1]==2) break;
  2453.         }
  2454.         save_y_or_n();
  2455.         if(oth_run)
  2456.         {
  2457.           wds1302_data(d02_temp,als_temp[0]);
  2458.           wds1302_data(d02_temp+2,als_temp[1]);
  2459.         }
  2460.         return 1;
  2461.       }
  2462.     }
  2463.   }
  2464. }         
  2465.                      
  2466.          
  2467. /*温度计主函数*/         
  2468. void temp_func(void)
  2469. {        
  2470.   uchar t;  
  2471.   while(1)
  2472.   {
  2473.     oth_run=1;
  2474.     t=temp_func_dis();
  2475.     if(t==1)
  2476.     {
  2477.       t=temp_func_set();
  2478.       if(t==0) return;
  2479.     }
  2480.     else return;
  2481.   }
  2482. }
  2483. /*=====================================================================================
  2484. 函数名称:闹铃功能
  2485. 功能描述:设定闹铃
  2486. 全局变量:alarm_time adju_si
  2487. 参数说明:见函数
  2488. 返回说明:无
  2489. 设 计 人:JZHG
  2490. 版    本:1.0
  2491. 说    明:
  2492. ======================================================================================*/


  2493. void alarm_func(void)
  2494. {
  2495.   uchar save[2],a,d;
  2496.   clear_dis();
  2497.   dis_title_e();
  2498.   display_cnasc(0x82,3,"闹  钟");  
  2499.   display_cnasc(0x91,6,"状态:\x11    \x10");
  2500.   display_cnasc(0x89,3,"闹铃:");
  2501.   display_cnasc(0x9f,1,"→");
  2502.   display_cnasc(0x90,1,"『");
  2503.   display_cnasc(0x8f,1,"』");
  2504.   adju_si=0;
  2505.   a=0;d=0;
  2506.   save[0]=char_num[alarm_time[0]>>4];
  2507.   save[1]=char_num[alarm_time[0]&0x0f];
  2508.   display_cnasc(0x8c,1,save);
  2509.   display_cnasc(0x8d,1,": ");
  2510.   save[0]=char_num[alarm_time[1]>>4];
  2511.   save[1]=char_num[alarm_time[1]&0x0f];
  2512.   display_cnasc(0x8e,1,save);
  2513.   do
  2514.   {
  2515.     if(a==0)
  2516.     {   
  2517.       display_cnasc(0x95,1,alm_sign[alm]);
  2518.       display_cnasc(0x94,1,"\x11 ");
  2519.       display_cnasc(0x96,1," \x10");
  2520.       con_disp(0x00,0x00,index_alm[d-1].lnum,index_alm[d-1].rnum,1,14);
  2521.     }
  2522.     if(a>0&&a<4)
  2523.     {
  2524.       if(d==0)
  2525.       {
  2526.         display_cnasc(0x94,1,"  ");
  2527.         display_cnasc(0x96,1,"  ");
  2528.       }
  2529.       else
  2530.        con_disp(0x00,0x00,index_alm[d-1].lnum,index_alm[d-1].rnum,1,14);
  2531.      con_disp(0xff,0xff,index_alm[a-1].lnum,index_alm[a-1].rnum,1,14);  
  2532.     }         
  2533.     d=a;
  2534.     while(1)
  2535.     {
  2536.       a=gotkey();
  2537.       if((a==1||a==3)&&d==0)
  2538.       {
  2539.         alm=!alm;
  2540.         if(a==1) display_cnasc(0x94,1,"\x09 ");
  2541.         else display_cnasc(0x96,1," \x09");
  2542.         delay(35000);
  2543.         if(a==1) display_cnasc(0x94,1,"\x11 ");
  2544.         else display_cnasc(0x96,1," \x10");
  2545.         display_cnasc(0x95,1,alm_sign[alm]);
  2546.       }
  2547.       if(d>0&&d<3&&a>=0&&a<10)
  2548.       {
  2549.         if(adju_si)
  2550.         {
  2551.           alarm_time[d-1]<<=4;alarm_time[d-1]+=a;
  2552.           if(d==1&&alarm_time[0]>0x23) alarm_time[0]=a;
  2553.           else if(d==2&&alarm_time[1]>0x59) alarm_time[1]=a;
  2554.           else adju_si=0;
  2555.         }
  2556.         else  
  2557.         {
  2558.           alarm_time[d-1]=a;adju_si=1;
  2559.         }
  2560.         save[0]=char_num[alarm_time[d-1]>>4];
  2561.         save[1]=char_num[alarm_time[d-1]&0x0f];
  2562.         display_cnasc(0x8c+(d-1)*2,1,save);
  2563.       }
  2564.       if(a==11){a=d+1;break;}
  2565.       if(a==10&&d!=0){a=d-1;break;}
  2566.     }
  2567.     adju_si=0;
  2568.     if(a==4)
  2569.     {
  2570.       save_y_or_n();
  2571.       wds1302_data(d02_signs,signs);
  2572.       wds1302_data(d02_alm,alarm_time[0]);
  2573.       wds1302_data(d02_alm+2,alarm_time[1]);
  2574.       return;
  2575.     }
  2576.   }while(1);
  2577. }



  2578. /*=====================================================================================
  2579. 函数名称:篮球器功能
  2580. 功能描述:分数  时间  24秒  
  2581. 全局变量:resu  opera
  2582. 参数说明:见函数
  2583. 返回说明:无
  2584. 设 计 人:JZHG
  2585. 版    本:1.0
  2586. 说    明:
  2587. ======================================================================================*/

  2588. /*比赛设置*/
  2589. void nba_set(void)
  2590. {
  2591.   uchar nba,save1,key,save[2];
  2592.   clear_dis();
  2593.   dis_title_e();
  2594.   if(resu[7]==1) display_cnasc(0x82,3,"加  时");
  2595.   else  
  2596.   {
  2597.     display_cnasc(0x82,3,"设  定");
  2598.     opera[0][0]=0;
  2599.     opera[1][0]=1;
  2600.   }
  2601.   resu[6]=0;    // 赋初值
  2602.   resu[0]=1;
  2603.   resu[1]=4;
  2604.   resu[2]=12;
  2605.   resu[3]=0;
  2606.   resu[4]=24;
  2607.   display_cnasc(0x90,7,"队1:红  队2:白");
  2608.   display_cnasc(0x88,7,"24秒:Y  节数:4");
  2609.   display_cnasc(0x98,8,"每节时间: 12分钟");
  2610.   save1=0;nba=0;
  2611.   while(1)
  2612.   {
  2613.     if(save1==4) display_cnasc(0x9c,1,":");
  2614.     else display_cnasc(index_nba[save1],1,"  ");
  2615.     if(nba==4)  display_cnasc(0x9c,1,":\x10");
  2616.     else display_cnasc(index_nba[nba],1,"\x11 ");
  2617.     save1=nba;
  2618.     key=gotkey();   
  2619.     if(key==1||key==3)
  2620.     {     
  2621.       switch(nba)     // 导航更改数据
  2622.       {
  2623.         case 0:            
  2624.         case 1:
  2625.                 if(key==1){if(opera[nba][0]>0) opera[nba][0]--;
  2626.                            else opera[nba][0]=7;}
  2627.                 if(key==3){if(opera[nba][0]<7) opera[nba][0]++;
  2628.                            else opera[nba][0]=0;}
  2629.                 display_cnasc(index_nba[nba]-1,1,nba_oppo[opera[nba][0]]);
  2630.                 break;
  2631.         case 2:
  2632.                 if(resu[0]>0) resu[0]=0;
  2633.                 else resu[0]=1;
  2634.                 if(resu[0]>0)   display_cnasc(0x8a,1,":Y");
  2635.                 else display_cnasc(0x8a,1,":N");
  2636.                 break;
  2637.         case 3:
  2638.                 if(key==1){if(resu[1]>1) resu[1]--;
  2639.                             else  resu[1]=4;}
  2640.                 if(key==3){if(resu[1]<4) resu[1]++;
  2641.                            else resu[1]=1;}
  2642.                 save[0]=':';
  2643.                 save[1]=char_num[resu[1]];
  2644.                 display_cnasc(0x8e,1,save);
  2645.                 break;
  2646.         case 4:
  2647.                 if(key==1){if(resu[2]>0) resu[2]--;
  2648.                             else  resu[2]=60;}
  2649.                 if(key==3){if(resu[2]<60) resu[2]++;
  2650.                            else resu[2]=0;}
  2651.                 save[0]=char_num[resu[2]/10];
  2652.                 save[1]=char_num[resu[2]%10];
  2653.                 display_cnasc(0x9d,1,save);
  2654.                 resu[5]=resu[2];
  2655.                 break;
  2656.       }
  2657.     }
  2658.     if(key==11)
  2659.     {
  2660.       nba++; if(nba==5) return;            
  2661.     }
  2662.     if(key==10&&nba!=0)  nba--;
  2663.   }
  2664. }



  2665. /*界面其他元素*/
  2666. void nba_oth_dis(void)
  2667. {
  2668.   uchar save[2];
  2669.   if(resu[7]==1) display_cnasc(0x80,5,"加时时间:");
  2670.   else display_cnasc(0x80,5,"比赛时间:");
  2671.   display_cnasc(0x98,1,nba_oppo[opera[0][0]]);
  2672.   display_cnasc(0x9e,1,nba_oppo[opera[1][0]]);
  2673.   display_cnasc(0x99,1,"队");
  2674.   display_cnasc(0x9f,1,"队");
  2675.   save[0]='0';
  2676.   save[1]=char_num[resu[6]+1];
  2677.   display_cnasc(0x9b,1,save);
  2678.   display_cnasc(0x9c,1,"st");
  2679.   con_disp(0xff,0xff,0x83,0x90,2,1); // 画正方框
  2680.   con_disp(0xff,0xff,0x8b,0x8f,2,1);
  2681.   con_disp(0x80,0x00,0x83,0x91,1,15);
  2682.   con_disp(0x00,0x01,0x84,0x91,1,15);
  2683.   con_disp(0x80,0x00,0x8b,0x80,1,15);
  2684.   con_disp(0x00,0x01,0x8c,0x80,1,15);
  2685.   nba_dis_time();
  2686.   if(resu[0]==0) display_cnasc(0x93,2,"\x07--\x07");
  2687.   display_cnasc(0x8b,2," S! ");
  2688. }



  2689. /*篮球器主函数*/
  2690. void nba_timer(void)
  2691. {
  2692.   uchar save,key,nba=0;
  2693.   als=di0=1;alm=keb=di1=oth_run=0;
  2694.   time_init();  
  2695.   display_cnasc(0x82,3,"篮球器");
  2696.   dis_title_e();
  2697.   removal_data(0,1);
  2698.   while(1)    // 使用说明
  2699.   {
  2700.     display_cnasc(0x90,8,timer_tips[nba]);
  2701.     display_cnasc(0x88,8,timer_tips[nba+1]);
  2702.     display_cnasc(0x98,8,timer_tips[nba+2]);
  2703.     key=gotkey();
  2704.     if(key==11)
  2705.     {
  2706.       nba+=3;
  2707.       if(nba>9) break;
  2708.     }
  2709.     if(key==10)
  2710.     {
  2711.       if(nba>0) nba-=3 ;
  2712.     }
  2713.   }
  2714. nn:
  2715.   nba_set();
  2716.   clear_dis();
  2717.   nba_oth_dis();
  2718.   nba_tim=1;
  2719.   while(1)
  2720.   {
  2721.     for(save=0x80,nba=0;nba<2;nba++)
  2722.     {
  2723.       if(opera[nba][1]>99)  // 分数显示
  2724.       {
  2725.         num2_asc_dis(opera[nba][1]/100,save);
  2726.         num2_asc_dis(opera[nba][1]/10%10,save+1);
  2727.         num2_asc_dis(opera[nba][1]%10,save+2);
  2728.       }
  2729.       else
  2730.       {
  2731.         num2_asc_dis(opera[nba][1]/10,save);
  2732.         num2_asc_dis(opera[nba][1]%10,save+1);
  2733.       }
  2734.       if(opera[1][1]>99) save=0x85;
  2735.       else save=0x86;
  2736.     }
  2737.    
  2738.     do
  2739.     {
  2740.     key=gotkey();
  2741.   ss:
  2742.     switch(key)
  2743.     {
  2744.       case 12:
  2745.       case 13:
  2746.                if(key==12)
  2747.                  {if(opera[0][1]<250) opera[0][1]++;}
  2748.                else
  2749.                  {if(opera[0][1]>0) opera[0][1]--;}
  2750.                save=110;
  2751.                break;
  2752.       case 14:
  2753.       case 15:
  2754.                if(key==14)
  2755.                  {if(opera[1][1]<250) opera[1][1]++;}
  2756.                else
  2757.                  {if(opera[1][1]>0) opera[1][1]--;}
  2758.                save=110;
  2759.                break;
  2760.       case  7:
  2761.                TR1=TR0=EA=0;
  2762.                if((++resu[3])>59)
  2763.                {
  2764.                  resu[3]=0;
  2765.                  if((++resu[2])>59)
  2766.                  {
  2767.                    resu[3]=0;
  2768.                    if(++resu[2]>60) resu[2]=0;
  2769.                  }
  2770.                }
  2771.                if(resu[4]<24) resu[4]++;
  2772.                nba_dis_time();
  2773.                break;
  2774.       case  8:
  2775.                if(resu[0]==1)
  2776.                {
  2777.                  TL1=(time_count&0x00FF);
  2778.                  TH1=(time_count>>8);
  2779.                  resu[4]=24; nba_dis_time();
  2780.                  TR0=TR1=EA=1;
  2781.                }
  2782.                break;
  2783.       case  9:
  2784.                if(resu[2]==0&&resu[3]==0)
  2785.                {
  2786.                  resu[2]=resu[5];resu[4]=24;
  2787.                  if(resu[6]==resu[1])
  2788.                  {                            // 判断比分进行加时赛
  2789.                    if(opera[0][1]==opera[1][1]){nba_tim=0;resu[7]=1; goto nn;}
  2790.                    while(gotkey()!=10);       // 否则只能退出
  2791.                    signs=r1302(d02_signs+1);
  2792.                    nba_tim=0;
  2793.                    return;
  2794.                  }
  2795.                  else nba_oth_dis();
  2796.                  break;
  2797.                }
  2798.                if(EA) {TR0=TR1=EA=0;break;}
  2799.                if(!EA&resu[4]!=0){ EA=TR0=1;if(resu[0]==1) TR1=1;}
  2800.                break;                                                                           
  2801.       case 10:
  2802.       case 11:
  2803.                if(!EA)          // 暂停状态下 ok键两次返回时钟界面
  2804.                {                //  ./s 键两次退出
  2805.                  delay(6000);
  2806.                  save=gotkey();
  2807.                  if(save==key)
  2808.                  {
  2809.                    if(key==11)
  2810.                    {
  2811.                      clear_dis();oth_run=1;
  2812.                      rds1302_time();
  2813.                      init_d2=1;
  2814.                      dis_mode2();
  2815.                      init_d2=0;
  2816.                      while(gotkey()!=11);
  2817.                      oth_run=0;
  2818.                      save=110;
  2819.                      clear_dis();
  2820.                      nba_oth_dis();
  2821.                    }
  2822.                    else{ signs=r1302(d02_signs+1); nba_tim=0;return;}
  2823.                  }
  2824.                  else{ key=save;goto ss;}
  2825.                }
  2826.                break;     
  2827.     }
  2828.     if(save==110)  break;
  2829.     }while(1);  
  2830.   }  
  2831. }

  2832.      
  2833. /*=====================================================================================
  2834. 函数名称:设置功能
  2835. 功能描述:系统状态设置  
  2836. 全局变量:signs
  2837. 参数说明:见函数
  2838. 返回说明:无
  2839. 设 计 人:JZHG
  2840. 版    本:1.0
  2841. 说    明:
  2842. ======================================================================================*/


  2843. /*设置调整内容 参数格式:选中设置项,设置项子值*/
  2844. uchar set_dis(uchar menu,uchar sub)
  2845. {
  2846.   uchar save;
  2847.   con_disp(0xff,0xff,0x8e,0x80,2,16);
  2848.   con_disp(0x00,0x00,0x8a,0x80,4,16);
  2849.   display_cnasc(0x96,1,"\x1e ");
  2850.   display_cnasc(0x9e,1,"\x1f ");
  2851.   display_cnasc(0x92,1,"  ");
  2852.   display_cnasc(0x9a,1,"  ");
  2853.   display_cnasc(0x8d,1,"\x11 ");
  2854.   display_cnasc(0x8a,1,"  ");
  2855.   while(1)
  2856.   {
  2857.    
  2858.     if(menu<2)
  2859.       display_cnasc(0x8e,2,set_bl_dm[menu][sub]);
  2860.     else
  2861.       display_cnasc(0x8e,2,set_mka[menu-2][sub]);
  2862.     save=gotkey();
  2863.     if(save==5)
  2864.     {
  2865.       key_dis(0x96);
  2866.       if(sub==0&&menu<2) sub=2;
  2867.       else if(sub==0&&menu>1) sub=1;
  2868.       else sub--;
  2869.     }
  2870.     if(save==2)
  2871.     {
  2872.       key_dis(0x9e);
  2873.       if(sub==2&&menu<2) sub=0;
  2874.       else if(sub==1&&menu>1) sub=0;
  2875.       else sub++;
  2876.     }
  2877.     if(save==1||save==11)
  2878.     {
  2879.       display_cnasc(0x8d,1,"\x04 ");
  2880.         delay(30000);
  2881.       con_disp(0x00,0x00,0x8e,0x80,2,16);
  2882.       con_disp(0xff,0xff,0x8a,0x80,4,16);
  2883.       display_cnasc(0x92,1,"\x1e ");
  2884.       display_cnasc(0x9a,1,"\x1f ");
  2885.       display_cnasc(0x96,1,"  ");
  2886.       display_cnasc(0x9e,1,"  ");
  2887.       display_cnasc(0x8a,1,"【");
  2888.       display_cnasc(0x8d,3,"】\x10 \x04 ");
  2889.       return(sub);    // 返回设置值
  2890.     }
  2891.   }
  2892. }


  2893. /*设置调整*/
  2894. void set_func(void)
  2895. {
  2896.   uchar d,key,save;
  2897.   display_cnasc(0x81,2,"设置");
  2898.   dis_title();
  2899.   display_cnasc(0x88,8,selected[1]);
  2900.   con_disp(0xff,0xff,0x8a,0x80,4,16);
  2901.   save=d=0;
  2902.   do
  2903.   {   
  2904.     display_cnasc(0x93,2,set_menu[index_s[save].lnum]);
  2905.     display_cnasc(0x8b,2,set_menu[save]);
  2906.     display_cnasc(0x9b,2,set_menu[index_s[save].rnum]);
  2907.     d=save;
  2908.     while(1)
  2909.     {
  2910.       key=gotkey();
  2911.       if(key==11||key==3){ enter_dis();break;}
  2912.       if(key==5){save=index_s[d].lnum;key_dis(0x92); break;}
  2913.       if(key==2){save=index_s[d].rnum;key_dis(0x9a); break;}
  2914.       if(key==1){ wds1302_data(d02_signs,signs); return;}
  2915.     }
  2916.     if(key==11||key==3)
  2917.     {
  2918.       save=0;
  2919.       for(key=0;key<2;key++)  //  进行两次比较 首次为现时值 其次为设定置更改
  2920.       {
  2921.         switch(d)
  2922.         {
  2923.           case 0:
  2924.                   if(key==1)
  2925.                   {
  2926.                     bl0=bl1=0;
  2927.                     if(save==1) bl0=1;
  2928.                     if(save==2) bl1=1;
  2929.                   }
  2930.                   else
  2931.                   {if(bl0) save=1; if(bl1) save=2;}
  2932.                   if(bl1) lcd_bl=close;
  2933.                   else lcd_bl=open;
  2934.                   break;
  2935.           case 1:
  2936.                   if(key==1)
  2937.                   {
  2938.                     di0=di1=0;
  2939.                     if(save==1) di0=1;
  2940.                     if(save==2) di1=1;
  2941.                   }
  2942.                   else {if(di0) save=1; if(di1) save=2;}
  2943.                   break;
  2944.           case 2:
  2945.                   if(key==1) meu=(bit)save;
  2946.                   else {if(meu) save++;}         
  2947.                   break;
  2948.           case 3:
  2949.                   if(key==1) keb=(bit)save;
  2950.                   else{if(keb) save++;}      
  2951.                   break;
  2952.           case 4:
  2953.                   if(key==1) als=(bit)save;
  2954.                   else{if(als) save++;}      
  2955.                   break;
  2956.           case 5: wds1302_data(d02_signs,signs);
  2957.                   return;
  2958.         }
  2959.         if(key==0) save=set_dis(d,save);
  2960.       }
  2961.       save=d;
  2962.     }
  2963.   }while(1);
  2964. }


  2965. /*=====================================================================================
  2966. 函数名称:保密功能
  2967. 功能描述:系统重设  密码锁  密码更改  
  2968. 全局变量:resu  
  2969. 参数说明:见函数
  2970. 返回说明:无
  2971. 设 计 人:JZHG
  2972. 版    本:1.0
  2973. 说    明:
  2974. ======================================================================================*/


  2975. /*密码整理*/
  2976. void passwork_finish()
  2977. {
  2978.   uchar i;
  2979.   for(i=0;i<6;i+=2)
  2980.   {
  2981.     resu[ i]<<=4;
  2982.     resu[ i]+=resu[i+1];
  2983.   }
  2984. }



  2985. /*读取密码*/
  2986. uchar input_passwork()
  2987. {
  2988.   uchar i,save[2];
  2989.   save[0]=' ';
  2990.   display_cnasc(0x9d,3,"(./S)\x10");
  2991.   for(i=0;i<6;i++)
  2992.   {
  2993.     while(1)
  2994.     {
  2995.       resu[ i]=gotkey();
  2996.       if(resu[ i]>=0&&resu[ i]<10) break;
  2997.       if(resu[ i]==10) return 10;
  2998.     }
  2999.     save[1]=char_num[resu[ i]];
  3000.     display_cnasc(0x89+i,1,save);
  3001.     delay(20000);
  3002.     display_cnasc(0x89+i,1," *");
  3003.   }
  3004.   return 11;
  3005. }



  3006. /*密码确认*/
  3007. void input_second_passwork()
  3008. {
  3009.   uchar i,save[2];
  3010.   save[0]=' ';
  3011.   display_cnasc(0x89,6,"            ");
  3012.   for(i=0;i<6;i++)
  3013.   {   
  3014.     if(resu[ i]!=gotkey())   break;
  3015.     save[1]=char_num[resu[ i]];
  3016.     display_cnasc(0x89+i,1,save);
  3017.     delay(20000);
  3018.     display_cnasc(0x89+i,1," *");
  3019.   }
  3020.   if(i!=6)
  3021.   {
  3022.     display_cnasc(0x89,6,"密码不相同!");
  3023.     delay(50000);
  3024.     display_cnasc(0x9a,6,"任意键 \x10    ");
  3025.     while(gotkey()==0xf0);
  3026.     return;
  3027.   }
  3028.   else
  3029.   {
  3030.     passwork_finish();
  3031.     for(i=0;i<6;i+=2)
  3032.       wds1302_data(d02_passw+i,resu[ i]);
  3033.     for(i=0;i<6;i+=2)
  3034.       if(resu[ i]!=r1302(d02_passw+i+1)) break;
  3035.     if(i==6)
  3036.      {display_cnasc(0x98,8,"\x10 更改成功!(OK) ");
  3037.       while(gotkey()!=11);return;}
  3038.     else
  3039.       display_cnasc(0x9a,6,"更改失败!  ");
  3040.   }
  3041.   delay_pw();
  3042. }               



  3043. /*密码比较*/
  3044. uchar passwork_comp()
  3045. {
  3046.   uchar i;
  3047.   passwork_finish();
  3048.   for(i=0;i<6;i+=2)
  3049.     if(resu[ i]!=r1302(d02_passw+i+1)) break;
  3050.   if(i==6)   return 1;
  3051.   else
  3052.   {
  3053.     display_cnasc(0x89,6,"  密码错误!");
  3054.     delay_pw();
  3055.     display_cnasc(0x89,6,"            ");
  3056.     return 110;
  3057.   }
  3058. }




复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:70481 发表于 2014-12-16 17:02 | 只看该作者
接上面:
  1. /*保密导航*/
  2. void passw_func(void)
  3. {
  4.   uchar save,d,key;
  5.   d=0;save=0;
  6.   do
  7.   {
  8.     clear_dis();
  9.     display_cnasc(0x81,2,"保密");
  10.     dis_title();
  11.     display_cnasc(0x88,8,selected[0]);
  12.     con_disp(0xff,0xff,0x8a,0x80,5,16);
  13.     do
  14.     {     
  15.       display_cnasc(0x93,3,secrets_menu[index_p[save].lnum]);
  16.       display_cnasc(0x8b,3,secrets_menu[save]);
  17.       display_cnasc(0x9b,3,secrets_menu[index_p[save].rnum]);  
  18.       d=save;
  19.       while(1)
  20.       {
  21.         key=gotkey();
  22.         if(key==11||key==3){enter_dis();break;}
  23.         if(key==2){save=index_p[d].rnum; key_dis(0x9a);break;}
  24.         if(key==5){save=index_p[d].lnum; key_dis(0x92);break;}
  25.         if(key==1){return;}
  26.       }
  27.       if(key==11||key==3)
  28.       {
  29.         if(d==3) return;        
  30.         clear_dis();
  31.         dis_title_e();
  32.         switch(d)
  33.         {
  34.           case 0:
  35.                   display_cnasc(0x82,3,"密码锁");
  36.                   display_cnasc(0x90,5,"输入密码:");
  37.                   while(1)
  38.                   {
  39.                     key=input_passwork();
  40.                     if(key==10) break;
  41.                     key=passwork_comp();
  42.                     if(key==1)
  43.                     {
  44.                       display_cnasc(0x90,8,"处开启状态,按键");
  45.                       display_cnasc(0x88,8,"□1-常开□2-关闭");
  46.                       display_cnasc(0x98,8,"■自动延时30秒  ");
  47.                       pw_oc=open;
  48.                       save1=i=0;   
  49.                       lock_op=1;   // 开启标记等待延时
  50.                       while(1)
  51.                       {
  52.                         key=gotkey(); // 返回255为延时时间到达
  53.                         if(key==255){ lock_op=0;pw_oc=close;break;}
  54.                         if(key==1)
  55.                         {
  56.                           display_cnasc(0x88,1,"■");
  57.                           display_cnasc(0x98,1,"□");
  58.                           lock_op=0;
  59.                         }
  60.                         if(key==2)
  61.                         {
  62.                           display_cnasc(0x88,1,"□");
  63.                           display_cnasc(0x98,1,"□");
  64.                           display_cnasc(0x8c,1,"■");
  65.                           delay(60000);
  66.                           clear_dis();
  67.                           dis_title_e();
  68.                           display_cnasc(0x82,3,"密码锁");
  69.                           display_cnasc(0x90,5,"密码锁将在");
  70.                           display_cnasc(0x8a,6," 5秒后关闭:");
  71.                           for(save=0;save<5;save++)
  72.                           {
  73.                             display_cnasc(0x99+save,1,"→");
  74.                             delay_pw();
  75.                           }
  76.                           display_cnasc(0x9e,1,"√");
  77.                           pw_oc=open;
  78.                           delay(30000);
  79.                           pw_oc=close;
  80.                           lock_op=0;
  81.                           break;
  82.                         }
  83.                       }
  84.                       break;
  85.                     }
  86.                   }
  87.                   break;
  88.           case 1:
  89.                   display_cnasc(0x82,3,"更  改");
  90.                   display_cnasc(0x90,6,"输入旧密码:");
  91.                   while(1)
  92.                   {
  93.                     key=input_passwork();
  94.                     if(key==10) break;
  95.                     key=passwork_comp();
  96.                     if(key==1)
  97.                     {
  98.                       display_cnasc(0x92,1,"新");
  99.                       display_cnasc(0x89,6,"            ");
  100.                       key=input_passwork();
  101.                       if(key==10) break;
  102.                       display_cnasc(0x90,6,"确认密码:  ");
  103.                       input_second_passwork();
  104.                       break;            
  105.                     }
  106.                   }
  107.                   break;
  108.           case 2:
  109.                   display_cnasc(0x82,3,"初始化");
  110.                   display_cnasc(0x91,6,"是否初始化? ");
  111.                   display_cnasc(0x89,6,"Y(OK)\\N(./S)");
  112.                   while(1)
  113.                   {
  114.                     key=gotkey();
  115.                     if(key==11)
  116.                         {
  117.                       clear_dis();
  118.                       dis_title_e();
  119.                       display_cnasc(0x82,3,"初始化");
  120.                       display_cnasc(0x90,5,"输入密码:");
  121.                       do
  122.                       {
  123.                         key=input_passwork();
  124.                         if(key==10) break;
  125.                         key=passwork_comp();
  126.                         if(key==1)
  127.                         {
  128.                           display_cnasc(0x90,5,"密码正确!");
  129.                           display_cnasc(0x89,7,"\x10 初始化中... ");
  130.                           init_ds1302();
  131.                           rds1302_data();
  132.                           delay_pw();
  133.                           display_cnasc(0x9a,6,"\x10 完成!(OK)");
  134.                           while(gotkey()!=11);
  135.                           key=10;
  136.                           break;
  137.                         }
  138.                       }while(1);
  139.                         }
  140.                     if(key==10) break;
  141.                   }
  142.                   break;
  143.         }
  144.         key=99;save=d;
  145.       }
  146.       if(key==99) break;
  147.     }while(1);
  148.   }while(1);
  149. }


  150. /*=====================================================================================
  151. 函数名称:版本信息
  152. 功能描述:  
  153. 全局变量:
  154. 参数说明:见函数
  155. 返回说明:无
  156. 设 计 人:JZHG
  157. 版    本:1.0
  158. 说    明:
  159. ======================================================================================*/

  160. void version_func(void)
  161. {
  162.   uchar save,v=0;
  163.   display_cnasc(0x82,3,"版  本");
  164.   dis_title_e();
  165.   do
  166.   {
  167.     display_cnasc(0x90,8,version[v]);
  168.     display_cnasc(0x88,8,version[v+1]);
  169.     display_cnasc(0x98,8,version[v+2]);
  170.     if(v!=0) display_cnasc(0x97,1," \x1e");
  171.     else if(v==0)
  172.       display_cnasc(0x97,1,"院");
  173.     else display_cnasc(0x97,1,"  ");
  174.     if(v!=7) display_cnasc(0x9f,1," \x1f");
  175.     else display_cnasc(0x9f,1,"  ");
  176.     save=gotkey();
  177.     if(save==2&&v<7)
  178.     {
  179.       display_cnasc(0x9f,1," \x04");
  180.       delay(30000);
  181.       v++;
  182.     }
  183.     if(save==5&&v>0)
  184.     {
  185.       display_cnasc(0x97,1," \x04");
  186.       delay(30000);
  187.       v--;
  188.     }
  189.     if(save==1) return;
  190.     if((save==11||save==3)&&v==7)
  191.     {
  192.       display_cnasc(0x9e,2,") \x09 ");
  193.       delay(30000);
  194.       return;     
  195.     }
  196.   }while(1);
  197. }



  198. /*=====================================================================================
  199. 函数名称:系统主函数
  200. 功能描述:  
  201. 全局变量:
  202. 参数说明:见函数
  203. 返回说明:无
  204. 设 计 人:JZHG
  205. 版    本:1.0
  206. 说    明:
  207. ======================================================================================*/
  208. void main()
  209. {
  210.   uchar key,ys;                          
  211.   init_lcd();                         // 初始化lcd
  212.   lcd_bl=als_tl=als_th=buzzer=pw_oc=close;
  213.   key=r1302(d02_initsi+1);            // 读出1302初始化标记位
  214.   if(bl1) lcd_bl=close;
  215.   else lcd_bl=open;
  216.   for(ys=8;ys>0;ys--)
  217.   {
  218.       display_cnasc(0x92,4,"志高电子");   // 显示开机画面“志高电子”
  219.       display_cnasc(0x9d,3,"—JZHG");
  220.       delay_pw();
  221.   }
  222.   if(key!=0xb4)  init_ds1302();       // DS1302初始化
  223.   rds1302_data();                     // 开机读回设置数据
  224.   rds1302_date();
  225.   rds1302_time();                     // 读日期时间   
  226.   if(!ds18b20) init_ds18b20();        // 初始化18b20
  227.   if(ds18b20)
  228.   {                                 
  229.     ds18b20_func();                    // 读出温度
  230.   }
  231.   time_init();                         // 定时器初始化
  232.   delay_pw();resu[11]=0;
  233.   while(1)
  234.   {  
  235.     EA=1;
  236.     TR0=1;
  237.     dis_sig=1;  
  238.     clear_dis();
  239.     if(di0){init_d2=1;dis_mode2();init_d2=0;}
  240.     else if(di1) dis_mode3();
  241.     else dis_mode1();   
  242.     do
  243.     {
  244.       key=gotkey();
  245.       if(key==255)          // 键盘密码输入
  246.       {
  247.         TR0=0;
  248.         dis_sig=0;
  249.         clear_dis();
  250.         dis_title_e();
  251.         display_cnasc(0x82,3,"键盘锁");
  252.         display_cnasc(0x90,5,"输入密码:");
  253.         while(1)
  254.         {
  255.           keb=0;
  256.           key=input_passwork();
  257.           if(key==10) {keb=1;resu[11]=2;break;}
  258.           key=passwork_comp();
  259.           if(key==1) {keb=1;resu[11]=0;break;}   
  260.         }
  261.         rds1302_date();
  262.         rds1302_time();
  263.         save_time=now;
  264.         break;
  265.       }
  266.       if(key==11)
  267.       {
  268.         dis_menu_key(1);
  269.         delay(35000);
  270.         do
  271.         {
  272.           dis_sig=0;
  273.           TR0=0;
  274.           clear_dis();
  275.           key=dis_menu();
  276.           clear_dis();
  277.           if(key==0) adjust_func();
  278.           else if(key==1) // 调用相应程序功能S
  279.           {
  280.             while(1)
  281.             {
  282.               clear_dis();
  283.               key=tool_func();
  284.               if(key==4) break;
  285.               clear_dis();
  286.               switch(key)
  287.               {
  288.                 case 0: calculator();
  289.                         break;
  290.                 case 1: temp_func();
  291.                         break;
  292.                 case 2: alarm_func();
  293.                         break;
  294.                 case 3: nba_timer();
  295.                         break;
  296.               }
  297.             }
  298.           }
  299.           else if(key==2)   set_func();
  300.           else if(key==3)   passw_func();
  301.           else if(key==4) version_func();
  302.           else
  303.           {
  304.             rds1302_date();
  305.             rds1302_time();
  306.             save_time=now;
  307.             resu[11]=0;
  308.             dis_sig=1;
  309.             break;
  310.           }
  311.         }while(1);
  312.       }
  313.       if(dis_sig) break;
  314.     }while(1);
  315.   }
  316. }
复制代码
回复

使用道具 举报

板凳
ID:69553 发表于 2014-12-16 17:11 | 只看该作者
支持老师,很少见了
回复

使用道具 举报

地板
ID:69553 发表于 2014-12-16 17:11 | 只看该作者
支持老师,很少见了
回复

使用道具 举报

5#
ID:69553 发表于 2014-12-16 17:11 | 只看该作者
支持
回复

使用道具 举报

6#
ID:69553 发表于 2014-12-16 17:11 | 只看该作者
支持
回复

使用道具 举报

7#
ID:60811 发表于 2014-12-21 10:37 | 只看该作者
支持
回复

使用道具 举报

8#
ID:70075 发表于 2014-12-21 17:34 | 只看该作者
回复

使用道具 举报

9#
ID:70075 发表于 2014-12-21 17:35 | 只看该作者
挺好的
回复

使用道具 举报

10#
ID:70075 发表于 2014-12-21 17:35 | 只看该作者
希望更多资料,嘿嘿
回复

使用道具 举报

11#
ID:72399 发表于 2015-1-17 21:18 | 只看该作者
呵呵很好值得学习
回复

使用道具 举报

12#
ID:72846 发表于 2015-1-28 11:41 | 只看该作者
精致的源代码。感谢
回复

使用道具 举报

13#
ID:72846 发表于 2015-1-28 11:42 | 只看该作者
很喜欢。。。。
回复

使用道具 举报

14#
ID:72565 发表于 2015-2-2 01:28 | 只看该作者

好好看看   拿走了  谢谢楼主
回复

使用道具 举报

15#
ID:75610 发表于 2015-4-21 12:15 | 只看该作者
真是学习的好资料,谢谢分享
回复

使用道具 举报

16#
ID:64540 发表于 2015-5-6 18:35 | 只看该作者
确实是好资料!!要是是仿真图就好了,不知道为什么要用矩形键盘
回复

使用道具 举报

17#
ID:80961 发表于 2015-5-24 14:07 | 只看该作者
nice!!!!
回复

使用道具 举报

18#
ID:54731 发表于 2015-5-24 19:03 | 只看该作者
楼主:你应该把程序写成模块的,这样看会简介明了,你这样写有点乱
回复

使用道具 举报

19#
ID:80741 发表于 2016-1-25 09:23 来自手机 | 只看该作者
顶起,,,
回复

使用道具 举报

20#
ID:108622 发表于 2016-3-28 11:37 | 只看该作者
数码管能用吗
回复

使用道具 举报

21#
ID:86621 发表于 2016-4-18 14:06 | 只看该作者
我要攒
回复

使用道具 举报

22#
ID:128610 发表于 2016-6-29 21:22 | 只看该作者
怎么用不了呢
回复

使用道具 举报

23#
ID:102293 发表于 2016-6-29 22:07 | 只看该作者
真利害,谢谢分享。
回复

使用道具 举报

24#
ID:128625 发表于 2016-6-29 22:17 | 只看该作者
多谢了 谢谢分享
回复

使用道具 举报

25#
ID:10075 发表于 2016-7-11 09:47 | 只看该作者
看看产学习学习
回复

使用道具 举报

26#
ID:88643 发表于 2016-7-14 13:17 来自手机 | 只看该作者
好东西。
回复

使用道具 举报

27#
ID:88643 发表于 2016-7-14 13:18 来自手机 | 只看该作者
好东西。
回复

使用道具 举报

28#
ID:128384 发表于 2016-8-4 16:14 | 只看该作者
厉害,支持
回复

使用道具 举报

29#
ID:148094 发表于 2017-1-6 13:58 | 只看该作者
很好很好
回复

使用道具 举报

30#
ID:156472 发表于 2017-1-29 21:23 来自手机 | 只看该作者
初始密码多少
回复

使用道具 举报

31#
ID:146632 发表于 2017-2-22 16:28 | 只看该作者
谢谢分享。
回复

使用道具 举报

32#
ID:135781 发表于 2017-4-8 18:33 | 只看该作者
从开始到结尾多少行呀,看得好累呢,要是模块化就好了
回复

使用道具 举报

33#
ID:306530 发表于 2018-4-19 08:56 | 只看该作者
很厉害
回复

使用道具 举报

34#
ID:627586 发表于 2019-11-22 10:53 | 只看该作者
我用STC89C516RD+单片机运行此程序,时间和日期不走,设置了也不走,希望支持
回复

使用道具 举报

35#
ID:627586 发表于 2019-11-22 11:00 | 只看该作者
我用STC89C516RD+单片机运行此程序,时间和日期不走,调整保存成功后也不行,希望支持
回复

使用道具 举报

36#
ID:476271 发表于 2019-11-22 11:26 | 只看该作者
学习啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表