EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 737|回复: 1

[资料共享] avr 12864 矩阵键盘

[复制链接]

13

主题

0

回帖

127

E币

技术员

Rank: 2

积分
26
发表于 2017-5-12 15:24:12 | 显示全部楼层 |阅读模式
  1. //要做成定时器中断法,节省时间开支
  2. /**************************************
  3. ** 说明:线翻转法进行键盘扫描
  4. ** 输出:获得高低位的扫描值
  5. ** 有键时需要耗时 14ms
  6. **************************************/
  7. unsigned char key_scan(void)
  8. {
  9. unsigned char temp=0,key=0;
  10.         KEY_DDR  = 0xF0;  //高四位输出0,键按下,则对应的值为0
  11.         KEY_PORT = 0x0F;   //低四位输入,内部电阻上拉,没有键按下时为高
  12.         temp = KEY_PIN&0x0F;//与掉高四位
  13.         if(temp==0x0F)
  14.         {
  15.                 return 0; // 无按键返回
  16.         }
  17.         else
  18.         {
  19.                 Delay_ms(10);
  20.                 temp = KEY_PIN&0x0F;   //延时去抖后再检测
  21.                 if(temp==0x0F)
  22.                 return 0;
  23.                 else
  24.                 key=temp;
  25.         }
  26.         //翻转
  27.         KEY_DDR  = 0x0F; //低四位输出0,键按下,则对应的值为0
  28.         KEY_PORT = 0xF0;  //高四位输入,内部电阻上拉,没有键按下时为高
  29.         Delay_ms(3);     
  30.         //延时等待稳定

  31.         temp = KEY_PIN&0xF0;//与掉低四位
  32.         if(temp==0xF0)
  33.         {
  34.                 return 0; // 无按键返回
  35.         }
  36.         else           
  37.                 //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
  38.         {
  39.                 key |= temp;        //高低位的键值进入KEY
  40.         }
  41.         KEY_DDR = 0x00;/*输出复位*/
  42.         KEY_PORT = 0xFF;


  43.         return key;
  44. }
  45. /**************************************
  46. ** 说明:获得键盘的值  
  47. ** 内部调用函数key_scan
  48. ** 输出:实际键值
  49. **************************************/
  50. unsigned char get_key(unsigned char key_get)
  51. {
  52.         switch (key_get)
  53.         {/*将按键码转换成键值*/
  54.                 case  Key_0_zero: LCD_WRITE_DAT_CMD(WRDAT,'0');
  55.                         return 0;
  56.                 case  Key_1_BLACK: LCD_WRITE_DAT_CMD(WRDAT,'1');
  57.                         return 1;
  58.                 case  Key_2_PRINT: LCD_WRITE_DAT_CMD(WRDAT,'2');
  59.                         return 2;
  60.                 case  Key_3_REPORT: LCD_WRITE_DAT_CMD(WRDAT,'3');
  61.                         return 3;
  62.                 case  Key_4_START: LCD_WRITE_DAT_CMD(WRDAT,'4');
  63.                         return 4;
  64.                 case  Key_5_CURVE: LCD_WRITE_DAT_CMD(WRDAT,'5');
  65.                         return 5;
  66.                 case  Key_6_TIME: LCD_WRITE_DAT_CMD(WRDAT,'6');
  67.                         return 6;
  68.                 case  Key_7_CHECK: LCD_WRITE_DAT_CMD(WRDAT,'7');
  69.                         return 7;
  70.                 case  Key_8_SAVE: LCD_WRITE_DAT_CMD(WRDAT,'8');
  71.                         return 8;
  72.                 case  Key_9_CORRECTION: LCD_WRITE_DAT_CMD(WRDAT,'9');
  73.                         return 9;
  74. //                case  Key_SET: LCD_WRITE_DAT_CMD(WRDAT,'.');
  75. //                        return '.';
  76.                 default : return 0x00;
  77.         }
  78. }


  79. /**************************************
  80. ** 说明:获得键盘的值  
  81. ** 内部调用函数key_scan
  82. ** 输出:实际键值
  83. **************************************/
  84. unsigned char run_key(unsigned char key_get)
  85. {
  86.         switch (key_get)
  87.         {/*将按键码转换成键值*/
  88.                 case  Key_0_zero:
  89.                         LCD_WRITE_DAT_CMD(WRDAT,'0');
  90.                         return 0;
  91.                 case  Key_1_BLACK:
  92.                         LCD_WRITE_DAT_CMD(WRDAT,'1');
  93.                         return 1;
  94.                 case  Key_2_PRINT:
  95.                         LCD_WRITE_DAT_CMD(WRDAT,'2');
  96.                         return 2;
  97.                 case  Key_3_REPORT:
  98.                         LCD_WRITE_DAT_CMD(WRDAT,'3');
  99.                         return 3;
  100.                 case  Key_4_START:
  101.                         LCD_WRITE_DAT_CMD(WRDAT,'4');
  102.                         return 4;
  103.                 case  Key_5_CURVE: //进入标定程序
  104.                         LCD_WRITE_DAT_CMD(WRDAT,'5');
  105.                         return 5;
  106.                 case  Key_6_TIME:
  107.                         LCD_WRITE_DAT_CMD(WRDAT,'6');
  108.                         return 6;
  109.                 case  Key_7_CHECK:
  110.                         LCD_WRITE_DAT_CMD(WRDAT,'7');
  111.                         return 7;
  112.                 case  Key_8_SAVE:
  113.                         LCD_WRITE_DAT_CMD(WRDAT,'8');
  114.                         return 8;
  115.                 case  Key_9_CORRECTION:
  116.                         LCD_WRITE_DAT_CMD(WRDAT,'9');
  117.                         return 9;
  118.                 case  Key_OK:
  119.                         return 'O';
  120.                 case  Key_Cannel:
  121.                         return 'C';
  122.                 default : return 0xFF;
  123.         }
  124. }
  125. extern unsigned char l_tmpdate[7];
  126. //   0    1    2   3    4    5    6
  127. //  秒分时日月周年09-11-20 12:00:00
  128. void time_keynum_task(unsigned char ddram_addrc)
  129. {
  130. unsigned char key_test=0;
  131. unsigned char i=1;
  132. unsigned char j[8]={0};
  133.         convertChar(X_SHI,Y_SHI,2,FANBAI,1);
  134.         Read_RTC();

  135.                 j[2]=(l_tmpdate[2]/16)*10+l_tmpdate[2]%16;
  136.                 j[1]=(l_tmpdate[1]/16)*10+l_tmpdate[1]%16;
  137.                 j[0]=(l_tmpdate[0]/16)*10+l_tmpdate[0]%16;
  138.                 j[6]=(l_tmpdate[6]/16)*10+l_tmpdate[6]%16;
  139.                 j[4]=(l_tmpdate[4]/16)*10+l_tmpdate[4]%16;
  140.                 j[3]=(l_tmpdate[3]/16)*10+l_tmpdate[3]%16;
  141.                 j[5]=(l_tmpdate[5]/16)*10+l_tmpdate[5]%16;

  142.         while(1)
  143.         {
  144.                 Delay_ms(100);
  145.                 key_test = key_scan();
  146.                 if(key_test !=0)
  147.                 {        
  148.                         if(key_test==Key_OK)
  149.                         {
  150.                                 ALARM();
  151.                                 convertChar(X_XINGQI,Y_XINGQI,2,QUXIAOFANBAI,1);
  152.                                 convertChar(X_SHI,Y_SHI,2,QUXIAOFANBAI,1);
  153.                                 convertChar(X_FEN,Y_FEN,2,QUXIAOFANBAI,1);
  154.                                 convertChar(X_MIAO,Y_MIAO,2,QUXIAOFANBAI,1);
  155.                                 convertChar(X_NIAN,Y_NIAN,2,QUXIAOFANBAI,1);
  156.                                 convertChar(X_YUE,Y_YUE,2,QUXIAOFANBAI,1);
  157.                                 close_Cursor_Blink();
  158.                                 Set_RTC();
  159.                                 break;
  160.                         }
  161.                         else if(key_test==Key_Cannel)        
  162.                         {
  163.                                 ALARM();
  164.                                 convertChar(X_XINGQI,Y_XINGQI,2,QUXIAOFANBAI,1);
  165.                                 convertChar(X_SHI,Y_SHI,2,QUXIAOFANBAI,1);
  166.                                 convertChar(X_FEN,Y_FEN,2,QUXIAOFANBAI,1);
  167.                                 convertChar(X_MIAO,Y_MIAO,2,QUXIAOFANBAI,1);
  168.                                 convertChar(X_NIAN,Y_NIAN,2,QUXIAOFANBAI,1);
  169.                                 convertChar(X_YUE,Y_YUE,2,QUXIAOFANBAI,1);
  170.                                 break;
  171.                         }
  172.                         else if(key_test==Key_6_TIME)
  173.                         {
  174.                                 ALARM();
  175.                                 if(i==1)
  176.                                 {
  177.                                         convertChar(X_SHI,Y_SHI,2,QUXIAOFANBAI,1);
  178.                                         //取消反白
  179.                                         convertChar(X_FEN,Y_FEN,2,FANBAI,1);
  180.                                         i=2;
  181.                                 }//小时
  182.                                 else if(i==2)
  183.                                 {
  184.                                         convertChar(X_FEN,Y_FEN,2,QUXIAOFANBAI,1);
  185.                                         //取消反白
  186.                                         convertChar(X_MIAO,Y_MIAO,2,FANBAI,1);
  187.                                         //反白
  188.                                         i=3;
  189.                                 }//分钟
  190.                                 else if(i==3)
  191.                                 {
  192.                                         convertChar(X_MIAO,Y_MIAO,2,QUXIAOFANBAI,1);
  193.                                         //取消反白
  194.                                         convertChar(X_NIAN,Y_NIAN,2,FANBAI,1);
  195.                                         //反白
  196.                                         i=4;
  197.                                 }//秒钟
  198.                                 else if(i==4)
  199.                                 {
  200.                                         convertChar(X_NIAN,Y_NIAN,2,QUXIAOFANBAI,1);
  201.                                         //取消反白
  202.                                         convertChar(X_YUE,Y_YUE,2,FANBAI,1);
  203.                                         //反白
  204.                                         i=5;
  205.                                 }//年
  206.                                 else if(i==5)
  207.                                 {
  208.                                         convertChar(X_YUE,Y_YUE,2,QUXIAOFANBAI,1);
  209.                                         //取消反白
  210.                                         convertChar(X_RI,Y_RI,2,FANBAI,1);
  211.                                         //反白
  212.                                         i=6;
  213.                                 }//月
  214.                                 else if(i==6)
  215.                                 {
  216.                                         convertChar(X_RI,Y_RI,2,QUXIAOFANBAI,1);
  217.                                         //取消反白
  218.                                         convertChar(X_XINGQI,Y_XINGQI,2,FANBAI,1);
  219.                                         //反白
  220.                                         i=7;
  221.                                 }//日
  222.                         
  223.                                 else if(i==7)
  224.                                 {
  225.                                         convertChar(X_XINGQI,Y_XINGQI,2,QUXIAOFANBAI,1);
  226.                                         //取消反白
  227.                                         convertChar(X_SHI,Y_SHI,2,FANBAI,1);
  228.                                         //反白
  229.                                         i=1;
  230.                                 }
  231.                         }
  232.                         else
  233.                         {
  234.                                 if(i==1)
  235.                                 {
  236.                                         j[2]=time_shi_keynum_task(0x81,key_test,j[2]);
  237.                                         l_tmpdate[2]=(j[2]/10)*16+j[2]%10;
  238.                                 }//小时
  239.                                 else if(i==2)
  240.                                 {
  241.                                         j[1]=time_feng_keynum_task(0x83,key_test,j[1]);
  242.                                         l_tmpdate[1]=(j[1]/10)*16+j[1]%10;
  243.                                 }//分钟
  244.                                 else if(i==3)
  245.                                 {
  246.                                         j[0]=time_MIAO_keynum_task(0x85,key_test,j[0]);
  247.                                         l_tmpdate[0]=(j[0]/10)*16+j[0]%10;
  248.                                 }//秒钟
  249.                                 else if(i==4)
  250.                                 {
  251.                                         j[6]=time_nian_keynum_task(0x91,key_test,j[6]);
  252.                                         l_tmpdate[6]=(j[6]/10)*16+j[6]%10;
  253.                                 }//年
  254.                                 else if(i==5)
  255.                                 {
  256.                                         j[4]=time_yue_keynum_task(0x93,key_test,j[4]);
  257.                                         l_tmpdate[4]=(j[4]/10)*16+j[4]%10;
  258.                                 }//月
  259.                                 else if(i==6)
  260.                                 {
  261.                                         j[3]=time_ri_keynum_task(0x95,key_test,j[3]);
  262.                                         l_tmpdate[3]=(j[3]/10)*16+j[3]%10;
  263.                                 }//日
  264.                         
  265.                                 else if(i==7)
  266.                                 {
  267.                                         j[5]=time_xingqi_keynum_task(0x9a,key_test,j[5]);
  268.                                         l_tmpdate[5]=(j[5]/10)*16+j[5]%10;
  269.                                         if(j[5]==1)LCD_WRITE_STR_POSS(4,1,"星期一");
  270.                                         else if(j[5]==2)LCD_WRITE_STR_POSS(4,1,"星期二");
  271.                                         else if(j[5]==3)LCD_WRITE_STR_POSS(4,1,"星期三");
  272.                                         else if(j[5]==4)LCD_WRITE_STR_POSS(4,1,"星期四");
  273.                                         else if(j[5]==5)LCD_WRITE_STR_POSS(4,1,"星期五");
  274.                                         else if(j[5]==6)LCD_WRITE_STR_POSS(4,1,"星期六");
  275.                                         else if(j[5]==7)LCD_WRITE_STR_POSS(4,1,"星期日");
  276.                                 }
  277.                         }
  278.                 }

  279.         }

  280. }



  281. unsigned char time_shi_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  282. {
  283.         //反白
  284.         if(key_test==Key_Down)
  285.         {
  286.                 ALARM();
  287.                 if(j==23)
  288.                         j==23;
  289.                 else
  290.                         j++;
  291.                
  292.         }
  293.         else if(key_test==Key_Up)
  294.         {
  295.                 ALARM();
  296.                 if(j==0)
  297.                         j=0;
  298.                 else
  299.                         j--;
  300.                
  301.         }
  302.         Display_Cursor_Blink(ddram_addrc);
  303.         close_Cursor_Blink();
  304.         LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
  305.         LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
  306.         return(j);
  307. }

  308. unsigned char  time_feng_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  309. {
  310.         if(key_test==Key_Down)
  311.         {
  312.                 ALARM();
  313.                 if(j==59)
  314.                         j==59;
  315.                 else
  316.                         j++;
  317.                
  318.         }
  319.         else if(key_test==Key_Up)
  320.         {
  321.                 ALARM();
  322.                 if(j==0)
  323.                         j=0;
  324.                 else
  325.                         j--;
  326.                
  327.         }
  328.         Display_Cursor_Blink(ddram_addrc);
  329.         close_Cursor_Blink();
  330.         LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
  331.         LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
  332. return(j);
  333. }
  334. unsigned char  time_MIAO_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  335. {
  336.         if(key_test==Key_Down)
  337.         {
  338.                 ALARM();
  339.                 if(j==59)
  340.                         j==59;
  341.                 else
  342.                         j++;
  343.                
  344.         }
  345.         else if(key_test==Key_Up)
  346.         {
  347.                 ALARM();
  348.                 if(j==0)
  349.                         j=0;
  350.                 else
  351.                         j--;
  352.                
  353.         }
  354.         Display_Cursor_Blink(ddram_addrc);
  355.         close_Cursor_Blink();
  356.         LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
  357.         LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
  358.         return(j);
  359. }

  360. unsigned char  time_nian_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  361. {
  362.         if(key_test==Key_Down)
  363.         {
  364.                 ALARM();
  365.                 if(j==99)
  366.                         j==99;
  367.                 else
  368.                         j++;
  369.                
  370.         }
  371.         else if(key_test==Key_Up)
  372.         {
  373.                 ALARM();
  374.                 if(j==0)
  375.                         j=0;
  376.                 else
  377.                         j--;
  378.                
  379.         }
  380.         Display_Cursor_Blink(ddram_addrc);
  381.         close_Cursor_Blink();
  382.         LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
  383.         LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
  384.         return(j);
  385. }

  386. unsigned char  time_yue_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  387. {
  388.         if(key_test==Key_Down)
  389.         {
  390.                 ALARM();
  391.                 if(j==12)
  392.                         j==12;
  393.                 else
  394.                         j++;
  395.                
  396.         }
  397.         else if(key_test==Key_Up)
  398.         {
  399.                 ALARM();
  400.                 if(j==1)
  401.                         j=1;
  402.                 else
  403.                         j--;
  404.                
  405.         }
  406.         Display_Cursor_Blink(ddram_addrc);
  407.         close_Cursor_Blink();
  408.         LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
  409.         LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
  410.         return(j);
  411. }

  412. unsigned char  time_ri_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  413. {
  414.         if(key_test==Key_Down)
  415.         {
  416.                 ALARM();
  417.                 if(j==32)
  418.                         j==32;
  419.                 else
  420.                         j++;
  421.                
  422.         }
  423.         else if(key_test==Key_Up)
  424.         {
  425.                 ALARM();
  426.                 if(j==1)
  427.                         j=1;
  428.                 else
  429.                         j--;
  430.         }
  431.         Display_Cursor_Blink(ddram_addrc);
  432.         close_Cursor_Blink();
  433.         LCD_WRITE_DAT_CMD(WRDAT, j/10+'0');
  434.         LCD_WRITE_DAT_CMD(WRDAT, j%10+'0');
  435.         return(j);
  436. }

  437. unsigned char  time_xingqi_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
  438. {
  439.         if(key_test==Key_Down)
  440.         {
  441.                 ALARM();
  442.                 if(j==7)
  443.                         j==7;
  444.                 else
  445.                         j++;
  446.                
  447.         }
  448.         else if(key_test==Key_Up)
  449.         {
  450.                 ALARM();
  451.                 if(j==1)
  452.                         j=1;
  453.                 else
  454.                         j--;
  455.                
  456.         }
  457.         Display_Cursor_Blink(ddram_addrc);
  458.         close_Cursor_Blink();
  459.         LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');

  460.         if((j)==1)LCD_WRITE_STR_POSS(4,1,"星期一");
  461.         else if((j)==2)LCD_WRITE_STR_POSS(4,1,"星期二");
  462.         else if((j)==3)LCD_WRITE_STR_POSS(4,1,"星期三");
  463.         else if((j)==4)LCD_WRITE_STR_POSS(4,1,"星期四");
  464.         else if((j)==5)LCD_WRITE_STR_POSS(4,1,"星期五");
  465.         else if((j)==6)LCD_WRITE_STR_POSS(4,1,"星期六");
  466.         else if((j)==7)LCD_WRITE_STR_POSS(4,1,"星期日");
  467.         return(j);
  468. }
  469. /****************************************Copyright (c)****************************************************--------------格式说明-------------------------------------------------------------------------------**:**                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0**                0        0        1        AC6        AC5        AC4        AC3        AC2        AC1        AC0*******************************************************************************************************/#include"main.h"

  470. void LCD_set_XY(unsigned char x, unsigned char y){unsigned char X_ADDR;unsigned char Y_ADDR;        if(x==1)X_ADDR=0x80;        else if(x==2)X_ADDR=0x90;        else if(x==3)X_ADDR=0x88;        else if(x==4)X_ADDR=0x98;        Y_ADDR=X_ADDR+y;        LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);        LCD_WRITE_DAT_CMD(WRCMD,Y_ADDR);
  471. }unsigned char LCD_read_XY(unsigned char x, unsigned char y){unsigned char X_ADDR;unsigned char Y_ADDR;        if(x==1)X_ADDR=0x80;        else if(x==2)X_ADDR=0x90;        else if(x==3)X_ADDR=0x88;        else if(x==4)X_ADDR=0x98;        Y_ADDR=X_ADDR+y;return(Y_ADDR);}
  472. void Display_Cursor_Blink(unsigned char ucDDramAdd){        Serial_DDRAM_Address_Set(ucDDramAdd);        LCD_WRITE_DAT_CMD(WRCMD,0X0F);}void close_Cursor_Blink(void){//        Serial_DDRAM_Address_Set(ucDDramAdd);        LCD_WRITE_DAT_CMD(WRCMD,0X0c);}
  473. unsigned char LCD_READByte(unsigned char cmd)//读一字节{        unsigned char dat;        LCD_DATA_IN;
  474.         WATE_LCD_NOBUSY();        LCDRS_1;        LCDRW_1;        LCDE_1;        Delay_us(10);        dat=LCD_DATA_PIN;        Delay_ms(1);        LCDE_0;        Delay_us(1);        LCD_DATA_OUT;        return dat;}
  475. void WATE_LCD_NOBUSY( void )//忙检测{        LCD_DATA_IN;        LCDRS_0;         LCDRW_1;         LCDE_1;         while((LCD_DATA_PIN&0x80)==0x80);         LCDE_0;         LCD_DATA_OUT;}

  476. void LCD_WRITE_DAT_CMD(unsigned char cmd,unsigned char data)//写命令/数据{        WATE_LCD_NOBUSY();        if(cmd==WRCMD)LCDRS_0;else LCDRS_1;        LCDRW_0;        LCDE_1;
  477.         Delay_us(10);        LCD_DATA_PORT=data;        Delay_us(100);////////////////////在数据写入的时候加入适当的延时 //65        ;        LCDE_0;}#if 0void  lcd_mesg(unsigned char *adder1){        unsigned char i;        LCD_WRITE_DAT_CMD(WRCMD,0x80);  //Set Graphic Display RAM Address        Delay_ms(100);        for(i=0;i<32;i++)        {                LCD_WRITE_DAT_CMD(WRDAT,*adder1);//TransferData(*adder1,1);                adder1++;        }
  478.         LCD_WRITE_DAT_CMD(WRCMD,0x90);  //Set Graphic Display RAM Address        Delay_ms(100);        for(i=32;i<64;i++)        {                LCD_WRITE_DAT_CMD(WRDAT,*adder1);//TransferData(*adder1,1);                adder1++;        }}#endifvoid LCD_INIT(void) //初始化液晶{
  479.         Delay_ms(100);             //大于40MS的延时程序        LCD_WRITE_DAT_CMD(WRCMD,0x30);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF        Delay_ms(100);            //大于100uS的延时程序        LCD_WRITE_DAT_CMD(WRCMD,0x30);  //Function Set        Delay_ms(50);             ////大于37uS的延时程序        LCD_WRITE_DAT_CMD(WRCMD,0x0C);  //Display Control,D=1,显示开        Delay_ms(100);            //大于100uS的延时程序        LCD_WRITE_DAT_CMD(WRCMD,0x01);  //Display Clear        Delay_ms(500);             //大于10mS的延时程序        LCD_WRITE_DAT_CMD(WRCMD,0x06);  //Enry Mode Set,光标从右向左加1位移动        Delay_ms(100);            //大于100uS的延时程序
  480. }
  481. void lcd_clear(void)        //清屏函数{LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);LCD_WRITE_DAT_CMD(WRCMD,0x01);}
  482. void BMP_clear( void )// 清图形函数 {     unsigned char i,j;     LCD_WRITE_DAT_CMD(WRCMD,EXTEND_FUNCTION);      //8Bit扩充指令集,即使是36H也要写两次     LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);      //绘图ON,基本指令集里面36H不能开绘图     for(i=0;i<32;i++)            //12864实际为256x32     {           LCD_WRITE_DAT_CMD(WRCMD,0x80|i);      //行位置           LCD_WRITE_DAT_CMD(WRCMD,0x80);      //列位置           for(j=0;j<32;j++)            //256/8=32 byte                LCD_WRITE_DAT_CMD(WRDAT,0);     }}
  483. void TXT_Clear( void )//清文本函数{unsigned char i;     LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);      //8BitMCU,基本指令集合 //        Delay_ms(10);    LCD_WRITE_DAT_CMD(WRCMD,0x80);      //AC归起始位     for(i=0;i<64;i++) {                // Delay_us(10);     LCD_WRITE_DAT_CMD(WRDAT,0x20);}}
  484. void Overturn_1_line( unsigned char line_cmd)//{//unsigned char i;        LCD_WRITE_DAT_CMD(WRCMD,EXTEND_FUNCTION);      //8BitMCU,EXTEND指令集合        LCD_WRITE_DAT_CMD(WRCMD,line_cmd);}
  485. void LCD_WRITE_STR_POSS(unsigned char x,unsigned char y,unsigned char *buff)//光标定位函数{unsigned char addr,i=0;        if(x==1)addr=0x80;        if(x==2)addr=0x90;        if(x==3)addr=0x88;        if(x==4)addr=0x98;        addr=addr+y;        LCD_WRITE_DAT_CMD(WRCMD,0x30);//        Delay_us(10);        LCD_WRITE_DAT_CMD(WRCMD,addr);
  486.         while(buff[i]!='\0')        {           LCD_WRITE_DAT_CMD(WRDAT,buff[i]);//        Delay_us(10);           i++;        }}


  487. //=======================================================================

  488. /*void w_12864bmp(unsigned char *puts)//绘图函数{unsigned int x=0;unsigned char i,j;        LCD_WRITE_DAT_CMD(WRCMD,0x34); //扩展指令        LCD_WRITE_DAT_CMD(WRCMD,0x36); //打开绘图        for(i=0;i<32;i++)        {           LCD_WRITE_DAT_CMD(WRCMD,0x80|i);//列32行,双屏结构中上半屏            LCD_WRITE_DAT_CMD(WRCMD,0x80); //X地址坐标,自动加1.           for(j=0;j<16;j++) //16*8=256             LCD_WRITE_DAT_CMD(WRDAT,puts[x++]);                  }        for(i=0;i<32;i++)        {           LCD_WRITE_DAT_CMD(WRCMD,0x80|i);           LCD_WRITE_DAT_CMD(WRCMD,0x88); //下半屏           for(j=0;j<16;j++)             LCD_WRITE_DAT_CMD(WRDAT,puts[x++]);}
  489. }
  490. void Display_China(unsigned char X, unsigned char Y,unsigned char *Tmp_point){unsigned char i;        while(*(Tmp_point+i) != 0)//判断字符串长度                i ++;                    LCD_set_XY(X,Y);        for( ;i;i --)        {                LCD_WRITE_DAT_CMD(WRDAT,*Tmp_point++);                LCD_WRITE_DAT_CMD(WRDAT,*(Tmp_point++));        }}
  491. void Display_English(unsigned char X, unsigned char Y,unsigned char *Tmp_point){         unsigned char i;        while(*(Tmp_point+i) != 0)//判断字符串长度                i ++;            LCD_set_XY(X,Y);        for( ;i;i --)                LCD_WRITE_DAT_CMD(WRDAT, *(Tmp_point++));               
  492. }
  493. char char2hex(char num)  //字符型转化成ASCII码{        num        &=        0x0f;        if(num<10)return(num+0x30);        else return(num+0x61-0x0a);}char *unsigned char2hex(unsigned char num){        static char tc[3]={'\0','\0','\0'};                tc[0] = char2hex((unsigned char)(num>>4));        tc[1] = char2hex((unsigned char)(num));        return(tc);}char *int2hex(int num){        static char tc[5]={'\0','\0','\0','\0','\0'};                tc[0] = char2hex((unsigned char)(num>>12));//强制转化成字符型        tc[1] = char2hex((unsigned char)(num>>8));        tc[2] = char2hex((unsigned char)(num>>4));        tc[3] = char2hex((unsigned char)(num));        return(tc);}char *hex2int8(unsigned char num){        static char tc[4]={'\0','\0','\0','\0'};                tc[0] = ((num/100)&0x03)+0x30;        tc[1] = ((num/10)%10)+0x30;        tc[2] = (num%10)+0x30;        return(tc);}*/


  494. //*************************************************************//*函数名称:void LCD_DDRAM_AddressSet(unsigned char ucDDramAdd) *//*函数功能:设定DDRAM(文本区)地址到地址计数器AC                                  *//*形式参数:unsigned char ucDDramAdd                                                                  *//*行参说明:具体地址                                                                                  *//*格式说明:                                                                                                  *//*                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0                                  *//*                0        0        1        AC6        AC5        AC4        AC3        AC2        AC1        AC0                                  *//*返回参数:无                                                                                                  *//*使用说明:                                                                                                  *//*        第一行地址:80H~8FH                                                                                  *//*        第二行地址:90H~9FH                                                                                  *//*        第三行地址:A0H~AFH                                                                                  *//*        第四行地址:B0H~BFH                                                                                  *//*************************************************************void Serial_DDRAM_Address_Set(unsigned char ucDDramAdd){        LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                        //基本指令集        LCD_WRITE_DAT_CMD(WRCMD,ucDDramAdd);                                //设定DDRAM地址到地址计数器AC}#if 0//*************************************************************//*函数名称:void LCD_CGRAM_AddressSet(unsigned char ucCGramAdd) *//*函数功能:设定CGRAM(自定义字库区)地址到地址计数器AC                  *//*形式参数:unsigned char ucCGramAdd                                                                  *//*形参说明:具体地址                                                                                  *//*格式说明:                                                                                                  *//*                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0                                  *//*                0        0        0        1        AC5        AC4        AC3        AC2        AC1        AC0                                  *//*返回参数:无                                                                                                  *//*使用说明:地址范围为40H~3FH                                                                  *//*************************************************************void LCD_CGRAM_AddressSet(unsigned char ucCGramAdd){        LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                        //基本指令集        LCD_WRITE_DAT_CMD(WRCMD,ucCGramAdd);                                //设定CGRAM地址到地址计数器AC}
  495. //*******************************************************************************//*函数名称:void LCD_GDRAM_AddressSet(unsigned char ucGDramAdd)                   *//*函数功能:设定GDRAM(图形区)地址到地址计数器AC                                 *//*形式参数:unsigned char ucGDramAdd                                                    *//*形参说明:具体地址值                                                          *//*                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0                                 *//*                0        0        1        AC6        AC5        AC4        AC3        AC2        AC1        AC0                                 *//*                先设定垂直位置再设定水平位置(连续写入两个字节完成垂直和水平位置的设置)  *        //*                垂直地址范围:AC6~AC0                                                    *//*                水平地址范围:AC3~AC0                                                    *//*返回参数:无                                                                  *//*使用说明:必须在扩展指令集的情况下使用                                        *//*******************************************************************************void LCD_GDRAM_AddressSet(unsigned char ucGDramAdd){        LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                        //扩展指令集        LCD_WRITE_DAT_CMD(WRCMD,ucGDramAdd);                }
  496. #endif//**********************************************************
  497. //函数名称:Overturn_Char(unsigned char x,unsigned char y,unsigned char cor)//函数功能:使用绘图的方法让一个16*8的字符反白//形式参数:uunsigned char x,unsigned char y,unsigned char wide,unsigned char cor//                        x取值范围:1~16//                        y取值范围:1~4//          wide取值范围:1~16//行参说明:坐标水平位置,坐标垂直位置,反白行数,要反白还是清除(1:反白,2:清除)//液晶屏坐标说明://                _______________128个象素______________________//                |(1,1)                                                                    (16,1)|        //                |                                                                                          |        //        6        |                                                                                          |        //        4        |                                                                                  |//        个        |                                                                                    |        //        象        |                                                                                          |        //        素        |                                                                                          |//                |(1,4)__________________________________(16,4)|////返回参数:无//使用说明:无//**********************************************************void Overturn_Char(unsigned char x,unsigned char y,unsigned char wide,unsigned char cor){    unsigned char i,base_x,colour;        if(cor == 1) colour = 0xFF;        if(cor == 0) colour = 0x00;        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_OFF);        if(y == 1 || y == 2)    base_x = 0x80;        if(y == 3 || y == 4)    base_x = 0x88;    if(x % 2)        {            for(i = 0;i < wide; i ++)                {                LCD_WRITE_DAT_CMD(WRCMD,0X80 - 16 + y * 16 + i);                LCD_WRITE_DAT_CMD(WRCMD,base_x+(x/2));                     LCD_WRITE_DAT_CMD(WRDAT,colour);                    LCD_WRITE_DAT_CMD(WRDAT,0x00);                }        }        else        {            for(i = 0;i < wide; i ++)                {                LCD_WRITE_DAT_CMD(WRCMD,0X80 - 16 + y * 16 + i);                LCD_WRITE_DAT_CMD(WRCMD,base_x+(x/2)-1);                     LCD_WRITE_DAT_CMD(WRDAT,0x00);                    LCD_WRITE_DAT_CMD(WRDAT,colour);                }        }                LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);                }
  498. #if 0//**********************************************************//函数名称:Overturn_Font(unsigned char x,unsigned char y,unsigned char wide,unsigned char cor)//函数功能:使用绘图的方法让一个16*16的汉字符反白//形式参数:uunsigned char x,unsigned char y,unsigned char wide,unsigned char cor//                        x取值范围:1~8//                        y取值范围:1~4//          wide取值范围:1~16//行参说明:坐标水平位置,坐标垂直位置,反白行数,要反白还是清除(1:反白,2:清除)//液晶屏坐标说明://                _______________128个象素______________________//                |(1,1)                                                                     (8,1)|        //                |                                                                                          |        //        6        |                                                                                          |        //        4        |                                                                                  |//        个        |                                                                                    |        //        象        |                                                                                          |        //        素        |                                                                                          |//                |(1,4)___________________________________(8,4)|////返回参数:无//使用说明:无//**********************************************************void Overturn_Font(unsigned char x,unsigned char y,unsigned char wide,unsigned char cor){    unsigned char i,base_x,colour;        if(cor == 1) colour = 0xFF;        if(cor == 0) colour = 0x00;        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_OFF);        if(y == 1 || y == 2)    base_x = 0x80;        if(y == 3 || y == 4)    base_x = 0x88;            for(i = 0;i < wide;i ++)        {            LCD_WRITE_DAT_CMD(WRCMD,0X80 - 16 + y * 16 + i); //- 16 + y * 16 + i);            LCD_WRITE_DAT_CMD(WRCMD,base_x+x-1);                 LCD_WRITE_DAT_CMD(WRDAT,colour);                LCD_WRITE_DAT_CMD(WRDAT,colour);        }        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);}
  499. #endif
  500. /******************************************************************************//应用程序用的反白程序////CX为所要反白的行,CY为所要反白的起始列(0-16),width为反白的终止列.//建立日期:2008/04/14//                _______________128个象素______________________//                |(1,1)                                                                     (8,1)|        //                |                                                                                          |        //        6        |                                                                                          |        //        4        |                                                                                  |//        个        |                                                                                    |        //        象        |                                                                                          |        //        素        |                                                                                          |//                |(1,4)___________________________________(8,4)|///******************************************************************************/void convertChar (unsigned char CX, unsigned char CY, unsigned char width,unsigned char YN,unsigned char f) {unsigned char halfLineCnt, basicBlock,lcdPosX,lcdPosY;        LCD_WRITE_DAT_CMD(WRCMD,EXTEND_FUNCTION);
  501. //        if(f==1)        BMP_clear(); //清绘图区        lcdPosY = 0x80;
  502.         if (CX == 0)        {CX = 0x80;        halfLineCnt = 16;        }        else if (CX == 1)        {CX = 0x80;        halfLineCnt = 32;        }        else if (CX == 2)        {CX = 0x88;        halfLineCnt = 16;        }        else if (CX == 3)        {CX = 0x88;        halfLineCnt = 32;        }        lcdPosX = CX + CY;
  503.         for (; halfLineCnt != 0; halfLineCnt--)        {                basicBlock = width;                LCD_WRITE_DAT_CMD(WRCMD,EXTEND_FUNCTION);                LCD_WRITE_DAT_CMD(WRCMD,lcdPosY);      //行位置                LCD_WRITE_DAT_CMD(WRCMD,lcdPosX);      //列位置                LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                for (;basicBlock != 0; basicBlock--)                {                        if (halfLineCnt > 16)                        {                                LCD_WRITE_DAT_CMD(WRDAT,0x00);                        }                        else                        {                                if(YN==1)                                    LCD_WRITE_DAT_CMD(WRDAT,0xff);                                else      LCD_WRITE_DAT_CMD(WRDAT,0x00);                        }                }        lcdPosY++;        }        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);        LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);}/******************************************************************************/



  504.         #if 0
  505. //******************************************************************************//*****************以上为并行工作模式下的基本函数*******************************//******************************************************************************//*********以下为并行工作模式下的功能函数,由基本函数组成************************//******************************************************************************
  506. /***********************************************************第一行:80H ~ 87H第二行:90H ~ 97H第三行:88H ~ 8FH第四行:98H ~ 9FH***********************************************************/
  507. //**********************************************************//函数名称:void Serial_DisplayOneChineseCharacter_WithAddress(unsigned char ucAdd,unsigned char code *p)//函数功能:在(文本区)ucAdd指定的位置显示一个汉字(16*16点阵)//形式参数:unsigned char ucAdd,unsigned char code *p//行参说明:指定的位置,要显示的汉字//地址必须是:80H~8FH,90H~9FH,A0H~AFH,B0H~BFH.//返回参数:无//使用说明:使用之前要初始化液晶//**********************************************************void Serial_DisplayOneChineseCharacter_WithAddress(unsigned char ucAdd,unsigned char *p){    NOP();          LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                          //基本指令动作           Serial_DDRAM_Address_Set(ucAdd);        LCD_WRITE_DAT_CMD(WRDAT,*p);        LCD_WRITE_DAT_CMD(WRDAT,*(p+1));                                                }
  508. //**********************************************************//函数名称:void Serial_DisplayOneASCIICharacter_WithAddress(unsigned char ucAdd,unsigned char ucchar)//函数功能:在(文本区)ucAdd指定的位置显示一个ASCII字符(16*8点阵)//形式参数:unsigned char ucAdd,unsigned char ucchar//地址必须是:80H~8FH,90H~9FH,A0H~AFH,B0H~BFH.//行参说明:指定的位置,要显示的字符//返回参数:无//使用说明:使用之前要初始化液晶//**********************************************************void Serial_DisplayOneASCIICharacter_WithAddress(unsigned char ucAdd,unsigned char ucchar){    NOP();          LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                          //基本指令动作           Serial_DDRAM_Address_Set(ucAdd);        LCD_WRITE_DAT_CMD(WRDAT,ucchar);                                }
  509. //**********************************************************//函数名称:void Serial_DisplayStrings_WithAddress(unsigned char ucAdd,unsigned char code *p)//函数功能:在(文本区)ucAdd指定的位置显示一串字符(或是汉字或是ASCII或是两者混合)//形式参数:unsigned char ucAdd,unsigned char code *p//行参说明:指定的位置,要显示的字符串//地址必须是:80H~8FH,90H~9FH,A0H~AFH,B0H~BFH.//返回参数:无//使用说明:使用之前要初始化液晶]//注意:如果其中的16*8字符个数为奇数,则需要插入空格补位//**********************************************************void Serial_DisplayStrings_WithAddress(unsigned char ucAdd,unsigned char *p){        unsigned char i = 0;        while(*(p+i) != 0)//判断字符串长度                i ++;          LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);                          //基本指令动作           Serial_DDRAM_Address_Set(ucAdd);        for( ;i;i --)                LCD_WRITE_DAT_CMD(WRDAT, *(p++));                                        }
  510. //**********************************************************//函数名称:void Serial_UpRollOneLine(unsigned char ucN)//函数功能:DDRAM(文本区)内容垂直上卷ucN行                //形式参数:unsigned char ucN//行参说明:上卷的行数:0~3//返回参数:无//使用说明:无//注意:该函数不是非常好用,请尽量不要使用//**********************************************************void Serial_UpRollOneLine(unsigned char ucN){        LCD_WRITE_DAT_CMD(WRCMD,EXTEND_FUNCTION);          //扩展指令集        LCD_WRITE_DAT_CMD(WRCMD,ROLLADDRESS_ON);                  //允许输入卷动位址        LCD_WRITE_DAT_CMD(WRCMD,0x40+ucN*0x10);                  //上卷ucN行}
  511. //**********************************************************//函数名称:void Serial_ImgDisplay(flash unsigned char *pic)//函数功能:全屏显示128*64个象素的图形//形式参数:unsigned char code *img//行参说明:要显示的图形//液晶屏坐标说明://                _______________________________________________//                |(1,1)                                                                   (128,1)|        //                |                                                                                          |        //                |                                                                                          |        //                |                                                                                          |//                |                                                                                      |        //                |                                                                                          |        //                |                                                                                          |//                |(1,64)_______________________________(128,64)|////返回参数:无//使用说明:此函数适用于st7920型液晶,并且需要将图片存于FLASH中//**********************************************************void Serial_ImgDisplay(flash unsigned char *pic){         unsigned int x=0;         unsigned char i,j;         LCD_WRITE_DAT_CMD(WRCMD,GRAPH_OFF);                 //扩展指令动作
  512.         for(i=0;i<32;i++)                   //上半屏显示         {                LCD_WRITE_DAT_CMD(WRCMD,0x80|i);             //列位置                 LCD_WRITE_DAT_CMD(WRCMD,0x80);               //行位置                 for(j=0;j<16;j++)                 //256/8=32 byte                 {                           //列位置每行自动增加                         LCD_WRITE_DAT_CMD(WRDAT,*pic);                         pic++;                 }         }
  513.         for(i=0;i<32;i++)                   //下半屏显示         {                 LCD_WRITE_DAT_CMD(WRCMD,0x80|i);               //列位置                 LCD_WRITE_DAT_CMD(WRCMD,0x88);               //行位置                 for(j=0;j<16;j++)                 //256/8=32 byte                 {                         LCD_WRITE_DAT_CMD(WRDAT,*pic);                         pic++;                 }         }        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);                 //扩展指令动作         LCD_WRITE_DAT_CMD(WRCMD,0x30); }
  514. //**********************************************************//函数名称:void Serial_ImgDisplayCharacter(unsigned char x,unsigned char y,unsigned char code *img)//函数功能:使用绘图的方法,在(x,y)处画一个16*16点阵的图案,也可以是字符//形式参数:unsigned char x,unsigned char y,unsigned char code *img//                        x取值范围:0~15//                        y取值范围:0~32 (针对OCMJ4X8C 12864型液晶)        //行参说明:坐标水平位置,坐标垂直位置,要显示的图形//液晶屏坐标说明://                _______________128个象素______________________//                |(0,0)                                                                     (7,0)|        //                |                                                                                          |        //        6        |                                                                                          |        //        4        |(0,31)                                                                        (7,31)|//        个        |(8,0)                                                                        (15,0)|        //        象        |                                                                                          |        //        素        |                                                                                          |//                |(8,31)________________________________(15,31)|////返回参数:无//使用说明:此函数适用于st7920 12864型液晶//**********************************************************void Serial_ImgDisplayCharacter(unsigned char x,unsigned char y,flash unsigned char img[]){          unsigned char i;         LCD_WRITE_DAT_CMD(WRCMD,GRAPH_OFF);                        //先关闭图形显示功能    for(i=0;i<16;i++)           {
  515.                       LCD_WRITE_DAT_CMD(WRCMD,0x80+y+i);                      LCD_WRITE_DAT_CMD(WRCMD,0x80+x);                      LCD_WRITE_DAT_CMD(WRDAT,img[i*2]);                      LCD_WRITE_DAT_CMD(WRDAT,img[i*2+1]);           }        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);                                //最后打开图形显示功能}void Serial_ImgDisplayCharacter1(unsigned char x,unsigned char y,unsigned char m,unsigned char n,flash unsigned char img[]){          unsigned char i;         LCD_WRITE_DAT_CMD(WRCMD,GRAPH_OFF);                        //先关闭图形显示功能    for(i=0;i<16;i++)           {
  516.                       LCD_WRITE_DAT_CMD(WRCMD,0x80+y+i);                      LCD_WRITE_DAT_CMD(WRCMD,0x80+x);                      LCD_WRITE_DAT_CMD(WRDAT,img[i*2]);                      LCD_WRITE_DAT_CMD(WRDAT,img[i*2+1]);           }        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);                                //最后打开图形显示功能}

  517. //**********************************************************//函数名称:void GUI_FontAnywhere(unsigned char x,unsigned char y,//         unsigned char m,unsigned char n,flash unsigned char img[])//函数功能:使用绘图的方法,在(x,y)处画一个m*n大小的点阵的图案,也可以是字符//形式参数:unsigned char x,unsigned char y,unsigned char m,//         unsigned char n,flash unsigned char img[]//                        x取值范围:1~128//                        y取值范围:1~64 //行参说明:坐标水平位置,坐标垂直位置,要显示的图形长 m(只能为8的倍数),//         要显示的图形的宽 n,字模//液晶屏坐标说明://                _______________128个象素______________________//                |(1,1)                                                                   (128,1)|        //                |                                                                                          |        //        6        |                                                                                          |        //        4        |                                                                                  |//        个        |                                                                                    |        //        象        |                                                                                          |        //        素        |                                                                                          |//                |(1,64)_______________________________(128,64)|////返回参数:无//使用说明:横坐标必须为8的倍数//**********************************************************void GUI_FontAnywhere(unsigned char x,unsigned char y,unsigned char m,unsigned char n,flash unsigned char img[]){           unsigned char i,j,count = 0;        unsigned int a = 0;        unsigned char p = 0,q = 0;        unsigned char bit[8];
  518.         LCD_WRITE_DAT_CMD(WRCMD,GRAPH_OFF);                        //先关闭图形显示功能    for(p=0;p<n;p++)                for(q=0;q<(m/8);q++)                  {                        for(i = 0;i < 8;i ++)                            bit[i] = ((img[a]<<i)>>7);                        for(i = 0;i < 8;i ++)                            GUI_Point(x+i+(q*8),y+p,bit[i]);                    a ++;                }               
  519.         LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);                                //最后打开图形显示功能}

  520. //**********************************************************// 名称:GUI_Point(unsigned char y,unsigned char x,unsigned colour)// 功能:在指定位置上画点。// 入口参数:x                指定点所在行的位置//           y                指定点所在列的位置//          color             显示颜色(对于黑白色LCD12864,为0时灭,为1时显示)// 出口参数:无//**********************************************************void GUI_Point(unsigned char y,unsigned char x,unsigned colour){    unsigned char GDRAM_hbit,GDRAM_lbit;    unsigned char x_Dyte,x_byte;                 //定义列地址的字节位,及在字节中的哪1位     unsigned char y_Dyte,y_byte;            x--;y--;                                                                         //定义为上下两个屏(取值为0,1),行地址(取值为0~31)    /***X,Y坐标互换,即普通的X,Y坐标***/    x_Dyte=y/16;                                         //计算在16个字节中的哪一个    x_byte=y&0x0f;                                     //计算在该字节中的哪一位    y_Dyte=x/32;                                         //0为上半屏,1为下半屏    y_byte=x&0x1f;                                     //计算在0~31当中的哪一行        LCD_WRITE_DAT_CMD(WRCMD,0x80+y_byte);                     //设定行地址(y坐标)    LCD_WRITE_DAT_CMD(WRCMD,0x80+x_Dyte+8*y_Dyte);         //设定列地址(x坐标),并通过8*y_Dyte选定上下屏                             //   LCD12864_Read(); //   GDRAM_hbit=LCD12864_Read();                         //读取当前显示高8位数据 //   GDRAM_lbit=LCD12864_Read();                         //读取当前显示低8位数据        GDRAM_lbit=LCD_READByte(0xfe);                         //读取当前显示数据        Delay_us(1);         if(colour==1)    {                 LCD_WRITE_DAT_CMD(WRCMD,0x80+y_byte);                     //设定行地址(y坐标)                LCD_WRITE_DAT_CMD(WRCMD,0x80+x_Dyte+8*y_Dyte);         //设定列地址(x坐标),并通过8*y_Dyte选定上下屏                Delay_us(1);
  521.         if(x_byte<8)                                             //判断其在高8位,还是在低8位                {                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_hbit|(0X01<<(7-x_byte)));     //显示GDRAM区高8位数据                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_lbit);                             //显示GDRAM区低8位数据         }        else        {                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_hbit);                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_lbit|(0x01<<(15-x_byte)));        }     }    else    {                LCD_WRITE_DAT_CMD(WRCMD,0x80+y_byte);                     //设定行地址(y坐标)                LCD_WRITE_DAT_CMD(WRCMD,0x80+x_Dyte+8*y_Dyte);         //设定列地址(x坐标),并通过8*y_Dyte选定上下屏                Delay_us(1);
  522.         if(x_byte<8)                                             //判断其在高8位,还是在低8位                {                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_hbit & ~(0X01<<(7-x_byte)));     //显示GDRAM区高8位数据                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_lbit);                             //显示GDRAM区低8位数据         }        else        {                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_hbit);                        LCD_WRITE_DAT_CMD(WRDAT,GDRAM_lbit & ~(0x01<<(15-x_byte)));        }         }         }

  523. /************************************************************ 名称:GUI_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)* 功能:在指定位置上画线。* 入口参数:x0                指定线起点所在行的位置*           y0           指定线起点所在列的位置*           x1                指定线终点所在行的位置*           y1           指定线终点所在列的位置*          color             显示颜色(对于黑白色LCM,为0时灭,为1时显示)* 出口参数:无/**********************************************************/void GUI_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour){    int temp;    int dx,dy;               //定义起点到终点的横、纵坐标增加值    int s1,s2,status,i;    int Dx,Dy,sub;
  524.     dx = x1 - x0;    if(dx >= 0)                 //X的方向是增加的        s1 = 1;    else                     //X的方向是降低的        s1 = -1;         dy = y1 - y0;                 //判断Y的方向是增加还是降到的    if(dy >= 0)        s2 = 1;    else        s2 =- 1;      Dx = abs(x1-x0);             //计算横、纵标志增加值的绝对值    Dy = abs(y1-y0);           if(Dy > Dx)                                  {                     //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0         temp = Dx;        Dx = Dy;        Dy = temp;    status = 1;    }     else        status = 0;

  525. /*********Bresenham算法画任意两点间的直线********/     sub = Dy + Dy - Dx;                 //第1次判断下个点的位置    for(i = 0;i < Dx;i ++)    {         GUI_Point(x0,y0,colour);           //画点         if(sub >= 0)                                       {             if(status == 1)               //在靠近Y轴区,x值加1                x0 += s1;             else                     //在靠近X轴区,y值加1                               y0 += s2;             sub -= (Dx + Dx);                 //判断下下个点的位置         }         if(status == 1)            y0 += s2;         else                   x0 += s1;         sub += Dy + Dy;             } }

  526.         
  527. /***************************************************************************** 名称:plotC(int x,int y,int xc,int yc,unsigned char colour)* 功能:八分点画圆函数* 入口参数:x                指定线起点所在行的位置*           y           指定线起点所在列的位置*          color             显示颜色(对于黑白色LCM,为0时灭,为1时显示)* 出口参数:无****************************************************************************/void plotC(int x,int y,int xc,int yc,unsigned char colour){    GUI_Point(xc+x,yc+y,colour);    GUI_Point(xc+x,yc-y,colour);    GUI_Point(xc-x,yc+y,colour);    GUI_Point(xc-x,yc-y,colour);    GUI_Point(xc+y,yc+x,colour);    GUI_Point(xc+y,yc-x,colour);    GUI_Point(xc-y,yc+x,colour);    GUI_Point(xc-y,yc-x,colour);}
  528. /***************************************************************************** 名称:GUI_Circle(int xc,int yc,int r,unsigned char colour)* 功能:画圆* 入口参数:xc                圆心的行坐标*           yc           圆心的列坐标*           r                半径*          color             显示颜色(对于黑白色LCM,为0时灭,为1时显示)* 出口参数:无****************************************************************************/void GUI_Circle(int xc,int yc,int r,unsigned char colour){    int x,y,d;    y = r;    d = 3 - (r + r);    x = 0;    while(x <= y)    {        plotC(x,y,xc,yc,colour);        if(d < 0)            d += (x + x + x + x) + 6;        else        {            d+=((x - y) + (x - y) + (x - y) + (x - y)) + 10;            y = y - 1;        }        x = x + 1;    }}
  529. /***************************************************************************** 名称:GUI_Full(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)* 功能:用绘图的方法填充一个矩形* 入口参数:x0                起始点横坐标*           y0           起始点纵坐标*           x1                终止点横坐标*           y1      终止点纵坐标*          color             显示颜色(对于黑白色LCM,为0时灭,为1时显示)* 出口参数:无****************************************************************************/void GUI_Full(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour){    unsigned char i,j;        for(j = y0;j <= y1;j ++)            for(i = x0;i <= x1;i ++)                    GUI_Point(i,j,colour);}#endif//根据朗伯比尔计算吸光度浓度和曲线拟合#include "main.h"

  530. float Clac_Absorbance_600nm(float tem_I,float tem_Ib,float tem_I0,float T_TEST){        float tem1;        float tem2;        float tem_ABS;
  531. //I0>=I        tem1=(tem_I0-tem_Ib);        tem2=(tem_I-tem_Ib);        if(tem2>tem1)        {                tem_ABS = 0;        }        else        {                tem_ABS = log10f(tem1/tem2);        }        T_TEST=tem2/tem1;return tem_ABS; }float Clac_COD(float abs,float k,float b){        return(k*(fabsf(abs))+b);}float Clac_b(float abs,float k,float cod){        return(cod - k*(fabsf(abs)));}float Clac_k(float abs,float cod){        return(cod/(fabsf(abs)));}
  532. unsigned char ONPLAY_cod_K_LCD(float temp_d,unsigned char x, unsigned char y,unsigned char i){unsigned long temp_c;unsigned char num_line;        LCD_set_XY(x,y);        if(temp_d==0)        {                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('0')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('.')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('0')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(' ')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(' ')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(' ')));                i=6;        }        else{        if(temp_d>=1000)        {                temp_c = (unsigned long)fabsf(temp_d*10);                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/10000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%10000)/1000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('.')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));                i=6;        }        else if(temp_d>=100)        {                temp_c = (unsigned long)fabsf(temp_d*100);                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/10000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%10000)/1000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('.')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));                i=6;        }        else if(temp_d>=10)        {                temp_c = (unsigned long)fabsf(temp_d*1000);                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/10000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%10000)/1000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('.')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));                i=6;        }        else if(temp_d>1)        {                temp_c = (unsigned long)fabsf(temp_d*1000);                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/1000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('.')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));                i=6;        }        else         {                temp_c = (unsigned long)fabsf(temp_d*1000);                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('0')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)('.')));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));                i=6;        }                }num_line=i;return num_line;
  533. }
  534. void ONPLAY_ABS_LCD(unsigned char x, unsigned char y,float Absorbance){unsigned int temp_d;float temp;        LCD_set_XY(x,y);        temp = fabsf(Absorbance*1000);        temp_d = (uint)temp;        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d/1000+'0'));        LCD_WRITE_DAT_CMD(WRDAT,'.');        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)((temp_d%1000)/100+'0'));        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d%100/10+'0'));        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d%10+'0'));//        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d%10+'0'));        LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));
  535. }void ONPLAY_ABS_10000_LCD(unsigned char x, unsigned char y,unsigned int Absorbance){unsigned int temp_d;        temp_d = Absorbance;        LCD_set_XY(x,y);        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d/10000+'0'));        LCD_WRITE_DAT_CMD(WRDAT,'.');        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)((temp_d%10000)/1000+'0'));        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d%1000/100+'0'));        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d%100/10+'0'));//        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_d%10+'0'));        LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));}
  536. void ONPLAY_K_LCD(float temp_d,unsigned char x, unsigned char y){unsigned int temp_c;unsigned int  temp_e;        LCD_set_XY(x,y);        if(temp_d>0)        {                temp_c = (unsigned int)temp_d;        }        else        {                temp_c = (unsigned int)fabsf(temp_d);                LCD_WRITE_STR_POSS(x,y,"-");        }        if(temp_c/10000!=0)        {                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/10000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%10000)/1000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));        }        else if(temp_c/1000!=0)        {                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/1000)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%1000)/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));        }        else if(temp_c/100!=0)        {                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/100)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)((temp_c%100)/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));        }        else if(temp_c/10!=0)        {                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c/10)+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));        }        else         {                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)(temp_c%10)+'0'));        }        if(temp_c!=0)        {                temp_e= (uint)((temp_d/(float)temp_c)*1000.0);
  537.                 LCD_WRITE_DAT_CMD(WRDAT,'.');                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)((temp_e%1000)/100+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_e%100/10+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_e%10+'0'));        }        else        {                temp_e= (uint)(temp_d*1000.0);
  538.                 LCD_WRITE_DAT_CMD(WRDAT,'.');                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)((temp_e%1000)/100+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_e%100/10+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_e%10+'0'));        }}
  539. void ONPLAY_Cod_and_K_LCD(unsigned char x, unsigned char y,float temp_cod){        unsigned int temp_r;        LCD_set_XY(x,y);        if(temp_cod<10)        {                temp_r=temp_cod*1000;                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r/1000+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)('.'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));        }        else        {                if(temp_cod > 60000)                {                        temp_r=(unsigned int)temp_cod;                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)('e'));                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)('e'));                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)('r'));                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(' '));                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(' '));                        LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));
  540.                 }                else if(temp_cod >= 6000)                {                        temp_r=(unsigned int)temp_cod;                        if(temp_r/10000 >0)                        {                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r/10000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));                        }                        else                        {                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));                        }
  541.                 }                else if(temp_cod >= 600)                {                        temp_r=(unsigned int)(temp_cod*10);                        if(temp_r/10000 >0)                        {                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r/10000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)'.'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                        }                        else                        {                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)'.'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));                        }                }                else if(temp_cod >= 60)                {                        temp_r=(unsigned int)(temp_cod*100);                        if(temp_r/10000 >0)                        {                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r/10000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)'.'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                        }                        else                        {                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)'.'));                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                                LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)' '));                        }                }                else                 {                        temp_r=(unsigned int)(temp_cod*1000);                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r/10000+'0'));                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10000/1000+'0'));                        LCD_WRITE_DAT_CMD(WRDAT,((unsigned char)'.'));                        LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%1000/100+'0'));                                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%100/10+'0'));                                                LCD_WRITE_DAT_CMD(WRDAT,(unsigned char)(temp_r%10+'0'));                }
  542.         }}
  543. #ifdef POLYFITfloat sum(float *a, uint n) { float sum = 0.0; uint i;
  544.         for(i = 0; i < n; i ++)         sum += a[i];
  545. return sum; }
  546. float sum_ab(float *a,float *b, uint n) { float sum = 0.0; uint i;
  547.         for(i = 0; i < n; i ++)         sum += (a[i]*b[i]);
  548. return sum; } float sum_aa(float *y, uint n) { float sum = 0.0; uint i; unsigned long sum1=0;        for(i = 0; i < n; i ++)         {                        sum1 +=(unsigned long) (y[i]*y[i]);         }        sum = (float)(sum1/10000);        return sum; }
  549. float average(float *a, uint n) {         return sum(a, n) / (float)n; }
  550. float linearregression(float *x, float *y, unsigned int n, float a, float b,float r_line, float s_line) {         float sum_x, sum_y;         float sum_xx, sum_xy,sum_yy;         float xavg, yavg;         float LXY, LXX;         float tem1;        float tem2;        float k;        uint i;
  551.         sum_xx = sum_ab(x, x,n);         sum_xy = sum_ab(x, y,n);         sum_yy = sum_aa(y,n); #ifndef DEBUG_SIMULATOR        TXT_Clear();        LCD_WRITE_STR_POSS(1,0,"sumxx=");        ONPLAY_K_LCD(sum_xx,1, 3);        LCD_WRITE_STR_POSS(2,0,"sumxy=");        ONPLAY_K_LCD(sum_xy,2, 3);        LCD_WRITE_STR_POSS(3,0,"sumyy=");        ONPLAY_K_LCD(sum_yy,3, 3);        LCD_WRITE_STR_POSS(4,0,"请按ok键继续");        wait_ok();#endif        sum_x = sum(x, n);         sum_y = sum(y, n); #ifndef DEBUG_SIMULATOR        TXT_Clear();        LCD_WRITE_STR_POSS(1,0,"sum_x=");        ONPLAY_K_LCD(sum_x,1, 3);        LCD_WRITE_STR_POSS(2,0,"sum_y=");        ONPLAY_K_LCD(sum_y,2, 3);        LCD_WRITE_STR_POSS(4,0,"请按ok键继续");        wait_ok();#endif
  552.         xavg = average(x, n);         yavg = average(y, n);         ONPLAY_K_LCD(xavg,1, 3);#ifndef DEBUG_SIMULATOR        TXT_Clear();        LCD_WRITE_STR_POSS(1,0,"xavg=");        ONPLAY_K_LCD(xavg,1, 3);        LCD_WRITE_STR_POSS(2,0,"yavg=");        ONPLAY_K_LCD(yavg,2, 3);        LCD_WRITE_STR_POSS(4,0,"请按ok键继续");        wait_ok();#endif
  553.         LXY = 0.0;         LXX = 0.0;         for(i = 0; i < n; i ++)         {         LXY += (x[i] - xavg) * (y[i] - yavg); //LXY        LXX += (x[i] - xavg) * (x[i] - xavg); //LXX        } #ifndef DEBUG_SIMULATOR        TXT_Clear();        LCD_WRITE_STR_POSS(1,0,"LXY=");        ONPLAY_K_LCD(LXY,1, 2);        LCD_WRITE_STR_POSS(2,0,"LXX=");        ONPLAY_K_LCD(LXX,2, 2);        LCD_WRITE_STR_POSS(4,0,"请按ok键继续");        wait_ok();#endif
  554.         a = LXY / LXX; //LXY/LXX        b = yavg - a * xavg; //AVG_Y-B*AVG_X
  555.         tem1=(((float)n*sum_xy)-((float)sum_x*sum_y))/100;        tem2=(((float)n*sum_xx)-(sum_x*sum_x))*((float)n*sum_yy-((sum_y*sum_y)/10000));        r_line =(float)(tem1/sqrtf(tem2));
  556.         tem1=sum_xx-(sum_x*sum_x/(float)n);        s_line =(float)(sqrtf((float)(tem1/(float)(n-1))));//s_line =(float)(sqrtf((float)(tem1/(float)(n-1))));#ifndef DEBUG_SIMULATOR        TXT_Clear();        LCD_WRITE_STR_POSS(1,0,"s=");        ONPLAY_K_LCD(s_line,1, 1);
  557.         LCD_WRITE_STR_POSS(2,0,"y=        x+");        LCD_WRITE_STR_POSS(4,0,"r=");        ONPLAY_r_LCD(r_line,4,1);
  558.         ONPLAY_K_LCD(a,2, 1);        ONPLAY_K_LCD(b,3, 1);        LCD_WRITE_STR_POSS(1,7,"按");        LCD_WRITE_STR_POSS(2,7,"ok");        LCD_WRITE_STR_POSS(3,7,"继");        LCD_WRITE_STR_POSS(4,7,"续");        wait_ok();#endif        k=a;        return k;} void line_polyfit_test(void){float X_DATA[10]={0.023,0.058,0.075,0.109,0.142,0.163,0.225,0.288};float Y_DATA[10]={100,200,300,400,500,600,800,1000};float S_line=0.0;float R_line=0.0;float K_line=0.0;float B_line=0.0;        linearregression(X_DATA,Y_DATA,8,K_line,B_line,R_line,S_line);        }#endif
复制代码


积分规则
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-24 03:48 , Processed in 0.043588 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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