找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电子指南针源码GPL833F series 6502 CPU

[复制链接]
跳转到指定楼层
楼主
ID:276976 发表于 2018-1-17 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电子指南针所有资料51hei提供下载:
OW091-C.zip (754.47 KB, 下载次数: 11)

单片机源程序如下:
  1. /* ======================================================================= */
  2. /*    File Name   : main.c                                                 */
  3. /*    Description : main function for user program                         */
  4. /*    Body        : GPL833F series 6502 CPU                               */
  5. /*    Toolchain   : gp65cc Compiler V0.9x                                  */
  6. /*    Date        : 2014/09/09                                             */
  7. /*    Author      :                                                        */
  8. /*    Version     : 1.0.0                                                  */
  9. /* ======================================================================= */
  10. #include "GPL833F.h"
  11. #include"main.h"
  12. #include <math.h>
  13. #define shift_cant 16
  14. //void heat_index(void)__banked;
  15. void weath_read(void);
  16. void read_temp_hum_1(void);
  17. void read_temp_hum_2(void);

  18. void ow61_init(void)__banked;
  19. void clrr_dis_ram(void);
  20. void read_comp_data(void)__banked;
  21. void disp()__banked;
  22. void key_fun(void)__banked;
  23. void disp_time()__banked;
  24. void disp_temp()__banked;
  25. void press_unit()__banked;
  26. void disp_press()__banked;
  27. void disp_anlg()__banked;
  28. void disp_weath()__banked;
  29. void rfc_start()__banked;
  30. void dark_pres_unit()__banked;
  31. void dark_spend_unit()__banked;
  32. void spend_unit(void)__banked;


  33. unsigned char weath_mode=0;
  34. //void compass_calibration(void)__banked;

  35. unsigned char *display_buf;
  36. unsigned char comp_init_flag=0x1f,axis_test_time;
  37. unsigned int angle=0;       
  38. unsigned char cant_10s=0,key_stater=2,time_display_mode=0,pres_disp_mode=0;
  39. unsigned char cant_5s=0,weath_stater=1;
  40. unsigned char inc_8_time=0;
  41. unsigned char key_data=0;
  42. unsigned char press_max_stater=0,press_min_stater=0,press_stater1=0,press_stater2=0;
  43. unsigned char press_send_data,spend_danwei=3,press_danwei;
  44. unsigned long int press_read_data;
  45. unsigned char  canat_60_minute=0;
  46. unsigned char data_buf;
  47. unsigned char press_wait_time;
  48. unsigned long int press_data_buf=101625,press_data=101325;
  49. unsigned long int press_save_data=0;
  50.   float wr0,wr1,wr3,dis_spend=0,dis_spend1=5.6;
  51. int in_temp,in_hum,in_temp_f;
  52. unsigned int spend,spend1;
  53. long int wr4;
  54. unsigned char *pointer1;
  55. unsigned int wr5;
  56. unsigned int wr6;
  57. int high_value,high_value1=0;

  58. int save_shift_high=0;
  59. unsigned char fishing_data;
  60. unsigned char porta_buf;
  61. unsigned char portd_buf;
  62. unsigned char *pointer1;
  63. unsigned char compass_data;
  64. unsigned char flag0=0x10;//bit0半秒标志
  65.                                                  //bit1秒位置是显示周或秒标志
  66.                                                  //bit2表示上电第一次测气压
  67.                                                  //bit3表示温度单位是华氏度还是摄氏度0/1,C/F
  68.                                                  //bit4表示FISHING
  69.                                                  //bit5表示温度测量是否有错误
  70.                                                  //bit6表示测完温度或湿度
  71.                                                  //bit7表示正在测量温湿度
  72. unsigned char flag1=0x10;//bit0 风速测试ON/OFF 1/0
  73.                                                  //bit1 气压测试模式
  74.                                                  //bit2 开启/关闭 1/0指南针模块
  75.                                                  //bit3表示气压错误标志
  76.                                                  //bit4表示正在测气压
  77.                                                  //bit5表示完成方向测量
  78.                                                  //bit6表示测量方向是错误
  79.                                                  //bit7表示时间模式
  80. unsigned char flag2=2;        //bit0-bit4表示天气状态       
  81.                                                         //bit5表示短按
  82.                                                         //bit6表示长按
  83. unsigned char flag3=0xb4;//bit0 temp test done
  84.                                                         //bit1 hum test done
  85.                                                         //bit4 init 开始读指南针数据
  86.                                                         //bit5 time updata       
  87.                                                         //bit6 24/12hour       
  88.                                                         //bit7 rfc start/stop 1/0
  89. unsigned char flag4=0xf8;//bit0 rfc测完等待计算       
  90.                                                 //bit1 检测到按键
  91.                                                 //bit2 温度是用rf还是用sen
  92.                                                 //bit3 刷新时间显示
  93.                                                 //bit4 刷新天气图案显示
  94.                                                 //bit5刷新气压显示
  95.                                                 //bit6 刷新温度显示
  96.                                                 //bit7刷新角度显示
  97. unsigned char flag6=0;//1s标志
  98.                                           //bit1 指南针是否校验标志
  99. unsigned char flag5;//湿度和压力OFFSET
  100. unsigned char cant_30s=0,temp_test_time;       
  101. unsigned char year=17,moth=1,day=1,hour=0,mint=0,second=0,week_data=53;
  102. unsigned char cant_15s;
  103. unsigned int XRaw=0;
  104. unsigned int YRaw=0;
  105. unsigned char cant_3s;
  106. unsigned int Xoffset=0;
  107. unsigned int Yoffset=0;
  108. unsigned int Xsens=0;
  109. unsigned int Ysens=0;

  110. unsigned int X_raw=0,Y_raw=0;   
  111. unsigned int xmax=0,ymax=0,xmin=0,ymin=0;
  112. unsigned long int x_value=0,y_value=0;
  113. unsigned int Angle=0;
  114. unsigned int I2cAngleBuf[2];
  115. unsigned long int xvalue_buf,yvalue_buf;
  116. int dis_pres,disp_pres_num=10120;
  117. unsigned int rfc_ref,rfc_sen1,rfc_sen2;
  118. unsigned char cant_20s=0;
  119. unsigned char spend_on_5s=0;
  120. #define cood_char const unsigned int
  121. const        unsigned char moth_table[12]=
  122. {
  123.         31,28,31,30,31,30,31,31,30,31,30,31
  124. };
  125. void coter_20second();

  126. void time_inc(void)
  127. {
  128.         flag4|=0x08;
  129.         spend_on_5s++;
  130.         if(cant_10s<11)cant_10s++;
  131.         second++;
  132.         cant_30s++;
  133.         if(cant_15s<21)cant_15s++;
  134.         if(cant_5s<6)cant_5s++;
  135.         cant_3s++;
  136.         if(second>59)
  137.                 {
  138.                 second=0;
  139.                 mint++;
  140.                 canat_60_minute++;
  141.                 if(canat_60_minute>59)flag1|=0x10;
  142.                 }
  143.         if(mint>59){hour++;mint=0;}
  144.         if(hour>23){day++;hour=0;}
  145.         if(moth==2)
  146.                 {
  147.                 if(year&0x03)
  148.                         {
  149.                         if(day>28)day=1;
  150.                         }
  151.                 else
  152.                         {
  153.                         if(day>29)day=1;               
  154.                         }
  155.                 }
  156.         else if(day>moth_table[moth-1])
  157.                 {
  158.                 day=1;
  159.                 }
  160.         if(moth>12){year++;moth=1;}
  161.         if(year>99)year=16;
  162. }

  163. void rfc_init()
  164. {
  165.         static unsigned char stater=0,cant_2=0;
  166.         unsigned char d;
  167.         if(!(flag3&0x80))return;
  168.         if(flag4&0x04)return;
  169.         cant_2++;
  170.         if(cant_2<8)return;
  171.         cant_2=0;
  172.         switch(stater)
  173.                 {
  174.                 case 0:
  175.                         stater=1;
  176.                         P_CTS_Ctrl2&=~D_CTSStart;
  177.                         P_CTS_TM0Cnt_LB=0x00;
  178.                         P_CTS_TM0Cnt_HB=0x00;
  179.                         P_IO_RFC_Ctrl=0;
  180.                         P_IO_RFC_Ctrl=D_REF2En;
  181.                         rfc_ref=P_CTS_TM0Cnt_HB<<8;
  182.                         rfc_ref+=P_CTS_TM0Cnt_LB;
  183.                         P_CTS_Ctrl2|=D_CTSStart;
  184.                         break;
  185.                 case 1:
  186.                         P_CTS_Ctrl2&=~D_CTSStart;
  187.                         rfc_ref=P_CTS_TM0Cnt_HB<<8;
  188.                         rfc_ref+=P_CTS_TM0Cnt_LB;
  189.                         P_IO_RFC_Ctrl=0;
  190.                         P_IO_RFC_Ctrl=D_SEN2AEn;
  191.                         P_CTS_TM0Cnt_LB=0x00;
  192.                         P_CTS_TM0Cnt_HB=0x00;
  193.                         P_CTS_Ctrl2|=D_CTSStart;
  194.                         stater=2;
  195.                         break;
  196.                 case 2:
  197.                         P_CTS_Ctrl2&=~D_CTSStart;
  198.                         rfc_sen2=P_CTS_TM0Cnt_HB<<8;
  199.                         rfc_sen2+=P_CTS_TM0Cnt_LB;
  200.                         P_IO_RFC_Ctrl=0;
  201.                         P_IO_RFC_Ctrl=D_SEN2BEn;
  202.                         P_CTS_TM0Cnt_LB=0x00;
  203.                         P_CTS_TM0Cnt_HB=0x00;
  204.                         P_CTS_Ctrl2|=D_CTSStart;
  205.                         stater=3;
  206.                         break;
  207.                 case 3:
  208.                         P_CTS_Ctrl2&=~D_CTSStart;
  209.                         rfc_sen1=P_CTS_TM0Cnt_HB<<8;
  210.                         rfc_sen1+=P_CTS_TM0Cnt_LB;
  211.                         P_IO_Ctrl2&=~D_RFC2En;
  212.                         P_CTS_Ctrl2&=~D_CTSEn;
  213.                         P_IO_RFC_Ctrl=0;
  214.                         P_CTS_TM0Cnt_LB=0x00;
  215.                         P_CTS_TM0Cnt_HB=0x00;

  216.                         P_IO_PortB_Dir|=~0xf0;
  217.                         P_IO_PortB_Attrib&=~0x0f;
  218.                         P_IO_PortB_Data|=~0xf0;
  219.                         P_IO_PortB_Buffer&=0xf0;
  220.                         flag3&=0x7f;
  221.                         flag4|=0x01;
  222.                         stater=0;
  223.                         break;

  224.                 }
  225. }

  226. void scan_key(void)
  227. {
  228.         static unsigned char stater=0,old_key;
  229.         unsigned char i;
  230.         i=P_IO_PortA_Data&0xf0;
  231.         switch(stater)
  232.                 {
  233.                 case 0:       
  234.                         if(i!=0xf0)
  235.                                 {
  236.                                 if(i!=old_key)//等待安检稳定,可以检测组合键。
  237.                                         {
  238.                                         inc_8_time=0;
  239.                                         old_key=i;
  240.                                         }
  241.                                 else inc_8_time++;
  242.                                 }
  243.                         else
  244.                                 {
  245.                                 old_key=0;
  246.                                 inc_8_time=0;
  247.                                 }
  248.                         if(inc_8_time>13){stater=1;key_data=i;}//按键稳定了
  249.                         break;
  250.                 case 1:
  251.                                 if(i==0xf0)stater=2;
  252.                                 else
  253.                                         {
  254.                                         inc_8_time++;
  255.                                         }
  256.                                 if(inc_8_time>=0xfe)
  257.                                         {
  258.                                         stater=3;
  259.                                         flag2|=0x40;
  260.                                         cant_5s=0;
  261.                                         }
  262.                         break;
  263.                 case 2:
  264.                         if(i==0xf0)
  265.                                 {
  266.                                 flag2|=0x20;
  267.                                 stater=0;
  268.                                 inc_8_time=0;
  269.                                 P_INT_KEY_Clear=0xff;
  270.                                 P_INT_Ctrl2|=D_KeyIntEn;
  271.                                 flag4&=0xfd;
  272.                                 }
  273.                         else stater=1;
  274.                         break;
  275.                 case 3:
  276.                         if(i==0xf0)stater=4;
  277.                         else inc_8_time++;
  278.                         break;
  279.                 case 4:
  280.                         if(i==0xf0)
  281.                                 {
  282.                                 P_INT_KEY_Clear=0xff;
  283.                                 P_INT_Ctrl2|=D_KeyIntEn;
  284.                                 flag4&=0xfd;
  285.                                 flag2&=0xbf;
  286.                                 inc_8_time=0;
  287.                                 stater=0;
  288.                                 }
  289.                         else stater=3;
  290.                         break;
  291.                 }
  292. }

  293. int main(void)
  294. {
  295.         display_buf=&p1;
  296.         ow61_init();
  297.          clrr_dis_ram();
  298.          rfc_start();
  299.          while(second<3);
  300.          second=0;
  301.          dark_pres_unit();
  302.          dark_spend_unit();
  303.          *(display_buf+4+6)&=0xfb;//p1
  304.          *(display_buf+4)&=0x7f;//data
  305.          if(key_data==0x90)flag1|=0x02;
  306.          flag2&=0x9f;
  307.         while(1)
  308.                 {
  309.                 weath_read();
  310.                 read_temp_hum_1();
  311.                 read_temp_hum_2();
  312.                 read_comp_data();
  313.                 key_fun();
  314.                 coter_20second();
  315.                 disp_time();
  316.                 disp_temp();
  317.                 disp_press();
  318.                 disp_anlg();
  319.                 disp_weath();
  320.                 if(flag6&0x01)
  321.                         {
  322.                         spend_unit();flag5=flag5&0xfe;
  323.                         }
  324.                 if(!(flag3&0x80)&&!(flag4&0x02)&&!(comp_init_flag&0x10))
  325.                         P_TIMER_TimeBase_Ctrl2&=~D_128HzEn;
  326.                 if(!(flag3&0x80))
  327.                         {
  328.                         P_CLK_PLL_Ctrl&=0xcf;
  329.                         P_SLP_Ctrl=0xa5;
  330.                         P_CLK_PLL_Ctrl|=0x30;
  331.                         }
  332.                 else P_CLK_PLL_Ctrl|=0x30;
  333.                 //rfc_start();
  334.                 }
  335. }

  336. #pragma        codesec                ROM_keyscan_NBank0
  337. void coter_20second()
  338. {
  339.         if((cant_20s==40)&&((key_stater==1)||(key_stater==2)))
  340.                 {
  341.                 spend_danwei=0;
  342.                 key_stater=0;
  343.                 time_display_mode=0;
  344.                 flag4|=0xf8;
  345.                 time_display_mode=0;
  346.                 pres_disp_mode=0;
  347.                 press_unit();
  348.                 dark_spend_unit();
  349.                 }
  350.         if(cant_10s==10)
  351.                 {
  352.                 P_IO_PortD_Data=P_IO_PortD_Buffer&0xf7;
  353.                 }
  354.         if(cant_30s>33)
  355.                 {
  356.                 cant_30s=0;
  357.                 rfc_start();
  358.                 }
  359.         if((flag1&0x02)&&(cant_3s>3))
  360.                 {
  361.                 flag1|=0x10;
  362.                 cant_3s=0;
  363.                 }
  364.        
  365. }

  366. const unsigned char dis_data_tabl1[]=
  367. {
  368.                          0X3F,//0
  369.                          0X06,// 1
  370.                          0X5B,// 2
  371.                          0X4F,// 3
  372.                          0X66,// 4
  373.                          0X6D,//5
  374.                          0X7D,//6
  375.                          0X07,//7
  376.                          0X7F,//8
  377.                          0X6F,//9
  378.                          0X00,//DARK 10
  379.                          0x40,//- 11
  380.                          0x76,//H 12
  381.                          0x50,//r 13
  382.                          0x6e,//y 14
  383.                          0X79,//E 15
  384.                          0X36,//W 16
  385.                          0X09,//S 17
  386.                          0X36,//N 18
  387.                          0x39,//c 19
  388.                          0x71,//F 20
  389.                          0x63,//o 21
  390.                          0x37,//n 22
  391.                          0x38,//L 23
  392.                          
  393. };
  394. const unsigned char dis_data_tabl2[]=
  395. {
  396.                          0X00,//0
  397.                          0X00,// 1
  398.                          0X01,// 2
  399.                          0X01,// 3
  400.                          0X01,// 4
  401.                          0X01,//5
  402.                          0X01,//6
  403.                          0X00,//7
  404.                          0X01,//8
  405.                          0X01,//9
  406.                          0X00,//DARK
  407.                          0x01,//-
  408.                          0x01,//H
  409.                          0x01,//r
  410.                          0x01,//y
  411.                          0x00,//E
  412.                          0x0c,//w
  413.                          0x06,//s
  414.                          0x06,//N
  415. };
  416. const unsigned char weath_buf[]=
  417. {
  418.         0x02,0x04,0x08,0x01
  419. };

  420. cood_char di_1ge_8[]=
  421. {
  422.         0x4000+1,
  423.         0x4006+1,
  424.         0x400c+1,
  425.         0x8012+1,
  426.         0x010c,
  427.         0x8000+1,//dark
  428.         0x800c+1
  429. };
  430. cood_char di_2ge_8[]=
  431. {
  432.         0x0100+4,//a
  433.         0x0200+4,//b
  434.         0x020c+4,//c
  435.         0x0112+4,//d
  436.         0x010c+4,//e
  437.         0x0106+4,//f
  438.         0x0206+4//g
  439. };
  440. cood_char di_3ge_8[]=
  441. {
  442.         0x0800+4,//a
  443.         0x1000+4,//b
  444.         0x100c+4,//c
  445.         0x0812+4,//d
  446.         0x080c+4,//e
  447.         0x0806+4,//f
  448.         0x1006+4//g
  449. };
  450. cood_char di_4ge_8[]=
  451. {
  452.         0x2000+4,//a
  453.         0x4000+4,//b
  454.         0x400c+4,//c
  455.         0x2012+4,//d
  456.         0x200c+4,//e
  457.         0x2006+4,//f
  458.         0x4006+4//g
  459. };

  460. cood_char di_5ge_8[]=
  461. {
  462.         0x0200+3,//a
  463.         0x0206+3,//b
  464.         0x0212+3,//c
  465.         0x010c+3,//d
  466.         0x0106+3,//e
  467.         0x0100+3,//f
  468.         0x020c+3//g
  469. };
  470. cood_char di_6ge_8[]=
  471. {
  472.         0x0400+3,//a
  473.         0x0800+3,//b
  474.         0x080c+3,//c
  475.         0x0412+3,//d
  476.         0x040c+3,//e
  477.         0x0406+3,//f
  478.         0x0806+3//g
  479. };
  480. cood_char di_7ge_8[]=
  481. {
  482.         0x4012+1,//a
  483.         0x0118+4,//b
  484.         0x011e+4,//c
  485.         0x401e+1,//d
  486.         0x801E+1,//e
  487.         0x8018+1,//f
  488.         0x4018+1//g
  489. };
  490. cood_char di_8ge_8[]=
  491. {
  492.         0x040c+4,//a
  493.         0x0412+4,//b
  494.         0x0418+4,//c
  495.         0x041e+4,//d
  496.         0x021e+4,//e
  497.         0x0212+4,//f
  498.         0x0218+4//g
  499. };
  500. cood_char di_9ge_8[]=
  501. {
  502.         0x1012+4,//a
  503.         0x2018+4,//b
  504.         0x201e+4,//c
  505.         0x101e+4,//d
  506.         0x081E+4,//e
  507.         0x0818+4,//f
  508.         0x1018+4//g
  509. };
  510. cood_char di_10ge_8[]=
  511. {
  512.         0x800c+4,//a
  513.         0x0112+3,//b
  514.         0x011e+3,//c
  515.         0x801e+4,//d
  516.         0x8018+4,//e
  517.         0x8012+4,//f
  518.         0x0118+3//g
  519. };
  520. cood_char di_11ge_8[]=
  521. {
  522.         0x0418+3,//a
  523.         0x0812+3,//b
  524.         0x081e+3,//c
  525.         0x021e+3,//d
  526.         0x0218+3,//e
  527.         0x041e+3,//f
  528.         0x0818+3//g
  529. };
  530. cood_char di_15ge_8[]=
  531. {
  532.         0x081e+2,//a
  533.         0x0418+2,//b
  534.         0x0412+2,//c
  535.         0x0812+2,//d
  536.         0x1012+2,//e
  537.         0x1018+2,//f
  538.         0x0818+2//g
  539. };
  540. cood_char di_16ge_8[]=
  541. {
  542.         0x021e+2,//a
  543.         0x011e+2,//b
  544.         0x0112+2,//c
  545.         0x020c+2,//d
  546.         0x0212+2,//e
  547.         0x0218+2,//f
  548.         0x0118+2//g
  549. };
  550. cood_char di_17ge_8[]=
  551. {
  552.         0x801e+3,//a
  553.         0x4018+3,//b
  554.         0x400c+3,//c
  555.         0x800c+3,//d
  556.         0x8012+3,//e
  557.         0x8018+3,//f
  558.         0x4012+3//g
  559. };
  560. cood_char di_18ge_8[]=
  561. {
  562.         0x100c+1,//a
  563.         0x0806+1,//b
  564.         0x0800+1,//c
  565.         0x1000+1,//d
  566.         0x2000+1,//e
  567.         0x2006+1,//f
  568.         0x1006+1//g
  569. };
  570. cood_char di_19ge_8[]=
  571. {
  572.         0x020c+1,//a
  573.         0x0106+1,//b
  574.         0x0100+1,//c
  575.         0x0200+1,//d
  576.         0x0400+1,//e
  577.         0x0406+1,//f
  578.         0x0206+1//g
  579. };
  580. cood_char di_20ge_8[]=
  581. {
  582.         0x400c+2,//a
  583.         0x2006+2,//b
  584.         0x2000+2,//c
  585.         0x4000+2,//d
  586.         0x8000+2,//e
  587.         0x8006+2,//f
  588.         0x4006+2//g
  589. };
  590. cood_char di_21ge_8[]=
  591. {
  592.         0x080c+2,//a
  593.         0x040c+2,//b
  594.         0x0406+2,//c
  595.         0x0800+2,//d
  596.         0x1006+2,//e
  597.         0x100c+2,//f
  598.         0x0806+2//g
  599. };
  600. cood_char di_22ge_8[]=
  601. {
  602.         0x010c+2,//a
  603.         0x8006+3,//b
  604.         0x8000+3,//c
  605.         0x0100+2,//d
  606.         0x0200+2,//e
  607.         0x0206+2,//f
  608.         0x0106+2//g
  609. };
  610. cood_char di_12ge_8_1[]=
  611. {
  612.         0x201e+1,//a
  613.         0x081e+1,//b
  614.         0x080c+1,//c
  615.         0x200c+1,//d
  616.         0x2012+1,//e
  617.         0x2018+1,//f
  618.         0x1018+1//g
  619. };
  620. cood_char di_12ge_8_2[]=
  621. {
  622.         0x0818+1,//H
  623.         0x101e+1,//I
  624.         0x0812+1,//L
  625.         0x1012+1,//N
  626.         0x8000+1,//dark
  627.         0x8000+1,//dark
  628.         0x8000+1,//dark
  629. };
  630. cood_char di_14ge_8_1[]=
  631. {
  632.         0x801e+2,//a
  633.         0x201e+2,//b
  634.         0x200c+2,//c
  635.         0x800c+2,//d
  636.         0x8012+2,//e
  637.         0x8018+2,//f
  638.         0x4018+2//g
  639. };
  640. cood_char di_14ge_8_2[]=
  641. {
  642.         0x2018+2,//H
  643.         0x401e+2,//I
  644.         0x2012+2,//L
  645.         0x4012+2,//N
  646.         0x8000+1,//dark
  647.         0x8000+1,//dark
  648.         0x8000+1,//dark
  649. };
  650. cood_char di_13ge_8_1[]=
  651. {
  652.         0x041e+1,//a
  653.         0x011e+1,//b
  654.         0x010c+1,//c
  655.         0x040c+1,//d
  656.         0x0412+1,//e
  657.         0x0418+1,//f
  658.         0x0218+1//g
  659. };
  660. cood_char di_13ge_8_2[]=
  661. {
  662.         0x0118+1,//H
  663.         0x021e+1,//I
  664.         0x0112+1,//L
  665.         0x0212+1,//N
  666.         0x8000+1,//dark
  667.         0x8000+1,//dark
  668.         0x8000+1,//dark
  669. };
  670. #if 1
  671. const float temp_table[]=
  672. {
  673.         262.70        ,
  674.         249.21        ,
  675.         238.49        ,
  676.         224.49        ,
  677.         213.16        ,
  678.         202.46        ,
  679.         192.36        ,
  680.         182.82        ,
  681.         173.80        ,
  682.         165.28        ,
  683.         157.22        ,
  684.         149.59        ,
  685.         142.37        ,
  686.         135.55        ,
  687.         129.08        ,
  688.         122.96        ,
  689.         117.16        ,
  690.         111.66        ,
  691.         108.45        ,
  692.         101.51        ,
  693.         96.83        ,
  694.         92.38        ,
  695.         88.18        ,
  696.         84.16        ,
  697.         80.36        ,
  698.         76.75        ,
  699.         73.32        ,
  700.         70.06        ,
  701.         66.96        ,
  702.         64.02        ,
  703.         61.22        ,
  704.         58.55        ,
  705.         56.02        ,
  706.         53.60        ,
  707.         51.31        ,
  708.         49.12        ,
  709.         47.04        ,
  710.         45.05        ,
  711.         43.16        ,
  712.         41.36        ,
  713.         39.64        ,
  714.         38.00        ,
  715.         36.44        ,
  716.         34.95        ,
  717.         33.52        ,
  718.         32.16        ,
  719.         30.87        ,
  720.         29.63        ,
  721.         28.44        ,
  722.         27.31        ,
  723.         26.23        ,
  724.         25.20        ,
  725.         24.21        ,
  726.         23.27        ,
  727.         22.27        ,
  728.         21.50        ,
  729.         20.68        ,
  730.         19.89        ,
  731.         19.13        ,
  732.         18.40        ,
  733.         17.71        ,//60
  734.         /*
  735.         8.22        ,
  736.         7.94        ,
  737.         7.67        ,
  738.         7.41        ,
  739.         7.16        ,
  740.         6.9513        ,
  741.         6.6837        ,
  742.         6.4068        ,
  743.         6.2483        ,
  744.         6.0397        ,
  745.         5.8407        ,
  746.         5.6492        ,
  747.         5.4646        ,
  748.         5.2888        ,
  749.         5.1155        ,
  750.         4.9504        ,
  751.         4.7913        ,
  752.         4.6379        ,
  753.         4.49        ,
  754.         4.3474        ,
  755.         4.2099        ,
  756.         4.0772        ,
  757.         3.9493        ,
  758.         3.8259        ,
  759.         3.7088        ,
  760.         3.5917        ,
  761.         3.4087        ,
  762.         3.3735        ,
  763.         3.2701        ,
  764.         */
  765. };
  766. #endif
  767. const float hum_table[]=
  768. {
  769.         4460.0,
  770.         1945.0,
  771.         895.8,
  772.         434.3,
  773.         221.1,
  774.         117.9,
  775.         65.63,
  776.         38.09,
  777.         23.00,
  778.         14.42,
  779.         9.363,
  780.         6.291,
  781.         4.366,
  782.         3.125,
  783.         2.303,
  784.         1.746
  785. };



  786. #if 1
  787. const unsigned char cAtanStep[19]=
  788. {
  789. 0x11,0x12,0x13,0x14,0x15,
  790. 0x16,0x17,0x18,0x19,0x1a,
  791. 0x1b,0x1c,0x1d,0x1e,0x1f,
  792. 0x20,0x21,0x22,0x23
  793. };

  794. const unsigned int iAtanPoint[19]=
  795. {

  796. 0x020C,0x0998,0x0d60,0x1057,0x12cd,
  797. 0x1508,0x1702,0x18ca,0x1a8c,0x1c2c,
  798. 0x1da6,0x1f12,0x206e,0x21b8,0x2258,
  799. 0x244d,0x2576,0x26a8,0x2710
  800. };

  801. const unsigned int iAtanAngle[19]=
  802. {
  803. 0x001e,0x008a,0x00bd,0x00e3,0x0101,
  804. 0x011b,0x0131,0x0144,0x0156,0x0166,
  805. 0x0174,0x0181,0x018d,0x0198,0x01a3,
  806. 0x01ad,0x01b6,0x01bf,0x01c2
  807. };

  808. #endif
  809. #if 1
  810. const unsigned int angle_buf[]=
  811. {
  812.         0x0057,0x00b0,0x010b,0x016b,0x01d2,0x0241,0x02bc,0x0347,0x03e7       
  813. };
  814. #endif
  815. void ow61_init(void)
  816. {
  817.         P_CLK_PLL_Ctrl=0x30;
  818.         P_IO_Ctrl1=D_ExtI2En;
  819.         P_IO_Ctrl2=0;
  820.         P_IO_RFC_Ctrl=0;
  821.         P_IO_LCDPORT_Ctrl=0x37;
  822.        
  823.         P_IO_PortA_Dir=0x0d;
  824.         P_IO_PortA_Attrib=0x02;//PA1为输入做外部中断口
  825.         P_IO_PortA_Data=0xf1;
  826.        
  827.         P_IO_PortB_Dir=0xff;
  828.         P_IO_PortB_Attrib=0x10;
  829.         P_IO_PortB_Data=0xff;
  830.         P_IO_PortD_Dir=0xc8;
  831.         P_IO_PortD_Attrib=0x20;
  832.         P_IO_PortD_Data=0xe8;
  833.         if(P_IO_PortD_Data&0x10)
  834.                 {
  835.                 flag4|=0x04;
  836.                 P_IO_PortD_Data|=0x10;
  837.                 }
  838.         else flag4&=~0x04;
  839.                

  840.        
  841.         P_IO_PortE_Dir=0x00;
  842.         P_IO_PortE_Attrib=0x00;
  843.         P_IO_PortE_Data=0x00;
  844.         flag5=P_IO_PortE_Data;
  845.         P_IO_PortE_Data=flag5;
  846.         //;==========================
  847.        
  848.         //=======================
  849.         P_LCD_BIAS_Ctrl=D_LCDBias3;
  850.         P_LCD_VLCD_Ctrl=0x0f;//1.5v
  851.         //P_LCD_VLCD_Ctrl=0x0e;//1.467v
  852.         //P_LCD_VLCD_Ctrl=0x0d;//1.433v
  853.         //P_LCD_VLCD_Ctrl=0x0c;//1.4v
  854.         //P_LCD_VLCD_Ctrl=0x0b;//1.367v
  855.         //P_LCD_VLCD_Ctrl=0x0a;//1.333v
  856.         P_LCD_PUMP_Ctrl=D_PumpEn+D_PumpClk4K;
  857.         P_LCD_Ctrl2=D_LCDAllOn;
  858.         P_LCD_Clock=0x19;
  859.         P_LCD_COM_Num=5;
  860.         P_LCD_SEG_Num=5;
  861.         P_IO_LCDPORT_Ctrl=D_ShiftSeg24+D_PEEn+D_PCEn+D_PDEn;
  862.         P_LCD_StartAddr_LB=0;
  863.         P_LCD_Ctrl1=D_LCDEn+D_DisplayOn;

  864.         P_IO_KeyChange_Ctrl1=0xf0;
  865.         //====================
  866.         //P_LCD_Ctrl2=0x20;all off
  867.         //P_LCD_Ctrl2=0x40;all on
  868.         P_LCD_Ctrl2=0x00;
  869.         //======================
  870.         //中断初始化
  871.         disable_interrupt();//禁止中断
  872.         P_INT_TBL_Clear=0;
  873.         P_INT_TBH_Clear=0;
  874.         P_INT_TM0_Clear=0;
  875.        
  876.         P_TIMER_TimeBase_Status=D_2Hz_Flag;//清除溢出标志
  877.         P_TIMER_TimeBase_Ctrl2=D_2HzEn+D_128HzEn;//使能2HZ中断
  878.         P_TIMER_TimeBase_Ctrl1=D_TBRST;
  879.         P_TIMER_TimeBase_Ctrl1=D_TBRUN;
  880.         P_INT_Ctrl2=D_TBLIntEn+D_TBHIntEn+D_KeyIntEn;//+D_CtsTM0IntEn;
  881.         P_INT_Ctrl1=D_TM0IntEn;
  882.         P_TIMER_Timer_Ctrl=D_TM1Clk32K;
  883.         /*
  884.         P_TIMER_EN=0;
  885.         P_TIMER_TM1Data_LB=(65536-4)%256;
  886.         P_TIMER_TM1Data_HB=(65536-4)/256;//4kHz
  887.         P_AUDIO_BZ_Ctrl=0x05;
  888.         P_TIMER_EN=D_TM1En;
  889.         */
  890.         //P_TIMER_TM1CntData_LB=(65536-8)%256;
  891.         //P_TIMER_TM1CntData_HB=(65536-8)/256;
  892.         P_CTS_Timer_Ctrl=D_CtsTM0ClkRFC2;
  893. //        P_TIMER_TM0Data_LB=(65536-2)%256;
  894. //        P_TIMER_TM0Data_HB=(65536-2)%256;
  895. //        P_TIMER_TM0CntData_LB=(65536-2)%256;
  896. //        P_TIMER_TM0CntData_HB=(65536-2)%256;
  897.         P_INT_KEY_Clear=0xff;
  898.        
  899.         //P_TIMER_EN=D_TM1En;
  900.         //P_AUDIO_BZ_Ctrl=0x85;//bzp tim1 on
  901.         enable_interrupt();//使能中断
  902.        
  903. }
  904. void delay(void)
  905. {
  906.         // unsigned char i;
  907.         //for(i=0;i<20;i++)
  908.                 {
  909.                 nop_instruction();
  910.                 nop_instruction();
  911.                 nop_instruction();
  912.                 }
  913. }


  914. void clr_press_sclk_pb7(void)
  915. {
  916.         P_IO_PortB_Data&=0x7f;
  917. }


  918. void set_press_sclk_pb7(void)
  919. {
  920.         P_IO_PortB_Data|=0x80;
  921. }


  922. void clr_press_sdo_pb6(void)
  923. {
  924.         P_IO_PortB_Data&=0xbf;
  925. }


  926. void set_press_sdo_pb6(void)
  927. {
  928.         P_IO_PortB_Data|=0x40;
  929. }


  930. void sdo_pb6_set_in(void)
  931. {
  932.         P_IO_PortB_Dir&=0xbf;
  933.         P_IO_PortB_Attrib|=0x40;
  934.         P_IO_PortB_Data|=0x40;
  935. }


  936. void sdo_pb6_set_out(void)
  937. {
  938.         P_IO_PortB_Dir|=0x40;
  939.         P_IO_PortB_Data|=0x40;
  940. }
  941. void i2c_press_start(void)
  942. {
  943.         sdo_pb6_set_out();
  944.         delay();
  945.         clr_press_sclk_pb7();
  946.         delay();
  947.         set_press_sdo_pb6();
  948.         delay();
  949.         set_press_sclk_pb7();
  950.         delay();
  951.         clr_press_sdo_pb6();
  952.         delay();
  953.         clr_press_sclk_pb7();
  954.                
  955. }
  956. void i2c_press_stop(void)
  957. {
  958.         sdo_pb6_set_out();
  959.         clr_press_sdo_pb6();
  960.         delay();
  961.         set_press_sclk_pb7();
  962.         delay();
  963.         set_press_sdo_pb6();
  964. }
  965. unsigned char i2c_press_wait_ack(void)
  966. {
  967.          unsigned char wr0;
  968.         sdo_pb6_set_in();
  969.         set_press_sclk_pb7();
  970.         delay();
  971.         wr0=P_IO_PortB_Data;
  972.         clr_press_sclk_pb7();
  973.         delay();
  974.         return wr0;
  975. }
  976. void i2c_press_send_ack(void)
  977. {
  978.         sdo_pb6_set_out();
  979.         delay();
  980.         clr_press_sdo_pb6();
  981.         delay();
  982.         set_press_sclk_pb7();
  983.         delay();
  984.         clr_press_sclk_pb7();
  985.         delay();
  986. }
  987. void i2c_press_no_ack(void)
  988. {
  989.         sdo_pb6_set_out();
  990.         delay();
  991.         set_press_sdo_pb6();
  992.         delay();
  993.         set_press_sclk_pb7();
  994.         delay();
  995.         clr_press_sclk_pb7();
  996.         delay();
  997. }
  998. void i2c_press_send_8bit( unsigned char data1)
  999. {
  1000.          unsigned data_buf,i;
  1001.         data_buf=data1;
  1002.         sdo_pb6_set_out();
  1003.         for(i=0;i<8;i++)
  1004.                 {
  1005.                 if(data_buf&0x80)set_press_sdo_pb6();
  1006.                 else clr_press_sdo_pb6();
  1007.                 set_press_sclk_pb7();
  1008.                 delay();
  1009.                 clr_press_sclk_pb7();
  1010.                 delay();
  1011.                 data_buf<<=1;
  1012.                 }
  1013. }
  1014. void i2c_press_read_8bit(void)
  1015. {
  1016.          unsigned char i;
  1017.         sdo_pb6_set_in();
  1018.         for(i=0;i<8;i++)
  1019.                 {
  1020.                         press_data_buf<<=1;
  1021.                         set_press_sclk_pb7();
  1022.                         delay();
  1023.                         if(P_IO_PortB_Buffer&0x40)press_data_buf=press_data_buf|0x00000001;
  1024.                         else press_data_buf=press_data_buf&0xfffffffe;
  1025.                         clr_press_sclk_pb7();
  1026.                         delay();       
  1027.                 }
  1028. }
  1029. #if 0
  1030. void weath(void)
  1031. {
  1032.          unsigned char buf1;
  1033.         pointer1=&wr4;
  1034.         wr4=press_save_data-press_data_buf;
  1035.         buf1=*(pointer1+3);
  1036.         if(buf1&0x80)wr4=~wr4;//取最高8位
  1037.         wr4+=1;
  1038.         if(!weath_stater)//判断是否是晴天
  1039.                 {
  1040.                 if(buf1&0x80)press_save_data=press_data_buf;
  1041.                 else
  1042.                         {
  1043.                         if((wr4>300)&&(wr0<600))flag2=0x04;//阴天
  1044.                         else if(wr4>=600){flag2=0x08;press_save_data=press_data_buf;}//小雨
  1045.                         }
  1046.                 }
  1047.         else
  1048.                 {
  1049.                 if(buf1&0x80)//判断气压是增还是减
  1050.                         {
  1051.                         if((wr4>200)&&(wr0<500))flag2=0x02;//半晴天
  1052.                         else if(wr4>=500)flag2=0x01;//晴天
  1053.                         }
  1054.                 else
  1055.                         {
  1056.                         if(flag2&0x10);//press_save_data=press_data_buf;
  1057.                         else if(flag2&0x08)
  1058.                                 {
  1059.                                         if(wr4>=200)flag2=0x10;//大雨
  1060.                                 }
  1061.                         else {if(wr4>100)flag2=0x08;}//小雨
  1062.                         press_save_data=press_data_buf;
  1063.                         }
  1064.                 }
  1065. }
  1066. #endif
  1067. void weath(void)
  1068. {
  1069.        
  1070.         if(flag0&0x4)
  1071.         {
  1072.         if(canat_60_minute<60)return;
  1073.         flag4|=0x10;
  1074.         canat_60_minute=0;
  1075.         wr4=press_save_data-press_data_buf;
  1076.         switch(weath_stater)
  1077.                 {
  1078.                 case 0:
  1079.                         if(wr4<=0)press_save_data=press_data_buf;
  1080.                         else if(wr4>=60)
  1081.                                 {
  1082.                                 press_save_data=press_data_buf;
  1083.                                 weath_stater=3;
  1084.                                 }
  1085.                         else if(wr4>=30)
  1086.                                 {
  1087.                                 weath_stater=2;
  1088.                                 }
  1089.                         break;
  1090.                 case 1:
  1091.                         if(wr4<=-50)
  1092.                                 {
  1093.                                 press_save_data=press_data_buf;
  1094.                                 weath_stater=0;
  1095.                                 }
  1096.                         else if(wr4>=10)
  1097.                                 {
  1098.                                 press_save_data=press_data_buf;
  1099.                                 weath_stater=3;       
  1100.                                 }
  1101.                         break;
  1102.                 case 2:
  1103.                         if(wr4<=-50)
  1104.                                 {
  1105.                                 press_save_data=press_data_buf;
  1106.                                 weath_stater=0;
  1107.                                 }
  1108.                         else if(wr4<=-20)weath_stater=1;
  1109.                         else if(wr4>=10)
  1110.                                 {
  1111.                                 press_save_data=press_data_buf;
  1112.                                 weath_stater=3;       
  1113.                                 }
  1114.                         break;
  1115.                 case 3:
  1116.                         if(wr4<=-50)
  1117.                                 {
  1118.                                 press_save_data=press_data_buf;
  1119.                                 weath_stater=0;
  1120.                                 }
  1121.                         else if(wr4<=-20)weath_stater=1;
  1122.                         else if(wr4>0)press_save_data=press_data_buf;
  1123.                         break;
  1124.                 }
  1125.         }
  1126.         else
  1127.                 {
  1128.                         press_save_data=press_data_buf-30;
  1129.                         flag0|=0x4;
  1130.                 }
  1131. }

  1132. void weath_read(void)
  1133. {
  1134.         unsigned char wr0;
  1135.         if(!(flag1&0x10))return;
  1136.                 i2c_press_start();
  1137.                 i2c_press_send_8bit(0xd8);
  1138.                 wr0=i2c_press_wait_ack();       
  1139.                 if(wr0&0x40){i2c_press_stop();return;}
  1140.                 i2c_press_send_8bit(0x30);
  1141.                 wr0=i2c_press_wait_ack();       
  1142.                 if(wr0&0x40){i2c_press_stop();return;}
  1143.                 i2c_press_send_8bit(0x0a);
  1144.                 wr0=i2c_press_wait_ack();       
  1145.                 if(wr0&0x40){i2c_press_stop();return;}
  1146.                 i2c_press_stop();
  1147.                
  1148.                 i2c_press_start();
  1149.                 i2c_press_send_8bit(0xd8);
  1150.                 wr0=i2c_press_wait_ack();       
  1151.                 if(wr0&0x40){i2c_press_stop();return;}
  1152.                 i2c_press_send_8bit(0x06);
  1153.                 wr0=i2c_press_wait_ack();       
  1154.                 if(wr0&0x40){i2c_press_stop();return;}
  1155.                 i2c_press_start();
  1156.                 i2c_press_send_8bit(0xd9);
  1157.                 wr0=i2c_press_wait_ack();       
  1158.                 if(wr0&0x40){i2c_press_stop();return;}
  1159.                 press_data_buf=0;
  1160.                 //i2c_press_start();
  1161.                 i2c_press_read_8bit();
  1162.                 i2c_press_send_ack();
  1163.                 i2c_press_read_8bit();
  1164.                 i2c_press_send_ack();
  1165.                 i2c_press_read_8bit();
  1166.                 i2c_press_no_ack();
  1167.                 i2c_press_stop();
  1168.                 press_data_buf=press_data_buf>>6;//unit pa
  1169.                 press_data_buf=press_data_buf/100*10;
  1170.                 if(!(flag0&0x4))
  1171.                         {
  1172.                         high_value=10120-press_data_buf;
  1173.                         }
  1174.                 //wr1=powf((float)press_data_buf/(float)press_data,0.190263);
  1175.                 //wr1=1-wr1;
  1176.                 //wr1=wr1*44330.77;
  1177.                 //high_value=wr1;
  1178.                 //high_value+=save_shift_high;
  1179.                 //if(high_value>9999)high_value=9999;
  1180.                 //else if(high_value<0)high_value=0;
  1181.                
  1182.                 weath();
  1183.                 press_unit();
  1184.                 flag1&=0xef;
  1185. }
  1186. void clrr_dis_ram(void)
  1187. {
  1188.         unsigned char i;
  1189.         for(i=0;i<0xff;i++)
  1190.                 {
  1191.                 *(display_buf+i)=0x00;
  1192.                 }
  1193.         for(i=0;i<0xff;i++)
  1194.                 {
  1195.                 *(display_buf+i)=0xFF;
  1196.                 }
  1197. }
  1198. #if 1
  1199. void clr_temp_sclk_pd7(void)
  1200. {
  1201.         P_IO_PortD_Data&=0x7f;
  1202. }
  1203. void set_temp_sclk_pd7(void)
  1204. {
  1205.         P_IO_PortD_Data|=0x80;
  1206. }
  1207. void clr_temp_sdo_pd6(void)
  1208. {
  1209.         P_IO_PortD_Data&=0xbf;
  1210. }
  1211. void set_temp_sdo_pd6(void)
  1212. {
  1213.         P_IO_PortD_Data|=0x40;
  1214. }
  1215. void sdo_pd6_set_in(void)
  1216. {
  1217.         P_IO_PortD_Dir&=0xbf;
  1218.         P_IO_PortD_Attrib|=0x40;
  1219.         P_IO_PortD_Data|=0x40;
  1220. }
  1221. void sdo_pd6_set_out(void)
  1222. {
  1223.         P_IO_PortD_Dir|=0x40;
  1224.         P_IO_PortD_Data|=0x40;
  1225. }
  1226. void teamp_start(void)
  1227. {
  1228.         sdo_pd6_set_out();
  1229.         set_temp_sdo_pd6();
  1230.         set_temp_sclk_pd7();
  1231.         delay();
  1232.         clr_temp_sdo_pd6();
  1233.         clr_temp_sclk_pd7();
  1234.         delay();
  1235. }
  1236. void temp_stop(void)
  1237. {
  1238.         sdo_pd6_set_out();
  1239.         clr_temp_sdo_pd6();
  1240.         set_temp_sclk_pd7();
  1241.         delay();
  1242.         set_temp_sdo_pd6();
  1243.         delay();
  1244. }
  1245. void temp_send_ack(void)
  1246. {
  1247.         sdo_pd6_set_out();
  1248.         clr_temp_sdo_pd6();
  1249.         set_temp_sclk_pd7();
  1250.         delay();
  1251.         clr_temp_sclk_pd7();
  1252.         delay();
  1253. }
  1254. void temp_no_ack(void)
  1255. {
  1256.         sdo_pd6_set_out();
  1257.         set_temp_sdo_pd6();
  1258.         set_temp_sclk_pd7();
  1259.         delay();
  1260.         clr_temp_sclk_pd7();
  1261.         delay();
  1262. }
  1263. void temp_send_8bit(unsigned char data)
  1264. {
  1265.         unsigned char i,data_buf=0;
  1266.         sdo_pd6_set_out();
  1267.         data_buf=data;
  1268.         for(i=0;i<8;i++)
  1269.                 {
  1270.                 if(data_buf&0x80)sdo_pd6_set_out();
  1271.                 else clr_temp_sdo_pd6();
  1272.                 data_buf<<=1;
  1273.                 set_temp_sclk_pd7();
  1274.                 delay();
  1275.                 clr_temp_sclk_pd7();
  1276.                 delay();
  1277.                 }
  1278.         sdo_pd6_set_in();
  1279.         set_temp_sclk_pd7();
  1280.         delay();
  1281.         if(P_IO_PortD_Data&0x40)flag0|=0x20;
  1282.         else flag0&=0xdf;
  1283.         clr_temp_sclk_pd7();
  1284. }
  1285. void temp_read(void)
  1286. {
  1287.         unsigned char i;
  1288.         sdo_pd6_set_in();
  1289.         for(i=0;i<8;i++)
  1290.                 {
  1291.                         wr6<<=1;
  1292.                         set_temp_sclk_pd7();
  1293.                         delay();
  1294.                         if(P_IO_PortD_Data&0x40)wr6|=0x0001;
  1295.                         else wr6=wr6&0xfffe;
  1296.                         clr_temp_sclk_pd7();
  1297.                         delay();       
  1298.                 }       
  1299. }
  1300. void read_temp_hum_2(void)
  1301. {
  1302.         static unsigned char stater=0;
  1303.         if(!(flag3&0x80))return;
  1304.         if(!(flag4&0x04))return;
  1305.         switch(stater)
  1306.                 {
  1307.                 case 0:       
  1308.                 teamp_start();
  1309.                 temp_send_8bit(0x80);
  1310.                 temp_send_8bit(0xe5);
  1311.                 temp_test_time=0;
  1312.                 stater++;
  1313.                 break;
  1314.                 case 1:
  1315.                         if(temp_test_time>2)stater++;
  1316.                         break;
  1317.                 case 2:
  1318.                         teamp_start();
  1319.                         temp_send_8bit(0x81);
  1320.                         temp_read();
  1321.                         temp_send_ack();
  1322.                         temp_read();
  1323.                         temp_no_ack();
  1324.                         temp_stop();
  1325.                         if(!(flag0&0x20))
  1326.                                 {
  1327.                                 in_hum=(int)(125.0*wr6/65536.0-6.0);
  1328.                                 stater++;
  1329.                                 }
  1330.                         else stater=0;
  1331.                         break;
  1332.                 case 3:
  1333.                         teamp_start();
  1334.                         temp_send_8bit(0x80);
  1335.                         temp_send_8bit(0xe0);
  1336.                         teamp_start();
  1337.                         temp_send_8bit(0x81);
  1338.                         temp_read();
  1339.                         temp_send_ack();
  1340.                         temp_read();
  1341.                         temp_no_ack();
  1342.                         temp_stop();
  1343.                         if(!(flag0&0x20))
  1344.                                 {
  1345.                                 in_temp=(int)(1757.2*wr6/65536-468.5);
  1346.                                 in_temp_f=(int)(1757.2*wr6/117964.8/*65536*1.8=117964.8*/-843.3/*468.5*1.8=843.3*/+320);
  1347.                                 }
  1348.                         stater=0;
  1349.                         flag3&=0x7f;
  1350.                         flag4|=0x40;
  1351.                         break;
  1352.                 }
  1353. }
  1354. #endif
  1355. unsigned char Rfc_SeekTab(float res,float *tab_addr)
  1356. {
  1357.         unsigned char x,y,z;
  1358.         unsigned long res_m;

  1359.         //初始化"实测电阻值"在表中的范围
  1360.         //起点
  1361.         x=0;
  1362.         //终点
  1363.         z=60;

  1364.         //递归缩小包围圈,找到"实测电阻值"在表中的具体位置
  1365.         while((x+2) <= z)
  1366.         {
  1367.                 //取表格中间的数据
  1368.                 y = (x+z)/2;
  1369.                 res_m = tab_addr[y];

  1370.                 //缩小实测电阻值所在表格的范围
  1371.                 if(res > res_m)
  1372.                 {
  1373.                         z = y;
  1374.                 }
  1375.                 else
  1376.                 {
  1377.                         x = y;
  1378.                 }
  1379.         }

  1380.         return x;
  1381. }
  1382. void cal_temp(unsigned int d1)
  1383. {
  1384.         wr0=rfc_ref;
  1385.         wr0=wr0*50.0/d1;
  1386.         wr0=wr0-50;
  1387.         if(wr0<1000)
  1388.         wr0=wr0*1000.0/(1000.0-wr0);
  1389.         else wr0=4460;
  1390. }

  1391. void read_temp_hum_1(void)
  1392. {
  1393.         unsigned char i;
  1394.         if(!(flag4&0x01))return;
  1395.         cal_temp(rfc_sen1);
  1396.         i=Rfc_SeekTab(wr0,temp_table);
  1397.         if(i==0)wr0=-10;
  1398.         else if(wr0>=temp_table[i])
  1399.                 {
  1400.                 wr0=(temp_table[i-1]-wr0)/(temp_table[i-1]-temp_table[i]);
  1401.                 wr0=(float)i-1+wr0-10.0;
  1402.                 }
  1403.         else
  1404.                 {
  1405.                 wr0=(temp_table[i]-wr0)/(temp_table[i]-temp_table[i+1]);
  1406.                 wr0=(float)i+wr0-10.0;
  1407.                 }
  1408.         wr1=wr0;
  1409.         in_temp=(int)(wr0*10.0);
  1410.         in_temp_f=(wr0*1.8+32)*10.0;
  1411.         cal_temp(rfc_sen2);
  1412.         i=0;
  1413.         for(;;)
  1414.                 {
  1415.                 if(wr0>=hum_table[i])break;
  1416.                 i++;
  1417.                 if(i==15)break;
  1418.                 }
  1419.         if(i==0)in_hum=20;
  1420.         else if(i==15)in_hum=99;
  1421.         else
  1422.                 {
  1423.                 wr0=(wr0-hum_table[i])/(hum_table[i-1]-hum_table[i])*5;
  1424.                 in_hum=(int)(20.0+(float)i*5.0-wr0);
  1425.                 }
  1426.         wr1=(wr1-25)*0.5;
  1427.         in_hum=(int)(in_hum-wr1);
  1428.         flag4&=0xfe;
  1429.         flag4|=0x40;
  1430. }

  1431. #pragma        codesec                ROM_keyscan_NBank1
  1432. #if 0
  1433. void heat_index(void)
  1434. {
  1435.         wr0=in_temp*1.8+32;
  1436.         wr3=-42.379+2.04901523*wr0+10.14333172*in_hum;
  1437.         wr3=wr3-0.22475541*wr0*in_hum;
  1438.         wr3=wr3+0.00122874*wr0*wr0*in_hum;
  1439.         wr3=wr3+0.00085282*in_hum*in_hum*wr0;
  1440.         wr3=wr3-0.00000199*in_hum*in_hum*wr0*wr0;
  1441.         if(in_hum<13)
  1442.                 {
  1443.                 //wr3=wr3-sqrtf((17-fabsf(95-wr0))/17.0)*(13-in_hum)/4.0;       
  1444.                 wr3=wr3-powf((17-fabsf(95-wr0))/17.0,0.5)*(13-in_hum)/4.0;       
  1445.                 }
  1446.         else if(((in_hum>85)&&(80<wr0<87)))
  1447.                 {
  1448.                 wr3=wr3+(in_hum-85)/10.0*(87-wr0);
  1449.                 }
  1450.         heat_buf=wr3;
  1451.         wr3=35.74+0.6215*wr0-35.75*powf(spend,0.16) + 0.4275*wr0*powf(spend,0.16);
  1452.         chilltemp=wr3;
  1453. }
  1454. #endif
  1455. void set_comp_sclk_high(void)
  1456. {
  1457.         P_IO_PortB_Data|=0x20;       
  1458. }
  1459. void set_comp_sclk_low(void)
  1460. {
  1461.         P_IO_PortB_Data&=0xdf;       
  1462. }
  1463. void set_comp_sda_high(void)
  1464. {
  1465.         P_IO_PortB_Data|=0x10;       
  1466. }
  1467. void set_comp_sda_low(void)
  1468. {
  1469.         P_IO_PortB_Data&=0xef;       
  1470. }
  1471. void set_comp_sda_in(void)
  1472. {
  1473.         P_IO_PortB_Dir&=0xef;
  1474.         //P_IO_PortB_Attrib|=0x10;
  1475.         //P_IO_PortB_Data|=0x10;
  1476. }
  1477. void set_comp_sda_out(void)
  1478. {
  1479.         P_IO_PortB_Dir|=0x10;
  1480.         //P_IO_PortB_Attrib&=0xef;
  1481.         //P_IO_PortB_Data|=0x10;
  1482. }
  1483. void comp_start(void)
  1484. {
  1485.         //set_comp_sda_out();
  1486.         set_comp_sda_high();
  1487.         delay();
  1488.         set_comp_sclk_high();
  1489.         delay();
  1490.         set_comp_sda_low();
  1491.         delay();
  1492.         set_comp_sclk_low();
  1493.         delay();
  1494. }
  1495. void comp_stop(void)
  1496. {
  1497.         //set_comp_sda_out();
  1498.         set_comp_sclk_low();
  1499.         delay();
  1500.         set_comp_sda_low();
  1501.         delay();
  1502.         set_comp_sclk_high();
  1503.         delay();
  1504.         set_comp_sda_high();
  1505.         delay();
  1506.         set_comp_sclk_high();
  1507.         delay();
  1508. }
  1509. void comp_sed_ack(void)
  1510. {
  1511.         //set_comp_sda_out();
  1512.         set_comp_sda_low();
  1513.         set_comp_sclk_high();
  1514.         delay();
  1515.         delay();
  1516.         delay();
  1517.         set_comp_sclk_low();
  1518.         delay();
  1519. }
  1520. void comp_no_ack(void)
  1521. {
  1522.         //set_comp_sda_out();
  1523.         set_comp_sda_high();
  1524.         delay();
  1525.         set_comp_sclk_high();
  1526.         delay();
  1527.         delay();
  1528.         set_comp_sclk_low();
  1529.         delay();
  1530. }
  1531. void comp_send_8_bit(unsigned char send_data)
  1532. {
  1533.         unsigned char i,d;
  1534.         d=send_data;
  1535.         //set_comp_sda_out();
  1536.         for(i=0;i<8;i++)
  1537.                 {
  1538.                 if(d&0x80)set_comp_sda_high();
  1539.                 else set_comp_sda_low();
  1540.                 set_comp_sclk_high();
  1541.                 delay();
  1542.                 set_comp_sclk_low();
  1543.                 delay();
  1544.                 d<<=1;
  1545.                 }
  1546.         set_comp_sda_in();
  1547.         delay();
  1548.         set_comp_sclk_high();
  1549.         delay();       
  1550.         if(P_IO_PortB_Data&0x10)flag1|=0x40;
  1551.         else flag1&=0xbf;
  1552.         set_comp_sclk_low();
  1553.         delay();
  1554.         set_comp_sda_out();
  1555. }
  1556. unsigned char comp_read_8bit(void)
  1557. {
  1558.         unsigned char i=0,d=0;
  1559.         set_comp_sda_in();
  1560.         for(i=0;i<8;i++)
  1561.                 {
  1562.                 d<<=1;       
  1563.                 set_comp_sclk_high();
  1564.                 delay();
  1565.                 if(P_IO_PortB_Data&0x10)d|=0x01;
  1566.                 else d&=0xef;
  1567.                 set_comp_sclk_low();
  1568.                 delay();
  1569.                 }
  1570.         set_comp_sda_out();
  1571.         return d;
  1572. }
  1573. unsigned char read_stater(void)
  1574. {
  1575.         unsigned char return_data;
  1576.         comp_start();
  1577.         comp_send_8_bit(0x60);
  1578.         comp_send_8_bit(0x06);
  1579.         comp_start();
  1580.         comp_send_8_bit(0x61);
  1581.         if(flag1&0x40)return 0;
  1582.         return_data=comp_read_8bit();
  1583.         comp_no_ack();
  1584.         comp_stop();
  1585.         return return_data;
  1586. }
  1587. void rest_set(unsigned char dd)
  1588. {
  1589.         comp_start();
  1590.         comp_send_8_bit(0x60);
  1591.         comp_send_8_bit(0x07);
  1592.         comp_send_8_bit(dd);
  1593.         comp_stop();
  1594. }
  1595. void max_min_init(void)
  1596. {
  1597.         xmax=0x0000;
  1598.         xmin=0xffff;
  1599.         ymax=0;
  1600.         ymin=0xffff;
  1601.         xvalue_buf=0;
  1602.         yvalue_buf=0;
  1603. }
  1604. void read_data(void)
  1605. {
  1606.         unsigned char r_data;
  1607.         comp_start();
  1608.         comp_send_8_bit(0x60);
  1609.         comp_send_8_bit(0x00);
  1610.         comp_start();
  1611.         comp_send_8_bit(0x61);
  1612.         XRaw=comp_read_8bit();
  1613.         comp_sed_ack();
  1614.         r_data=comp_read_8bit();
  1615.         XRaw|=r_data<<8;
  1616.         //XRaw=r_data;
  1617.         comp_sed_ack();
  1618.         YRaw=comp_read_8bit();
  1619.         comp_sed_ack();
  1620.         r_data=comp_read_8bit();
  1621.         YRaw|=r_data<<8;
  1622.         //YRaw=r_data;
  1623.         comp_sed_ack();
  1624.         r_data=comp_read_8bit();
  1625.         comp_sed_ack();
  1626.         r_data=comp_read_8bit();
  1627.         comp_no_ack();
  1628.         comp_stop();
  1629. }
  1630.   unsigned  long int arcTan(unsigned long int lAcc);

  1631. /****************************************************
  1632. ****************************************************/

  1633. /***************************************************
  1634. ***************************************************/


  1635. /***************************************************
  1636. ***************************************************/

  1637. /******************************************************************************
  1638. ;---Function Description: compass processs
  1639. ******************************************************************************/
  1640. void cal_compass(void)
  1641. {
  1642.         unsigned long int X_raw, Y_raw;                // signed X & Y Raw data
  1643.         unsigned long int lAcc;
  1644.         int Vangle;

  1645.         if( XRaw > Xoffset )
  1646.                 X_raw = XRaw - Xoffset;
  1647.         else
  1648.                 X_raw = Xoffset - XRaw ;
  1649.         if( YRaw > Yoffset)
  1650.                 Y_raw = YRaw - Yoffset;
  1651.         else
  1652.                 Y_raw = Yoffset - YRaw ;
  1653.         if( Xsens > Ysens )
  1654.                 {
  1655.                 Y_raw*=Xsens;
  1656.                 Y_raw = Y_raw / Ysens; // perform gain matching
  1657.                 }
  1658.         else
  1659.                 {
  1660.                 X_raw*=Ysens;
  1661.                 X_raw = X_raw/ Xsens; // perform gain matching
  1662.                 }

  1663.         if( X_raw >= Y_raw)
  1664.         {
  1665.                 lAcc = Y_raw;
  1666.                 lAcc *= 1000;
  1667.                 lAcc /= X_raw;
  1668.                 lAcc /= 1;
  1669.                 lAcc = arcTan(lAcc);
  1670.                 Vangle = lAcc / 10;
  1671.         //        Vangle=arcTan(lAcc);
  1672.         }
  1673.         else
  1674.         {
  1675.                 lAcc = X_raw;
  1676.                 lAcc *= 1000;
  1677.                 lAcc = lAcc/Y_raw;
  1678.                 lAcc = arcTan(lAcc);
  1679.                 Vangle = 90 - (lAcc/10);
  1680.                 //Vangle=90-arcTan(lAcc);
  1681.         }
  1682.         #if 0
  1683.         if(XRaw>=Xoffset)
  1684.                 {
  1685.                 if(YRaw>=Yoffset)Vangle=Vangle;
  1686.                 else Vangle=180-Vangle;
  1687.                 }
  1688.         else
  1689.                 {
  1690.                 if(YRaw>=Yoffset)Vangle=360-Vangle;
  1691.                 else Vangle=180+Vangle;
  1692.                 }
  1693.         #endif
  1694.         #if 1
  1695.         if((XRaw > Xoffset) && (YRaw > Yoffset)) Vangle = Vangle; // quadrant +X, +Y (0 to 90)
  1696.         if((XRaw < Xoffset) && (YRaw > Yoffset)) Vangle = 180 - Vangle; // quadrant X, +y (91 to 180)
  1697.         else if((XRaw < Xoffset) && (YRaw < Yoffset)) Vangle = 180 + Vangle; // quadrant X, -Y (181 to 270)
  1698.         else if((XRaw > Xoffset) && (YRaw < Yoffset)) Vangle = 360 - Vangle; // quadrant +X, -Y (271 to 359)
  1699.         //Vangle-=180;
  1700. //        if(Vangle>=360)
  1701.         //        {
  1702.         //                Vangle -=360;
  1703.         //        }
  1704.         //else if(Vangle<0)
  1705.         //        {
  1706.         //                Vangle +=360;
  1707.         //        }
  1708.         #if 0
  1709.         if(XRaw == Xoffset)
  1710.         {
  1711.                 if(YRaw == Yoffset)
  1712.                         {
  1713.                                 Vangle = 0;
  1714.                         }
  1715.         else if(YRaw > Yoffset)
  1716.                         {
  1717.                                 Vangle = 90;
  1718.                         }
  1719.         else
  1720.                         {
  1721.                                 Vangle = 270;
  1722.                         }
  1723.         }
  1724.         if(YRaw == Yoffset)
  1725.         {
  1726.                 if(XRaw == Xoffset)
  1727.                         {
  1728.                         Vangle = 0;
  1729.                         }
  1730.         else if(XRaw > Xoffset)
  1731.                         {
  1732.                                 Vangle = 0;
  1733.                         }
  1734.         else
  1735.                         {
  1736.                                 Vangle = 180;
  1737.                         }
  1738.         }
  1739.         if(Vangle>=360)
  1740.                 {
  1741.                         Vangle -=360;
  1742.                 }
  1743.         else
  1744.                 {
  1745.                 if(Vangle <= 0)
  1746.                         {
  1747.                                 Vangle +=360;
  1748.                         }
  1749.                 if(Vangle == 360)
  1750.                         {
  1751.                                 Vangle = 0;
  1752.                         }
  1753.                 }
  1754.         #endif
  1755.         #if 0
  1756.         if(!((XRaw < Xoffset) && (YRaw < Yoffset)))
  1757.                 {
  1758.         if(Vangle < 360)
  1759.                 {
  1760.                         Vangle = 360 - Vangle;
  1761.                 }
  1762.         else
  1763.                 {
  1764.                         Vangle -= 360;
  1765.                 }
  1766.         Vangle += 270;
  1767.         if(Vangle >= 360)
  1768.                 {
  1769.                         Vangle -= 360;
  1770.                 }
  1771.                 }
  1772.         #endif
  1773.         //I2cAngleBuf[0] = (unsigned char)(Vangle & 0xff);
  1774.         //Vangle >>= 8;
  1775.         //I2cAngleBuf[1] = (unsigned char)(Vangle & 0xff);
  1776.         #endif
  1777.         angle=Vangle;
  1778.         flag4|=0x80;
  1779. }

  1780. /***************************************************
  1781. ***************************************************/
  1782. #if 1
  1783. unsigned long int arcTan(unsigned long int lAcc) // arc Tan function
  1784. {
  1785. char I;

  1786. lAcc *= 10;
  1787. if(lAcc>10000)
  1788. lAcc=10000;
  1789. for(I=0;I<19;I++)
  1790. {
  1791. if (lAcc <= iAtanPoint[I])
  1792.         {
  1793.                 if(I== 0)
  1794.                         {
  1795.                         lAcc /= cAtanStep[0];
  1796.                         }
  1797.                 else
  1798.                         {
  1799.                         lAcc -= iAtanPoint[I-1];
  1800.                         lAcc /= cAtanStep[I-1];
  1801.                         lAcc += iAtanAngle[I-1];
  1802.                         }
  1803.                         break;
  1804.          }
  1805. }
  1806. return(lAcc);
  1807. }
  1808. #endif
  1809. #if 0
  1810. unsigned char arcTan(unsigned long int lAcc)
  1811. {
  1812.         unsigned char i,j=0;
  1813.         for(i=0;i<9;i++)
  1814.                 {
  1815.                         if (lAcc <= angle_buf[i])
  1816.                         {
  1817.                                 if(i== 0)
  1818.                                         {
  1819.                                         j = 5-(angle_buf[i]-lAcc)*10/angle_buf[i]/10;
  1820.                                         }
  1821.                                 else
  1822.                                         {
  1823.                                         j = 5*i-(angle_buf[i]-lAcc)*10/(angle_buf[i]-angle_buf[i-1])/10;
  1824.                                         }
  1825.                                         break;
  1826.                          }
  1827.                 }
  1828.         if(i>=8)j=45;
  1829.         return j;
  1830. }
  1831. #endif
  1832. void test_comp()
  1833. {
  1834.         comp_start();
  1835.         comp_send_8_bit(0x60);
  1836.         comp_send_8_bit(0x07);
  1837.         comp_send_8_bit(0x01);
  1838.         comp_stop();
  1839. }
  1840. #if 0
  1841. void read_comp_data(void)
  1842. {
  1843.         unsigned char r_data;
  1844.         unsigned long int data_1;
  1845.         static unsigned char i;
  1846.         static unsigned char j=0;
  1847.         if(!(comp_init_flag&0x10))return;
  1848.         if(comp_init_flag&0x01)//init1
  1849.                 {
  1850.                         //if(axis_test_time<4)return;
  1851.                         axis_test_time=0;
  1852.                         comp_start();
  1853.                         comp_send_8_bit(0x60);
  1854.                         comp_send_8_bit(0x07);
  1855.                         comp_send_8_bit(0x80);
  1856.                         comp_stop();
  1857.                         comp_init_flag&=0xfe;
  1858.                         i=0;
  1859.                 }
  1860.         else if(comp_init_flag&0x02)//init2
  1861.                 {
  1862.                         if(axis_test_time<16)return;
  1863.                         axis_test_time=0;
  1864.                 //        comp_start();
  1865.                 //        comp_send_8_bit(0x60);
  1866.                 //comp_send_8_bit(0x08);
  1867.                 //        comp_send_8_bit(0x01);
  1868.                 //        comp_stop();
  1869.                         rest_set(0x23);
  1870.                         comp_init_flag&=0xfd;
  1871.                         i=0;
  1872.                         max_min_init();       
  1873.                         //test_comp();
  1874.                         j=0;
  1875.                 }
  1876.         else if(comp_init_flag&0x04)
  1877.                 {
  1878.                         r_data=read_stater();
  1879.                         if(r_data&0x01)
  1880.                                 {
  1881.                                 read_data();
  1882.                                 //test_comp();
  1883.                                 if(xmax<XRaw)
  1884.                                         {
  1885.                                         xmax=XRaw;
  1886.                                         //test11=YRaw;
  1887.                                         }
  1888.                                  if(xmin>XRaw)
  1889.                                          {
  1890.                                          xmin=XRaw;
  1891.                                         //test21=YRaw;
  1892.                                         }
  1893.                                 if(ymax<YRaw)
  1894.                                         {
  1895.                                         ymax=YRaw;
  1896.                                         //test31=XRaw;
  1897.                                         }
  1898.                                  if(ymin>YRaw)
  1899.                                          {ymin=YRaw;}//test41=XRaw;
  1900.                                 i++;
  1901.                                 if(i>=8)
  1902.                                         {
  1903.                                         i=0;
  1904.                                         compass_data++;
  1905.                                         j++;
  1906.                                         }
  1907.                                 if(j>=40)comp_init_flag&=~0x04;
  1908.                                 }
  1909.                 }
  1910.         else if(comp_init_flag&0x08)
  1911.                 {
  1912.                                 i=0;
  1913.                                 data_1=xmax;
  1914.                                 data_1+=xmin;
  1915.                                 Xoffset = data_1/2;
  1916.                                 data_1=ymax;
  1917.                                 data_1+=ymin;
  1918.                                 Yoffset =data_1/2;
  1919.                                 Xsens = (xmax - xmin)/2;
  1920.                                 Ysens = (ymax - ymin)/2;
  1921.                                 max_min_init();       
  1922.                                 comp_init_flag&=0xf7;
  1923.                 }
  1924.         else
  1925.                 {
  1926.                         r_data=read_stater();
  1927.                         if(r_data&0x01)
  1928.                                 {
  1929.                                 read_data();
  1930.                                 //test_comp();
  1931.                                 xvalue_buf += XRaw;
  1932.                                 yvalue_buf += YRaw;
  1933.                                 if(xmax<XRaw)
  1934.                                         xmax=XRaw;
  1935.                                  if(xmin>XRaw)
  1936.                                         xmin=XRaw;
  1937.                                 if(ymax<YRaw)
  1938.                                         ymax=YRaw;
  1939.                                  if(ymin>YRaw)
  1940.                                         ymin=YRaw;
  1941.                                 i++;
  1942.                                 if(i==6)
  1943.                                         {
  1944.                                         XRaw=(xvalue_buf-xmax-xmin)>>2;
  1945.                                         YRaw=(yvalue_buf-ymin-ymax)>>2;
  1946.                                         cal_compass();
  1947.                                         max_min_init();
  1948.                                         i=0;
  1949.                                         }
  1950.                                 }
  1951.                 }
  1952.        
  1953.        
  1954. }
  1955. #endif
  1956. unsigned int h1x,h1y,h2x,h2y;
  1957. void read_comp_data(void)
  1958. {
  1959.         unsigned char r_data;
  1960.         static unsigned char comp_stater=0,i=0,j=0;
  1961.         unsigned long addx,addy;
  1962.         if(!(comp_init_flag&0x10)){comp_stater=0;return;}
  1963.         switch(comp_stater)
  1964.                 {
  1965.                 case 0:
  1966.                         axis_test_time=0;
  1967.                         comp_start();
  1968.                         comp_send_8_bit(0x60);
  1969.                         comp_send_8_bit(0x07);
  1970.                         comp_send_8_bit(0x80);
  1971.                         comp_stop();
  1972.                         comp_stater++;
  1973.                         break;
  1974.                 case 1:
  1975.                         if(axis_test_time<16)break;
  1976.                         rest_set(0x21);
  1977.                         comp_stater++;
  1978.                         break;
  1979.                 case 2:
  1980.                         r_data=read_stater();
  1981.                         if(!(r_data&0x01))break;
  1982.                         read_data();
  1983.                         h1x=XRaw;
  1984.                         h1y=YRaw;
  1985.                         comp_stater++;
  1986.                         break;
  1987.                 case 3:
  1988.                         axis_test_time=0;
  1989.                         comp_start();
  1990.                         comp_send_8_bit(0x60);
  1991.                         comp_send_8_bit(0x07);
  1992.                         comp_send_8_bit(0x80);
  1993.                         comp_stop();
  1994.                         comp_stater++;
  1995.                         break;
  1996.                 case 4:
  1997.                         if(axis_test_time<16)break;
  1998.                         rest_set(0x41);
  1999.                         comp_stater++;
  2000.                         break;
  2001.                 case 5:
  2002.                         r_data=read_stater();
  2003.                         if(!(r_data&0x01))break;
  2004.                         read_data();
  2005.                         h2x=XRaw;
  2006.                         h2y=YRaw;
  2007.                         addx=h2x;
  2008.                         addx+=h1x;
  2009.                         addx/=2;
  2010.                         addy=h2y;
  2011.                         addy+=h1y;
  2012.                         addy/=2;
  2013.                         max_min_init();       
  2014.                         comp_stater++;
  2015.                         comp_start();
  2016.                         comp_send_8_bit(0x60);
  2017.                         comp_send_8_bit(0x07);
  2018.                         comp_send_8_bit(0x03);
  2019.                         comp_stop();
  2020.                         break;
  2021.                 case 6:
  2022.                         r_data=read_stater();
  2023.                         if(!(r_data&0x01))break;
  2024.                                 read_data();
  2025.                                 //test_comp();
  2026.                                 if(xmax<XRaw)
  2027.                                         {
  2028.                                         xmax=XRaw;
  2029.                                         //test11=YRaw;
  2030.                                         }
  2031.                                  if(xmin>XRaw)
  2032.                                          {
  2033.                                          xmin=XRaw;
  2034.                                         //test21=YRaw;
  2035.                                         }
  2036.                                 if(ymax<YRaw)
  2037.                                         {
  2038.                                         ymax=YRaw;
  2039.                                         //test31=XRaw;
  2040.                                         }
  2041.                                  if(ymin>YRaw)
  2042.                                          {ymin=YRaw;}//test41=XRaw;
  2043.                                 i++;
  2044.                                 if(i>=8)
  2045.                                         {
  2046.                                         i=0;
  2047.                                         compass_data++;
  2048.                                         j++;
  2049.                                         }
  2050.                                 if(j>=40)comp_stater++;
  2051.                         break;
  2052.                 case 7:
  2053.                                 comp_init_flag&=~0x04;
  2054.                                 i=0;
  2055.                                 addx=xmax;
  2056.                                 addx+=xmin;
  2057.                                 Xoffset = addx/2;
  2058.                                 addx=ymax;
  2059.                                 addx+=ymin;
  2060.                                 Yoffset =addx/2;
  2061.                                 Xsens = (xmax - xmin)/2;
  2062.                                 Ysens = (ymax - ymin)/2;
  2063.                                 max_min_init();       
  2064.                                 comp_stater++;
  2065.                         break;
  2066.                 case 8:
  2067.                         r_data=read_stater();
  2068.                         if(!(r_data&0x01))break;
  2069.                                 read_data();
  2070.                                 //test_comp();
  2071.                                 xvalue_buf += XRaw;
  2072.                                 yvalue_buf += YRaw;
  2073.                                 if(xmax<XRaw)
  2074.                                         xmax=XRaw;
  2075.                                  if(xmin>XRaw)
  2076.                                         xmin=XRaw;
  2077.                                 if(ymax<YRaw)
  2078.                                         ymax=YRaw;
  2079.                                  if(ymin>YRaw)
  2080.                                         ymin=YRaw;
  2081.                                 i++;
  2082.                                 if(i==6)
  2083.                                         {
  2084.                                         XRaw=(xvalue_buf-xmax-xmin)>>2;
  2085.                                         YRaw=(yvalue_buf-ymin-ymax)>>2;
  2086.                                         cal_compass();
  2087.                                         max_min_init();
  2088.                                         i=0;
  2089.                                         }
  2090.                         break;
  2091.                        
  2092.                 }
  2093. }
  2094. #define uch unsigned char
  2095. void display1(uch *p1, unsigned int*p2, uch d1)
  2096. {
  2097.         uch buf1,i,buf2,buf6;
  2098.         unsigned int buf3;
  2099.         buf1=*(p1+d1);
  2100.         for(i=0;i<7;i++)
  2101.                 {
  2102.                 buf3=*(p2+i);
  2103.                 buf2=(uch)buf3;
  2104.                 buf6=(uch)(buf3>>8);
  2105.                 if(buf1&0x01)*(display_buf+buf2)|=buf6;
  2106.                 else *(display_buf+buf2)&=~buf6;
  2107.                 buf1>>=1;
  2108.                 }
  2109. }
  2110. void getspeedms(void)
  2111. {
  2112.   if(spend<114)dis_spend1=0.0272;
  2113. else if(spend<174)dis_spend1=0.0241;
  2114. else dis_spend1=0.0234;
  2115. dis_spend1=((float)spend*dis_spend1+0.05)*10;
  2116. if(dis_spend1>711)dis_spend1=711;
  2117. }

  2118. void spend_unit(void)
  2119. {
  2120.         if(!pres_disp_mode)return;
  2121.         flag4|=0x20;       
  2122.         getspeedms();
  2123.         switch(spend_danwei)
  2124.                 {
  2125.                 case 0:
  2126.                         //dis_spend=wr0;
  2127.                         dis_spend=dis_spend1;//spend;//dis_spend1;//m/s
  2128.                         break;
  2129.                 case 1:
  2130.                         dis_spend=dis_spend1*194.4;//knots/h
  2131.                         //dis_pres=(unsigned int)dis_spend;
  2132.                         break;
  2133.                 case 2:
  2134.                         dis_spend=dis_spend1*360;//km/h
  2135.                        
  2136.                         break;
  2137.                 case 3:
  2138.                         dis_spend=dis_spend1*223.69;//mph
  2139.                         break;
  2140.                 }
  2141.         dis_pres=(unsigned int)dis_spend;
  2142. }
  2143. void press_unit()
  2144. {
  2145.         int d;
  2146.         if(pres_disp_mode)return;
  2147.         flag4|=0x20;
  2148.         d=press_data_buf/10+(high_value+high_value1)/10;
  2149.         switch(spend_danwei)
  2150.                 {
  2151.                 case 0:
  2152.                         dis_pres=d;//hpa 1位小数点
  2153.                         if(d>1050)dis_pres=1050;
  2154.                         if(d<850)dis_pres=850;
  2155.                         break;
  2156.                 case 1:
  2157.                         if(d>1050)d=1050;
  2158.                         if(d<850)d=850;
  2159.                         wr0=2.9529988*(float)d;//inhg 2位小数点
  2160.                         dis_pres=(unsigned long int)wr0;
  2161.                         break;
  2162.                 case 2:
  2163.                         if(d>1050)d=1050;
  2164.                         if(d<850)d=850;
  2165.                         wr0=0.75*(float)d;
  2166.                         dis_pres=(unsigned long int)wr0;//mmhg 2位小数点
  2167.                         break;
  2168.                 case 3:
  2169.                         dis_pres=high_value+high_value1;//m        0位小数点               
  2170.                         break;
  2171.                 case 4:
  2172.                         wr0=(float)(high_value+high_value1)*3.24254;// 1/0.3084=3.24254;//0.3048;
  2173.                         dis_pres=(unsigned long int)wr0;//feet 0位小数点
  2174.                         break;
  2175.                 }
  2176. }


  2177. void key_fun(void)
  2178. {
  2179.         int k;
  2180.         if(!(flag2&0x60))return;
  2181.         cant_10s=0;
  2182.         cant_20s=0;
  2183.         flag4|=0x08;
  2184.         if(key_data==0xe0)
  2185.                 {
  2186.                 if(flag2&0x40)
  2187.                         {
  2188.                         if(cant_5s>3)
  2189.                                 {
  2190.                                 flag2&=0x9f;
  2191.                                 if(P_IO_PortA_Data&0x04)P_IO_PortA_Buffer&=~0x04;
  2192.                                 else P_IO_PortA_Buffer|=0x04;
  2193.                                 }
  2194.                         }
  2195.                 else
  2196.                         {
  2197.                         P_IO_PortD_Data=P_IO_PortD_Buffer|0x08;
  2198.                         cant_5s=0;
  2199.                         flag2&=0x9f;
  2200.                         }
  2201.                 return;
  2202.                 }
  2203.         switch(key_stater)
  2204.                 {
  2205.                 case 0:
  2206.                         cant_15s=0;
  2207.                         if(flag2&0x20)//短按
  2208.                                 {
  2209.                                 flag3|=0x20;
  2210.                                 flag3|=0x04;
  2211.                                 if(key_data==0x70)
  2212.                                         {
  2213.                                         time_display_mode++;
  2214.                                         if(time_display_mode>2)
  2215.                                                 {
  2216.                                                 flag0&=0xfd;
  2217.                                                 time_display_mode=0;
  2218.                                                 }
  2219.                                         else flag0|=0x02;
  2220.                                         }
  2221.                                 else if(key_data==0xb0)
  2222.                                         {
  2223.                                                 spend_danwei=0;
  2224.                                                 pres_disp_mode++;
  2225.                                                 if(pres_disp_mode>1)pres_disp_mode=0;
  2226.                                                 if(pres_disp_mode)spend_unit();
  2227.                                                 else press_unit();
  2228.                                                 dark_spend_unit();
  2229.                                                 dark_pres_unit();
  2230.                                                        
  2231.                                                
  2232.                                         }
  2233.                                 else if(key_data==0xd0)
  2234.                                         {
  2235.                                         if(pres_disp_mode)
  2236.                                                 {
  2237.                                                 spend_danwei++;
  2238.                                                 if(spend_danwei>3)spend_danwei=0;
  2239.                                                  spend_unit();
  2240.                                                 }
  2241.                                         else
  2242.                                                 {
  2243.                                                 spend_danwei++;
  2244.                                                 if(spend_danwei>4)spend_danwei=0;
  2245.                                                 press_unit();
  2246.                                                 }
  2247.                                         }
  2248.                                 }
  2249.                         else
  2250.                                 {
  2251.                                         if(key_data==0x70)
  2252.                                                 {
  2253.                                                         cant_15s=0;
  2254.                                                         time_display_mode=0;
  2255.                                                         //flag1|=0x03;
  2256.                                                         key_stater=1;
  2257.                                                         flag0|=0x02;
  2258.                                                 }
  2259.                                         else if(key_data==0xb0)
  2260.                                                 {
  2261.                                                 key_stater=2;
  2262.                                                 weath_mode=0;
  2263.                                                 pres_disp_mode=0;
  2264.                                                 spend_danwei=3;
  2265.                                                 dark_spend_unit();
  2266.                                                 dark_pres_unit();
  2267.                                                 press_unit();
  2268.                                                 }
  2269.                                         else if(key_data==0xd0)
  2270.                                                 {
  2271.                                                 //key_stater=3;
  2272.                                                 //if((comp_init_flag&0x10)&&(comp_init_flag&0x04))comp_init_flag&=0xfb;
  2273.                                             if(!(comp_init_flag&0x10))
  2274.                                                         {
  2275.                                                         comp_init_flag|=0x1f;
  2276.                                                         }
  2277.                                                 else
  2278.                                                         {
  2279.                                                         comp_start();
  2280.                                                         comp_send_8_bit(0x60);
  2281.                                                         comp_send_8_bit(0x07);
  2282.                                                         comp_send_8_bit(0x80);
  2283.                                                         comp_stop();
  2284.                                                         comp_init_flag&=0xef;
  2285.                                                         angle=0;
  2286.                                                         compass_data=0;
  2287.                                                         }
  2288.                                                 flag4|=0x80;
  2289.                                                 }
  2290.                                         else if(key_data==0x90)
  2291.                                                 {
  2292.                                                
  2293.                                                 flag4|=0x20;
  2294.                                                 spend1=0;
  2295.                                                 flag1^=0x01;
  2296.                                                 if(flag1&0x01){P_INT_Ctrl2|=D_ExtI2IntEn;P_IO_PortA_Buffer&=~0x01;}
  2297.                                                 else {P_INT_Ctrl2&=~D_ExtI2IntEn;P_IO_PortA_Buffer|=0x01;}
  2298.                                                 spend_on_5s=0;
  2299.                                                 }
  2300.                                 }
  2301.                         flag2&=0x9f;
  2302.                         break;
  2303.                 case 1:
  2304.                         if(key_data==0x70)
  2305.                                 {
  2306.                                 cant_15s=0;
  2307.                                 flag2&=0x9f;
  2308.                                 time_display_mode++;
  2309.                                 //flag1&=0xf8;
  2310.                                 if(time_display_mode>3)flag0&=0xfd;
  2311.                                 if(time_display_mode>6)
  2312.                                         {
  2313.                                         time_display_mode=0;
  2314.                                         key_stater=0;
  2315.                                         }
  2316.                                 }
  2317.                         else if(key_data==0xb0)
  2318.                                 {
  2319.                                 if((flag2&0x20)||(inc_8_time>=shift_cant))
  2320.                                         {
  2321.                                         inc_8_time=0;
  2322.                                         cant_15s=0;
  2323.                                         flag3|=0x20;
  2324.                                         flag2&=0xdf;
  2325.                                         inc_8_time=0;
  2326.                                         switch(time_display_mode)
  2327.                                                 {
  2328.                                                 case 0:
  2329.                                                                 flag3^=0x40;
  2330.                                                                 flag2&=0x9f;
  2331.                                                                 break;
  2332.                                                 case 1:
  2333.                                                                 year++;
  2334.                                                                 if(year>99)year=17;
  2335.                                                                 //get_wek_data();
  2336.                                                                 break;
  2337.                                                 case 2:
  2338.                                                                 moth++;
  2339.                                                                 if(moth>12)moth=1;
  2340.                                                                 if(moth==2)
  2341.                                                                         {
  2342.                                                                         if(!(year&0x03))
  2343.                                                                                 {
  2344.                                                                                 while(day>29)day--;
  2345.                                                                                 }
  2346.                                                                         else while(day>28)day--;
  2347.                                                                         }
  2348.                                                                 else while(day>moth_table[moth-1])day--;
  2349.                                                                 //get_wek_data();
  2350.                                                                 break;
  2351.                                                 case 3:
  2352.                                                         day++;
  2353.                                                         if(moth==2)
  2354.                                                                 {
  2355.                                                                 if(!(year&0x03))
  2356.                                                                         {
  2357.                                                                         if(day>29)day=1;
  2358.                                                                         }
  2359.                                                                 else if(day>28)day=1;
  2360.                                                                 }
  2361.                                                         else
  2362.                                                                 {
  2363.                                                                 if(day>moth_table[moth-1])
  2364.                                                                         day=1;
  2365.                                                                 }
  2366.                                                         //get_wek_data();
  2367.                                                         break;
  2368.                                                 case 4:
  2369.                                                         hour++;
  2370.                                                         second=0;
  2371.                                                         if(hour>=24)hour=0;
  2372.                                                         break;
  2373.                                                 case 5:
  2374.                                                         mint++;
  2375.                                                         second=0;
  2376.                                                         if(mint>59)mint=0;
  2377.                                                         break;
  2378.                                                 case 6:
  2379.                                                         flag2&=0x9f;
  2380.                                                         flag0^=0x08;
  2381.                                                         flag4|=0x40;
  2382.                                                         break;
  2383.                                                 }
  2384.                                         }
  2385.                                 }
  2386.                         else if(key_data==0xd0)
  2387.                                 {
  2388.                                 if((flag2&0x20)||(inc_8_time>=shift_cant))
  2389.                                         {
  2390.                                         inc_8_time=0;
  2391.                                         cant_15s=0;
  2392.                                         flag3|=0x20;
  2393.                                         flag2&=0xdf;
  2394.                                         inc_8_time=0;
  2395.                                         switch(time_display_mode)
  2396.                                                 {
  2397.                                                 case 0:
  2398.                                                                 flag3^=0x40;
  2399.                                                                 flag2&=0x9f;
  2400.                                                                 break;
  2401.                                                 case 1:
  2402.                                                                 year--;
  2403.                                                                 if(year<17)year=99;
  2404.                                         //                        get_wek_data();
  2405.                                                                 break;
  2406.                                                 case 2:
  2407.                                                                 moth--;
  2408.                                                                 if(moth<1)moth=12;
  2409.                                                                 if(moth==2)
  2410.                                                                         {
  2411.                                                                         if(!(year&0x03))
  2412.                                                                                 {
  2413.                                                                                 while(day>29)day--;
  2414.                                                                                 }
  2415.                                                                         else while(day>28)day--;
  2416.                                                                         }
  2417.                                                                 else while(day>moth_table[moth-1])day--;
  2418.                                                                 //get_wek_data();
  2419.                                                                 break;
  2420.                                                 case 3:
  2421.                                                        
  2422. ……………………

  2423. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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