📄 main.c
字号:
void Task_Keypad(void)
{
static char pot;
for(;;)
{
OS_WaitBinSem(DISPLAY, task_keypad1);
PORTD = 0x0F; //LED'S OFF
TRISB = 0xF0; //RB7:RB4 = INPUTS,RB3:RB0 = OUTPUTS
switch(ButtonPress(0b00001110) )
{
case 0x7E: //SET LOW AND HIGH TEMPS
PORTD = 0x00; //TURN ON DIGITS TO
TRISB = 0x00; // SHOW TEMP SETTING
PORTB = 0x00; // ACTIVATION
OS_Delay(200, task_keypad2);
//GET LOW TEMPERATURE LIMIT
PEIE = 0; //INTERRUPT DISABLED
Low_Hi = 0;
BcdConv(Keys()); //GET 1ST DIGIT
while( PORTB != 0xF0 );
BcdConv(Keys()); //GET 2ND DIGIT
while( PORTB != 0xF0 );
BcdConv(Keys()); //GET 3RD DIGIT
low = Low_Hi;
Display(low); //DISPLAY LOW TEMP
PORTD = 0x0F; //LED'S OFF
TRISB = 0xF0; //RB7:RB4 = INPUTS,RB3:RB0 = OUTPUTS
//GET HIGH TEMPERATURE LIMIT
Low_Hi = 0;
BcdConv(Keys()); //GET 1ST DIGIT
while( PORTB != 0xF0 );
BcdConv(Keys()); //GET 2ND DIGIT
while( PORTB != 0xF0 );
BcdConv(Keys()); //GET 3RD DIGIT
high = Low_Hi;
Display(high); //DISPLAY HIGH TEMP
PEIE = 1; //INTERRUPT RE-ENABLED
break;
//POTENTIOMETER SELECTION
case 0xEE: //#1
pot = 1;
OSSignalMsg(POTVAL,(OStypeMsgP)&pot); //SIGNAL task_pots() W/ POT-1
break;
case 0xDE: //#4
pot = 4;
OSSignalMsg(POTVAL,(OStypeMsgP)&pot); //SIGNAL task_pots() W/ POT-4
break;
default:
break;
}
if(ButtonPress(0b00001101) == 0xED) //#2
{
pot = 2;
OSSignalMsg(POTVAL,(OStypeMsgP)&pot); //SIGNAL task_pots() W/ POT-2
}
switch(ButtonPress(0b00001011) )
{
case 0xEB:
pot = 3; //#3
OSSignalMsg(POTVAL,(OStypeMsgP)&pot); //SIGNAL task_pots() W/ POT-3
break;
//EEPROM BUTTON
case 0x7B:
OSSignalBinSem(REEPROM); //SIGNAL task_reeprom()
break;
default:
break;
}
//ZONE BUTTONS
switch(ButtonPress(0b00000111))
{
case 0xE7:
zone_dis = &temp1; //ZONE 1 BUTTON
break;
case 0xD7:
zone_dis = &temp2; //ZONE 2 BUTTON
break;
case 0xB7:
zone_dis = &temp3; //ZONE 3 BUTTON
break;
case 0x77:
zone_dis = &temp4; //ZONE 4 BUTTON
break;
default:
break;
}
OSSignalBinSem(DISPLAY);
OS_Delay(10,task_keypad3); //DELAYED FOR 20mS
}
}
void Task_Display(void)
{
unsigned char v1,v2,v3;
unsigned char dis_temp;
for(;;)
{
OS_WaitBinSem(DISPLAY, task_display1);
dis_temp = *zone_dis;
v1 = dis_temp/0x64; //FIND FIRST DISPLAY DIGIT
v2 = (dis_temp-(v1*0x64))/10; //FIND SECOND DIGIT
v3 = (dis_temp-(v1*0x64)-(v2*10)); //FIND THIRD DIGIT
WriteSevenSegment(0, 1); //SEND SEGMENT VALUE AND DIGIT 1
Delay(100); //DIGIT-ON DELAY
WriteSevenSegment(v1, 2);
Delay(100);
WriteSevenSegment(v2, 3);
Delay(100);
WriteSevenSegment(v3, 4);
Delay(100);
PORTB = 0xFF; //TURN OFF LAST DIGIT
OSSignalBinSem(DISPLAY);
OS_Delay(1, task_display2); //DELAYED FOR 2mS
}
}
void Task_Usart(void)
{
unsigned char v1,v2,v3,v2A,v3A,v2B,v3B,v2C,v3C,v2D,v3D;
for(;;)
{
ReadUSART();
if(ReadUSART() == 0x7A) //ASCII CHARACTER z
{
v1 = temp1 / 0x64; //CONVERT TEMP1 FOR DISPLAY
v2 = (temp1 - (v1*0x64))/10;
v3 = (temp1 - (v1*0x64) - (v2*10));
v2A = v2, v3A = v3;
v1 = temp2 / 0x64; // TEMP2
v2 = (temp2 - (v1*0x64))/10;
v3 = (temp2 - (v1*0x64) - (v2*10));
v2B = v2, v3B = v3;
v1 = temp3 / 0x64; // TEMP3
v2 = (temp3 - (v1*0x64))/10;
v3 = (temp3 - (v1*0x64) - (v2*10));
v2C = v2, v3C = v3;
v1 = temp4 / 0x64; // TEMP4
v2 = (temp4 - (v1*0x64))/10;
v3 = (temp4 - (v1*0x64) - (v2*10));
v2D = v2, v3D = v3;
Z1[15] = v2A + '0';
Z1[16] = v3A + '0';
Z1[21] = v2B + '0';
Z1[22] = v3B + '0';
Z1[27] = v2C + '0';
Z1[28] = v3C + '0';
Z1[33] = v2D + '0';
Z1[34] = v3D + '0';
WriteUSARTBuffer(Z1,39); //WRITE STRING Z1 FOR 39 BYTES
}
OS_Delay(400, task_usart1); //DELAYED FOR 800mS
}
}
void Task_Weeprom(void) //WAITING TASK
{
OStypeMsgP alarm_zoneP;
char word;
for(;;)
{
OS_WaitMsg(WEEPROM, &alarm_zoneP, task_weeprom1);
word = *(const unsigned char*) alarm_zoneP;
SEN = 1; //START ENABLED
while(SEN); //WAIT UNTIL START IS OVER
SSPBUF = 0b10100000; //CONTROL BYTE
Idle(); //ENSURE MODULE IS IDLE
if(!ACKSTAT); //LOOK FOR ACK
else
break;
SSPBUF = data_address; //ADDRESS BYTE
Idle(); //ENSURE MODULE IS IDLE
if(!ACKSTAT); //LOOK FOR ACK
else
break;
SSPBUF = word; //DATA BYTE (ZONES: 1,2,3 or 4)
Idle(); //ENSURE MODULE IS IDLE
if(!ACKSTAT) //LOOK FOR ACK
{ PEN = 1; //STOP ENABLED
while(PEN); //WAIT UNTIL STOP IS OVER
}
else
break;
}
}
void Task_Reeprom(void)
{
char word;
for(;;) //WAITING TASK
{
OS_WaitBinSem(REEPROM,task_reeprom1);
Idle(); //ENSURE MODULE IS IDLE
SEN = 1; //START ENABLED
while(SEN); //WAIT UNTIL START IS OVER
SSPBUF = 0b10100000; //CONTROL BYTE (write)
Idle(); //ENSURE MODULE IS IDLE
if(!ACKSTAT); //LOOK FOR ACK
else
break;
SSPBUF = data_address; //ADDRESS BYTE (write)
Idle(); //ENSURE MODULE IS IDLE
if(!ACKSTAT); //LOOK FOR ACK
else
break;
RSEN = 1; //REPEAT START CONDITION
while(RSEN); //WAIT UNTIL RESTART IS OVER
SSPBUF = 0b10100001; //CONTROL BYTE (read)
Idle(); //ENSURE MODULE IS IDLE
if(!ACKSTAT); //LOOK FOR ACK
else
break;
RCEN = 1; //ENABLE RECEIVE
while(RCEN); //WAIT UNTIL RECEIVE IS OVER
ACKDT = 1; //NO ACK
ACKEN = 1;
while(ACKEN); //WAIT UNTIL ACK IS FINISHED
PEN = 1; //STOP ENABLED
while(PEN); //WAIT UNTIL STOP IS OVER
word = SSPBUF; //WRITE DATA TO VARIABLE
++data_address; //MOVE ADDRESS TO NEXT SPACE
OS_WaitBinSem(DISPLAY, task_reeprom2);
WriteSevenSegment(word, 3); //DISPLAY ZONE OF LAST ALARM
OS_Delay(200, task_reeprom3);
OSSignalBinSem(DISPLAY);
}
}
void Task_Pots(void) //WAITING TASK
{
OStypeMsgP pot_valP;
char pot_val;
for(;;)
{
OS_WaitMsg(POTVAL, &pot_valP, task_pots1);
pot_val = *(char*) pot_valP;
OS_WaitBinSem(DISPLAY, task_pots2);
switch(pot_val)
{
case 1:
CHS2=0, CHS1=0, CHS0=0; //AN0 - PIEZO "TONE" (PWM PERIOD)
PotDisplay();
PR2 = ADRESH;
break;
case 2:
CHS2=0, CHS1=0, CHS0=1; //DISPLAY A/D VALUE
PotDisplay();
break;
case 3:
CHS2=0, CHS1=1, CHS0=0; //DISPLAY A/D VALUE
PotDisplay();
break;
case 4:
CHS2=0, CHS1=1, CHS0=1; //AN3 - FOR PIZO DUTY CYCLE
PotDisplay();
CCPR1L = ADRESH;
break;
}
OSSignalBinSem(DISPLAY);
}
}
//*****************************( MAIN )****************************************
//*******************************************************************************
void main(void)
{
TXSTA = 0b10100100; //TRANSMIT
RCSTA = 0b10010000; //RECEIVE
SPBRG = 0x81; //BAUD RATE
TRISC6 = 0,TRISC7 = 1; //TXD OUTPUT & RXD INPUT
TRISC3 = 1,TRISC4 = 1; //SCL & SDA - I2C
SSPADD = 0x32; //I2C BAUD RATE (MASTER MODE)
SSPCON = 0b00101000; //ENABLE SDA & SCL,S-PORT MODE-MASTER
ADCON0 = 0b01000001; //A/D CONFIG
OPTION = 0b10000101; //TIMER0 CONFIG
T1CON = 0b00010101; //TIMER1 CONFIG (system tick rate)
TMR1IE = 1; //ENABLE INTERRUPT
TMR1IF = 0; //CLEAR FLAG
TRISC2 = 0; //PIEZO
CCPR1L = 0x80,CCP1X=0,CCP1Y=0; //PWM DUTY CYCLE
T2CON = 0b00000101; //TIMER2 PRESCALE = 4 (PWM)
GIE = 1, PEIE = 1; //ENABLE GLOBAL & PERIPHERAL INTERRUPTS
TRISD = 0x00; //PORTD OUTPUT-DIGITS
low=20, high=170; //INITIAL TEMPERATURE RANGE
data_address = 0x00; //FIRST EEPROM WRITE
OSInit();
//ID PRIORITY
OSCreateTask(Task_Convert, 0, 1);
OSCreateTask(Task_Alarm_On, 1, 1);
OSCreateTask(Task_Keypad, 2, 3);
OSCreateTask(Task_Display, 3, 2);
OSCreateTask(Task_Usart, 4, 4);
OSCreateTask(Task_Weeprom, 5, 5);
OSCreateTask(Task_Reeprom, 6, 6);
OSCreateTask(Task_Pots, 7, 7);
OSCreateMsg (ALARM, (OStypeMsgP) 0);
OSCreateMsg (WEEPROM,(OStypeMsgP) 0);
OSCreateBinSem (REEPROM, 0);
OSCreateMsg (POTVAL, (OStypeMsgP) 0);
OSCreateBinSem (DISPLAY, 1);
for(;;)
OSSched();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -