//要做成定时器中断法,节省时间开支
/**************************************
** 说明:线翻转法进行键盘扫描
** 输出:获得高低位的扫描值
** 有键时需要耗时 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
|