找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4246|回复: 1
收起左侧

avr 12864 矩阵键盘

[复制链接]
ID:57823 发表于 2013-12-12 15:21 | 显示全部楼层 |阅读模式
//要做成定时器中断法,节省时间开支
/**************************************
** 说明:线翻转法进行键盘扫描
** 输出:获得高低位的扫描值
** 有键时需要耗时 14ms
**************************************/
unsigned char key_scan(void)
{
unsigned char temp=0,key=0;
        KEY_DDR  = 0xF0;  //高四位输出0,键按下,则对应的值为0
        KEY_PORT = 0x0F;   //低四位输入,内部电阻上拉,没有键按下时为高
        temp = KEY_PIN&0x0F;//与掉高四位
        if(temp==0x0F)
        {
                return 0; // 无按键返回
        }
        else
        {
                Delay_ms(10);
                temp = KEY_PIN&0x0F;   //延时去抖后再检测
                if(temp==0x0F)
                return 0;
                else
                key=temp;
        }
        //翻转
        KEY_DDR  = 0x0F; //低四位输出0,键按下,则对应的值为0
        KEY_PORT = 0xF0;  //高四位输入,内部电阻上拉,没有键按下时为高
        Delay_ms(3);     
        //延时等待稳定

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


        return key;
}
/**************************************
** 说明:获得键盘的值  
** 内部调用函数key_scan
** 输出:实际键值
**************************************/
unsigned char get_key(unsigned char key_get)
{
        switch (key_get)
        {/*将按键码转换成键值*/
                case  Key_0_zero: LCD_WRITE_DAT_CMD(WRDAT,'0');
                        return 0;
                case  Key_1_BLACK: LCD_WRITE_DAT_CMD(WRDAT,'1');
                        return 1;
                case  Key_2_PRINT: LCD_WRITE_DAT_CMD(WRDAT,'2');
                        return 2;
                case  Key_3_REPORT: LCD_WRITE_DAT_CMD(WRDAT,'3');
                        return 3;
                case  Key_4_START: LCD_WRITE_DAT_CMD(WRDAT,'4');
                        return 4;
                case  Key_5_CURVE: LCD_WRITE_DAT_CMD(WRDAT,'5');
                        return 5;
                case  Key_6_TIME: LCD_WRITE_DAT_CMD(WRDAT,'6');
                        return 6;
                case  Key_7_CHECK: LCD_WRITE_DAT_CMD(WRDAT,'7');
                        return 7;
                case  Key_8_SAVE: LCD_WRITE_DAT_CMD(WRDAT,'8');
                        return 8;
                case  Key_9_CORRECTION: LCD_WRITE_DAT_CMD(WRDAT,'9');
                        return 9;
//                case  Key_SET: LCD_WRITE_DAT_CMD(WRDAT,'.');
//                        return '.';
                default : return 0x00;
        }
}


/**************************************
** 说明:获得键盘的值  
** 内部调用函数key_scan
** 输出:实际键值
**************************************/
unsigned char run_key(unsigned char key_get)
{
        switch (key_get)
        {/*将按键码转换成键值*/
                case  Key_0_zero:
                        LCD_WRITE_DAT_CMD(WRDAT,'0');
                        return 0;
                case  Key_1_BLACK:
                        LCD_WRITE_DAT_CMD(WRDAT,'1');
                        return 1;
                case  Key_2_PRINT:
                        LCD_WRITE_DAT_CMD(WRDAT,'2');
                        return 2;
                case  Key_3_REPORT:
                        LCD_WRITE_DAT_CMD(WRDAT,'3');
                        return 3;
                case  Key_4_START:
                        LCD_WRITE_DAT_CMD(WRDAT,'4');
                        return 4;
                case  Key_5_CURVE: //进入标定程序
                        LCD_WRITE_DAT_CMD(WRDAT,'5');
                        return 5;
                case  Key_6_TIME:
                        LCD_WRITE_DAT_CMD(WRDAT,'6');
                        return 6;
                case  Key_7_CHECK:
                        LCD_WRITE_DAT_CMD(WRDAT,'7');
                        return 7;
                case  Key_8_SAVE:
                        LCD_WRITE_DAT_CMD(WRDAT,'8');
                        return 8;
                case  Key_9_CORRECTION:
                        LCD_WRITE_DAT_CMD(WRDAT,'9');
                        return 9;
                case  Key_OK:
                        return 'O';
                case  Key_Cannel:
                        return 'C';
                default : return 0xFF;
        }
}
extern unsigned char l_tmpdate[7];
//   0    1    2   3    4    5    6
//  秒分时日月周年09-11-20 12:00:00
void time_keynum_task(unsigned char ddram_addrc)
{
unsigned char key_test=0;
unsigned char i=1;
unsigned char j[8]={0};
        convertChar(X_SHI,Y_SHI,2,FANBAI,1);
        Read_RTC();

                j[2]=(l_tmpdate[2]/16)*10+l_tmpdate[2]%16;
                j[1]=(l_tmpdate[1]/16)*10+l_tmpdate[1]%16;
                j[0]=(l_tmpdate[0]/16)*10+l_tmpdate[0]%16;
                j[6]=(l_tmpdate[6]/16)*10+l_tmpdate[6]%16;
                j[4]=(l_tmpdate[4]/16)*10+l_tmpdate[4]%16;
                j[3]=(l_tmpdate[3]/16)*10+l_tmpdate[3]%16;
                j[5]=(l_tmpdate[5]/16)*10+l_tmpdate[5]%16;

        while(1)
        {
                Delay_ms(100);
                key_test = key_scan();
                if(key_test !=0)
                {       
                        if(key_test==Key_OK)
                        {
                                ALARM();
                                convertChar(X_XINGQI,Y_XINGQI,2,QUXIAOFANBAI,1);
                                convertChar(X_SHI,Y_SHI,2,QUXIAOFANBAI,1);
                                convertChar(X_FEN,Y_FEN,2,QUXIAOFANBAI,1);
                                convertChar(X_MIAO,Y_MIAO,2,QUXIAOFANBAI,1);
                                convertChar(X_NIAN,Y_NIAN,2,QUXIAOFANBAI,1);
                                convertChar(X_YUE,Y_YUE,2,QUXIAOFANBAI,1);
                                close_Cursor_Blink();
                                Set_RTC();
                                break;
                        }
                        else if(key_test==Key_Cannel)       
                        {
                                ALARM();
                                convertChar(X_XINGQI,Y_XINGQI,2,QUXIAOFANBAI,1);
                                convertChar(X_SHI,Y_SHI,2,QUXIAOFANBAI,1);
                                convertChar(X_FEN,Y_FEN,2,QUXIAOFANBAI,1);
                                convertChar(X_MIAO,Y_MIAO,2,QUXIAOFANBAI,1);
                                convertChar(X_NIAN,Y_NIAN,2,QUXIAOFANBAI,1);
                                convertChar(X_YUE,Y_YUE,2,QUXIAOFANBAI,1);
                                break;
                        }
                        else if(key_test==Key_6_TIME)
                        {
                                ALARM();
                                if(i==1)
                                {
                                        convertChar(X_SHI,Y_SHI,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_FEN,Y_FEN,2,FANBAI,1);
                                        i=2;
                                }//小时
                                else if(i==2)
                                {
                                        convertChar(X_FEN,Y_FEN,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_MIAO,Y_MIAO,2,FANBAI,1);
                                        //反白
                                        i=3;
                                }//分钟
                                else if(i==3)
                                {
                                        convertChar(X_MIAO,Y_MIAO,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_NIAN,Y_NIAN,2,FANBAI,1);
                                        //反白
                                        i=4;
                                }//秒钟
                                else if(i==4)
                                {
                                        convertChar(X_NIAN,Y_NIAN,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_YUE,Y_YUE,2,FANBAI,1);
                                        //反白
                                        i=5;
                                }//年
                                else if(i==5)
                                {
                                        convertChar(X_YUE,Y_YUE,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_RI,Y_RI,2,FANBAI,1);
                                        //反白
                                        i=6;
                                }//月
                                else if(i==6)
                                {
                                        convertChar(X_RI,Y_RI,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_XINGQI,Y_XINGQI,2,FANBAI,1);
                                        //反白
                                        i=7;
                                }//日
                       
                                else if(i==7)
                                {
                                        convertChar(X_XINGQI,Y_XINGQI,2,QUXIAOFANBAI,1);
                                        //取消反白
                                        convertChar(X_SHI,Y_SHI,2,FANBAI,1);
                                        //反白
                                        i=1;
                                }
                        }
                        else
                        {
                                if(i==1)
                                {
                                        j[2]=time_shi_keynum_task(0x81,key_test,j[2]);
                                        l_tmpdate[2]=(j[2]/10)*16+j[2]%10;
                                }//小时
                                else if(i==2)
                                {
                                        j[1]=time_feng_keynum_task(0x83,key_test,j[1]);
                                        l_tmpdate[1]=(j[1]/10)*16+j[1]%10;
                                }//分钟
                                else if(i==3)
                                {
                                        j[0]=time_MIAO_keynum_task(0x85,key_test,j[0]);
                                        l_tmpdate[0]=(j[0]/10)*16+j[0]%10;
                                }//秒钟
                                else if(i==4)
                                {
                                        j[6]=time_nian_keynum_task(0x91,key_test,j[6]);
                                        l_tmpdate[6]=(j[6]/10)*16+j[6]%10;
                                }//年
                                else if(i==5)
                                {
                                        j[4]=time_yue_keynum_task(0x93,key_test,j[4]);
                                        l_tmpdate[4]=(j[4]/10)*16+j[4]%10;
                                }//月
                                else if(i==6)
                                {
                                        j[3]=time_ri_keynum_task(0x95,key_test,j[3]);
                                        l_tmpdate[3]=(j[3]/10)*16+j[3]%10;
                                }//日
                       
                                else if(i==7)
                                {
                                        j[5]=time_xingqi_keynum_task(0x9a,key_test,j[5]);
                                        l_tmpdate[5]=(j[5]/10)*16+j[5]%10;
                                        if(j[5]==1)LCD_WRITE_STR_POSS(4,1,"星期一");
                                        else if(j[5]==2)LCD_WRITE_STR_POSS(4,1,"星期二");
                                        else if(j[5]==3)LCD_WRITE_STR_POSS(4,1,"星期三");
                                        else if(j[5]==4)LCD_WRITE_STR_POSS(4,1,"星期四");
                                        else if(j[5]==5)LCD_WRITE_STR_POSS(4,1,"星期五");
                                        else if(j[5]==6)LCD_WRITE_STR_POSS(4,1,"星期六");
                                        else if(j[5]==7)LCD_WRITE_STR_POSS(4,1,"星期日");
                                }
                        }
                }

        }

}



unsigned char time_shi_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        //反白
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==23)
                        j==23;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==0)
                        j=0;
                else
                        j--;
               
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
        LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
        return(j);
}

unsigned char  time_feng_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==59)
                        j==59;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==0)
                        j=0;
                else
                        j--;
               
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
        LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
return(j);
}
unsigned char  time_MIAO_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==59)
                        j==59;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==0)
                        j=0;
                else
                        j--;
               
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
        LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
        return(j);
}

unsigned char  time_nian_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==99)
                        j==99;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==0)
                        j=0;
                else
                        j--;
               
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
        LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
        return(j);
}

unsigned char  time_yue_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==12)
                        j==12;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==1)
                        j=1;
                else
                        j--;
               
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, (j)/10+'0');
        LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');
        return(j);
}

unsigned char  time_ri_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==32)
                        j==32;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==1)
                        j=1;
                else
                        j--;
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, j/10+'0');
        LCD_WRITE_DAT_CMD(WRDAT, j%10+'0');
        return(j);
}

unsigned char  time_xingqi_keynum_task(unsigned char ddram_addrc,unsigned char key_test,unsigned char j)
{
        if(key_test==Key_Down)
        {
                ALARM();
                if(j==7)
                        j==7;
                else
                        j++;
               
        }
        else if(key_test==Key_Up)
        {
                ALARM();
                if(j==1)
                        j=1;
                else
                        j--;
               
        }
        Display_Cursor_Blink(ddram_addrc);
        close_Cursor_Blink();
        LCD_WRITE_DAT_CMD(WRDAT, (j)%10+'0');

        if((j)==1)LCD_WRITE_STR_POSS(4,1,"星期一");
        else if((j)==2)LCD_WRITE_STR_POSS(4,1,"星期二");
        else if((j)==3)LCD_WRITE_STR_POSS(4,1,"星期三");
        else if((j)==4)LCD_WRITE_STR_POSS(4,1,"星期四");
        else if((j)==5)LCD_WRITE_STR_POSS(4,1,"星期五");
        else if((j)==6)LCD_WRITE_STR_POSS(4,1,"星期六");
        else if((j)==7)LCD_WRITE_STR_POSS(4,1,"星期日");
        return(j);
}
/****************************************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"

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);
}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);}
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);}
unsigned char LCD_READByte(unsigned char cmd)//读一字节{        unsigned char dat;        LCD_DATA_IN;
        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;}
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;}

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;
        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++;        }
        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) //初始化液晶{
        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的延时程序
}
void lcd_clear(void)        //清屏函数{LCD_WRITE_DAT_CMD(WRCMD,BASIC_FUNCTION);LCD_WRITE_DAT_CMD(WRCMD,0x01);}
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);     }}
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);}}
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);}
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);
        while(buff[i]!='\0')        {           LCD_WRITE_DAT_CMD(WRDAT,buff[i]);//        Delay_us(10);           i++;        }}


//=======================================================================

/*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++]);}
}
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++));        }}
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++));               
}
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);}*/


//*************************************************************//*函数名称: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}
//*******************************************************************************//*函数名称: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);                }
#endif//**********************************************************
//函数名称: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);                }
#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);}
#endif
/******************************************************************************//应用程序用的反白程序////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);
//        if(f==1)        BMP_clear(); //清绘图区        lcdPosY = 0x80;
        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;
        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);}/******************************************************************************/



        #if 0
//******************************************************************************//*****************以上为并行工作模式下的基本函数*******************************//******************************************************************************//*********以下为并行工作模式下的功能函数,由基本函数组成************************//******************************************************************************
/***********************************************************第一行:80H ~ 87H第二行:90H ~ 97H第三行:88H ~ 8FH第四行:98H ~ 9FH***********************************************************/
//**********************************************************//函数名称: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));                                                }
//**********************************************************//函数名称: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);                                }
//**********************************************************//函数名称: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++));                                        }
//**********************************************************//函数名称: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行}
//**********************************************************//函数名称: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);                 //扩展指令动作
        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++;                 }         }
        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); }
//**********************************************************//函数名称: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++)           {
                      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++)           {
                      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 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];
        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 ++;                }               
        LCD_WRITE_DAT_CMD(WRCMD,GRAPH_ON);                                //最后打开图形显示功能}

//**********************************************************// 名称: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);
        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);
        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)));        }         }         }

/************************************************************ 名称: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;
    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;

/*********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;             } }

       
/***************************************************************************** 名称: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);}
/***************************************************************************** 名称: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;    }}
/***************************************************************************** 名称: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"

float Clac_Absorbance_600nm(float tem_I,float tem_Ib,float tem_I0,float T_TEST){        float tem1;        float tem2;        float tem_ABS;
//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)));}
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;
}
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)' '));
}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)' '));}
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);
                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);
                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'));        }}
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)' '));
                }                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)' '));                        }
                }                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'));                }
        }}
#ifdef POLYFITfloat sum(float *a, uint n) { float sum = 0.0; uint i;
        for(i = 0; i < n; i ++)         sum += a[i];
return sum; }
float sum_ab(float *a,float *b, uint n) { float sum = 0.0; uint i;
        for(i = 0; i < n; i ++)         sum += (a[i]*b[i]);
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; }
float average(float *a, uint n) {         return sum(a, n) / (float)n; }
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;
        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
        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
        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
        a = LXY / LXX; //LXY/LXX        b = yavg - a * xavg; //AVG_Y-B*AVG_X
        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));
        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);
        LCD_WRITE_STR_POSS(2,0,"y=        x+");        LCD_WRITE_STR_POSS(4,0,"r=");        ONPLAY_r_LCD(r_line,4,1);
        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


回复

使用道具 举报

ID:103094 发表于 2016-1-25 20:03 | 显示全部楼层
还不错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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