📄 i2c_master.c
字号:
I2CDRB = TX_DATA[txIdx++];
break;
case 0x0E: break; // GCIFG: n/a
case 0x10: break; // STTIFG: n/a
}
}
//
// PORT 1 Interrupt Service Routine
//
#pragma vector=PORT1_VECTOR
__interrupt void port1_ISR (void)
{
// P1.4
if( P1IFG & 0x10 )
{
P1IE &= ~0x10; // Disable interrupt
P1IFG &= ~0x10; // Clear interrupt flag
debounceCnt[0] = DEBOUNCE_CNT;
IE1 |= WDTIE; // Enable WDT interrupt
}
// P1.5
if( P1IFG & 0x20 )
{
P1IE &= ~0x20; // Disable interrupt
P1IFG &= ~0x20; // Clear interrupt flag
debounceCnt[1] = DEBOUNCE_CNT;
IE1 |= WDTIE; // Enable WDT interrupt
}
}
//
// PORT 2 Interrupt Service Routine
//
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
// P2.0
if( P2IFG & 0x01 )
{
P2IE &= ~0x01; // Disable interrupt
P2IFG &= ~0x01; // Clear interrupt flag
Event |= EVENT_INT; // Set event flag
LPM0_EXIT; // Exit LPM0
}
}
//
// Watchdog Timer (WDT) Interrupt Service Routine
//
#pragma vector=WDT_VECTOR
__interrupt void wdt_ISR(void)
{
unsigned char contFlag = 0;
if( debounceCnt[0] > 0 )
{
if( --debounceCnt[0] == 0 )
{
P1IFG &= ~0x10; // Clear interrupt flag
P1IE |= 0x10; // Enable interrupt
Event |= EVENT_SW1; // Set event flag
LPM0_EXIT; // Exit LPM0
}
else
{
contFlag = 1; // Set continue WDT flag
}
}
if( debounceCnt[1] > 0 )
{
if( --debounceCnt[1] == 0 )
{
P1IFG &= ~0x20; // Clear interrupt flag
P1IE |= 0x20; // Enable interrupt
Event |= EVENT_SW2; // Set event flag
LPM0_EXIT; // Exit LPM0
}
else
{
contFlag = 1; // Set continue WDT flag
}
}
if( !contFlag )
{
IE1 &= ~WDTIE; // Disable WDT interrupt
}
}
//
// SW1 Options
//
void sw1Options(void)
{
unsigned char option;
option = (P4IN >> 4); // Read value on pins P4.7,6,5,4
switch( option )
{
case 0x00:
break;
case 0x01:
break;
case 0x02:
break;
case 0x03:
break;
case 0x04:
break;
case 0x05:
break;
case 0x06:
break;
case 0x07:
break;
case 0x08:
break;
case 0x09:
break;
case 0x0A:
break;
case 0x0B:
break;
case 0x0C:
break;
case 0x0D:
break;
case 0x0E:
break;
case 0x0F:
break;
};
}
//
// SW2 Options
//
void sw2Options(void)
{
unsigned char x;
unsigned char option;
option = (P4IN >> 4); // Read value on pins P4.7,6,5,4
switch( option )
{
case 0x00: // Get RTC params
txStr("\r\n\nGet RTC Parameters");
getRTC();
iicSend(I2C_ADDR, TX_DATA[0], 0); // I2C write
iicSend(I2C_ADDR, 0, 1); // I2C read
txStr("\r\nRTC Parameters:");
for(x = 1; x < RX_DATA[0]; x++)
{
txStr(" ");
txByte(RX_DATA[x]);
}
break;
case 0x01:
txStr("\r\n\nSet RTC Parameters");
setRTC();
iicSend(I2C_ADDR, TX_DATA[0], 0); // I2C write
txStr("...done.");
break;
case 0x02:
txStr("\r\nGet IR Data");
getIRData();
iicSend(I2C_ADDR, TX_DATA[0], 0); // I2C write
iicSend(I2C_ADDR, 0, 1); // I2C read
txStr("\r\nIR Data:");
for(x = 1; x < RX_DATA[0]; x++)
{
txStr(" ");
txByte(RX_DATA[x]);
}
break;
case 0x03:
txStr("\r\n\nGet Last IR Value");
getIRVal();
iicSend(I2C_ADDR, TX_DATA[0], 0); // I2C write
iicSend(I2C_ADDR, 0, 1); // I2C read
txStr("\r\nIR Data:");
for(x = 1; x < RX_DATA[0]; x++)
{
txStr(" ");
txByte(RX_DATA[x]);
}
break;
case 0x04:
txStr("\r\n\nGet Port Pin State");
getInputState();
iicSend(I2C_ADDR, TX_DATA[0], 0); // I2C write
iicSend(I2C_ADDR, 0, 1); // I2C read
txStr("\r\nPort Pin:");
for(x = 1; x < RX_DATA[0]; x++)
{
txStr(" ");
txByte(RX_DATA[x]);
}
break;
case 0x05:
break;
case 0x06:
break;
case 0x07:
break;
case 0x08:
break;
case 0x09:
break;
case 0x0A:
break;
case 0x0B:
break;
case 0x0C:
break;
case 0x0D:
break;
case 0x0E:
break;
case 0x0F:
break;
};
}
//
// UART1 RX Interrupt Service Routine
//
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_Rx_ISR(void)
{
while( !(IFG2 & UTXIFG1) ){} // Is USART1 TX buffer ready?
TXBUF1 = RXBUF1 + 1; // Increment RXBUF1, copy to TXBUF1
}
//
// UART Function - transmit null-terminated string
//
void txStr(const char* pStr)
{
unsigned int cnt = 0;
for(; *pStr; ++pStr)
{
while (!(IFG2 & UTXIFG1)) // USART1 TX buffer ready?
{
if( ++cnt == UART_TX_RETRY )
{
return;
}
}
TXBUF1 = *pStr; // Transmit character
}
}
//
// UART Function - transmit byte as ASCII character
//
void txByte(unsigned char byte)
{
unsigned char x;
char str[3];
str[0] = byte >> 4;
str[1] = (byte & 0x0f);
str[2] = 0;
for(x = 0; x < 2; x++)
{
if( str[x] > 9 )
{
str[x] += 0x37;
}
else
{
str[x] += 0x30;
}
}
txStr(str);
}
//
// UART Function - transmit word as ASCII characters
//
void txWord(unsigned int word)
{
txByte(word >> 8);
txByte(word & 0x00ff);
}
//
// I2C Message - Get RTC Parameters
//
void getRTC(void)
{
TX_DATA[0] = 2; // Set message length
TX_DATA[1] = GET_RTC_PARAMS; // Set message ID
}
//
// I2C Message - Set RTC Parameters
//
void setRTC(void)
{
TX_DATA[0] = 9; // Set message length
TX_DATA[1] = SET_RTC_PARAMS; // Set message ID
TX_DATA[2] = 0x05; // Set year LSB (BCD)
TX_DATA[3] = 0x20; // Set year MSB (BCD)
TX_DATA[4] = 0x06; // Set month (BCD)
TX_DATA[5] = 0x01; // Set day (BCD)
TX_DATA[6] = 0x12; // Set hour (BCD)
TX_DATA[7] = 0x00; // Set minute (BCD)
TX_DATA[8] = 0x00; // Set second (BCD)
}
//
// I2C Message - Get IR Data
//
void getIRData(void)
{
TX_DATA[0] = 2; // Set message length
TX_DATA[1] = SEND_IR_DATA; // Set message ID
}
//
// I2C Message - Get Last IR Value
//
void getIRVal(void)
{
TX_DATA[0] = 2; // Set message length
TX_DATA[1] = GET_LAST_IR_VALUE; // Set message ID
}
//
// I2C Message - Get Port Pin Input State
//
void getInputState(void)
{
TX_DATA[0] = 2; // Set message length
TX_DATA[1] = GET_INPUT_STATE; // Set message ID
}
//
// I2C Message - Get Event
//
void getEvent(void)
{
TX_DATA[0] = 2; // Set message length
TX_DATA[1] = GET_EVENT; // Set message ID
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -