Skip to content

Instantly share code, notes, and snippets.

@VEINHORN
Created December 9, 2014 12:30
Show Gist options
  • Save VEINHORN/17349b9dfd5de3d92030 to your computer and use it in GitHub Desktop.
Save VEINHORN/17349b9dfd5de3d92030 to your computer and use it in GitHub Desktop.
/*
Ìåñòî èíäèêàöèè - Ëåâûé âåðõíèé óãîë
Îðèåíòàöèß (ïîâîðîò) òåêñòà - 180 ãðàäóñîâ
Çåðêàëüíîå îòðàæåíèå - âåðòèêàëüíî, òîëüêî ñèìâîëû
Îñü èçìåðåíèé àêñåëåðîìåòðà - Z
*/
#include "msp430f5529.h"
#define BUTTON 7 //PORT1
#define ACCEL_PWR 6 //PORT3
#define ACCEL_CS 5 //PORT3
#define ACCEL_SOMI 4 //PORT3
#define ACCEL_SIMO 3 //PORT3
#define ACCEL_SCK 7 //PORT2
#define ACCEL_INT 5 //PORT2
#define REVID 0x01 // ASIC version
#define CTRL 0x02 // Control register
#define DOUTX 0x06 // X channel data register
#define DOUTY 0x07 // Y channel data register
#define DOUTZ 0x08 // Z channel data register
#define G_RANGE_2 0x80 // 8g range
#define I2C_DIS 0x10 // I2C denied
#define MEASURE_MODE_400 0x04 // Move detecting, 10Hz
#define LCD_SIMO 1 //PORT4
#define LCD_SCLK 3 //PORT4
#define LCD_CS 4 //PORT7
#define LCD_RST 7 //PORT5
#define LCD_CD 6 //PORT5
#define LCD_BL 6 //PORT7
#define SET_SCROLL_LINE 0x40 // Start scrolling line (0...63) Ñ without scrolling (after reset = 0)
#define SET_SEG_REVERSE 0xA1 // Mirror mode for column addressing
#define SET_SEG_NORMAL 0xA0 // Normal mode for column addressing
#define SET_COM_REVERSE 0xC8 // Mirror mode for line addressing
#define SET_COM_NORMAL 0xC0 // Normal mode for line addressing
#define SET_POWER_CONTROL 0x2F // Powering up amplifier, repeater and controller (after reset = 0)
#define SET_DISPLAY_ENABLE 0xAF // Display On
#define ZERO_PAGE_ADDRESS 0xB0 // 1011
#define ZERO_LSB_COLUMN_ADDR 0x00
#define ZERO_MSB_COLUMN_ADDR 0x10
#define NUMBER_OF_PAGES 8
#define NUMBER_OF_COLUMNS 102
void dogs102SPI(unsigned char data);
char cma3000SPI(unsigned char address, unsigned char data, unsigned char rw);
void initLCD();
void clearLCD();
void printDefaultString();
unsigned char reverseFlag = 0;
unsigned char digits[] =
{
126,129,129,126, //0
4, 2, 255, 0, //1
194, 161, 145, 142, //2
66, 137, 137, 118, //3
48, 44, 34, 255, //4
76, 139, 137, 113, //5
126, 145, 137, 114, //6
1, 225, 29, 3, //7
118, 137, 137, 118, //8
78, 145, 137, 126, //9
};
unsigned char defaultString[] =
{
129, 102, 24, 24, 102, 129, 0, 0, //X
195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 0, 0, //=
126,129,129,126, //0
192,192, //.
126,129,129,126, //0
126,129,129,126, //0
126,129,129,126, //0
0,0, //space
158,161,146,127 //g
};
unsigned char digitPosition[] = {20, 26, 30, 34};
#define DIGIT_LEN 4
#define STRING_LEN sizeof(defaultString)
int accelerationBitLevel[] = {18, 36, 71, 143, 286, 571, 1142};
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P1OUT |= (1 << BUTTON); // Enable pull up resistor for button
P1REN |= (1 << BUTTON);
P1IES |= (1 << BUTTON); // Interrupt generate with high to low transition
P1IE |= (1 << BUTTON);
P2IE |= (1 << ACCEL_INT); // Interrupts enabled
P3DIR |= (1 << ACCEL_CS); // Choosing device
P3OUT |= (1 << ACCEL_CS);
P3DIR |= (1 << ACCEL_PWR); // Voltage
P3OUT |= (1 << ACCEL_PWR);
P3SEL |= (1 << ACCEL_SOMI); // Line data reception by SPI interface
P3SEL |= (1 << ACCEL_SIMO); // Line data transmitting by SPI interface
P2SEL |= (1 << ACCEL_SCK); // Synch-signal
P7DIR |= (1 << LCD_CS) | (1 << LCD_BL); // Choosing device and enable the backlight
P5DIR |= (1 << LCD_RST) | (1 << LCD_CD); // Reset and Data mode (0 - command)
P7OUT |= (1 << LCD_CS) | (1 << LCD_BL); // Power on (Step #1 for LCD Powering Up)
P4SEL |= (1 << LCD_SIMO) | (1 << LCD_SCLK); // SIMO data and Synch-signal
// RST = 0 (by default) (Step #2 for LCD Powering Up)
// Reset display
__delay_cycles(1100); // Wait at least 1 ms (Step #3 for LCD Powering Up)
P5OUT |= (1 << LCD_RST); // Set RST to 1 (Step #4 for LCD Powering Up)
__delay_cycles(5500); // Wait at least 5 ms (Step #5 for LCD Powering Up)
// SPI settings for accelerometer
UCA0CTL1 |= UCSWRST; // Enable possibility to changes for first channel of USCI_A // ???????
UCA0CTL0 |= UCSYNC | UCMST | UCMSB | UCCKPH; // Synch mode, Master, MSB, change on second differential and capture on first
UCA0CTL1 |= UCSWRST | UCSSEL__SMCLK; // Choose source - SMCLK
UCA0BR0 = 0x30; // Master transmit speed
UCA0BR1 = 0; // Slave transmit speed
UCA0CTL1 &= ~UCSWRST; // Disable possibility to change
// SPI settings for LCD
UCB1CTL1 |= UCSWRST; // Same algorithm for USCI_B
UCB1CTL0 |= UCSYNC | UCMST | UCMSB | UCCKPH; // For LCD only those features can be set
UCB1CTL1 |= UCSWRST | UCSSEL__SMCLK;
UCB1BR0 = 0x30;
UCB1BR1 = 0;
UCB1CTL1 &= ~UCSWRST;
__delay_cycles(132000); // Wait at least 120 ms (Step #6 for LCD Powering Up)
// Display settings
initLCD();
clearLCD();
// Accelerometer settings
cma3000SPI(REVID,0,0);
__delay_cycles(25); // Delay between SPI cycles (~22ms)
cma3000SPI(CTRL, G_RANGE_2 | I2C_DIS | MEASURE_MODE_400, 1); // 8G range, I2C denied, Move detecting (10Hz)
__delay_cycles(25); // Delay between SPI cycles (~22ms)
printDefaultString();
_EINT();
while(1);
return 0;
}
void dogs102SPI(unsigned char data)
{
while(!(UCB1IFG & UCTXIFG)); // Wait until TXBUF is ready to receive data
P7OUT &= ~(1 << LCD_CS); // Choosing devise disable
UCB1TXBUF = data; // Send data to BUF
while(UCB1STAT & UCBUSY); // Wait until USCI_A0 SPI interface is no longer busy
P7OUT |= (1 << LCD_CS); // Choose devise
}
// NOTE: UCT - ïåðåäàò÷èê
// UCR - ïðèÞìíèê
// €êñåëåðîìåòð âñåãäà ðàáîòàåò â âåäîìîì ðåæèìå
char cma3000SPI(unsigned char address, unsigned char data, unsigned char rw)
{
address = address << 2;
if(rw == 1) // If write
address |= 2; // Control register
char receiveData;
P3OUT &= ~(1 << ACCEL_CS); // Disable choosing device
receiveData = UCA0RXBUF; // Read data
while(!(UCA0IFG & UCTXIFG)); // Wait until TXIFG == TXBUF is ready for new data
UCA0TXBUF = address; // Start SPI transmit
while(!(UCA0IFG & UCRXIFG)); // Wait until RXIFG == RXBUF have new data
receiveData = UCA0RXBUF;
while(!(UCA0IFG & UCTXIFG)); // Wait until TXIFG == TXBUF is ready for new data
UCA0TXBUF = data; // Start SPI transmit
while(!(UCA0IFG & UCRXIFG)); // Wait until RXIFG == RXBUF have new data
receiveData = UCA0RXBUF;
while(UCA0STAT & UCBUSY); // Wait until USCI_A0 SPI interface is no longer busy
P3OUT |= (1 << ACCEL_CS); // Choose device
return receiveData;
}
void initLCD()
{
P5OUT &= ~(1 << LCD_CD); // Command mode
dogs102SPI(SET_POWER_CONTROL); // Powering up amplifier, repeater and controller
dogs102SPI(SET_DISPLAY_ENABLE); // Display On
dogs102SPI(SET_SCROLL_LINE); // Without scrolling
dogs102SPI(SET_SEG_REVERSE); // Mirror mode for column addressing
dogs102SPI(SET_COM_NORMAL); // Normal mode for line addressing
P5OUT |= (1 << LCD_CD); // Return data mode
}
void clearLCD()
{
unsigned char i = 0;
unsigned char j = 0;
for(i = 0; i < NUMBER_OF_PAGES; i++)
{
P5OUT &= ~(1 << LCD_CD); // Command mode
dogs102SPI(ZERO_PAGE_ADDRESS + i);
dogs102SPI(ZERO_LSB_COLUMN_ADDR);
dogs102SPI(ZERO_MSB_COLUMN_ADDR);
P5OUT |= (1 << LCD_CD); // Return data mode
for(j = 0; j < NUMBER_OF_COLUMNS; j++)
dogs102SPI(0);
}
}
void printDefaultString()
{
unsigned char i =0;
P5OUT &= ~(1 << LCD_CD); // Command mode
dogs102SPI(ZERO_PAGE_ADDRESS); // Last page
char temp = 0; // Set start position~
// char temp = NUMBER_OF_COLUMNS - STRING_LEN; // Set start position~
dogs102SPI(ZERO_LSB_COLUMN_ADDR + (temp & 0x0F)); // Set start column for MSB~
dogs102SPI(ZERO_MSB_COLUMN_ADDR + (temp >> 4)); // Set start column for LSB
P5OUT |= (1 << LCD_CD); // Return data mode
if(reverseFlag == 1)
for(i = STRING_LEN; i > 0; i--) // Print string
dogs102SPI(defaultString[i]);
else
for(i = 0; i < STRING_LEN; i++) // Print string
dogs102SPI(defaultString[i]);
}
#pragma vector = PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
P2IE &= ~(1 << ACCEL_INT); // Interrupts disabled
int dx = 0;
int temp2;
char temp;
temp = cma3000SPI(DOUTZ,0,0);
__delay_cycles(25); // Delay between SPI cycles (~22ms)
unsigned char i = 0;
for(i = 0; i < 7; i++) // 7 significant digits in binary number
{
if((temp >> i) & 1)
dx += accelerationBitLevel[i];
}
i = 0;
for(i = 0; i < 4; i++) // 4 significant digits in decimal number
{
unsigned char j = 0;
temp2 = dx / 10;
temp2 = dx - temp2 * 10;
for(j = 0; j < DIGIT_LEN; j++)
defaultString[digitPosition[3 - i] + j] = digits[DIGIT_LEN * temp2 + j];
dx /= 10;
}
printDefaultString();
P2IE |= (1 << ACCEL_INT);
__delay_cycles(500000);
//P2IFG &= ~(1 << ACCEL_INT);
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1IE &= ~(1 << BUTTON); // Disable interrupt from button
__delay_cycles(50000);
if(!(P1IN & (1 << BUTTON)))
{
P5OUT &= ~(1 << LCD_CD);
if(reverseFlag == 0)
{
//dogs102SPI(SET_SEG_REVERSE);
//dogs102SPI(SET_COM_REVERSE);
//dogs102SPI(SET_SCROLL_LINE + 56);
reverseFlag = 1;
}
else
{
//dogs102SPI(SET_SEG_NORMAL);
//dogs102SPI(SET_COM_NORMAL);
//dogs102SPI(SET_SCROLL_LINE);
reverseFlag = 0;
}
P5OUT |= (1 << LCD_CD);
}
P1IE = (1 << BUTTON);
P1IFG &= ~(1 << BUTTON);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment