Example #1
0
void Display_Task(void *pvParameters )
{
	static volatile uint8_t str_buf[32];
	task_watches[DISPLAY_TASK].task_status=TASK_ACTIVE;
	while(1)
	{
		vTaskDelay(300);
		if(display_init_counter>=DISPLAY_INIT_PERIOD)
		{
			HD44780_Reinit(HD44780_WIDTH,HD44780_HEIGHT);
			display_init_counter=0;
		}
		else
		{
			display_init_counter++;
		}

		UKS_Sort_Channels(&uks_channels,DRYING_CHANNELS_NUM);

		uint8_t i=0;

		switch(uks_channels.screen)
		{
			case SCREEN_INIT_HEATER:
			{
				sprintf(str_buf,"   Ёpoеecc Ѕaґpeіa  ");/*  Процесс нагрева  */
				HD44780_Puts(0,0,str_buf);
				sprintf(str_buf,"Ёo¶a»y№cїa,ѕoгo¶гёїe");/*Пожалуйста,подождите*/
				HD44780_Puts(0,1,str_buf);
				sprintf(str_buf,"                    ");
				HD44780_Puts(0,2,str_buf);

				float temp=uks_channels.heater_temperature;
				if(temp>=0)
				{
					sprintf(str_buf,"Haґpeіaїe»Д %3d.%01d \xEF\x43",(uint16_t)temp,(uint16_t)(temp*10)%10);
				}
				else
				{
					sprintf(str_buf,"Haґpeіaїe»Д-%3d.%01d \xEF\x43",(uint16_t)(-temp),(uint16_t)(((-temp)*10))%10);
				}


				HD44780_Puts(0,3,str_buf);
			}
			break;

			case SCREEN_HEATER_INIT_TIMEOUT:
			{
				sprintf(str_buf,"       OБёІєa       ");/*       Ошибка       */
				HD44780_Puts(0,0,str_buf);
				sprintf(str_buf,"    BpeјЗ Ѕaґpeіa   ");//    Время нагрева
				HD44780_Puts(0,1,str_buf);
				sprintf(str_buf,"      ѕpeіГБeЅo     ");//     превышено
				HD44780_Puts(0,2,str_buf);
				sprintf(str_buf,"                    ");
				HD44780_Puts(0,3,str_buf);
			}
			break;

			case SCREEN_CHANNELS_FIRST:
			{
				for(i=0;i<HD44780_HEIGHT;i++)
				{
					float temp=uks_channels.drying_channel_sort_list[i]->temperature;
					if(temp<0.0)
					{
						temp=0.0;
					}
					sprintf(str_buf,"%1d %3d.%01d \xEF\x43 %s",(uks_channels.drying_channel_sort_list[i]->number+1),(uint16_t)temp,(uint16_t)(temp*10)%10,&drying_states[uks_channels.drying_channel_sort_list[i]->drying_state]);
					HD44780_Puts(0,i,str_buf);
				}
			}
			break;

			case SCREEN_CHANNELS_SECOND:
			{
				for(i=HD44780_HEIGHT;i<DRYING_CHANNELS_NUM;i++)
				{
					float temp=uks_channels.drying_channel_sort_list[i]->temperature;
					if(temp<0.0)
					{
						temp=0.0;
					}
					sprintf(str_buf,"%1d %3d.%01d \xEF\x43 %s",(uks_channels.drying_channel_sort_list[i]->number+1),(uint16_t)temp,(uint16_t)(temp*10)%10,&drying_states[uks_channels.drying_channel_sort_list[i]->drying_state]);
					HD44780_Puts(0,(i-HD44780_HEIGHT),str_buf);
				}

				for(i=DRYING_CHANNELS_NUM-HD44780_HEIGHT;i<HD44780_HEIGHT;i++)
				{
					sprintf(str_buf,"                    ");
					HD44780_Puts(0,i,str_buf);
				}

			}
			break;

			case SCREEN_HEATER:
			{
				float temp=uks_channels.heater_temperature;


				sprintf(str_buf,"                    ");
				HD44780_Puts(0,0,str_buf);
				if(temp>=0)
				{
					sprintf(str_buf,"Haґpeіaїe»Д %3d.%01d \xEF\x43",(uint16_t)temp,(uint16_t)(temp*10)%10);
				}
				else
				{
					sprintf(str_buf,"Haґpeіaїe»Д-%3d.%01d \xEF\x43",(uint16_t)(-temp),(uint16_t)(((-temp)*10))%10);
				}
				HD44780_Puts(0,1,str_buf);
				sprintf(str_buf,"                    ");
				HD44780_Puts(0,2,str_buf);
				HD44780_Puts(0,3,str_buf);
			}
			break;

			case SCREEN_ERROR:
			{
				switch(uks_channels.device_error)
				{
					case ERROR_PHAZE:
					{
						sprintf(str_buf,"       OБёІєa       ");/*       Ошибка       */
						HD44780_Puts(0,0,str_buf);
						sprintf(str_buf,"        Єa·a        ");//        Фаза
						HD44780_Puts(0,1,str_buf);
						sprintf(str_buf,"    oїcyїcїіyeї     ");//    отсутствует
						HD44780_Puts(0,2,str_buf);
						sprintf(str_buf,"                    ");
						HD44780_Puts(0,3,str_buf);
					}
					break;

					case ERROR_HEATER_RELAY:
					{
						sprintf(str_buf,"       OБёІєa       ");/*       Ошибка       */
						HD44780_Puts(0,0,str_buf);
						sprintf(str_buf,"Haґpeіaїe»Д ё»ё pe»e");//Нагреватель или реле
						HD44780_Puts(0,1,str_buf);
						sprintf(str_buf,"     ЅeёcѕpaіЅГ     ");//     неисправны
						HD44780_Puts(0,2,str_buf);
						sprintf(str_buf,"                    ");
						HD44780_Puts(0,3,str_buf);
					}
					break;

					case ERROR_RELAY:
					{
						sprintf(str_buf,"       OБёІєa       ");/*       Ошибка       */
						HD44780_Puts(0,0,str_buf);
						sprintf(str_buf,"        Pe»e        " );//        Реле
						HD44780_Puts(0,1,str_buf);
						sprintf(str_buf,"     ЅeёcѕpaіЅo     ");//     неисправно
						HD44780_Puts(0,2,str_buf);
						sprintf(str_buf,"                    ");
						HD44780_Puts(0,3,str_buf);
					}
					break;

					default:
					{
						uks_channels.screen=SCREEN_CHANNELS_FIRST;
					}
				}
			}
			break;

			default:
			{
				uks_channels.screen=SCREEN_CHANNELS_FIRST;
			}
		}
		task_watches[DISPLAY_TASK].counter++;
	}
}
int main(void) {
    TRIS_KEY1 = 1;
    TRIS_KEY2 = 1;
    TRIS_LED1 = 0;
    TRIS_LED2 = 0;
    LAT_LED1 = 0;
    LAT_LED2 = 0;

    /* External Interrupts Configuration */
    INTCONbits.INT0E = 1; /* Enable Interrupt 0 (RB0 as interrupt) */
    INTCON2bits.INTEDG0 = 1; /* Cause Interrupt 0 at rising edge */
    INTCONbits.INT0F = 0; /* Clear Interrupt 0 flag */
    INTCON3bits.INT1E = 1; /* Enable Interrupt 1 (RB1 as interrupt) */
    INTCON2bits.INTEDG1 = 1; /* Cause Interrupt 1 at rising edge */
    INTCON3bits.INT1F = 0; /* Clear Interrupt 0 flag */
    ei(); /* Global Interrupt Enable */

    /* Initialize LCD 16 cols x 2 rows */
    HD44780_Init(16, 2);
    HD44780_Puts(3, 0, "PIC18F4520");
    HD44780_Puts(0, 1, "16x2 HD44780 LCD");
    Delayms(2000);
    
    SSEG_Init();
    KEYPAD_Init();
    
    OpenADC(ADC_FOSC_4 &
            ADC_RIGHT_JUST &
            ADC_0_TAD,
            ADC_CH0 &
            ADC_REF_VDD_VSS &
            ADC_INT_OFF,
            ADC_1ANA);
    Delay(50);
    
    /* Loop forever */
    while(1) {
        if (state == STATE_LCD) {
            counter = 0;
            lcd_flag = 0;
            while(lcd_flag == 0) {
                HD44780_Clear();
                Delayms(250);
                HD44780_Clear();
                HD44780_Puts(0, 0, "1.LCD TEST");
                HD44780_Puts(0, 1, "<<ADC      LED>>");
                Delayms(250);
                counter++;
                if(counter > 3) {counter = 0; break;}
            }
            HD44780_Clear();
            HD44780_Puts(0, 0, "1.LCD TEST");
            HD44780_Puts(0, 1, "<<ADC      LED>>");
            
            while(lcd_flag == 0){
                HD44780_Clear();                
                HD44780_Puts(0, 0, "PRESS KEY1 FOR");
                HD44780_Puts(0, 1, "LEFT");
                Delayms(500);
                HD44780_Clear();
                HD44780_Puts(0, 0, "PRESS KEY2 FOR");
                HD44780_Puts(0, 1, "RIGHT");
                Delayms(500);
                counter++;
                if(counter > 3) {counter = 0; break;}
            }
        }
        else if (state == STATE_LED) {
            counter = 0;
            led_flag = 0;
            while(led_flag == 0) {
                HD44780_Clear();
                Delayms(250);
                HD44780_Clear();
                HD44780_Puts(0, 0, "2.LED TEST");
                HD44780_Puts(0, 1, "<<LCD     SSEG>>");
                Delayms(250);
                counter++;
                if(counter > 3) {counter = 0; break;}
            }
            HD44780_Clear();
            HD44780_Puts(0, 0, "2.LED TEST");
            HD44780_Puts(0, 1, "<<LCD     SSEG>>");
            
            while(led_flag == 0) {
                LAT_LED1 = 1;
                LAT_LED2 = 0;
                Delayms(50);
                LAT_LED1 = 0;
                LAT_LED2 = 1;
                Delayms(50);
            }
            LAT_LED2 = 0;
        }
        else if (state == STATE_SSEG) {
            counter = 0;
            sseg_flag = 0;
            while(sseg_flag == 0) {
                HD44780_Clear();
                Delayms(250);
                HD44780_Clear();
                HD44780_Puts(0, 0, "3.SSEG TEST");
                HD44780_Puts(0, 1, "<<LED   KEYPAD>>");
                Delayms(250);
                counter++;
                if(counter > 3) {counter = 0; break;}
            }
            HD44780_Clear();
            HD44780_Puts(0, 0, "3.SSEG TEST");
            HD44780_Puts(0, 1, "<<LED   KEYPAD>>");

            while(sseg_flag == 0) {
                SSEG_Print(1,sseg_counter%10);
                Delayms(10);
                SSEG_Print(2,sseg_counter/10);
                Delayms(10);
                sseg_counter++;
                if(sseg_counter > 99) sseg_counter = 0;
            }
            LATCbits.LATC0 = 0;
            LATCbits.LATC5 = 0;
        }
        else if (state == STATE_KEYPAD) {
            counter = 0;
            keypad_flag = 0;
            while(keypad_flag == 0) {
                HD44780_Clear();
                Delayms(250);
                HD44780_Clear();
                HD44780_Puts(0, 0, "4.KEYPAD TEST");
                HD44780_Puts(0, 1, "<<SSEG     ADC>>");
                Delayms(250);
                counter++;
                if(counter > 3) {counter = 0; break;}
            }
            HD44780_Clear();
            HD44780_Puts(0, 0, "4.KEYPAD TEST");
            HD44780_Puts(0, 1, "<<SSEG     ADC>>");

            while(keypad_flag == 0) {
                int_key = KEYPAD_Read();
                char_key = (char)KEYPAD_KeytoASCII(int_key); 
                HD44780_CursorSet(0,0);
                if(int_key != 0xFF)
                    printf("4.KEYPAD TEST: %c", char_key);
                Delayms(50);
            }
        }
        else if (state == STATE_ADC) {            
            counter = 0;
            adc_flag = 0;
            while(adc_flag == 0) {
                HD44780_Clear();
                Delayms(250);
                HD44780_Clear();
                HD44780_Puts(0, 0, "5.ADC TEST");
                HD44780_Puts(0, 1, "<<KEYPAD   LCD>>");
                Delayms(250);
                counter++;
                if(counter > 3) {counter = 0; break;}
            }
            HD44780_Clear();
            HD44780_Puts(0, 0, "5.ADC TEST");
            HD44780_Puts(0, 1, "<<KEYPAD   LCD>>");

            while(adc_flag == 0){
                ConvertADC();
                while( BusyADC() );
                adcin = 1023 - ReadADC();
                dcf_old = dcf;
                dcf = (1-lamda)*dcf + lamda*adcin;
                if(dcf != dcf_old) {
                    HD44780_CursorSet(0,0);
                    printf("5.ADC TEST: %4d", (int)dcf);
                }
            }
        }
        else state = STATE_LCD;        
    }
}