//要做成定時器中斷法,節省時間開支
/**************************************
** 說明:線翻轉法進行鍵盤掃描
** 輸出:獲得高低位的掃描值
** 有鍵時需要耗時 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
|