/PIC Stuff/PIC_27J13/Adafruit_GFX.c |
---|
0,0 → 1,558 |
#include "maindefs.h" |
#include "Adafruit_GFX.h" |
#include "glcdfont.c" |
#include "oled_ssd1306.h" |
#include "oled_ssd1331.h" |
#include <string.h> |
#include <stdio.h> |
static GFX_DATA gfx_data; |
void GFX_Init(int w, int h) { |
gfx_data._width = gfx_data.WIDTH = w; |
gfx_data._height = gfx_data.HEIGHT = h; |
gfx_data.rotation = 0; |
gfx_data.cursor_x = gfx_data.cursor_y = 0; |
gfx_data.textsize = 1; |
gfx_data.textcolor = gfx_data.textbgcolor = 0xFFFF; |
gfx_data.wrap = 1; |
memset(gfx_data.lcd_buffer, 0, GFX_LCD_BUFFER_SIZE); |
memset(gfx_data.buffer, 0, GFX_STRING_BUFFER_SIZE); |
} |
int GFX_Abs(int i) { |
if (i < 0) |
return -i; |
else |
return i; |
} |
void GFX_Swap(int *a, int *b) { |
int tmp = *a; |
*a = *b; |
*b = tmp; |
} |
void GFX_drawLine(int x0, int y0, int x1, int y1, unsigned int color) { |
#ifdef GFX_SSD1306 |
int dx, dy, err, ystep; |
int steep = GFX_Abs(y1 - y0) > GFX_Abs(x1 - x0); |
if (steep) { |
GFX_Swap(&x0, &y0); |
GFX_Swap(&x1, &y1); |
} |
if (x0 > x1) { |
GFX_Swap(&x0, &x1); |
GFX_Swap(&y0, &y1); |
} |
dx = x1 - x0; |
dy = GFX_Abs(y1 - y0); |
err = dx / 2; |
if (y0 < y1) { |
ystep = 1; |
} else { |
ystep = -1; |
} |
for (; x0 <= x1; x0++) { |
if (steep) { |
SSD1306_Draw_Pixel(y0, x0, color); |
} else { |
SSD1306_Draw_Pixel(x0, y0, color); |
} |
err -= dy; |
if (err < 0) { |
y0 += ystep; |
err += dx; |
} |
} |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Line(x0, y0, x1, y1, color); |
#endif |
} |
void GFX_drawFastVLine(int x, int y, int h, unsigned int color) { |
GFX_drawLine(x, y, x, y + h - 1, color); |
} |
void GFX_drawFastHLine(int x, int y, int w, unsigned int color) { |
GFX_drawLine(x, y, x + w - 1, y, color); |
} |
void GFX_drawRect(int x, int y, int w, int h, unsigned int color) { |
#ifdef GFX_SSD1306 |
GFX_drawFastHLine(x, y, w, color); |
GFX_drawFastHLine(x, y + h, w, color); |
GFX_drawFastVLine(x, y, h, color); |
GFX_drawFastVLine(x + w, y, h, color); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Rect(x, y, x + w, y + h, color); |
#endif |
} |
void GFX_fillRect(int x, int y, int w, int h, unsigned int color) { |
#ifdef GFX_SSD1306 |
int i; |
for (i = x; i < x + w; i++) { |
GFX_drawFastVLine(i, y, h, color); |
} |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Fill_Rect(x, y, x + w, y + h, color); |
#endif |
} |
void GFX_fillScreen(unsigned int color) { |
GFX_fillRect(0, 0, gfx_data._width, gfx_data._height, color); |
} |
void GFX_clearScreen() { |
#ifdef GFX_SSD1306 |
GFX_fillScreen(SSD1306_BLACK); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Clear_Display(); |
#endif |
} |
void GFX_drawCircle(int x0, int y0, int r, unsigned int color) { |
int f = 1 - r; |
int ddF_x = 1; |
int ddF_y = -2 * r; |
int x = 0; |
int y = r; |
#ifdef GFX_SSD1306 |
SSD1306_Draw_Pixel(x0, y0 + r, color); |
SSD1306_Draw_Pixel(x0, y0 - r, color); |
SSD1306_Draw_Pixel(x0 + r, y0, color); |
SSD1306_Draw_Pixel(x0 - r, y0, color); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Pixel(x0, y0 + r, color); |
SSD1331_Draw_Pixel(x0, y0 - r, color); |
SSD1331_Draw_Pixel(x0 + r, y0, color); |
SSD1331_Draw_Pixel(x0 - r, y0, color); |
#endif |
while (x < y) { |
if (f >= 0) { |
y--; |
ddF_y += 2; |
f += ddF_y; |
} |
x++; |
ddF_x += 2; |
f += ddF_x; |
#ifdef GFX_SSD1306 |
SSD1306_Draw_Pixel(x0 + x, y0 + y, color); |
SSD1306_Draw_Pixel(x0 - x, y0 + y, color); |
SSD1306_Draw_Pixel(x0 + x, y0 - y, color); |
SSD1306_Draw_Pixel(x0 - x, y0 - y, color); |
SSD1306_Draw_Pixel(x0 + y, y0 + x, color); |
SSD1306_Draw_Pixel(x0 - y, y0 + x, color); |
SSD1306_Draw_Pixel(x0 + y, y0 - x, color); |
SSD1306_Draw_Pixel(x0 - y, y0 - x, color); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Pixel(x0 + x, y0 + y, color); |
SSD1331_Draw_Pixel(x0 - x, y0 + y, color); |
SSD1331_Draw_Pixel(x0 + x, y0 - y, color); |
SSD1331_Draw_Pixel(x0 - x, y0 - y, color); |
SSD1331_Draw_Pixel(x0 + y, y0 + x, color); |
SSD1331_Draw_Pixel(x0 - y, y0 + x, color); |
SSD1331_Draw_Pixel(x0 + y, y0 - x, color); |
SSD1331_Draw_Pixel(x0 - y, y0 - x, color); |
#endif |
} |
} |
void GFX_drawCircleHelper(int x0, int y0, int r, unsigned char cornername, unsigned int color) { |
int f = 1 - r; |
int ddF_x = 1; |
int ddF_y = -2 * r; |
int x = 0; |
int y = r; |
while (x < y) { |
if (f >= 0) { |
y--; |
ddF_y += 2; |
f += ddF_y; |
} |
x++; |
ddF_x += 2; |
f += ddF_x; |
#ifdef GFX_SSD1306 |
if (cornername & 0x4) { |
SSD1306_Draw_Pixel(x0 + x, y0 + y, color); |
SSD1306_Draw_Pixel(x0 + y, y0 + x, color); |
} |
if (cornername & 0x2) { |
SSD1306_Draw_Pixel(x0 + x, y0 - y, color); |
SSD1306_Draw_Pixel(x0 + y, y0 - x, color); |
} |
if (cornername & 0x8) { |
SSD1306_Draw_Pixel(x0 - y, y0 + x, color); |
SSD1306_Draw_Pixel(x0 - x, y0 + y, color); |
} |
if (cornername & 0x1) { |
SSD1306_Draw_Pixel(x0 - y, y0 - x, color); |
SSD1306_Draw_Pixel(x0 - x, y0 - y, color); |
} |
#endif |
#ifdef GFX_SSD1331 |
if (cornername & 0x4) { |
SSD1331_Draw_Pixel(x0 + x, y0 + y, color); |
SSD1331_Draw_Pixel(x0 + y, y0 + x, color); |
} |
if (cornername & 0x2) { |
SSD1331_Draw_Pixel(x0 + x, y0 - y, color); |
SSD1331_Draw_Pixel(x0 + y, y0 - x, color); |
} |
if (cornername & 0x8) { |
SSD1331_Draw_Pixel(x0 - y, y0 + x, color); |
SSD1331_Draw_Pixel(x0 - x, y0 + y, color); |
} |
if (cornername & 0x1) { |
SSD1331_Draw_Pixel(x0 - y, y0 - x, color); |
SSD1331_Draw_Pixel(x0 - x, y0 - y, color); |
} |
#endif |
} |
} |
void GFX_fillCircle(int x0, int y0, int r, unsigned int color) { |
GFX_drawFastVLine(x0, y0 - r, 2 * r + 1, color); |
GFX_fillCircleHelper(x0, y0, r, 3, 0, color); |
} |
void GFX_fillCircleHelper(int x0, int y0, int r, unsigned char cornername, int delta, unsigned int color) { |
int f = 1 - r; |
int ddF_x = 1; |
int ddF_y = -2 * r; |
int x = 0; |
int y = r; |
while (x < y) { |
if (f >= 0) { |
y--; |
ddF_y += 2; |
f += ddF_y; |
} |
x++; |
ddF_x += 2; |
f += ddF_x; |
if (cornername & 0x1) { |
GFX_drawFastVLine(x0 + x, y0 - y, 2 * y + 1 + delta, color); |
GFX_drawFastVLine(x0 + y, y0 - x, 2 * x + 1 + delta, color); |
} |
if (cornername & 0x2) { |
GFX_drawFastVLine(x0 - x, y0 - y, 2 * y + 1 + delta, color); |
GFX_drawFastVLine(x0 - y, y0 - x, 2 * x + 1 + delta, color); |
} |
} |
} |
void GFX_drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color) { |
GFX_drawLine(x0, y0, x1, y1, color); |
GFX_drawLine(x1, y1, x2, y2, color); |
GFX_drawLine(x2, y2, x0, y0, color); |
} |
void GFX_fillTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color) { |
int a, b, y, last; |
int dx01 = x1 - x0; |
int dy01 = y1 - y0; |
int dx02 = x2 - x0; |
int dy02 = y2 - y0; |
int dx12 = x2 - x1; |
int dy12 = y2 - y1; |
int sa = 0; |
int sb = 0; |
// Sort coordinates by Y order (y2 >= y1 >= y0) |
if (y0 > y1) { |
GFX_Swap(&y0, &y1); |
GFX_Swap(&x0, &x1); |
} |
if (y1 > y2) { |
GFX_Swap(&y2, &y1); |
GFX_Swap(&x2, &x1); |
} |
if (y0 > y1) { |
GFX_Swap(&y0, &y1); |
GFX_Swap(&x0, &x1); |
} |
if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing |
a = b = x0; |
if (x1 < a) a = x1; |
else if (x1 > b) b = x1; |
if (x2 < a) a = x2; |
else if (x2 > b) b = x2; |
GFX_drawFastHLine(a, y0, b - a + 1, color); |
return; |
} |
// For upper part of triangle, find scanline crossings for segments |
// 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 |
// is included here (and second loop will be skipped, avoiding a /0 |
// error there), otherwise scanline y1 is skipped here and handled |
// in the second loop...which also avoids a /0 error here if y0=y1 |
// (flat-topped triangle). |
if (y1 == y2) last = y1; // Include y1 scanline |
else last = y1 - 1; // Skip it |
for (y = y0; y <= last; y++) { |
a = x0 + sa / dy01; |
b = x0 + sb / dy02; |
sa += dx01; |
sb += dx02; |
/* longhand: |
a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); |
b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); |
*/ |
if (a > b) GFX_Swap(&a, &b); |
GFX_drawFastHLine(a, y, b - a + 1, color); |
} |
// For lower part of triangle, find scanline crossings for segments |
// 0-2 and 1-2. This loop is skipped if y1=y2. |
sa = dx12 * (y - y1); |
sb = dx02 * (y - y0); |
for (; y <= y2; y++) { |
a = x1 + sa / dy12; |
b = x0 + sb / dy02; |
sa += dx12; |
sb += dx02; |
/* longhand: |
a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); |
b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); |
*/ |
if (a > b) GFX_Swap(&a, &b); |
GFX_drawFastHLine(a, y, b - a + 1, color); |
} |
} |
void GFX_drawRoundRect(int x, int y, int w, int h, int r, unsigned int color) { |
// smarter version |
GFX_drawFastHLine(x + r, y, w - 2 * r, color); // Top |
GFX_drawFastHLine(x + r, y + h - 1, w - 2 * r, color); // Bottom |
GFX_drawFastVLine(x, y + r, h - 2 * r, color); // Left |
GFX_drawFastVLine(x + w - 1, y + r, h - 2 * r, color); // Right |
// draw four corners |
GFX_drawCircleHelper(x + r, y + r, r, 1, color); |
GFX_drawCircleHelper(x + w - r - 1, y + r, r, 2, color); |
GFX_drawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color); |
GFX_drawCircleHelper(x + r, y + h - r - 1, r, 8, color); |
} |
void GFX_fillRoundRect(int x, int y, int w, int h, int r, unsigned int color) { |
// smarter version |
GFX_fillRect(x + r, y, w - 2 * r, h, color); |
// draw four corners |
GFX_fillCircleHelper(x + w - r - 1, y + r, r, 1, h - 2 * r - 1, color); |
GFX_fillCircleHelper(x + r, y + r, r, 2, h - 2 * r - 1, color); |
} |
void GFX_drawBitmap(int x, int y, const unsigned char* bitmap, int w, int h, unsigned int color) { |
int i, j; |
for (j = 0; j < h; j++) { |
for (i = 0; i < w; i++) { |
if (bitmap[i + (j / 8) * w] & (j % 8)) { |
#ifdef GFX_SSD1306 |
SSD1306_Draw_Pixel(x + i, y + j, color); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Pixel(x + i, y + j, color); |
#endif |
} |
} |
} |
} |
void GFX_drawChar(int x, int y, unsigned char c, unsigned int color, unsigned int bg, unsigned char size) { |
int i, j; |
unsigned int line; |
if ((x >= gfx_data._width) || // Clip right |
(y >= gfx_data._height) || // Clip bottom |
((x + 5 * size - 1) < 0) || // Clip left |
((y + 8 * size - 1) < 0)) // Clip top |
return; |
for (i = 0; i < 6; i++) { |
if (i == 5) |
line = 0x0; |
else |
line = font[(c * 5) + i]; |
for (j = 0; j < 8; j++) { |
if (line & 0x1) { |
if (size == 1) {// default size |
#ifdef GFX_SSD1306 |
SSD1306_Draw_Pixel(x + i, y + j, color); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Pixel(x + i, y + j, color); |
#endif |
} else { // big size |
GFX_fillRect(x + (i * size), y + (j * size), size, size, color); |
} |
} else if (bg != color) { |
if (size == 1) { // default size |
#ifdef GFX_SSD1306 |
SSD1306_Draw_Pixel(x + i, y + j, bg); |
#endif |
#ifdef GFX_SSD1331 |
SSD1331_Draw_Pixel(x + i, y + j, bg); |
#endif |
} else { // big size |
GFX_fillRect(x + i*size, y + j*size, size, size, bg); |
} |
} |
line >>= 1; |
} |
} |
} |
void GFX_write(unsigned char c) { |
if (c == '\n' || c == '\r') { |
gfx_data.cursor_y += gfx_data.textsize * 8; |
gfx_data.cursor_x = 0; |
// } else if (c == '\r') { |
// // skip em |
} else { |
GFX_drawChar(gfx_data.cursor_x, gfx_data.cursor_y, c, gfx_data.textcolor, gfx_data.textbgcolor, gfx_data.textsize); |
gfx_data.cursor_x += gfx_data.textsize * 6; |
if (gfx_data.wrap && (gfx_data.cursor_x > (gfx_data._width - gfx_data.textsize * 6))) { |
gfx_data.cursor_y += gfx_data.textsize * 8; |
gfx_data.cursor_x = 0; |
} |
} |
} |
void GFX_writeString(const rom char *fmt, ...) { |
unsigned char i, len; |
// Parse and create string |
va_list args; |
va_start(args, fmt); |
vsprintf((char *) gfx_data.buffer, fmt, args); |
va_end(args); |
len = strlen((char *) gfx_data.buffer); |
// Make sure string to insert fits in buffer, truncate if necessary |
if (len > GFX_STRING_BUFFER_SIZE) |
len = GFX_STRING_BUFFER_SIZE; |
// Print buffer to string |
for (i = 0; i < len; i++) { |
GFX_write(gfx_data.buffer[i]); |
} |
} |
void GFX_appendString(const rom char *fmt, ...) { |
unsigned char i, len; |
// Parse and create string |
va_list args; |
va_start(args, fmt); |
vsprintf((char *) gfx_data.buffer, fmt, args); |
va_end(args); |
// Make sure string to insert fits in buffer, truncate if necessary |
len = strlen((char *) gfx_data.buffer); |
if (len == 1) { // This will only occur on "\n" |
// Do nothing? |
return; |
} |
if (len > GFX_STRING_BUFFER_SIZE) |
len = GFX_STRING_BUFFER_SIZE; |
// Omit the newline if string fill entire line |
if (((len - 1)%(GFX_width() / 6)) == 0) { // 16 or 10 |
len -= 1; |
} |
// Shift everything right and insert string at beginning |
for (i = 127; i > len - 1; i--) { |
gfx_data.lcd_buffer[i] = gfx_data.lcd_buffer[i - len]; |
} |
memcpy(gfx_data.lcd_buffer, gfx_data.buffer, len); |
// Print full buffer to screen |
GFX_clearScreen(); |
GFX_setCursor(0,0); |
for (i = 0; i < GFX_LCD_BUFFER_SIZE-1; i++) { |
GFX_write(gfx_data.lcd_buffer[i]); |
} |
} |
void GFX_setCursor(int x, int y) { |
gfx_data.cursor_x = x; |
gfx_data.cursor_y = y; |
} |
void GFX_setTextColor(unsigned int c) { |
// for 'transparent' background, we'll set the bg |
// to the same as fg instead of using a flag |
gfx_data.textcolor = c; |
gfx_data.textbgcolor = c; |
} |
void GFX_setTextColorBG(unsigned int c, unsigned int bg) { |
gfx_data.textcolor = c; |
gfx_data.textbgcolor = bg; |
} |
void GFX_setTextSize(unsigned char s) { |
gfx_data.textsize = (s > 0) ? s : 1; |
} |
void GFX_setTextWrap(unsigned char w) { |
gfx_data.wrap = w; |
} |
void GFX_setRotation(unsigned char x) { |
x %= 4; // cant be higher than 3 |
gfx_data.rotation = x; |
switch (x) { |
case 0: |
case 2: |
gfx_data._width = gfx_data.WIDTH; |
gfx_data._height = gfx_data.HEIGHT; |
break; |
case 1: |
case 3: |
gfx_data._width = gfx_data.HEIGHT; |
gfx_data._height = gfx_data.WIDTH; |
break; |
} |
} |
unsigned char GFX_getRotation() { |
gfx_data.rotation %= 4; |
return gfx_data.rotation; |
} |
int GFX_height() { |
return gfx_data._height; |
} |
int GFX_width() { |
return gfx_data._width; |
} |
/PIC Stuff/PIC_27J13/Adafruit_GFX.h |
---|
0,0 → 1,61 |
#ifndef ADAFRUIT_GFX_H |
#define ADAFRUIT_GFX_H |
#define GFX_LCD_BUFFER_SIZE 129 // # of chars + null |
#define GFX_STRING_BUFFER_SIZE 32 |
typedef struct __GFX_DATA { |
unsigned char buffer[GFX_STRING_BUFFER_SIZE]; |
unsigned char lcd_buffer[GFX_LCD_BUFFER_SIZE]; |
int WIDTH, HEIGHT; // raw display size |
int _width, _height; // size depending on rotation |
int cursor_x, cursor_y; |
unsigned int textcolor, textbgcolor; |
unsigned char textsize; |
unsigned char rotation; |
unsigned char wrap; // If set, wrap text at right side |
} GFX_DATA; |
int GFX_Abs(int i); |
void GFX_Swap(int *a, int *b); |
void GFX_Init(int w, int h); |
void GFX_drawLine(int x0, int y0, int x1, int y1, unsigned int color); |
void GFX_drawFastVLine(int x, int y, int h, unsigned int color); |
void GFX_drawFastHLine(int x, int y, int w, unsigned int color); |
void GFX_drawRect(int x, int y, int w, int h, unsigned int color); |
void GFX_fillRect(int x, int y, int w, int h, unsigned int color); |
void GFX_fillScreen(unsigned int color); |
void GFX_clearScreen(void); |
void GFX_drawCircle(int x0, int y0, int r, unsigned int color); |
void GFX_drawCircleHelper(int x0, int y0, int r, unsigned char cornername, unsigned int color); |
void GFX_fillCircle(int x0, int y0, int r, unsigned int color); |
void GFX_fillCircleHelper(int x0, int y0, int r, unsigned char cornername, int delta, unsigned int color); |
void GFX_drawTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color); |
void GFX_fillTriangle(int x0, int y0, int x1, int y1, int x2, int y2, unsigned int color); |
void GFX_drawRoundRect(int x0, int y0, int w, int h, int radius, unsigned int color); |
void GFX_fillRoundRect(int x0, int y0, int w, int h, int radius, unsigned int color); |
void GFX_drawBitmap(int x, int y, const unsigned char *bitmap, int w, int h, unsigned int color); |
void GFX_drawChar(int x, int y, unsigned char c, unsigned int color, unsigned int bg, unsigned char size); |
void GFX_write(unsigned char c); |
void GFX_writeString(const rom char *fmt, ...); |
void GFX_appendString(const rom char *fmt, ...); |
void GFX_setCursor(int x, int y); |
void GFX_setTextColor(unsigned int c); |
void GFX_setTextColorBG(unsigned int c, unsigned int bg); |
void GFX_setTextSize(unsigned char s); |
void GFX_setTextWrap(unsigned char w); |
void GFX_setRotation(unsigned char r); |
unsigned char GFX_getRotation(void); |
int GFX_height(void); |
int GFX_width(void); |
#endif /* ADAFRUIT_GFX_H */ |
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.cof |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.cof |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/PIC Stuff/PIC_27J13/dist/default/production/PIC_27J13.production.hex |
---|
0,0 → 1,2813 |
:020000040000FA |
:0600000055EF56F012005E |
:020006001200E6 |
:06000800AAEF52F0120005 |
:02000E00257358 |
:0100100000EF |
:020012001200DA |
:060018002EEF53F0120070 |
:02001E000200DE |
:100020002EAD0000850E0000100000001FAD000086 |
:08003000950E00000F00000016 |
:08003800D9CFE6FFE1CFD9FFAB |
:10004000FD0EDBCFA1F1FE0EDBCFA2F1A1C1A5F128 |
:10005000A2C1A6F1FB0EDBCFA3F1FC0EDBCFA4F116 |
:10006000A3C1A7F1A4C1A8F10101B26B000EAB6F4F |
:10007000AC6BA96FAA6B010EB16FAF69B069AD69C6 |
:10008000AE69B36F810EE66EE66AE66A200EE66E32 |
:10009000010EE66E6AEC53F0006E050EE15E005054 |
:1000A000200EE66EE66AE66A000EE66E010EE66E69 |
:1000B0006AEC53F0006E050EE15E0050E552E7CFAA |
:1000C000D9FF1200D9CFE6FFE1CFD9FFFE0EDBCF7B |
:1000D00001F0800E01140BE0FD0EDBCF00F0FE0EF0 |
:1000E000DBCF01F0006C011E000E012206D0FD0ED8 |
:1000F000DBCF00F0FE0EDBCF01F000C0F3FF01C04C |
:10010000F4FFE552E7CFD9FF1200D9CFE6FFE1CFE8 |
:10011000D9FF020EE126FD0EDBCFE9FFFE0EDBCF9D |
:10012000EAFFEECFDEFFEDCFDDFFFB0EDBCFE9FF19 |
:10013000FC0EDBCFEAFFEECF00F0EFCF01F0FD0EBB |
:10014000DBCFE9FFFE0EDBCFEAFF00C0EEFF01C010 |
:10015000EDFFFB0EDBCFE9FFFC0EDBCFEAFFDECFCE |
:10016000EEFFDDCFEDFF020EE15C02E2E16AE55257 |
:10017000E16EE552E7CFD9FF1200D9CFE6FFE1CF1C |
:10018000D9FFF50EDBCFE6FFF60EDBCFE6FFF70E6D |
:10019000DBCFE6FFF80EDBCFE6FFF90EDBCFE6FFA5 |
:1001A000FA0EDBCFE6FFFB0EDBCFE6FFFC0EDBCF6C |
:1001B000E6FFFD0EDBCFE6FFFE0EDBCFE6FF26EC13 |
:1001C00018F0006E0A0EE15E0050E552E7CFD9FF4D |
:1001D0001200D9CFE6FFE1CFD9FFF70EDBCFE6FF64 |
:1001E000F80EDBCFE6FFF90EDBCF02F0FA0EDBCF25 |
:1001F00003F0FB0EDB500224006EFC0EDB500320EC |
:10020000016E0006000E015A00C0E6FF01C0E6FFC5 |
:10021000FD0EDBCFE6FFFE0EDBCFE6FFFB0EDBCFF6 |
:10022000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0EAA |
:10023000DBCFE6FFA2DF046E0A0EE15E0450E5525A |
:10024000E7CFD9FF1200D9CFE6FFE1CFD9FFF70EF4 |
:10025000DBCFE6FFF80EDBCFE6FFFB0EDBCFE6FFE2 |
:10026000FC0EDBCFE6FFF90EDBCF02F0FA0EDBCFA0 |
:1002700003F0FD0EDB500224006EFE0EDB50032067 |
:10028000016E0006000E015A00C0E6FF01C0E6FF45 |
:10029000FB0EDBCFE6FFFC0EDBCFE6FFFD0EDBCF78 |
:1002A000E6FFFE0EDBCFE6FF68DF046E0A0EE15EBE |
:1002B0000450E552E7CFD9FF1200D9CFE6FFE1CFD6 |
:1002C000D9FFF50EDBCFE6FFF60EDBCFE6FFF70E2C |
:1002D000DBCF02F0F80EDBCF03F0FB0EDB50022485 |
:1002E000006EFC0EDB500320016E00C0E6FFE66EE0 |
:1002F000F90EDBCF06F0FA0EDBCF07F0FD0EDB5078 |
:100300000624046EFE0EDB500720056E04C0E6FFD7 |
:10031000E66EFB0EDBCFE6FFFC0EDBCFE6FFFD0E4D |
:10032000DBCFE6FFFE0EDBCFE6FF48EC1AF0086EEF |
:100330000A0EE15E0850E552E7CFD9FF1200D9CF8F |
:10034000E6FFE1CFD9FFF50EDBCFE6FFF60EDBCF00 |
:10035000E6FFF70EDBCF02F0F80EDBCF03F0FB0E6B |
:10036000DB500224006EFC0EDB500320016E00C047 |
:10037000E6FFE66EF90EDBCF06F0FA0EDBCF07F0F4 |
:10038000FD0EDB500624046EFE0EDB500720056ECA |
:1003900004C0E6FFE66EFB0EDBCFE6FFFC0EDBCF14 |
:1003A000E6FFFD0EDBCFE6FFFE0EDBCFE6FF94ECB3 |
:1003B0001CF0086E0A0EE15E0850E552E7CFD9FF47 |
:1003C0001200D9CFE6FFE1CFD9FFFD0EDBCFE6FF6C |
:1003D000FE0EDBCFE6FFA7C1E6FFA8C1E6FFA5C181 |
:1003E000E6FFA6C1E6FF000EE66EE66AE66EE66A86 |
:1003F000A6DF006E0A0EE15E0050E552E7CFD9FF9E |
:10040000120016EF1FF0D9CFE6FFE1CFD9FF0A0E99 |
:10041000E126F90EDBCF00F0FA0EDBCF01F0010E82 |
:10042000D8800056000E015600C0DEFF01C0DDFF7F |
:10043000010EF36E020EF3CFDBFF030EDB6AFE0E3E |
:100440001F6E2068F90EDBCF24F0FA0EDBCF25F00B |
:100450007AEC54F0040E1DC0DBFF050E1EC0DBFF5E |
:10046000060EDB6A070EDB6AF90EDBCF1FF0FA0E11 |
:10047000DBCF20F0080E1FC0DBFF090E20C0DBFF22 |
:10048000F70EDBCFE6FFF80EDBCFE6FFF90EDBCF92 |
:1004900002F0FA0EDBCF03F0FB0EDB500224006EFD |
:1004A000FC0EDB500320016E00C0E6FFE66EFD0E81 |
:1004B000DBCFE6FFFE0EDBCFE6FF0AEC17F0046EA3 |
:1004C000060EE15E0450F70EDBCFE6FFF80EDBCF41 |
:1004D000E6FFFB0EDBCF02F0FC0EDBCF03F0F90EE4 |
:1004E000DB50025C006EFA0EDB500358016E00C058 |
:1004F000E6FFE66EFD0EDBCFE6FFFE0EDBCFE6FF8E |
:100500000AEC17F0046E060EE15E0450F70EDBCF26 |
:10051000E6FFF80EDBCFE6FFFB0EDBCFE6FFFC0EBF |
:10052000DBCFE6FFF90EDBCF02F0FA0EDBCF03F0F4 |
:10053000FD0EDB500224006EFE0EDB500320016E28 |
:1005400000C0E6FFE66E0AEC17F0046E060EE15EF0 |
:100550000450F70EDBCFE6FFF80EDBCFE6FFFB0E15 |
:10056000DBCFE6FFFC0EDBCFE6FFFD0EDBCF02F0BC |
:10057000FE0EDBCF03F0F90EDB50025C006EFA0ECC |
:10058000DB500358016E00C0E6FFE66E0AEC17F080 |
:10059000046E060EE15E0450060EDBCF00F0070E7F |
:1005A000DBCF01F0080EDBCF02F0090EDBCF03F04A |
:1005B00001500318E8AE02D0033404D00250005CAE |
:1005C0000350015801E3B1D1DECF00F0DDCF01F0DF |
:1005D0000001800E01141CE1080EDB06090E01E289 |
:1005E000DB06D950040FE96EDACFEAFF020EEE26E1 |
:1005F000000EED22040EDBCF00F0050EDBCF01F084 |
:10060000D9CFE9FFDACFEAFF0050EE260150ED2204 |
:10061000060EDB2A070E01E3DB2AD950020FE96E32 |
:10062000DACFEAFF020EEE26000EED22020EDBCF3D |
:1006300000F0030EDBCF01F0D9CFE9FFDACFEAFFFC |
:100640000050EE260150ED22F70EDBCFE6FFF80E4C |
:10065000DBCFE6FF080EDBCF02F0090EDBCF03F0A5 |
:10066000FB0EDB500224006EFC0EDB500320016EFB |
:1006700000C0E6FFE66E060EDBCF06F0070EDBCF0E |
:1006800007F0FD0EDB500624046EFE0EDB50072043 |
:10069000056E04C0E6FFE66E0AEC17F0086E060E63 |
:1006A000E15E0850F70EDBCFE6FFF80EDBCFE6FF8A |
:1006B000080EDBCF02F0090EDBCF03F0FB0EDB50A0 |
:1006C0000224006EFC0EDB500320016E00C0E6FF2A |
:1006D000E66EFD0EDBCF06F0FE0EDBCF07F0060E5A |
:1006E000DB50065C046E070EDB500758056E04C035 |
:1006F000E6FFE66E0AEC17F0086E060EE15E0850A3 |
:10070000F70EDBCFE6FFF80EDBCFE6FFFB0EDBCF0D |
:1007100002F0FC0EDBCF03F0080EDB50025C006E33 |
:10072000090EDB500358016E00C0E6FFE66E060EB0 |
:10073000DBCF06F0070EDBCF07F0FD0EDB50062403 |
:10074000046EFE0EDB500720056E04C0E6FFE66E69 |
:100750000AEC17F0086E060EE15E0850F70EDBCFCC |
:10076000E6FFF80EDBCFE6FFFB0EDBCF02F0FC0E60 |
:10077000DBCF03F0080EDB50025C006E090EDB508D |
:100780000358016E00C0E6FFE66EFD0EDBCF06F0FB |
:10079000FE0EDBCF07F0060EDB50065C046E070E84 |
:1007A000DB500758056E04C0E6FFE66E0AEC17F052 |
:1007B000086E060EE15E0850F70EDBCFE6FFF80E7E |
:1007C000DBCFE6FF060EDBCF02F0070EDBCF03F038 |
:1007D000FB0EDB500224006EFC0EDB500320016E8A |
:1007E00000C0E6FFE66E080EDBCF06F0090EDBCF99 |
:1007F00007F0FD0EDB500624046EFE0EDB500720D2 |
:10080000056E04C0E6FFE66E0AEC17F0086E060EF1 |
:10081000E15E0850F70EDBCFE6FFF80EDBCFE6FF18 |
:10082000060EDBCF02F0070EDBCF03F0FB0EDB5032 |
:100830000224006EFC0EDB500320016E00C0E6FFB8 |
:10084000E66EFD0EDBCF06F0FE0EDBCF07F0080EE6 |
:10085000DB50065C046E090EDB500758056E04C0C1 |
:10086000E6FFE66E0AEC17F0086E060EE15E085031 |
:10087000F70EDBCFE6FFF80EDBCFE6FFFB0EDBCF9C |
:1008800002F0FC0EDBCF03F0060EDB50025C006EC4 |
:10089000070EDB500358016E00C0E6FFE66E080E3F |
:1008A000DBCF06F0090EDBCF07F0FD0EDB50062490 |
:1008B000046EFE0EDB500720056E04C0E6FFE66EF8 |
:1008C0000AEC17F0086E060EE15E0850F70EDBCF5B |
:1008D000E6FFF80EDBCFE6FFFB0EDBCF02F0FC0EEF |
:1008E000DBCF03F0060EDB50025C006E070EDB5020 |
:1008F0000358016E00C0E6FFE66EFD0EDBCF06F08A |
:10090000FE0EDBCF07F0080EDB50065C046E090E0E |
:10091000DB500758056E04C0E6FFE66E0AEC17F0E0 |
:10092000086E060EE15E085037D60A0EE15C02E260 |
:10093000E16AE552E16EE552E7CFD9FF1200D9CF67 |
:10094000E6FFE1CFD9FF0A0EE126F90EDBCF00F07A |
:10095000FA0EDBCF01F0010ED8800056000E0156D2 |
:1009600000C0DEFF01C0DDFF010EF36E020EF3CF0B |
:10097000DBFF030EDB6AFE0E1F6E2068F90EDBCF75 |
:1009800024F0FA0EDBCF25F07AEC54F0040E1DC0F3 |
:10099000DBFF050E1EC0DBFF060EDB6A070EDB6AFF |
:1009A000F90EDBCF1FF0FA0EDBCF20F0080E1FC0D0 |
:1009B000DBFF090E20C0DBFF060EDBCF00F0070EC9 |
:1009C000DBCF01F0080EDBCF02F0090EDBCF03F026 |
:1009D00001500318E8AE02D0033404D00250005C8A |
:1009E0000350015801E3CED1DECF00F0DDCF01F09E |
:1009F0000001800E01141CE1080EDB06090E01E265 |
:100A0000DB06D950040FE96EDACFEAFF020EEE26BC |
:100A1000000EED22040EDBCF00F0050EDBCF01F05F |
:100A2000D9CFE9FFDACFEAFF0050EE260150ED22E0 |
:100A3000060EDB2A070E01E3DB2AD950020FE96E0E |
:100A4000DACFEAFF020EEE26000EED22020EDBCF19 |
:100A500000F0030EDBCF01F0D9CFE9FFDACFEAFFD8 |
:100A60000050EE260150ED22F80EDB50006E016AB8 |
:100A7000E850040B5CE0F60EDBCFE6FFF70EDBCFB1 |
:100A8000E6FF080EDBCF02F0090EDBCF03F0FB0E12 |
:100A9000DB500224006EFC0EDB500320016E00C010 |
:100AA000E6FFE66E060EDBCF06F0070EDBCF07F0A3 |
:100AB000FD0EDB500624046EFE0EDB500720056E93 |
:100AC00004C0E6FFE66E0AEC17F0086E060EE15E63 |
:100AD0000850F60EDBCFE6FFF70EDBCFE6FF060E83 |
:100AE000DBCF02F0070EDBCF03F0FB0EDB5002245E |
:100AF000006EFC0EDB500320016E00C0E6FFE66EC8 |
:100B0000080EDBCF06F0090EDBCF07F0FD0EDB5041 |
:100B10000624046EFE0EDB500720056E04C0E6FFBF |
:100B2000E66E0AEC17F0086E060EE15E0850F80E4D |
:100B3000DB50006E016AE850020B5CE0F60EDBCF82 |
:100B4000E6FFF70EDBCFE6FFFB0EDBCF02F0FC0E7D |
:100B5000DBCF03F0080EDB50025C006E090EDB50A9 |
:100B60000358016E00C0E6FFE66E060EDBCF06F00E |
:100B7000070EDBCF07F0FD0EDB500624046EFE0EE1 |
:100B8000DB500720056E04C0E6FFE66E0AEC17F0A6 |
:100B9000086E060EE15E0850F60EDBCFE6FFF70E9C |
:100BA000DBCFE6FFFB0EDBCF02F0FC0EDBCF03F06A |
:100BB000060EDB50025C006E070EDB500358016E20 |
:100BC00000C0E6FFE66E080EDBCF06F0090EDBCFB5 |
:100BD00007F0FD0EDB500624046EFE0EDB500720EE |
:100BE000056E04C0E6FFE66E0AEC17F0086E060E0E |
:100BF000E15E0850F80EDB50006E016AE850080B09 |
:100C00005CE0F60EDBCFE6FFF70EDBCFE6FF060E6D |
:100C1000DBCF02F0070EDBCF03F0FB0EDB5002242C |
:100C2000006EFC0EDB500320016E00C0E6FFE66E96 |
:100C3000FD0EDBCF06F0FE0EDBCF07F0080EDB501B |
:100C4000065C046E090EDB500758056E04C0E6FF13 |
:100C5000E66E0AEC17F0086E060EE15E0850F60E1E |
:100C6000DBCFE6FFF70EDBCFE6FF080EDBCF02F0AF |
:100C7000090EDBCF03F0FB0EDB500224006EFC0EEE |
:100C8000DB500320016E00C0E6FFE66EFD0EDBCFF9 |
:100C900006F0FE0EDBCF07F0060EDB50065C046E9E |
:100CA000070EDB500758056E04C0E6FFE66E0AEC3F |
:100CB00017F0086E060EE15E0850F80EDB50006E6D |
:100CC000016AE850010B01E177D6F60EDBCFE6FFB3 |
:100CD000F70EDBCFE6FFFB0EDBCF02F0FC0EDBCF27 |
:100CE00003F0060EDB50025C006E070EDB5003586B |
:100CF000016E00C0E6FFE66EFD0EDBCF06F0FE0ED5 |
:100D0000DBCF07F0080EDB50065C046E090EDB50EB |
:100D10000758056E04C0E6FFE66E0AEC17F0086E91 |
:100D2000060EE15E0850F60EDBCFE6FFF70EDBCFD6 |
:100D3000E6FFFB0EDBCF02F0FC0EDBCF03F0080E6C |
:100D4000DB50025C006E090EDB500358016E00C0E0 |
:100D5000E6FFE66EFD0EDBCF06F0FE0EDBCF07F002 |
:100D6000060EDB50065C046E070EDB500758056E5E |
:100D700004C0E6FFE66E0AEC17F0086E060EE15EB0 |
:100D800008501AD60A0EE15C02E2E16AE552E16E11 |
:100D9000E552E7CFD9FF1200D9CFE6FFE1CFD9FF67 |
:100DA000F70EDBCFE6FFF80EDBCFE6FF020E1F6E7D |
:100DB000206AF90EDBCF24F0FA0EDBCF25F07AECB7 |
:100DC00054F01DC000F01EC001F0010E0026000E00 |
:100DD000012200C0E6FF01C0E6FFFB0EDBCF04F0FE |
:100DE000FC0EDBCF05F0F90EDB50045C026EFA0E50 |
:100DF000DB500558036E02C0E6FFE66EFD0EDBCF4A |
:100E0000E6FFFE0EDBCFE6FFE9EC00F0066E080E13 |
:100E1000E15E0650F70EDBCFE6FFF80EDBCFE6FF14 |
:100E2000000EE66EE66A030EE66EF90EDBCFE6FF15 |
:100E3000FA0EDBCFE6FFFB0EDBCFE6FFFC0EDBCFCF |
:100E4000E6FFFD0EDBCFE6FFFE0EDBCFE6FF08D8A8 |
:100E5000006E0B0EE15E0050E552E7CFD9FF1200A5 |
:100E6000D9CFE6FFE1CFD9FF0A0EE126F90EDBCF9D |
:100E700000F0FA0EDBCF01F0010ED8800056000E14 |
:100E8000015600C0DEFF01C0DDFF010EF36E020E51 |
:100E9000F3CFDBFF030EDB6AFE0E1F6E2068F90E38 |
:100EA000DBCF24F0FA0EDBCF25F07AEC54F0040E01 |
:100EB0001DC0DBFF050E1EC0DBFF060EDB6A070E42 |
:100EC000DB6AF90EDBCF1FF0FA0EDBCF20F0080E45 |
:100ED0001FC0DBFF090E20C0DBFF060EDBCF00F0DA |
:100EE000070EDBCF01F0080EDBCF02F0090EDBCFDF |
:100EF00003F001500318E8AE02D0033404D00250CE |
:100F0000005C0350015801E381D1DECF00F0DDCF5A |
:100F100001F00001800E01141CE1080EDB06090E31 |
:100F200001E2DB06D950040FE96EDACFEAFF020EC8 |
:100F3000EE26000EED22040EDBCF00F0050EDBCF17 |
:100F400001F0D9CFE9FFDACFEAFF0050EE260150D9 |
:100F5000ED22060EDB2A070E01E3DB2AD950020F31 |
:100F6000E96EDACFEAFF020EEE26000EED22020E47 |
:100F7000DBCF00F0030EDBCF01F0D9CFE9FFDACFF2 |
:100F8000EAFF0050EE260150ED22F80EDB50006E15 |
:100F9000016AE850010B01E198D0F40EDBCFE6FFC7 |
:100FA000F50EDBCFE6FF020E1F6E206A080EDBCFC8 |
:100FB00024F0090EDBCF25F07AEC54F01DC002F0CE |
:100FC0001EC003F0010E0226000E0322F60EDB50B7 |
:100FD0000224006EF70EDB500320016E00C0E6FF16 |
:100FE000E66EFB0EDBCF06F0FC0EDBCF07F0080E43 |
:100FF000DB50065C046E090EDB500758056E04C01A |
:10100000E6FFE66E060EDBCF0AF0070EDBCF0BF035 |
:10101000FD0EDB500A24086EFE0EDB500B20096E1D |
:1010200008C0E6FFE66EE9EC00F00C6E080EE15E2B |
:101030000C50F40EDBCFE6FFF50EDBCFE6FF020E21 |
:101040001F6E206A060EDBCF24F0070EDBCF25F0E3 |
:101050007AEC54F01DC002F01EC003F0010E02260F |
:10106000000E0322F60EDB500224006EF70EDB505A |
:101070000320016E00C0E6FFE66EFB0EDBCF06F03C |
:10108000FC0EDBCF07F0060EDB50065C046E070E8D |
:10109000DB500758056E04C0E6FFE66E080EDBCF96 |
:1010A0000AF0090EDBCF0BF0FD0EDB500A24086EB0 |
:1010B000FE0EDB500B20096E08C0E6FFE66EE9EC81 |
:1010C00000F00C6E080EE15E0C50F80EDB50006E66 |
:1010D000016AE850020B01E100D7F40EDBCFE6FF16 |
:1010E000F50EDBCFE6FF020E1F6E206A080EDBCF87 |
:1010F00024F0090EDBCF25F07AEC54F01DC002F08D |
:101100001EC003F0010E0226000E0322F60EDB5075 |
:101110000224006EF70EDB500320016E00C0E6FFD4 |
:10112000E66EFB0EDBCF06F0FC0EDBCF07F0080E01 |
:10113000DB50065C046E090EDB500758056E04C0D8 |
:10114000E6FFE66EFD0EDBCF0AF0FE0EDBCF0BF006 |
:10115000060EDB500A5C086E070EDB500B58096E5A |
:1011600008C0E6FFE66EE9EC00F00C6E080EE15EEA |
:101170000C50F40EDBCFE6FFF50EDBCFE6FF020EE0 |
:101180001F6E206A060EDBCF24F0070EDBCF25F0A2 |
:101190007AEC54F01DC002F01EC003F0010E0226CE |
:1011A000000E0322F60EDB500224006EF70EDB5019 |
:1011B0000320016E00C0E6FFE66EFB0EDBCF06F0FB |
:1011C000FC0EDBCF07F0060EDB50065C046E070E4C |
:1011D000DB500758056E04C0E6FFE66EFD0EDBCF60 |
:1011E0000AF0FE0EDBCF0BF0080EDB500A5C086E37 |
:1011F000090EDB500B58096E08C0E6FFE66EE9ECFD |
:1012000000F00C6E080EE15E0C5067D60A0EE15C31 |
:1012100002E2E16AE552E16EE552E7CFD9FF120042 |
:10122000D9CFE6FFE1CFD9FFF10EDBCFE6FFF20E1B |
:10123000DBCFE6FFF70EDBCFE6FFF80EDBCFE6FFF6 |
:10124000F90EDBCFE6FFFA0EDBCFE6FFFB0EDBCFBE |
:10125000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E6A |
:10126000DBCFE6FFBDEC00F0006E0A0EE15E005041 |
:10127000F10EDBCFE6FFF20EDBCFE6FFF30EDBCFA6 |
:10128000E6FFF40EDBCFE6FFF50EDBCFE6FFF60E52 |
:10129000DBCFE6FFF70EDBCFE6FFF80EDBCFE6FF96 |
:1012A000F90EDBCFE6FFFA0EDBCFE6FFBDEC00F078 |
:1012B000006E0A0EE15E0050F10EDBCFE6FFF20E8B |
:1012C000DBCFE6FFFB0EDBCFE6FFFC0EDBCFE6FF5E |
:1012D000FD0EDBCFE6FFFE0EDBCFE6FFF30EDBCF2E |
:1012E000E6FFF40EDBCFE6FFF50EDBCFE6FFF60EF2 |
:1012F000DBCFE6FFBDEC00F0006E0A0EE15E0050B1 |
:10130000E552E7CFD9FF1200D9CFE6FFE1CFD9FFF1 |
:10131000180EE126F90EDBCF02F0FA0EDBCF03F058 |
:10132000FD0EDB50025C006EFE0EDB500358016EBA |
:10133000080E00C0DBFF090E01C0DBFFF70EDBCF9C |
:1013400002F0F80EDBCF03F0FB0EDB50025C006E08 |
:10135000FC0EDB500358016E0A0E00C0DBFF0B0EC3 |
:1013600001C0DBFFF50EDBCF02F0F60EDBCF03F0A2 |
:10137000FD0EDB50025C006EFE0EDB500358016E6A |
:101380000C0E00C0DBFF0D0E01C0DBFFF30EDBCF48 |
:1013900002F0F40EDBCF03F0FB0EDB50025C006EBC |
:1013A000FC0EDB500358016E0E0E00C0DBFF0F0E6B |
:1013B00001C0DBFFF50EDBCF02F0F60EDBCF03F052 |
:1013C000F90EDB50025C006EFA0EDB500358016E22 |
:1013D000100E00C0DBFF110E01C0DBFFF30EDBCFF0 |
:1013E00002F0F40EDBCF03F0F70EDB50025C006E70 |
:1013F000F80EDB500358016E120E00C0DBFF130E17 |
:1014000001C0DBFF140EDB6A150EDB6A160EDB6A09 |
:10141000170EDB6AFB0EDBCF00F0FC0EDBCF01F01A |
:10142000F70EDBCF02F0F80EDBCF03F0035001180C |
:10143000E8AE02D0013404D00050025C01500358E1 |
:1014400024E2D950F70FE66EFF0EDA20E66ED9508F |
:10145000FB0FE66EFF0EDA20E66E85EC00F0E5523B |
:10146000E552E552E552D950F90FE66EFF0EDA204B |
:10147000E66ED950FD0FE66EFF0EDA20E66E85ECC3 |
:1014800000F0E552E552E552E552F70EDBCF00F0F1 |
:10149000F80EDBCF01F0F30EDBCF02F0F40EDBCF62 |
:1014A00003F003500118E8AE02D0013404D000501C |
:1014B000025C0150035824E2D950F70FE66EFF0E8C |
:1014C000DA20E66ED950F30FE66EFF0EDA20E66EF4 |
:1014D00085EC00F0E552E552E552E552D950F90F9E |
:1014E000E66EFF0EDA20E66ED950F50FE66EFF0EBF |
:1014F000DA20E66E85EC00F0E552E552E552E55261 |
:10150000FB0EDBCF00F0FC0EDBCF01F0F70EDBCFE4 |
:1015100002F0F80EDBCF03F003500118E8AE02D062 |
:10152000013404D00050025C0150035824E2D95029 |
:10153000F70FE66EFF0EDA20E66ED950FB0FE66E6F |
:10154000FF0EDA20E66E85EC00F0E552E552E5523A |
:10155000E552D950F90FE66EFF0EDA20E66ED9504B |
:10156000FD0FE66EFF0EDA20E66E85EC00F0E55228 |
:10157000E552E552E552FB0EDBCF00F0FC0EDBCF6F |
:1015800001F0F30EDB50001801E0BCD0F40EDB508C |
:10159000011801E0B7D0FD0EDBCF1FF0FE0EDBCF50 |
:1015A00020F0020E1FC0DBFF030E20C0DBFF1FC0B8 |
:1015B000DEFF20C0DDFFF90EDBCF00F0FA0EDBCF3F |
:1015C00001F0DECF02F0DDCF03F001500318E8AEEA |
:1015D00002D0033404D00250005C0350015806E2EC |
:1015E000F90EDBCFDEFFDBCFDDFF23D0F90EDBCF43 |
:1015F00000F0FA0EDBCF01F0020EDBCF02F0030E9B |
:10160000DBCF03F003500118E8AE02D0013404D060 |
:101610000050025C015003580CE2F90EDBCF1FF0C2 |
:10162000FA0EDBCF20F0020E1FC0DBFF030E20C03E |
:10163000DBFFF50EDBCF00F0F60EDBCF01F0DECFE7 |
:1016400002F0DDCF03F001500318E8AE02D00334FE |
:1016500004D00250005C0350015806E2F50EDBCFC7 |
:10166000DEFFDBCFDDFF23D0F50EDBCF00F0F60E83 |
:10167000DBCF01F0020EDBCF02F0030EDBCF03F075 |
:1016800003500118E8AE02D0013404D00050025CCF |
:10169000015003580CE2F50EDBCF1FF0F60EDBCF46 |
:1016A00020F0020E1FC0DBFF030E20C0DBFFF10E97 |
:1016B000DBCFE6FFF20EDBCFE6FF020EDBCF02F060 |
:1016C000030EDBCF03F0DE50025C006EDD500358EA |
:1016D000016E010E0026000E012200C0E6FF01C0CF |
:1016E000E6FFFB0EDBCFE6FFFC0EDBCFE6FFDECF37 |
:1016F000E6FFDDCFE6FF23EC01F0046E080EE15EAD |
:10170000045008D2F70EDBCF00F0F80EDBCF01F06B |
:10171000F30EDB50001811E1F40EDB5001180DE15F |
:10172000F70EDBCF1FF0F80EDBCF20F0060E1FC048 |
:10173000DBFF070E20C0DBFF0FD0F70EDBCF00F082 |
:10174000F80EDBCF01F00006000E015A060E00C0B5 |
:10175000DBFF070E01C0DBFFFB0EDBCF1FF0FC0E33 |
:10176000DBCF20F0040E1FC0DBFF050E20C0DBFF27 |
:10177000040EDBCF00F0050EDBCF01F0060EDBCF51 |
:1017800002F0070EDBCF03F003500118E8AE02D0E1 |
:10179000013404D00050025C0150035801E2B1D082 |
:1017A000FD0EDBCF02F0FE0EDBCF03F0140EDBCF1D |
:1017B0001FF0150EDBCF20F00A0EDBCF24F00B0E4E |
:1017C000DBCF25F054EC54F002501F24006E035080 |
:1017D0002020016E00C0DEFFDD6EFD0EDBCF02F0CB |
:1017E000FE0EDBCF03F0160EDBCF1FF0170EDBCFA4 |
:1017F00020F00E0EDBCF24F00F0EDBCF25F054ECE3 |
:1018000054F002501F24006E03502020016E020E7F |
:1018100000C0DBFF030E01C0DBFF080EDBCF00F0D2 |
:10182000090EDBCF01F0D950140FE96EDACFEAFFD1 |
:101830000050EE260150ED220C0EDBCF00F00D0E15 |
:10184000DBCF01F0D950160FE96EDACFEAFF005076 |
:10185000EE260150ED22DECF00F0DDCF01F0020ECA |
:10186000DBCF02F0030EDBCF03F003500118E8AE2C |
:1018700002D0013404D00050025C0150035810E241 |
:10188000D950020FE66E000EDA20E66ED9CFE6FFE1 |
:10189000DACFE6FF85EC00F0E552E552E552E5527D |
:1018A000F10EDBCFE6FFF20EDBCFE6FF020EDBCF61 |
:1018B00002F0030EDBCF03F0DE50025C006EDD5061 |
:1018C0000358016E010E0026000E012200C0E6FF43 |
:1018D00001C0E6FF040EDBCFE6FF050EDBCFE6FF1F |
:1018E000DECFE6FFDDCFE6FF23EC01F0046E080E4D |
:1018F000E15E0450040EDB2A050E01E239D7DB2A33 |
:1019000037D7040EDBCF02F0050EDBCF03F0F70E66 |
:10191000DB50025C006EF80EDB500358016E100EB7 |
:10192000DBCF1FF0110EDBCF20F000C024F001C090 |
:1019300025F07AEC54F0140E1DC0DBFF150E1EC00E |
:10194000DBFF040EDBCF02F0050EDBCF03F0FB0E56 |
:10195000DB50025C006EFC0EDB500358016E0C0E77 |
:10196000DBCF1FF00D0EDBCF20F000C024F001C054 |
:1019700025F07AEC54F0160E1DC0DBFF170E1EC0CA |
:10198000DBFF040EDBCF00F0050EDBCF01F0F30E22 |
:10199000DBCF02F0F40EDBCF03F003500118E8AE0A |
:1019A00002D0013404D00050025C0150035801E21F |
:1019B000B1D0F90EDBCF02F0FA0EDBCF03F0140E3C |
:1019C000DBCF1FF0150EDBCF20F0120EDBCF24F0A3 |
:1019D000130EDBCF25F054EC54F002501F24006EA0 |
:1019E00003502020016E00C0DEFFDD6EFD0EDBCF58 |
:1019F00002F0FE0EDBCF03F0160EDBCF1FF0170E4A |
:101A0000DBCF20F00E0EDBCF24F00F0EDBCF25F066 |
:101A100054EC54F002501F24006E03502020016E3D |
:101A2000020E00C0DBFF030E01C0DBFF100EDBCF98 |
:101A300000F0110EDBCF01F0D950140FE96EDACFB0 |
:101A4000EAFF0050EE260150ED220C0EDBCF00F035 |
:101A50000D0EDBCF01F0D950160FE96EDACFEAFF99 |
:101A60000050EE260150ED22DECF00F0DDCF01F078 |
:101A7000020EDBCF02F0030EDBCF03F003500118A0 |
:101A8000E8AE02D0013404D00050025C015003588B |
:101A900010E2D950020FE66E000EDA20E66ED9CFC2 |
:101AA000E6FFDACFE6FF85EC00F0E552E552E552BD |
:101AB000E552F10EDBCFE6FFF20EDBCFE6FF020EC2 |
:101AC000DBCF02F0030EDBCF03F0DE50025C006ED2 |
:101AD000DD500358016E010E0026000E012200C0E9 |
:101AE000E6FF01C0E6FF040EDBCFE6FF050EDBCF0D |
:101AF000E6FFDECFE6FFDDCFE6FF23EC01F0046E6C |
:101B0000080EE15E0450040EDB2A050E01E239D70F |
:101B1000DB2A37D7180EE15C02E2E16AE552E16E9A |
:101B2000E552E7CFD9FF1200D9CFE6FFE1CFD9FFC9 |
:101B3000F30EDBCFE6FFF40EDBCFE6FFF90EDBCFD3 |
:101B400002F0FA0EDBCF03F0020E1F6E206AF50ED4 |
:101B5000DBCF24F0F60EDBCF25F07AEC54F01D50ED |
:101B6000025C006E1E500358016E00C0E6FFE66E78 |
:101B7000FB0EDBCFE6FFFC0EDBCFE6FFF50EDBCF87 |
:101B800006F0F60EDBCF07F0FD0EDB500624046EE8 |
:101B9000FE0EDB500720056E04C0E6FFE66E23EC68 |
:101BA00001F0086E080EE15E0850F30EDBCFE6FF91 |
:101BB000F40EDBCFE6FFF90EDBCF02F0FA0EDBCF3F |
:101BC00003F0020E1F6E206AF50EDBCF24F0F60E36 |
:101BD000DBCF25F07AEC54F01D50025C006E1E50F5 |
:101BE0000358016E00C0E6FFE66EF70EDBCF06F08D |
:101BF000F80EDBCF07F0FB0EDB500624046EFC0E64 |
:101C0000DB500720056E0406000E055A04C0E6FFEF |
:101C100005C0E6FFF50EDBCF0AF0F60EDBCF0BF0CA |
:101C2000FD0EDB500A24086EFE0EDB500B20096E01 |
:101C300008C0E6FFE66E23EC01F00C6E080EE15ED4 |
:101C40000C50F30EDBCFE6FFF40EDBCFE6FFF70E12 |
:101C5000DBCF02F0F80EDBCF03F0020E1F6E206A1E |
:101C6000F50EDBCF24F0F60EDBCF25F07AEC54F046 |
:101C70001D50025C006E1E500358016E00C0E6FF4E |
:101C8000E66EF50EDBCF06F0F60EDBCF07F0FB0EAF |
:101C9000DB500624046EFC0EDB500720056E04C0EA |
:101CA000E6FFE66EFD0EDBCFE6FFFE0EDBCFE6FFC6 |
:101CB000E9EC00F0086E080EE15E0850F30EDBCF91 |
:101CC000E6FFF40EDBCFE6FFF70EDBCF02F0F80EF7 |
:101CD000DBCF03F0020E1F6E206AF50EDBCF24F07F |
:101CE000F60EDBCF25F07AEC54F01D50025C006E4E |
:101CF0001E500358016E00C0E6FFE66EF50EDBCF06 |
:101D000006F0F60EDBCF07F0FB0EDB500624046E68 |
:101D1000FC0EDB500720056E04C0E6FFE66EF90EF0 |
:101D2000DBCF0AF0FA0EDBCF0BF0FD0EDB500A24FE |
:101D3000086EFE0EDB500B20096E0806000E095AD5 |
:101D400008C0E6FF09C0E6FFE9EC00F00C6E080EE3 |
:101D5000E15E0C50F30EDBCFE6FFF40EDBCFE6FFC7 |
:101D6000010EE66EF50EDBCFE6FFF60EDBCFE6FFEB |
:101D7000F50EDBCF02F0F60EDBCF03F0FB0EDB50EF |
:101D80000224006EFC0EDB500320016E00C0E6FF53 |
:101D9000E66EF50EDBCF06F0F60EDBCF07F0FD0E9C |
:101DA000DB500624046EFE0EDB500720056E04C0D7 |
:101DB000E6FFE66E9FEC04F0086E090EE15E085047 |
:101DC000F30EDBCFE6FFF40EDBCFE6FF020EE66E8E |
:101DD000F50EDBCFE6FFF60EDBCFE6FFF50EDBCF31 |
:101DE00002F0F60EDBCF03F0FB0EDB500224006E98 |
:101DF000FC0EDB500320016E00C0E6FFE66EF90E1C |
:101E0000DBCF08F0FA0EDBCF09F0FD0EDB50082423 |
:101E1000066EFE0EDB500920076EF50EDB50065CE9 |
:101E2000046EF60EDB500758056E0406000E055AC8 |
:101E300004C0E6FF05C0E6FF9FEC04F00A6E090E41 |
:101E4000E15E0A50F30EDBCFE6FFF40EDBCFE6FFD8 |
:101E5000040EE66EF50EDBCFE6FFF60EDBCFE6FFF7 |
:101E6000F70EDBCF04F0F80EDBCF05F0FB0EDB50F6 |
:101E70000424026EFC0EDB500520036EF50EDB50D1 |
:101E8000025C006EF60EDB500358016E0006000E79 |
:101E9000015A00C0E6FF01C0E6FFF90EDBCF0AF0F1 |
:101EA000FA0EDBCF0BF0FD0EDB500A24086EFE0E9F |
:101EB000DB500B20096EF50EDB50085C066EF60E4B |
:101EC000DB500958076E0606000E075A06C0E6FFEB |
:101ED00007C0E6FF9FEC04F00C6E090EE15E0C50AB |
:101EE000F30EDBCFE6FFF40EDBCFE6FF080EE66E67 |
:101EF000F50EDBCFE6FFF60EDBCFE6FFF70EDBCF0E |
:101F000004F0F80EDBCF05F0FB0EDB500424026E6C |
:101F1000FC0EDB500520036EF50EDB50025C006EFC |
:101F2000F60EDB500358016E0006000E015A00C089 |
:101F3000E6FF01C0E6FFF50EDBCF08F0F60EDBCFC3 |
:101F400009F0FD0EDB500824066EFE0EDB50092062 |
:101F5000076E06C0E6FFE66E9FEC04F00A6E090EFF |
:101F6000E15E0A50E552E7CFD9FF1200D9CFE6FF74 |
:101F7000E1CFD9FFF30EDBCFE6FFF40EDBCFE6FFB8 |
:101F8000F70EDBCFE6FFF80EDBCFE6FFF90EDBCF77 |
:101F900002F0FA0EDBCF03F0020E1F6E206AF50E80 |
:101FA000DBCF24F0F60EDBCF25F07AEC54F01D5099 |
:101FB000025C006E1E500358016E00C0E6FFE66E24 |
:101FC000FB0EDBCFE6FFFC0EDBCFE6FFF50EDBCF33 |
:101FD00006F0F60EDBCF07F0FD0EDB500624046E94 |
:101FE000FE0EDB500720056E04C0E6FFE66E9FEC98 |
:101FF00001F0086E0A0EE15E0850F30EDBCFE6FF3B |
:10200000F40EDBCFE6FFF70EDBCF02F0F80EDBCFEE |
:1020100003F0020E1F6E206AF50EDBCF24F0F60EE1 |
:10202000DBCF25F07AEC54F01D50025C006E1E50A0 |
:102030000358016E0006000E015A00C0E6FF01C001 |
:10204000E6FF010EE66EF50EDBCFE6FFF60EDBCF08 |
:10205000E6FFF50EDBCF06F0F60EDBCF07F0FB0E4A |
:10206000DB500624046EFC0EDB500720056E04C016 |
:10207000E6FFE66EF90EDBCF0CF0FA0EDBCF0DF0CB |
:10208000FD0EDB500C240A6EFE0EDB500D200B6E95 |
:10209000F50EDB500A5C086EF60EDB500B58096E2D |
:1020A0000806000E095A08C0E6FF09C0E6FF30EC3A |
:1020B00007F00E6E0B0EE15E0E50F30EDBCFE6FF67 |
:1020C000F40EDBCFE6FFF70EDBCF02F0F80EDBCF2E |
:1020D00003F0020E1F6E206AF50EDBCF24F0F60E21 |
:1020E000DBCF25F07AEC54F01D50025C006E1E50E0 |
:1020F0000358016E0006000E015A00C0E6FF01C041 |
:10210000E6FF020EE66EF50EDBCFE6FFF60EDBCF46 |
:10211000E6FFF50EDBCF06F0F60EDBCF07F0FB0E89 |
:10212000DB500624046EFC0EDB500720056E04C055 |
:10213000E6FFE66EF50EDBCF0AF0F60EDBCF0BF016 |
:10214000FD0EDB500A24086EFE0EDB500B20096EDC |
:1021500008C0E6FFE66E30EC07F00C6E0B0EE15E99 |
:102160000C50E552E7CFD9FF1200D9CFE6FFE1CFFF |
:10217000D9FF040EE126020EDB6A030EDB6A020EB3 |
:10218000DBCF00F0030EDBCF01F0F50EDBCF02F06A |
:10219000F60EDBCF03F001500318E8AE02D0033493 |
:1021A00004D00250005C0350015801E393D0DE6A72 |
:1021B000DD6ADECF00F0DDCF01F0F70EDBCF02F0FD |
:1021C000F80EDBCF03F001500318E8AE02D0033461 |
:1021D00004D00250005C0350015875E2020EDBCFC0 |
:1021E00008F0030EDBCF09F0080E246E256A08C044 |
:1021F0001FF009C020F054EC54F01BC008F01CC0C4 |
:1022000009F0DECF04F0DDCF05F0080E066E076A98 |
:10221000020EDBCF1FF0030EDBCF20F006C024F050 |
:1022200007C025F054EC54F0F70EDBCF24F0F80E85 |
:10223000DBCF25F07AEC54F004501D24026E0550DB |
:102240001E20036EF90EDB500224E96EFA0EDB50FD |
:102250000320EA6EEF5000010814016AE8500110F3 |
:102260002CE0F30EDBCFE6FFF40EDBCFE6FF020E31 |
:10227000DBCF02F0030EDBCF03F0FB0EDB500224BA |
:10228000006EFC0EDB500320016E00C0E6FFE66E20 |
:10229000FD0EDBCF06F0FE0EDBCF07F0DE5006248E |
:1022A000046EDD500720056E04C0E6FFE66E0AEC02 |
:1022B00017F0086E060EE15E0850DF2A010E01E2FB |
:1022C00078D7DB2A76D7020EDB2A030E01E257D736 |
:1022D000DB2A55D7040EE15C02E2E16AE552E16EC9 |
:1022E000E552E7CFD9FF1200D9CFE6FFE1CFD9FF02 |
:1022F000060EE126FD0EDBCF06F0FE0EDBCF07F06B |
:1023000001010750A619E8AE02D0A63504D0A551A8 |
:10231000065CA651075813E2FB0EDBCF08F0FC0E5B |
:10232000DBCF09F00950A819E8AE02D0A83504D0D7 |
:10233000A751085CA851095802E2000E01D0010E15 |
:10234000046E056AE850051022E1FD0EDBCF0CF0AB |
:10235000FE0EDBCF0DF0F50EDB500E6E0F6A050E94 |
:102360001F6E206A0EC024F00FC025F07AEC54F0E6 |
:102370000C501D240A6E0D501E200B6E0A06000E16 |
:102380000B5A0001800E0B1402E1000E01D0010E69 |
:10239000026E036AE850031022E1FB0EDBCF12F05D |
:1023A000FC0EDBCF13F0F50EDB50146E156A080E31 |
:1023B0001F6E206A14C024F015C025F07AEC54F08A |
:1023C00012501D24106E13501E20116E1006000EA8 |
:1023D000115A0001800E111402E1000E01D0010E0D |
:1023E000016AE850011001E024D1DE6ADD6ADECF27 |
:1023F00000F0DDCF01F0D890015004E6060E005C3D |
:10240000000E015801E315D1D9CFE9FFDACFEAFF79 |
:10241000050EEE1807E1ED5005E1040EDB6A050E2E |
:10242000DB6A2FD0F30E006E990E016E000E026E65 |
:10243000DECF06F0DDCF07F0FA0EDB50050DF350CE |
:102440000624036EF4500720046E056A04BE056876 |
:1024500000500324F36E01500420F46E0250052056 |
:10246000F86EF4CFF7FFF3CFF6FF0800F550E66EF5 |
:10247000D950040FE96EDACFEAFFE552E750EE6E6D |
:10248000ED6A020EDB6A030EDB6A020EDBCF00F0A0 |
:10249000030EDBCF01F0D890015004E6080E005C7B |
:1024A000000E015801E3BFD0040EDB50010B13E016 |
:1024B000F50EDB50006E016A010E001807E10150B5 |
:1024C00005E1F80EDBCFE6FFF90E21D0F80EDBCFE9 |
:1024D000E6FFF90E49D0F60EDBCF00F0F70EDBCFAA |
:1024E00001F0F80EDB50001803E1F90EDB50011883 |
:1024F00001E184D0F50EDB50006E016A010E001878 |
:102500002FE101502DE1F60EDBCFE6FFF70EDBCF1A |
:10251000E6FF020EDBCF02F0030EDBCF03F0FB0E73 |
:10252000DB500224006EFC0EDB500320016E00C065 |
:10253000E6FFE66EFD0EDBCF06F0FE0EDBCF07F00A |
:10254000DE500624046EDD500720056E04C0E6FF51 |
:10255000E66E0AEC17F0086E060EE15E08504ED0EB |
:10256000F60EDBCFE6FFF70EDBCFE6FFF50EDBCF97 |
:10257000E6FFE66ADBCFE6FFE66AFB0EDBCF02F0A2 |
:10258000FC0EDBCF03F0F50EDB50046E056A020E85 |
:10259000DBCF1FF0030EDBCF20F004C024F005C01A |
:1025A00025F07AEC54F002501D24006E03501E20DA |
:1025B000016E00C0E6FFE66EFD0EDBCF08F0FE0EFA |
:1025C000DBCF09F0F50EDB500A6E0B6A1F6E0BC0F5 |
:1025D00020F0DECF24F0DDCF25F07AEC54F0085067 |
:1025E0001D24066E09501E20076E06C0E6FFE66E2B |
:1025F0009FEC01F00C6E0A0EE15E0C50D950040FF6 |
:10260000E96EDACFEAFF010E0F0B06E0EC52D8902C |
:10261000ED32EF32E806FAE1020EDB2A030E01E2A8 |
:1026200034D7DB2A32D7DF2A010E01E2E0D6DB2ADB |
:10263000DED6060EE15C02E2E16AE552E16EE552A9 |
:10264000E7CFD9FF1200D9CFE6FFE1CFD9FFFE0EC9 |
:10265000DB50026E036A0A0E021801E103500BE020 |
:10266000FE0EDB50046E056A0D0E041801E10550E4 |
:1026700002E0000E01D0010E006E016AE850011068 |
:1026800002E0010142D00101B151E66EAFC1E6FFA7 |
:10269000B0C1E6FFADC1E6FFAEC1E6FFFE0EDB5006 |
:1026A000E66EABC1E6FFACC1E6FFA9C1E6FFAAC179 |
:1026B000E6FF1ADE006E0A0EE15E00500101B15124 |
:1026C000060DF350A927F450AA23B351026E036AF2 |
:1026D0000250031013E0B151060DF350A55D046ED6 |
:1026E000F450A659056EE850AA19E8AE02D0AA35F2 |
:1026F00004D0A951045CAA51055802E3000E01D090 |
:10270000010E016AE850011008E0B151080DF350C4 |
:10271000AB27F450AC23A96BAA6BE552E7CFD9FFE6 |
:102720001200D9CFE6FFE1CFD9FF040EE126D95040 |
:10273000FC0F006EFF0EDA20016E020E00C0DBFF00 |
:10274000030E01C0DBFF020EDBCFE6FF030EDBCF83 |
:10275000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E55 |
:10276000DBCFE6FF000EE66E010EE66E14EC55F0D0 |
:10277000006E070EE15E0050000EE66E010EE66E82 |
:1027800084EC53F0E552E552010EF3CFDBFFDB5052 |
:10279000006E016A013408E200502008000E015466 |
:1027A00003E2DE52200EDD6EDF6ADF50006E016A4A |
:1027B000010EDB50000101AE02D0D89003D0005CC6 |
:1027C000000E01580CE2DF50EA6A000FE96E010EBC |
:1027D000EA22EF50E66E37DFE552DF2AE6D7040E35 |
:1027E000E15C02E2E16AE552E16EE552E7CFD9FF32 |
:1027F0001200D9CFE6FFE1CFD9FF040EE126D95070 |
:10280000FC0F006EFF0EDA20016E020E00C0DBFF2F |
:10281000030E01C0DBFF020EDBCFE6FF030EDBCFB2 |
:10282000E6FFFC0EDBCFE6FFFD0EDBCFE6FFFE0E84 |
:10283000DBCFE6FF000EE66E010EE66E14EC55F0FF |
:10284000006E070EE15E0050000EE66E010EE66EB1 |
:1028500084EC53F0E552E552010EF3CFDBFFDB5081 |
:10286000006E016A010E001803E1015001E1ABD0D6 |
:10287000010EDB50006E016A013408E200502008AE |
:10288000000E015403E2DE52200EDD6E4ED9F3CF6E |
:1028900004F0F4CF05F0060E246E256AF3CF1FF086 |
:1028A000F4CF20F054EC54F01FC004F020C005F029 |
:1028B000010EDB50026E036A0206000E035A02C0CC |
:1028C0001FF003C020F004C024F005C025F054EC34 |
:1028D00054F005AE04D01B6C1C1E000E1C221BC045 |
:1028E00000F01CC001F01B501C1002E1010EDB06C1 |
:1028F0007F0EDF6EDF50006E016A010EDB50026E4C |
:10290000036A0206000E035A03500118E8AE02D013 |
:10291000013404D00050025C015003581EE2DF5025 |
:10292000006E016A010EDB50026E036AE850005C23 |
:10293000E96E03500158EA6E200EE926010EEA22E4 |
:10294000EF50E66EDF50EA6A200FE96E010EEA22D0 |
:10295000E552E750EF6EDF06CDD7010EDBCFE6FF85 |
:10296000E66A000EE66E010EE66E200EE66E010EC1 |
:10297000E66E3FEC53F0006E060EE15E005001EC97 |
:1029800002F0000EE66EE66AE66EE66A26D8E552CA |
:10299000E552E552E552DF6ADF50006E016AD890D9 |
:1029A000015004E6800E005C000E01580CE2DF507E |
:1029B000EA6A200FE96E010EEA22EF50E66E43DE6E |
:1029C000E552DF2AE9D7040EE15C02E2E16AE55252 |
:1029D000E16EE552E7CFD9FF1200D9CFE6FFE1CF94 |
:1029E000D9FFFD0EDBCFA9F1FE0EDBCFAAF1FB0E66 |
:1029F000DBCFABF1FC0EDBCFACF1E552E7CFD9FF7B |
:102A00001200D9CFE6FFE1CFD9FFFD0EDBCFADF14C |
:102A1000FE0EDBCFAEF1FD0EDBCFAFF1FE0EDBCF56 |
:102A2000B0F1E552E7CFD9FF1200D9CFE6FFE1CFF1 |
:102A3000D9FFFD0EDBCFADF1FE0EDBCFAEF1FB0E0D |
:102A4000DBCFAFF1FC0EDBCFB0F1E552E7CFD9FF22 |
:102A50001200D9CFE6FFE1CFD9FFFE0EDB50026EA8 |
:102A6000036A033408E202500008000E035403E234 |
:102A7000FE0EDB5001D0010E006E016AE8CFB1F10D |
:102A8000E552E7CFD9FF1200D9CFE6FFE1CFD9FF5A |
:102A9000FE0EDB500101B36FE552E7CFD9FF120004 |
:102AA000D9CFE6FFE1CFD9FFFE0EDBCFE7FF030E64 |
:102AB000E716FE0EE7CFDBFFDB500101B26FFE0E23 |
:102AC000DB50006E016A010E001801E1015017E0B1 |
:102AD000030E001801E1015012E0005001E1015025 |
:102AE00005E0020E001813E1015011E1A1C1A5F1AA |
:102AF000A2C1A6F1A3C1A7F1A4C1A8F108D0A3C1A6 |
:102B0000A5F1A4C1A6F1A1C1A7F1A2C1A8F1E55206 |
:102B1000E7CFD9FF12000101030EB217B251120024 |
:102B2000A7C1F3FFA8C1F4FF1200A5C1F3FFA6C11E |
:042B3000F4FF12009C |
:0C2B3400400EE66EE66A600EE66EE66A91 |
:102B40001CEC00F0E552E552E552E5521200D9CFF7 |
:102B5000E6FFE1CFD9FF250EE1268A9C010EE66E45 |
:102B6000F6EC55F0E5528A8CAE0EDF6EDE52A00E0A |
:102B7000DD6E720EF36E020EF3CFDBFFA10EF36E6D |
:102B8000030EF3CFDBFF040EDB6AA20EF36E050E1D |
:102B9000F3CFDBFF060EDB6AA40EF36E070EF3CF56 |
:102BA000DBFFA80EF36E080EF3CFDBFF3F0EF36ED4 |
:102BB000090EF3CFDBFFAD0EF36E0A0EF3CFDBFF92 |
:102BC0008E0EF36E0B0EF3CFDBFFB00EF36E0C0E1A |
:102BD000F3CFDBFF0B0EF36E0D0EF3CFDBFFB10E69 |
:102BE000F36E0E0EF3CFDBFF310EF36E0F0EF3CF4D |
:102BF000DBFFB30EF36E100EF3CFDBFFF00EF36EC0 |
:102C0000110EF3CFDBFF8A0EF36E120EF3CFDBFF54 |
:102C1000640EF36E130EF3CFDBFF8B0EF36E140E08 |
:102C2000F3CFDBFF780EF36E150EF3CFDBFF8A0ECA |
:102C3000F36E160EF3CFDBFF640EF36E170EF3CFB9 |
:102C4000DBFFBB0EF36E180EF3CFDBFF3A0EF36E15 |
:102C5000190EF3CFDBFFBE0EF36E1A0EF3CFDBFFC0 |
:102C60003E0EF36E1B0EF3CFDBFF870EF36E1C0ED2 |
:102C7000F3CFDBFF060EF36E1D0EF3CFDBFF810EED |
:102C8000F36E1E0EF3CFDBFF910EF36E1F0EF3CF2C |
:102C9000DBFF820EF36E200EF3CFDBFF500EF36EE0 |
:102CA000210EF3CFDBFF830EF36E220EF3CFDBFF9B |
:102CB0007D0EF36E230EF3CFDBFFAF0EF36E240E0B |
:102CC000F3CFDBFF8A9A250EE66EE66AD9CFE6FFE0 |
:102CD000DACFE6FF10EC50F0E552E552E552E5524E |
:102CE000250EE15C02E2E16AE552E16EE552E7CFD2 |
:102CF000D9FF1200D9CFE6FFE1CFD9FF060EE126BA |
:102D0000FD0EDBCF02F0FE0EDBCF03F0D8900350B8 |
:102D100004E6600E025C000E035810E2FB0EDBCFEF |
:102D200004F0FC0EDBCF05F0D890055004E6400E11 |
:102D3000045C000E055802E2000E01D0010E006E88 |
:102D4000016AE85001102BE1150EDF6EFD0EDB501D |
:102D5000E76E010EE7CFDBFF5F0EF36E020EF3CFDF |
:102D6000DBFF750EF36E030EF3CFDBFFFB0EDB50C4 |
:102D7000E76E040EE7CFDBFF3F0EF36E050EF3CFD9 |
:102D8000DBFF8A9A060EE66EE66AD9CFE6FFDACF57 |
:102D9000E6FF10EC50F0E552E552E552E552060E22 |
:102DA000E15C02E2E16AE552E16EE552E7CFD9FF6C |
:102DB00012001200D9CFE6FFE1CFD9FF8A9A010EA7 |
:102DC000E66EE66AD950FE0FE66EFF0EDA20E66E7A |
:102DD00010EC50F0E552E552E552E552E552E7CFEE |
:102DE000D9FF1200D9CFE6FFE1CFD9FF8A8A010EC1 |
:102DF000E66EE66AD950FE0FE66EFF0EDA20E66E4A |
:102E000010EC50F0E552E552E552E552E552E7CFBD |
:102E1000D9FF1200D9CFE6FFE1CFD9FF020EE1269C |
:102E2000FA0EDBCF01F001C000F0016A0050DF6E46 |
:102E3000F90EDB50E76E010EE7CFDBFFFD0EDBCFB7 |
:102E400006F0FE0EDBCF07F00001800E071423E131 |
:102E5000FD0EDBCF08F0FE0EDBCF09F008C0E6FF69 |
:102E600009C0E6FF95EC15F0E552E7CF09F0E55211 |
:102E7000E7CF08F0F3CF0AF0F4CF0BF00950F418C5 |
:102E8000E8AE02D00B3404D00A50085C0B5009584D |
:102E900002E2000E01D0010E046E056AE850051032 |
:102EA0000CE1FB0EDBCF0CF0FC0EDBCF0DF00001D4 |
:102EB000800E0D1402E1000E01D0010E026E036AB5 |
:102EC000E850031023E1FB0EDBCF0EF0FC0EDBCF4E |
:102ED0000FF00EC0E6FF0FC0E6FF90EC15F0E552D4 |
:102EE000E7CF0FF0E552E7CF0EF0F3CF10F0F4CFBD |
:102EF00011F00F50F418E8AE02D0113404D0105085 |
:102F00000E5C11500F5802E2000E01D0010E006E4F |
:102F1000016AE850011001E08FD08BEC15F0006ED3 |
:102F2000016A030E001801E1015042E0020E001890 |
:102F300001E1015029E0010E00185FE101505DE15F |
:102F4000D950FB0FE66EFF0EDA20E66ED950FD0F6A |
:102F5000E66EFF0EDA20E66E85EC00F0E552E552F3 |
:102F6000E552E552FD0EDBCF00F0FE0EDBCF01F0A7 |
:102F7000600ED8800056000E01560006015AFD0E64 |
:102F800000C0DBFFFE0E37D0FD0EDBCF00F0FE0EE3 |
:102F9000DBCF01F0600ED8800056000E015600060F |
:102FA000015AFD0E00C0DBFFFE0E01C0DBFF12D098 |
:102FB000D950FB0FE66EFF0EDA20E66ED950FD0FFA |
:102FC000E66EFF0EDA20E66E85EC00F0E552E55283 |
:102FD000E552E552FB0EDBCF00F0FC0EDBCF01F03B |
:102FE000400ED8800056000E01560006015AFB0E16 |
:102FF00000C0DBFFFC0E01C0DBFFFB0EDBCFE6FFFA |
:10300000FC0EDBCFE6FFFD0EDBCFE6FFFE0EDBCFD7 |
:10301000E6FF70DEE552E552E552E5528A8A020E7D |
:10302000E66EE66AD9CFE6FFDACFE6FF10EC50F0A5 |
:10303000E552E552E552E552020EE15C02E2E16A38 |
:10304000E552E16EE552E7CFD9FF1200D9CFE6FF96 |
:10305000E1CFD9FF080EE1268BEC15F0006E016A76 |
:10306000030E001801E1015001E18DD0020E00189D |
:1030700001E1015050E0010E001801E0CED00150F6 |
:1030800001E0CBD0D950FB0FE66EFF0EDA20E66EE2 |
:10309000D950FD0FE66EFF0EDA20E66E85EC00F0EB |
:1030A000E552E552E552E552D950F70FE66EFF0EB4 |
:1030B000DA20E66ED950F90FE66EFF0EDA20E66EE2 |
:1030C00085EC00F0E552E552E552E552FD0EDBCF0E |
:1030D00000F0FE0EDBCF01F0600ED8800056000E2F |
:1030E00001560006015AFD0E00C0DBFFFE0E01C0B6 |
:1030F000DBFFF90EDBCF00F0FA0EDBCF01F0600E44 |
:10310000D8800056000E01560006015AF90E00C084 |
:10311000DBFFFA0E80D0FD0EDBCF00F0FE0EDBCF22 |
:1031200001F0600ED8800056000E01560006015ACC |
:10313000FD0E00C0DBFFFE0E01C0DBFFFB0EDBCF90 |
:1031400000F0FC0EDBCF01F0400ED8800056000EE0 |
:1031500001560006015AFB0E00C0DBFFFC0E01C049 |
:10316000DBFFF90EDBCF00F0FA0EDBCF01F0600ED3 |
:10317000D8800056000E01560006015AF90E00C014 |
:10318000DBFFFA0E35D0D950FB0FE66EFF0EDA20CA |
:10319000E66ED950FD0FE66EFF0EDA20E66E85EC86 |
:1031A00000F0E552E552E552E552D950F70FE66ED0 |
:1031B000FF0EDA20E66ED950F90FE66EFF0EDA2028 |
:1031C000E66E85EC00F0E552E552E552E552FB0E65 |
:1031D000DBCF00F0FC0EDBCF01F0400ED8800056B4 |
:1031E000000E01560006015AFB0E00C0DBFFFC0E6C |
:1031F00001C0DBFFF70EDBCF00F0F80EDBCF01F0F4 |
:10320000400ED8800056000E01560006015AF70EF7 |
:1032100000C0DBFFF80E01C0DBFFFB0EDBCF02F0CE |
:10322000FC0EDBCF03F0D890035004E6400E025CA6 |
:10323000000E03580EE3F70EDBCF04F0F80EDBCFE1 |
:1032400005F0D890055004E6400E045C000E0558C9 |
:1032500002E2000E01D0010E006E016AE85001107A |
:1032600001E00CD1FD0EDBCF02F0FE0EDBCF03F050 |
:10327000D890035004E6600E025C000E03580EE383 |
:10328000F90EDBCF04F0FA0EDBCF05F0D890055035 |
:1032900004E6600E045C000E055802E2000E01D048 |
:1032A000010E006E016AE850011001E0E7D0FD0E4A |
:1032B000DBCF00F0FE0EDBCF01F0D890015004E62A |
:1032C000600E005C000E015807E35F0EF36EFD0E0A |
:1032D000F3CFDBFFFE0EDB6AFB0EDBCF00F0FC0E54 |
:1032E000DBCF01F0D890015004E6400E005C000EE8 |
:1032F000015807E33F0EF36EFB0EF3CFDBFFFC0E2E |
:10330000DB6AF90EDBCF00F0FA0EDBCF01F0D890CC |
:10331000015004E6600E005C000E015807E35F0EEA |
:10332000F36EF90EF3CFDBFFFA0EDB6AF70EDBCF9D |
:1033300000F0F80EDBCF01F0D890015004E6400E0B |
:10334000005C000E015807E33F0EF36EF70EF3CF5B |
:10335000DBFFF80EDB6AFD0EDBCF00F0FE0EDBCFED |
:1033600001F00001800E011404E0FD0EDB6AFE0E88 |
:10337000DB6AFB0EDBCF00F0FC0EDBCF01F0800E32 |
:10338000011404E0FB0EDB6AFC0EDB6AF90EDBCFF6 |
:1033900000F0FA0EDBCF01F0800E011404E0F90E0C |
:1033A000DB6AFA0EDB6AF70EDBCF00F0F80EDBCF3C |
:1033B00001F0800E011404E0F70EDB6AF80EDB6A00 |
:1033C000210EDF6EFD0EDB50E76E010EE7CFDBFF57 |
:1033D000FB0EDB50E76E020EE7CFDBFFF90EDB5092 |
:1033E000E76E030EE7CFDBFFF70EDB50E76E040E50 |
:1033F000E7CFDBFFF50EDBCF00F0F60EDBCF01F001 |
:103400000150016AE830E830E8301F0B006ED890B8 |
:1034100000360136050E00C0DBFFF50EDBCF00F0F5 |
:10342000F60EDBCF01F0050ED89001320032E80431 |
:10343000FBE13F0E0016000E0116060E00C0DBFF7A |
:10344000F50EDBCF00F0F60EDBCF01F0D8900036A2 |
:1034500001363F0E0016000E0116070E00C0DBFFFE |
:103460008A9A080EE66EE66AD9CFE6FFDACFE6FF63 |
:1034700010EC50F0E552E552E552E552080EE15CE1 |
:1034800002E2E16AE552E16EE552E7CFD9FF1200B0 |
:10349000D9CFE6FFE1CFD9FF150EE1268BEC15F071 |
:1034A000006E016A030E001801E1015001E1B6D07F |
:1034B000020E001801E1015073E0010E001801E155 |
:1034C00001502FE0005001E0E7D0015001E0E4D0CE |
:1034D000FD0EDBCF1FF0FE0EDBCF20F00D0E1FC068 |
:1034E000DBFF0E0E20C0DBFFFB0EDBCF1FF0FC0E60 |
:1034F000DBCF20F00F0E1FC0DBFF100E20C0DBFF64 |
:10350000F90EDBCF1FF0FA0EDBCF20F0110E1FC03B |
:10351000DBFF120E20C0DBFFF70EDBCF1FF0F80E33 |
:1035200036D0F70EDBCF00F0F80EDBCF01F0600EE7 |
:10353000D8800056000E01560006015A0D0E00C03C |
:10354000DBFF0E0E01C0DBFFFD0EDBCF1FF0FE0E1A |
:10355000DBCF20F00F0E1FC0DBFF100E20C0DBFF03 |
:10356000FB0EDBCF00F0FC0EDBCF01F0600ED8804D |
:103570000056000E01560006015A110E00C0DBFF76 |
:10358000120E01C0DBFFF90EDBCF1FF0FA0EDBCF0E |
:1035900020F0130E1FC0DBFF140E20C0DBFF7CD019 |
:1035A000F90EDBCF00F0FA0EDBCF01F0600ED88011 |
:1035B0000056000E01560006015A0D0E00C0DBFF3A |
:1035C0000E0E01C0DBFFF70EDBCF00F0F80EDBCFF5 |
:1035D00001F0400ED8800056000E01560006015A38 |
:1035E0000F0E00C0DBFF100E01C0DBFFFD0EDBCFB6 |
:1035F00000F0FE0EDBCF01F0600ED8800056000E0A |
:1036000001560006015A110E00C0DBFF120E01C068 |
:10361000DBFFFB0EDBCF00F0FC0E2FD0FB0EDBCF71 |
:103620001FF0FC0EDBCF20F00D0E1FC0DBFF0E0ED7 |
:1036300020C0DBFFF90EDBCF00F0FA0EDBCF01F08C |
:10364000400ED8800056000E01560006015A0F0E9B |
:1036500000C0DBFF100E01C0DBFFF70EDBCF1FF059 |
:10366000F80EDBCF20F0110E1FC0DBFF120E20C0C2 |
:10367000DBFFFD0EDBCF00F0FE0EDBCF01F0400ED6 |
:10368000D8800056000E01560006015A130E00C0E5 |
:10369000DBFF140E01C0DBFF0F0EDBCF02F0100EBC |
:1036A000DBCF03F0D890035004E6400E025C000E1E |
:1036B00003580EE3130EDBCF04F0140EDBCF05F03E |
:1036C000D890055004E6400E045C000E055802E256 |
:1036D000000E01D0010E006E016AE850011001E0F9 |
:1036E00019D10D0EDBCF02F00E0EDBCF03F0D89018 |
:1036F000035004E6600E025C000E03580EE3110E48 |
:10370000DBCF04F0120EDBCF05F0D890055004E6B5 |
:10371000600E045C000E055802E2000E01D0010E9E |
:10372000006E016AE850011001E0F4D00D0EDBCF0D |
:1037300000F00E0EDBCF01F0D890015004E6600ED1 |
:10374000005C000E015807E35F0EF36E0D0EF3CF21 |
:10375000DBFF0E0EDB6A0F0EDBCF00F0100EDBCFAF |
:1037600001F0D890015004E6400E005C000E0158B4 |
:1037700007E33F0EF36E0F0EF3CFDBFF100EDB6A95 |
:10378000110EDBCF00F0120EDBCF01F0D89001500C |
:1037900004E6600E005C000E015807E35F0EF36E56 |
:1037A000110EF3CFDBFF120EDB6A130EDBCF00F03E |
:1037B000140EDBCF01F0D890015004E6400E005CFF |
:1037C000000E015807E33F0EF36E130EF3CFDBFF3D |
:1037D000140EDB6A0D0EDBCF00F00E0EDBCF01F016 |
:1037E0000001800E011404E00D0EDB6A0E0EDB6A90 |
:1037F0000F0EDBCF00F0100EDBCF01F0800E0114B6 |
:1038000004E00F0EDB6A100EDB6A110EDBCF00F056 |
:10381000120EDBCF01F0800E011404E0110EDB6A02 |
:10382000120EDB6A130EDBCF00F0140EDBCF01F0BB |
:10383000800E011404E0130EDB6A140EDB6A260E00 |
:10384000DF6E010EDB6A220EF36E020EF3CFDBFF9A |
:103850000D0EDB50E76E030EE7CFDBFF0F0EDB50E4 |
:10386000E76E040EE7CFDBFF110EDB50E76E050EAF |
:10387000E7CFDBFF130EDB50E76E060EE7CFDBFF73 |
:10388000F50EDBCF00F0F60EDBCF01F00150016A40 |
:10389000E830E830E8301F0B006ED8900036013673 |
:1038A000070E00C0DBFFF50EDBCF00F0F60EDBCF1E |
:1038B00001F0050ED89001320032E804FBE13F0E22 |
:1038C0000016000E0116080E00C0DBFFF50EDBCF60 |
:1038D00000F0F60EDBCF01F0D890003601363F0E37 |
:1038E0000016000E0116090E00C0DBFF0A0EDB6A8F |
:1038F0000B0EDB6A0C0EDB6A8A9A0D0EE66EE66A28 |
:10390000D9CFE6FFDACFE6FF10EC50F0E552E552F2 |
:10391000E552E552150EE15C02E2E16AE552E16E24 |
:10392000E552E7CFD9FF1200D9CFE6FFE1CFD9FFAB |
:10393000150EE1268BEC15F0006E016A030E0018DF |
:1039400001E1015001E1B6D0020E001801E1015081 |
:1039500073E0010E001801E101502FE0005001E07A |
:10396000E7D0015001E0E4D0FD0EDBCF1FF0FE0EEA |
:10397000DBCF20F00D0E1FC0DBFF0E0E20C0DBFFE3 |
:10398000FB0EDBCF1FF0FC0EDBCF20F00F0E1FC0B5 |
:10399000DBFF100E20C0DBFFF90EDBCF1FF0FA0EAD |
:1039A000DBCF20F0110E1FC0DBFF120E20C0DBFFAB |
:1039B000F70EDBCF1FF0F80E36D0F70EDBCF00F09E |
:1039C000F80EDBCF01F0600ED8800056000E0156D5 |
:1039D0000006015A0D0E00C0DBFF0E0E01C0DBFF1A |
:1039E000FD0EDBCF1FF0FE0EDBCF20F00F0E1FC051 |
:1039F000DBFF100E20C0DBFFFB0EDBCF00F0FC0E68 |
:103A0000DBCF01F0600ED8800056000E0156000694 |
:103A1000015A110E00C0DBFF120E01C0DBFFF90ED0 |
:103A2000DBCF1FF0FA0EDBCF20F0130E1FC0DBFF41 |
:103A3000140E20C0DBFF7CD0F90EDBCF00F0FA0EB5 |
:103A4000DBCF01F0600ED8800056000E0156000654 |
:103A5000015A0D0E00C0DBFF0E0E01C0DBFFF70E9A |
:103A6000DBCF00F0F80EDBCF01F0400ED88000561F |
:103A7000000E01560006015A0F0E00C0DBFF100EAB |
:103A800001C0DBFFFD0EDBCF00F0FE0EDBCF01F04F |
:103A9000600ED8800056000E01560006015A110E25 |
:103AA00000C0DBFF120E01C0DBFFFB0EDBCF00F01E |
:103AB000FC0E2FD0FB0EDBCF1FF0FC0EDBCF20F077 |
:103AC0000D0E1FC0DBFF0E0E20C0DBFFF90EDBCF9B |
:103AD00000F0FA0EDBCF01F0400ED8800056000E49 |
:103AE00001560006015A0F0E00C0DBFF100E01C088 |
:103AF000DBFFF70EDBCF1FF0F80EDBCF20F0110E4F |
:103B00001FC0DBFF120E20C0DBFFFD0EDBCF00F07D |
:103B1000FE0EDBCF01F0400ED8800056000E01569D |
:103B20000006015A130E00C0DBFF140E01C0DBFFBC |
:103B30000F0EDBCF02F0100EDBCF03F0D890035056 |
:103B400004E6400E025C000E03580EE3130EDBCFBA |
:103B500004F0140EDBCF05F0D890055004E6400EBB |
:103B6000045C000E055802E2000E01D0010E006E4A |
:103B7000016AE850011001E04FD10D0EDBCF02F0D9 |
:103B80000E0EDBCF03F0D890035004E6600E025C0B |
:103B9000000E03580EE3110EDBCF04F0120EDBCF44 |
:103BA00005F0D890055004E6600E045C000E055840 |
:103BB00002E2000E01D0010E006E016AE850011011 |
:103BC00001E02AD10D0EDBCF00F00E0EDBCF01F0AD |
:103BD000D890015004E6600E005C000E015807E327 |
:103BE0005F0EF36E0D0EF3CFDBFF0E0EDB6A0F0ED2 |
:103BF000DBCF00F0100EDBCF01F0D890015004E6CF |
:103C0000400E005C000E015807E33F0EF36E0F0EEE |
:103C1000F3CFDBFF100EDB6A110EDBCF00F0120ECC |
:103C2000DBCF01F0D890015004E6600E005C000E7E |
:103C3000015807E35F0EF36E110EF3CFDBFF120E98 |
:103C4000DB6A130EDBCF00F0140EDBCF01F0D8904F |
:103C5000015004E6400E005C000E015807E33F0EE1 |
:103C6000F36E130EF3CFDBFF140EDB6A0D0EDBCF0A |
:103C700000F00E0EDBCF01F00001800E011404E015 |
:103C80000D0EDB6A0E0EDB6A0F0EDBCF00F0100E9E |
:103C9000DBCF01F0800E011404E00F0EDB6A100E82 |
:103CA000DB6A110EDBCF00F0120EDBCF01F0800ECD |
:103CB000011404E0110EDB6A120EDB6A130EDBCF77 |
:103CC00000F0140EDBCF01F0800E011404E0130E9F |
:103CD000DB6A140EDB6A260EDF6EDE52010EDD6E2D |
:103CE000220EF36E020EF3CFDBFF0D0EDB50E76EFC |
:103CF000030EE7CFDBFF0F0EDB50E76E040EE7CFBE |
:103D0000DBFF110EDB50E76E050EE7CFDBFF130E76 |
:103D1000DB50E76E060EE7CFDBFFF50EDBCF00F0E2 |
:103D2000F60EDBCF01F00150016AE830E830E830F0 |
:103D30001F0B006ED89000360136070E00C0DBFF67 |
:103D4000F50EDBCF00F0F60EDBCF01F0050ED890BC |
:103D500001320032E804FBE13F0E0016000E0116AE |
:103D6000080E00C0DBFFF50EDBCF00F0F60EDBCF58 |
:103D700001F0D890003601363F0E0016000E0116F5 |
:103D8000090E00C0DBFFF50EDBCF00F0F60EDBCF37 |
:103D900001F00150016AE830E830E8301F0B006E96 |
:103DA000D890003601360A0E00C0DBFFF50EDBCFDF |
:103DB00000F0F60EDBCF01F0050ED8900132003294 |
:103DC000E804FBE13F0E0016000E01160B0E00C0CA |
:103DD000DBFFF50EDBCF00F0F60EDBCF01F0D89065 |
:103DE000003601363F0E0016000E01160C0E00C004 |
:103DF000DBFF8A9A0D0EE66EE66AD9CFE6FFDACFD0 |
:103E0000E6FF10EC50F0E552E552E552E552040EA3 |
:103E1000E66E35EC56F0E552150EE15C02E2E16A21 |
:103E2000E552E16EE552E7CFD9FF1200D9CFE6FFA8 |
:103E3000E1CFD9FF050EE126250EDF6E010EDB6A0C |
:103E4000020EDB6A5F0EF36E030EF3CFDBFF3F0E55 |
:103E5000F36E040EF3CFDBFF8A9A050EE66EE66A78 |
:103E6000D9CFE6FFDACFE6FF10EC50F0E552E5528D |
:103E7000E552E552040EE66E35EC56F0E552050EBD |
:103E8000E15C02E2E16AE552E16EE552E7CFD9FF7B |
:103E90001200D9CFE6FFE1CFD9FF020EE126FE0ED8 |
:103EA000DB50006E016A030ED89001320032E80444 |
:103EB000FBE100C0DEFF01C0DDFFD9CFE9FFDACFB3 |
:103EC000EAFF060ED890EE36ED36E806FBE1FD0E71 |
:103ED000DB50006E016AD89001320032D890013276 |
:103EE0000032D9CFE9FFDACFEAFF0050EE120150DD |
:103EF000ED12D9CFE9FFDACFEAFF050ED890EE3602 |
:103F0000ED36E806FBE1FC0EDB50006E016A030EA5 |
:103F1000D89001320032E804FBE1D9CFE9FFDACFD3 |
:103F2000EAFF0050EE120150ED12DECF00F0DDCFBF |
:103F300001F000C0F3FF01C0F4FF020EE15C02E2F9 |
:103F4000E16AE552E16EE552E7CFD9FF1200D9CF21 |
:103F5000E6FFE1CFD9FF040EE12601EC02F0DE6AB4 |
:103F6000DD6ADECF00F0DDCF01F000C0E6FF01C06A |
:103F7000E6FF95EC15F0E552E7CF01F0E552E7CF0B |
:103F800000F0F3CF02F0F4CF03F00206000E035A64 |
:103F900001500318E8AE02D0033404D00250005C94 |
:103FA0000350015826E2FD0EDBCFE6FFFE0EDBCF0D |
:103FB000E6FF90EC15F0F3CF00F0F4CF01F000062F |
:103FC000000E015A00C0E6FF01C0E6FFDECFE6FFAB |
:103FD000DDCFE6FFE66EE66AE66EE66ABDEC00F06F |
:103FE000026E0A0EE15E0250060EDE26000EDD2293 |
:103FF000B8D7020EDB6A030EDB6A020EDBCF00F0DD |
:10400000030EDBCF01F000C0E6FF01C0E6FF90EC3D |
:1040100015F0E552E7CF01F0E552E7CF00F0F3CF1E |
:1040200002F0F4CF03F00206000E035A0150031809 |
:10403000E8AE02D0033404D00250005C03500158B3 |
:104040002DE2FD0EDBCFE6FFFE0EDBCFE6FF020E1C |
:10405000DBCFE6FF030EDBCFE6FF95EC15F0F3CFE9 |
:1040600000F0F4CF01F00006000E015A00C0E6FF98 |
:1040700001C0E6FFE66EE66AE66EE66ABDEC00F0B9 |
:10408000026E0A0EE15E0250D950020FE96EDACFDD |
:10409000EAFF060EEE26000EED22AFD701EC02F08D |
:1040A000DE6ADD6ADECF00F0DDCF01F000C0E6FFA2 |
:1040B00001C0E6FF95EC15F0E552E7CF01F0E552BF |
:1040C000E7CF00F0F3CF02F0F4CF03F00206000ECA |
:1040D000035A01500318E8AE02D0033404D0025052 |
:1040E000005C0350015831E2FD0EDBCFE6FFFE0E0F |
:1040F000DBCFE6FF90EC15F0F3CF00F0F4CF01F04A |
:104100000006000E015A00C0E6FF01C0E6FFDECF48 |
:10411000E6FFDDCFE6FFE66EE66A95EC15F0F3CF3D |
:1041200002F0F4CF03F00206000E035A02C0E6FFCD |
:1041300003C0E6FFBDEC00F0046E0A0EE15E045021 |
:10414000060EDE26000EDD22ADD7020EDB6A030E60 |
:10415000DB6A020EDBCF00F0030EDBCF01F000C004 |
:10416000E6FF01C0E6FF90EC15F0E552E7CF01F065 |
:10417000E552E7CF00F0F3CF02F0F4CF03F00206F0 |
:10418000000E035A01500318E8AE02D0033404D0E5 |
:104190000250005C035001582EE2FD0EDBCFE6FF1B |
:1041A000FE0EDBCFE6FF020EDBCFE6FF030EDBCF1A |
:1041B000E6FF000EE66EE66AE66EE66A95EC15F03E |
:1041C000F3CF00F0F4CF01F00006000E015A00C05A |
:1041D000E6FF01C0E6FFBDEC00F0026E0A0EE15EF4 |
:1041E0000250D950020FE96EDACFEAFF060EEE2632 |
:1041F000000EED22AED701EC02F0DE6ADD6ADECF02 |
:1042000000F0DDCF01F000C0E6FF01C0E6FF95EC55 |
:1042100015F0E552E7CF01F0E552E7CF00F0F3CF1C |
:1042200002F0F4CF03F00206000E035A0150031807 |
:10423000E8AE02D0033404D00250005C03500158B1 |
:1042400027E2FD0EDBCFE6FFFE0EDBCFE6FF000E22 |
:10425000E66EE66ADECFE6FFDDCFE6FF90EC15F016 |
:10426000F3CF00F0F4CF01F00006000E015A00C0B9 |
:10427000E6FF01C0E6FFE66EE66ABDEC00F0026E06 |
:104280000A0EE15E0250060EDE26000EDD22B7D7D2 |
:10429000020EDB6A030EDB6A020EDBCF00F0030EB8 |
:1042A000DBCF01F000C0E6FF01C0E6FF90EC15F0A7 |
:1042B000E552E7CF01F0E552E7CF00F0F3CF02F08F |
:1042C000F4CF03F00206000E035A01500318E8AEC3 |
:1042D00002D0033404D00250005C0350015838E28D |
:1042E000FD0EDBCFE6FFFE0EDBCFE6FF020EDBCFDF |
:1042F000E6FF030EDBCFE6FF95EC15F0F3CF00F001 |
:10430000F4CF01F00006000E015A00C0E6FF01C024 |
:10431000E6FF90EC15F0F3CF02F0F4CF03F00206C5 |
:10432000000E035A02C0E6FF03C0E6FFE66EE66A2F |
:10433000BDEC00F0046E0A0EE15E0450D950020F8D |
:10434000E96EDACFEAFF060EEE26000EED22A4D7C4 |
:1043500001EC02F0DE6ADD6ADECF00F0DDCF01F0B5 |
:1043600000C0E6FF01C0E6FF95EC15F0E552E7CF8F |
:1043700001F0E552E7CF00F0F3CF02F0F4CF03F005 |
:104380000206000E035A01500318E8AE02D00334AF |
:1043900004D00250005C0350015832E2FD0EDBCF26 |
:1043A000E6FFFE0EDBCFE6FF000EE66EE66ADECF2E |
:1043B000E6FFDDCFE6FF90EC15F0F3CF00F0F4CF91 |
:1043C00001F00006000E015A00C0E6FF01C0E6FF42 |
:1043D00095EC15F0F3CF02F0F4CF03F00206000ED7 |
:1043E000035A02C0E6FF03C0E6FFBDEC00F0046E16 |
:1043F0000A0EE15E0450060EDE26000EDD22ACD76A |
:10440000020EDB6A030EDB6A020EDBCF00F0030E46 |
:10441000DBCF01F000C0E6FF01C0E6FF90EC15F035 |
:10442000E552E7CF01F0E552E7CF00F0F3CF02F01D |
:10443000F4CF03F00206000E035A01500318E8AE51 |
:1044400002D0033404D00250005C0350015839E21A |
:10445000FD0EDBCFE6FFFE0EDBCFE6FF020EDBCF6D |
:10446000E6FF030EDBCFE6FF000EE66EE66A90EC99 |
:1044700015F0F3CF00F0F4CF01F00006000E015A62 |
:1044800000C0E6FF01C0E6FF95EC15F0F3CF02F0A7 |
:10449000F4CF03F00206000E035A02C0E6FF03C089 |
:1044A000E6FFBDEC00F0046E0A0EE15E0450D95048 |
:1044B000020FE96EDACFEAFF060EEE26000EED22BD |
:1044C000A3D7040EE15C02E2E16AE552E16EE55237 |
:1044D000E7CFD9FF1200D9CFE6FFE1CFD9FF020E17 |
:1044E000E12601EC02F090EC15F0F3CF00F0F4CFF0 |
:1044F00001F0F3CFE6FFF4CFE6FF95EC15F0E552BF |
:10450000E7CF01F0E552E7CF00F0F3CF02F0F4CFB0 |
:1045100003F00150F418E8AE02D0033404D0025086 |
:10452000005C0350015801E39ED0DE6ADD6ADECFF5 |
:1045300000F0DDCF01F000C0E6FF01C0E6FF90EC27 |
:1045400015F0E552E7CF01F0E552E7CF00F0F3CFE9 |
:1045500002F0F4CF03F00206000E035A01500318D4 |
:10456000E8AE02D0033404D00250005C035001587E |
:1045700001E317D1FD0EDBCFE6FFFE0EDBCFE6FF3A |
:10458000DECFE6FFDDCFE6FFDECFE6FFDDCFE6FFE5 |
:1045900090EC15F0F3CF02F0F4CF03F00206000E1A |
:1045A000035A020E246E256A02C01FF003C020F0D9 |
:1045B00054EC54F01FC002F020C003F0DECF04F032 |
:1045C000DDCF05F0020E246E256A04C01FF005C081 |
:1045D00020F054EC54F01FC004F020C005F01F5030 |
:1045E000025C006E20500358016E00C0E6FFE66ECC |
:1045F00095EC15F0F3CF08F0F4CF09F00806000EA3 |
:10460000095A020E246E256A08C01FF009C020F066 |
:1046100054EC54F01FC008F020C009F0DECF0AF0BF |
:10462000DDCF0BF0020E246E256A0AC01FF00BC00E |
:1046300020F054EC54F01FC00AF020C00BF01F50C3 |
:10464000085C066E20500958076E06C0E6FFE66E4D |
:104650005DEC01F00C6E0A0EE15E0C50060EDE26DB |
:10466000000EDD2264D7DE6ADD6ADECF00F0DDCF2A |
:1046700001F000C0E6FF01C0E6FF95EC15F0E55241 |
:10468000E7CF01F0E552E7CF00F0F3CF02F0F4CF2F |
:1046900003F00206000E035A01500318E8AE02D0E0 |
:1046A000033404D00250005C0350015801E379D078 |
:1046B000FD0EDBCFE6FFFE0EDBCFE6FFDECFE6FF33 |
:1046C000DDCFE6FFDECFE6FFDDCFE6FF90EC15F0B5 |
:1046D000F3CF02F0F4CF03F00206000E035A020EED |
:1046E000246E256A02C01FF003C020F054EC54F081 |
:1046F0001FC002F020C003F0DECF04F0DDCF05F0D4 |
:10470000020E246E256A04C01FF005C020F054EC90 |
:1047100054F01FC004F020C005F01F50025C006E72 |
:1047200020500358016E00C0E6FFE66E95EC15F0D0 |
:10473000F3CF08F0F4CF09F00806000E095A020E74 |
:10474000246E256A08C01FF009C020F054EC54F014 |
:104750001FC008F020C009F0DECF0AF0DDCF0BF05B |
:10476000020E246E256A0AC01FF00BC020F054EC24 |
:1047700054F01FC00AF020C00BF01F50085C066EFA |
:1047800020500958076E06C0E6FFE66E5DEC01F0AA |
:104790000C6E0A0EE15E0C50060EDE26000EDD22C7 |
:1047A00064D7020EE15C02E2E16AE552E16EE55295 |
:1047B000E7CFD9FF1200D9CFE6FFE1CFD9FF020E34 |
:1047C000E12601EC02F090EC15F0F3CF00F0F4CF0D |
:1047D00001F0F3CFE6FFF4CFE6FF95EC15F0E552DC |
:1047E000E7CF01F0E552E7CF00F0F3CF02F0F4CFCE |
:1047F00003F00150F418E8AE02D0033404D00250A4 |
:10480000005C0350015801E30BD190EC15F0F3CF9D |
:1048100000F0F4CF01F00006000E015A00C0DEFFE8 |
:1048200001C0DDFFDECF00F0DDCF01F0013401E398 |
:1048300002D200500608000E015401E3FCD1FD0E27 |
:10484000DBCFE6FFFE0EDBCFE6FFDECFE6FFDDCF00 |
:10485000E6FFDECFE6FFDDCFE6FF90EC15F0F3CF0D |
:1048600002F0F4CF03F00206000E035A020E246E8B |
:10487000256A02C01FF003C020F054EC54F01FC0A2 |
:1048800002F020C003F0DECF04F0DDCF05F0020E11 |
:10489000246E256A04C01FF005C020F054EC54F0CB |
:1048A0001FC004F020C005F01F50025C006E2050B5 |
:1048B0000358016E00C0E6FFE66E95EC15F0F3CFED |
:1048C00008F0F4CF09F00806000E095A020E246E13 |
:1048D000256A08C01FF009C020F054EC54F01FC036 |
:1048E00008F020C009F0DECF0AF0DDCF0BF0020E99 |
:1048F000246E256A0AC01FF00BC020F054EC54F05F |
:104900001FC00AF020C00BF01F50085C066E20503C |
:104910000958076E06C0E6FFE66E9FEC01F00C6ECC |
:104920000A0EE15E0C50FB0EDBCFE6FFFC0EDBCF88 |
:10493000E6FFDECFE6FFDDCFE6FFDECFE6FFDDCF31 |
:10494000E6FF90EC15F0F3CF02F0F4CF03F002068F |
:10495000000E035A020E246E256A02C01FF003C027 |
:1049600020F054EC54F01FC002F020C003F0DECF62 |
:1049700004F0DDCF05F0020E246E256A04C01FF09E |
:1049800005C020F054EC54F01FC004F020C005F026 |
:104990001F50025C006E20500358016E00C0E6FFFD |
:1049A000E66E95EC15F0F3CF08F0F4CF09F00806A9 |
:1049B000000E095A020E246E256A08C01FF009C0B5 |
:1049C00020F054EC54F01FC008F020C009F0DECFF6 |
:1049D0000AF0DDCF0BF0020E246E256A0AC01FF02C |
:1049E0000BC020F054EC54F01FC00AF020C00BF0B4 |
:1049F0001F50085C066E20500958076E06C0E6FF7F |
:104A0000E66E5DEC01F00C6E0A0EE15E0C50D9CF43 |
:104A1000E9FFDACFEAFF060EEE5E000EED5A02D78E |
:104A200095EC15F0F3CF00F0F4CF01F00006000E86 |
:104A3000015A00C0DEFF01C0DDFFDECF00F0DDCF98 |
:104A400001F0013401E3F7D000500608000E0154D4 |
:104A500001E3F1D0FD0EDBCFE6FFFE0EDBCFE6FF7C |
:104A6000DECFE6FFDDCFE6FFDECFE6FFDDCFE6FF00 |
:104A700090EC15F0F3CF02F0F4CF03F00206000E35 |
:104A8000035A020E246E256A02C01FF003C020F0F4 |
:104A900054EC54F01FC002F020C003F0DECF04F04D |
:104AA000DDCF05F0020E246E256A04C01FF005C09C |
:104AB00020F054EC54F01FC004F020C005F01F504B |
:104AC000025C006E20500358016E00C0E6FFE66EE7 |
:104AD00095EC15F0F3CF08F0F4CF09F00806000EBE |
:104AE000095A020E246E256A08C01FF009C020F082 |
:104AF00054EC54F01FC008F020C009F0DECF0AF0DB |
:104B0000DDCF0BF0020E246E256A0AC01FF00BC029 |
:104B100020F054EC54F01FC00AF020C00BF01F50DE |
:104B2000085C066E20500958076E06C0E6FFE66E68 |
:104B30009FEC01F00C6E0A0EE15E0C50FB0EDBCF19 |
:104B4000E6FFFC0EDBCFE6FFDECFE6FFDDCFE6FFC4 |
:104B5000DECFE6FFDDCFE6FF90EC15F0F3CF02F0FD |
:104B6000F4CF03F00206000E035A020E246E256AEB |
:104B700002C01FF003C020F054EC54F01FC002F03C |
:104B800020C003F0DECF04F0DDCF05F0020E246E6E |
:104B9000256A04C01FF005C020F054EC54F01FC07B |
:104BA00004F020C005F01F50025C006E2050035836 |
:104BB000016E00C0E6FFE66E95EC15F0F3CF08F04D |
:104BC000F4CF09F00806000E095A020E246E256A79 |
:104BD00008C01FF009C020F054EC54F01FC008F0CA |
:104BE00020C009F0DECF0AF0DDCF0BF0020E246EFC |
:104BF000256A0AC01FF00BC020F054EC54F01FC00F |
:104C00000AF020C00BF01F50085C066E20500958B7 |
:104C1000076E06C0E6FFE66E5DEC01F00C6E0A0E54 |
:104C2000E15E0C50D9CFE9FFDACFEAFF060EEE5E67 |
:104C3000000EED5A02D7020EE15C02E2E16AE55293 |
:104C4000E16EE552E7CFD9FF1200D9CFE6FFE1CF01 |
:104C5000D9FF040EE126DE6ADD6ADECF00F0DDCF8B |
:104C600001F000C0E6FF01C0E6FF95EC15F0E5524B |
:104C7000E7CF01F0E552E7CF00F0F3CF04F0F4CF37 |
:104C800005F00406000E055AFD0EDB500424026EEA |
:104C9000FE0EDB500520036E0250005C03500158ED |
:104CA00071E2020EDB6A030EDB6A020EDBCF00F05C |
:104CB000030EDBCF01F000C0E6FF01C0E6FF90EC81 |
:104CC00015F0E552E7CF01F0E552E7CF00F0F3CF62 |
:104CD00004F0F4CF05F00406000E055AFD0EDB507B |
:104CE0000424026EFE0EDB500520036E0250005CB1 |
:104CF0000350015832E2FB0EDBCFE6FFFC0EDBCFA8 |
:104D0000E6FFFD0EDBCFE6FFFE0EDBCFE6FF020E79 |
:104D1000DBCFE6FF030EDBCFE6FFDECFE6FFDDCF26 |
:104D2000E6FF03EC02F0006E080EE15E0050FD0E9F |
:104D3000DBCF00F0FE0EDBCF01F0010ED890003685 |
:104D40000136E806FBE1D950020FE96EDACFEAFF3F |
:104D50000050EE260150ED22A8D7FD0EDBCF00F06B |
:104D6000FE0EDBCF01F0010ED89000360136E806CA |
:104D7000FBE1D9CFE9FFDACFEAFF0050EE26015080 |
:104D8000ED226BD7040EE15C02E2E16AE552E16ECE |
:104D9000E552E7CFD9FF1200D9CFE6FFE1CFD9FF27 |
:104DA000020EE126FD0EDB50DF6EDF50006E016A61 |
:104DB000E66E01C0E6FF95EC15F0E552E7CF01F095 |
:104DC000E552E7CF00F0F3CF02F0F4CF03F0020694 |
:104DD000000E035A01500318E8AE02D0033404D089 |
:104DE0000250005C035001585EE2FD0EDB50E76E9E |
:104DF000010EE7CFDBFFDB50006E016AE66E01C0FB |
:104E0000E6FF90EC15F0E552E7CF01F0E552E7CF71 |
:104E100000F0F3CF02F0F4CF03F00206000E035AC5 |
:104E200001500318E8AE02D0033404D00250005CF5 |
:104E3000035001582AE2FB0EDBCFE6FFFC0EDBCF6E |
:104E4000E6FFFD0EDBCFE6FFFE0EDBCFE6FF010E39 |
:104E5000DBCFE6FFE66ADFCFE6FFE66ACCEC06F0E2 |
:104E6000006E080EE15E0050020E1F6E206AFD0EFD |
:104E7000DBCF24F0FE0EDBCF25F0A7EC54F0010EC3 |
:104E8000DBCFE7FF1D50E726B3D7020E1F6E206A67 |
:104E9000FD0EDBCF24F0FE0EDBCF25F0A7EC54F0A7 |
:104EA0001D50DF2682D7020EE15C02E2E16AE55284 |
:104EB000E16EE552E7CFD9FF1200D9CFE6FFE1CF8F |
:104EC000D9FF0C0EE126DE6AF80EDD6E95EC15F0CA |
:104ED000F3CF00F0F4CF01F0020E246E256AF3CF79 |
:104EE0001FF0F4CF20F054EC54F01FC000F020C0AD |
:104EF00001F0040E1FC0DBFF050E20C0DBFF90ECAD |
:104F000015F0060EF3CFDBFF070EF4CFDBFF080E24 |
:104F1000DB6A090EDB6A95EC15F00A0EF3CFDBFFB6 |
:104F20000B0EF4CFDBFF01EC02F0020EDB6A030E86 |
:104F3000DB6A020EDBCF00F0030EDBCF01F00134A1 |
:104F400004E200500F08000E015456E3DECFE6FFE6 |
:104F5000DDCFE6FF060EDBCFE6FF070EDBCFE6FF79 |
:104F60000A0EDBCFE6FF0B0EDBCFE6FF060EDBCF34 |
:104F7000E6FF070EDBCFE6FF080EDBCFE6FF090EEC |
:104F8000DBCFE6FF080EDBCFE6FF090EDBCFE6FF47 |
:104F9000040EDBCFE6FF050EDBCFE6FF10EC09F0D9 |
:104FA000006E0E0EE15E0050D950060FE96EDACFAA |
:104FB000EAFF040EEE5E000EED5AD950080FE96EBE |
:104FC000DACFEAFF040EEE26000EED22D9500A0FCA |
:104FD000E96EDACFEAFF040EEE5E000EED5A640EC3 |
:104FE000DE26000EDD22D950020FE96EDACFEAFF8D |
:104FF000EE2A000EED229DD70C0EE15C02E2E16A82 |
:10500000E552E16EE552E7CFD9FF1200D9CFE6FFB6 |
:10501000E1CFD9FF0E0EE126640EDE6EDD6A01ECF3 |
:1050200002F0040EDB6A050EDB6A040EDBCF00F033 |
:10503000050EDBCF01F0013404E200500408000E3D |
:10504000015401E290D0060EDB6A070EDB6A080EFF |
:10505000DB6A090EDB6A95EC15F00A0EF3CFDBFF75 |
:105060000B0EF4CFDBFF90EC15F00C0EF3CFDBFF53 |
:105070000D0EF4CFDBFF020EDB6A030EDB6A020EBD |
:10508000DBCF00F0030EDBCF01F0013404E200506F |
:105090001808000E01545AE3DECFE6FFDDCFE6FF2D |
:1050A000050EE66EE66A0C0EDBCFE6FF0D0EDBCFDB |
:1050B000E6FF0A0EDBCFE6FF0B0EDBCFE6FF080EA6 |
:1050C000DBCFE6FF090EDBCFE6FF060EDBCFE6FF08 |
:1050D000070EDBCFE6FF94EC0DF0006E0C0EE15EE8 |
:1050E0000050D950060FE96EDACFEAFF020EEE2625 |
:1050F000000EED22D950080FE96EDACFEAFF030E59 |
:10510000EE26000EED22D9500A0FE96EDACFEAFF43 |
:10511000040EEE5E000EED5AD9500C0FE96EDACF98 |
:10512000EAFF060EEE5E000EED5AD9CFE9FFDACFA8 |
:10513000EAFF4C0EEE26040EED22D950020FE96E66 |
:10514000DACFEAFFEE2A000EED2299D7640EDE26B2 |
:10515000000EDD22D950040FE96EDACFEAFFEE2A05 |
:10516000000EED2262D70E0EE15C02E2E16AE5522A |
:10517000E16EE552E7CFD9FF120001EC02F0E668DC |
:10518000E668080EE66EE66A3C0EE66EE66A4E0ECD |
:10519000E66EE66A0A0EE66EE66A190EE66EE66AE4 |
:1051A000B6EC0FF0006E0C0EE15E0050E66AF80EF1 |
:1051B000E66E280EE66EE66A5A0EE66EE66A3C0E6B |
:1051C000E66EE66A2A0EE66EE66A140EE66EE66A99 |
:1051D0002A0EE66EE66A84EC09F0006E0E0EE15EC1 |
:1051E0000050640EE66EF6EC55F0E552E668E668AF |
:1051F000080EE66EE66A3C0EE66EE66A4E0EE66E57 |
:10520000E66A5A0EE66EE66A190EE66EE66AB6ECD5 |
:105210000FF0006E0C0EE15E0050E00EE66E070E21 |
:10522000E66E050EE66EE66A2D0EE66EE66A140E72 |
:10523000E66EE66A620EE66EE66A270EE66EE66ADD |
:10524000B6EC0FF0006E0C0EE15E0050E00EE66E64 |
:10525000070EE66E050EE66EE66A2D0EE66EE66A4F |
:10526000140EE66EE66A620EE66EE66A450EE66EBD |
:10527000E66AB6EC0FF0006E0C0EE15E0050640EB4 |
:10528000E66EF6EC55F0E5521F0EE66EE66A280E65 |
:10529000E66EE66A5A0EE66EE66A3C0EE66EE66A70 |
:1052A0002A0EE66EE66A140EE66EE66A2A0EE66ED0 |
:1052B000E66A84EC09F0006E0E0EE15E0050640EAA |
:1052C000E66EF6EC55F0E552E66AF80EE66E050E6F |
:1052D000E66EE66A2D0EE66EE66A140EE66EE66A85 |
:1052E000620EE66EE66A270EE66EE66AB6EC0FF030 |
:1052F000006E0C0EE15E0050E66AF80EE66E050EDA |
:10530000E66EE66A2D0EE66EE66A140EE66EE66A54 |
:10531000620EE66EE66A450EE66EE66AB6EC0FF0E1 |
:10532000006E0C0EE15E0050E00EE66E070EE66EBB |
:10533000280EE66EE66A5A0EE66EE66A3C0EE66EE9 |
:10534000E66A2A0EE66EE66A140EE66EE66A2A0E33 |
:10535000E66EE66A84EC09F0006E0E0EE15E005027 |
:105360001200D9CFE6FFE1CFD9FF060EE126000EED |
:10537000E66EE66AE66EE66A7AEC16F0E552E5520B |
:10538000E552E552020EDB6A030EDB6A020EDBCF4A |
:1053900000F0030EDBCF01F0400E005C000E015860 |
:1053A00001E395D0040EDB6A050EDB6A040EDBCF49 |
:1053B00000F0050EDBCF01F0600E005C000E01581E |
:1053C00001E37ED0D950020FE96EDACFEAFF370E43 |
:1053D000D880EE54000EED5402E2DF6828D0D95098 |
:1053E000020FE96EDACFEAFF2F0ED880EE54000EDE |
:1053F000ED5402E2DF6A39D0D950020FE96EDACFFC |
:10540000EAFF270ED880EE54000EED5403E2070E9B |
:10541000DF6E3AD0D950020FE96EDACFEAFF1F0EE5 |
:10542000D880EE54000EED5405E2070EDF6E010E3B |
:10543000DB6831D0D950020FE96EDACFEAFF170EE0 |
:10544000D880EE54000EED5403E2F80EDF6E21D04A |
:10545000D950020FE96EDACFEAFF0F0ED880EE5472 |
:10546000000EED5405E2F80EDF6EDE521F0E0ED078 |
:10547000D950020FE96EDACFEAFF070ED880EE545A |
:10548000000EED5405E2DF68DE52E00EDD6E03D063 |
:10549000DF6A010EDB6A8A8A020EE66EE66AD9CFFF |
:1054A000E6FFDACFE6FF10EC50F0E552E552E552A8 |
:1054B000E552040EDB2A050E01E278D7DB2A76D707 |
:1054C000020EDB2A030E01E261D7DB2A5FD7060E4C |
:1054D000E15C02E2E16AE552E16EE552E7CFD9FF15 |
:0254E0001200B8 |
:0E54E200200EE66EE66A800EE66EE66A1CECB0 |
:1054F00000F0E552E552E552E5521200D9CFE6FF41 |
:10550000E1CFD9FF8A9C010EE66EF6EC55F0E5522C |
:105510008A8CAE0EE66E79D8E552D50EE66E75D859 |
:10552000E552800EE66E71D8E552A80EE66E6DD893 |
:10553000E5521F0EE66E69D8E552D30EE66E65D8C9 |
:10554000E552E66A62D8E552400EE66E5ED8E55254 |
:105550008D0EE66E5AD8E552FE0EDB50006E016AE3 |
:10556000010E001804E1015002E1100E01D0140EEA |
:10557000E66E4BD8E552200EE66E47D8E552E66A55 |
:1055800044D8E552A10EE66E40D8E552C80EE66E4C |
:105590003CD8E552DA0EE66E38D8E552020EE66ED9 |
:1055A00034D8E552810EE66E30D8E5528F0EE66EA5 |
:1055B0002CD8E552D90EE66E28D8E552FE0EDB5007 |
:1055C000006E016A010E001804E1015002E1220E92 |
:1055D00001D0F10EE66E19D8E552DB0EE66E15D855 |
:1055E000E552400EE66E11D8E552A40EE66E0DD8D7 |
:1055F000E552A60EE66E09D8E552AF0EE66E05D866 |
:10560000E552E552E7CFD9FF1200D9CFE6FFE1CF4F |
:10561000D9FFE652FE0EDB50DF6E8A9A010EE66E6F |
:10562000E66AD9CFE6FFDACFE6FF10EC50F0E5529C |
:10563000E552E552E552E552E552E7CFD9FF1200B7 |
:10564000D9CFE6FFE1CFD9FFE652FE0EDB50DF6E89 |
:105650008A8A010EE66EE66AD9CFE6FFDACFE6FF68 |
:1056600010EC50F0E552E552E552E552E552E552B4 |
:10567000E7CFD9FF1200E66A020EE66EE66AFF0E79 |
:10568000E66E000EE66E6AEC53F0050EE15E120067 |
:10569000D9CFE6FFE1CFD9FFFE0EDB50006E016AE5 |
:1056A000E850011002E0A70E01D0A60EE66EADDFB5 |
:1056B000E552E552E7CFD9FF1200D9CFE6FFE1CF9F |
:1056C000D9FF030EE126020EDB6AE66A9EDFE55291 |
:1056D000100EE66E9ADFE552400EE66E96DFE5525A |
:1056E0008A8AE66A020EE66EFF0EE66E000EE66E2F |
:1056F00010EC50F0E552E552E552E552030EE15C44 |
:1057000002E2E16AE552E16EE552E7CFD9FF12000D |
:10571000D9CFE6FFE1CFD9FFFD0EDBCF06F0FE0EBD |
:10572000DBCF07F00001800E071423E1FD0EDBCF75 |
:1057300008F0FE0EDBCF09F008C0E6FF09C0E6FF67 |
:1057400095EC15F0E552E7CF09F0E552E7CF08F008 |
:10575000F3CF0AF0F4CF0BF00950F418E8AE02D002 |
:105760000B3404D00A50085C0B50095802E2000EBA |
:1057700001D0010E046E056AE85005100CE1FB0E25 |
:10578000DBCF0CF0FC0EDBCF0DF00001800E0D1412 |
:1057900002E1000E01D0010E026E036AE850031010 |
:1057A00023E1FB0EDBCF0EF0FC0EDBCF0FF00EC0C3 |
:1057B000E6FF0FC0E6FF90EC15F0E552E7CF0FF0E3 |
:1057C000E552E7CF0EF0F3CF10F0F4CF11F00F5009 |
:1057D000F418E8AE02D0113404D010500E5C115011 |
:1057E0000F5802E2000E01D0010E006E016AE8506F |
:1057F000011001E0FED08BEC15F0006E016A030E83 |
:10580000001801E1015042E0020E001801E10150D0 |
:1058100029E0010E00185FE101505DE1D950FB0F56 |
:10582000E66EFF0EDA20E66ED950FD0FE66EFF0E33 |
:10583000DA20E66E85EC00F0E552E552E552E552DD |
:10584000FD0EDBCF00F0FE0EDBCF01F0800ED88026 |
:105850000056000E01560006015AFD0E00C0DBFF87 |
:10586000FE0E37D0FD0EDBCF00F0FE0EDBCF01F0D9 |
:10587000800ED8800056000E01560006015AFD0E1B |
:1058800000C0DBFFFE0E01C0DBFF12D0D950FB0FC2 |
:10589000E66EFF0EDA20E66ED950FD0FE66EFF0EC3 |
:1058A000DA20E66E85EC00F0E552E552E552E5526D |
:1058B000FB0EDBCF00F0FC0EDBCF01F0200ED8801A |
:1058C0000056000E01560006015AFB0E00C0DBFF19 |
:1058D000FC0E01C0DBFFD950F90FE96EFF0EDA2094 |
:1058E000EA6E010EEE1842E1ED5040E1FB0EDBCF17 |
:1058F00003F0FC0EDBCF04F0080E246E256A03C013 |
:105900001FF004C020F054EC54F01BC003F01CC086 |
:1059100004F01B507CEC56F0F3CF02F0FB0EDBCF13 |
:1059200000F0FC0EDBCF01F0080E246E256A00C0EB |
:105930001FF001C020F054EC54F01FC000F020C054 |
:1059400001F0070ED89000360136E806FBE1FD0EA7 |
:10595000DB500024E96EFE0EDB500120EA6EFF0EE4 |
:10596000E926000EEA220250EF1243D0FB0EDBCFF5 |
:1059700004F0FC0EDBCF05F0080E246E256A04C08F |
:105980001FF005C020F054EC54F01BC004F01CC004 |
:1059900005F01B507CEC56F0F3CF02F0F4CF03F08F |
:1059A000021E031EFB0EDBCF00F0FC0EDBCF01F06E |
:1059B000080E246E256A00C01FF001C020F054ECD0 |
:1059C00054F01FC000F020C001F0070ED890003640 |
:1059D0000136E806FBE1FD0EDB500024E96EFE0E09 |
:1059E000DB500120EA6EFF0EE926000EEA2202508B |
:1059F000EF16E552E7CFD9FF1200D9CFE6FFE1CF8E |
:105A0000D9FFE652010EE66E29EC15F0E552010EC3 |
:105A1000E66EE66A01EC15F0E552E552000EE66E20 |
:105A2000E66AE66EE66AEDEC14F0E552E552E55200 |
:105A3000E552DF6ADF50006E016AD890015004E63B |
:105A4000A80E005C000E01580FE2DF50006E016AE4 |
:105A50000A0E001802E1015005E0DF50E66E23EC6B |
:105A600013F0E552DF2AE6D728DEE552E552E7CF0C |
:105A7000D9FF1200D9CFE6FFE1CFD9FF020EE12610 |
:105A8000DE6ADD6ADECF00F0DDCF01F000C0E6FFA8 |
:105A900001C0E6FF90EC15F0E552E7CF01F0E552CA |
:105AA000E7CF00F0F3CF02F0F4CF03F00150F41889 |
:105AB000E8AE02D0033404D00250005C0350015819 |
:105AC00041E2010EE66EE66ADECFE6FFDDCFE6FFDD |
:105AD00090EC15F0F3CF00F0F4CF01F0020E246E3D |
:105AE000256AF3CF1FF0F4CF20F054EC54F01FC020 |
:105AF00000F020C001F01FC0E6FF20C0E6FF95ECDB |
:105B000015F0F3CF02F0F4CF03F0020E246E256AF5 |
:105B1000F3CF1FF0F4CF20F054EC54F01FC002F08C |
:105B200020C003F01FC0E6FF20C0E6FF03EC02F038 |
:105B3000046E080EE15E0450C0DD020EDE26000E8B |
:105B4000DD22A0D7020EE15C02E2E16AE552E16EDD |
:105B5000E552E7CFD9FF1200D9CFE6FFE1CFD9FF59 |
:105B6000020EE126DE6ADD6ADECF00F0DDCF01F055 |
:105B700000C0E6FF01C0E6FF90EC15F0E552E7CF6C |
:105B800001F0E552E7CF00F0F3CF02F0F4CF03F0DD |
:105B9000020E246E256AF3CF1FF0F4CF20F054ECF0 |
:105BA00054F01FC002F020C003F001502018E8AEEE |
:105BB00002D0033404D00250005C0350015847E285 |
:105BC000010EE66EE66A90EC15F0F3CF02F0F4CF2A |
:105BD00003F0020E1F6E206ADECF24F0DDCF25F029 |
:105BE0007AEC54F01D50025C006E1E500358016E9A |
:105BF00000C0E6FFE66E95EC15F0F3CF06F0F4CFAB |
:105C000007F0020E1F6E206ADECF24F0DDCF25F0F4 |
:105C10007AEC54F01D50065C046E1E500758056E59 |
:105C200004C0E6FFE66EDECFE6FFDDCFE6FFDECFA7 |
:105C3000E6FFDDCFE6FF5DEC01F0086E0A0EE15EE7 |
:105C400008503BDD020EDE26000EDD228DD7020E4F |
:105C5000E15C02E2E16AE552E16EE552E7CFD9FF8D |
:105C60001200D9CFE6FFE1CFD9FF030EE126010EE6 |
:105C7000DF6EDB6A020EDB6A010EDBCF00F0020E84 |
:105C8000DBCF01F000C0E6FF01C0E6FF90EC15F0AD |
:105C9000E552E7CF01F0E552E7CF00F0F3CF02F095 |
:105CA000F4CF03F0020E246E256AF3CF1FF0F4CF79 |
:105CB00020F054EC54F01FC002F020C003F001505B |
:105CC0002018E8AE02D0033404D00250005C035028 |
:105CD00001586EE2DF50006E016A020E246E256AE2 |
:105CE00000C01FF001C020F054EC54F01BC000F0C5 |
:105CF0001CC001F01BC0E6FF1CC0E6FF010EDBCF9D |
:105D000004F0020EDBCF05F0D8900436053604C04F |
:105D1000E6FF05C0E6FF90EC15F0E552E7CF05F091 |
:105D2000E552E7CF04F00450F35C026E0550F458DE |
:105D3000036E02C0E6FFE66E010EDBCF08F0020E36 |
:105D4000DBCF09F0D8900836093608C0E6FF09C055 |
:105D5000E6FF95EC15F0E552E7CF09F0E552E7CF05 |
:105D600008F00850F35C066E0950F458076E06C040 |
:105D7000E6FFE66E010EDBCFE6FF020EDBCFE6FFAD |
:105D8000010EDBCFE6FF020EDBCFE6FF9FEC01F05A |
:105D90000A6E0A0EE15E0A5090DCDF2AD950010F2C |
:105DA000E96EDACFEAFF030EEE26000EED2264D78D |
:105DB000030EE15C02E2E16AE552E16EE552E7CFF3 |
:105DC000D9FF1200D9CFE6FFE1CFD9FF040EE126BB |
:105DD00095EC15F0F3CF02F0F4CF03F0F3CFE6FF2C |
:105DE000F4CFE6FF90EC15F0E552E7CF03F0E55273 |
:105DF000E7CF02F0F3CF04F0F4CF05F00350F4182E |
:105E0000E8AE02D0053404D00450025C05500358BB |
:105E100003E295EC15F002D090EC15F0F3CF00F012 |
:105E2000F4CF01F0020EF3CFDBFF030EF4CFDBFF64 |
:105E3000DE6ADD6ADECF00F0DDCF01F0020EDBCFDF |
:105E400002F0030EDBCF03F0020E246E256A02C0BF |
:105E50001FF003C020F054EC54F01FC002F020C02B |
:105E600003F001502018E8AE02D0033404D00250F1 |
:105E7000005C0350015801E3B3D0010EE66EE66A00 |
:105E800090EC15F0F3CF02F0F4CF03F0020E246E85 |
:105E9000256AF3CF1FF0F4CF20F054EC54F01FC06C |
:105EA00002F020C003F0DE501F24006EDD502020E1 |
:105EB000016E00C0E6FFE66E95EC15F0F3CF06F03C |
:105EC000F4CF07F0020E246E256AF3CF1FF0F4CF53 |
:105ED00020F054EC54F01FC006F020C007F0DE5054 |
:105EE0001F24046EDD502020056E04C0E6FFE66E20 |
:105EF00090EC15F0F3CF0AF0F4CF0BF0020E246E05 |
:105F0000256AF3CF1FF0F4CF20F054EC54F01FC0FB |
:105F10000AF020C00BF0DE501F24086EDD50202058 |
:105F2000096E08C0E6FFE66E95EC15F0F3CF0EF0B3 |
:105F3000F4CF0FF0020E246E256AF3CF1FF0F4CFDA |
:105F400020F054EC54F01FC00EF020C00FF0DE50D3 |
:105F50001F5C0C6EDD5020580D6E0CC0E6FFE66E27 |
:105F600090EC15F0F3CF12F0F4CF13F0020E246E84 |
:105F7000256AF3CF1FF0F4CF20F054EC54F01FC08B |
:105F800012F020C013F0DE501F5C106EDD50205860 |
:105F9000116E10C0E6FFE66E95EC15F0F3CF14F02D |
:105FA000F4CF15F0020E246E256AF3CF1FF0F4CF64 |
:105FB00020F054EC54F01FC014F020C015F01FC0A6 |
:105FC000E6FF20C0E6FF10EC09F0166E0E0EE15E53 |
:105FD00016505DEC2BF0050EDE26000EDD222AD7D2 |
:105FE000040EE15C02E2E16AE552E16EE552E7CFC0 |
:105FF000D9FF1200D9CFE6FFE1CFD9FF050EE12688 |
:10600000010EDF6E95EC15F0F3CF02F0F4CF03F044 |
:10601000F3CFE6FFF4CFE6FF90EC15F0E552E7CFC3 |
:1060200003F0E552E7CF02F0F3CF04F0F4CF05F030 |
:106030000350F418E8AE02D0053404D00450025CDA |
:106040000550035803E295EC15F002D090EC15F0E2 |
:10605000F3CF00F0F4CF01F0030EF3CFDBFF040E1B |
:10606000F4CFDBFF020E006E016A030EDBCF1FF0E0 |
:10607000040EDBCF20F000C024F001C025F054EC6A |
:1060800054F0DE521FC0DEFF20C0DDFFDD52010EE6 |
:10609000DBCF00F0020EDBCF01F0013401E3D4D0FE |
:1060A00000500008000E015401E3CED0010EE66E50 |
:1060B000E66A90EC15F0F3CF02F0F4CF03F0020E95 |
:1060C000246E256AF3CF1FF0F4CF20F054EC54F087 |
:1060D0001FC002F020C003F0010EDB501F24006E31 |
:1060E000020EDB502020016E00C0E6FFE66E95EC4C |
:1060F00015F0F3CF06F0F4CF07F0020E246E256AF8 |
:10610000F3CF1FF0F4CF20F054EC54F01FC006F092 |
:1061100020C007F0010EDB501F24046E020EDB507E |
:106120002020056E04C0E6FFE66E90EC15F0F3CF7C |
:106130000AF0F4CF0BF0020E246E256AF3CF1FF0A5 |
:10614000F4CF20F054EC54F01FC00AF020C00BF044 |
:10615000010EDB501F24086E020EDB502020096E5A |
:1061600008C0E6FFE66E95EC15F0F3CF0EF0F4CF25 |
:106170000FF0020E246E256AF3CF1FF0F4CF20F04B |
:1061800054EC54F01FC00EF020C00FF0010EDB5095 |
:106190001F5C0C6E020EDB5020580D6E0CC0E6FF2B |
:1061A000E66E90EC15F0F3CF12F0F4CF13F0020E80 |
:1061B000246E256AF3CF1FF0F4CF20F054EC54F096 |
:1061C0001FC012F020C013F0010EDB501F5C106ED8 |
:1061D000020EDB502058116E10C0E6FFE66E95EC03 |
:1061E00015F0F3CF14F0F4CF15F0020E246E256AEB |
:1061F000F3CF1FF0F4CF20F054EC54F01FC014F094 |
:1062000020C015F01FC0E6FF20C0E6FF84EC09F0B7 |
:10621000166E0E0EE15E1650DF50006E016A010E22 |
:10622000001804E1015002E1DF6A02D0010EDF6EC6 |
:106230005DEC2BF0D950010FE96EDACFEAFF050EC5 |
:10624000EE5E000EED5A23D7050EE15C02E2E16A34 |
:10625000E552E16EE552E7CFD9FF1200D9CFE6FF54 |
:10626000E1CFD9FF020EE126DE6ADD6ADECF00F063 |
:10627000DDCF01F000C0E6FF01C0E6FF90EC15F0B5 |
:10628000E552E7CF01F0E552E7CF00F0F3CF02F09F |
:10629000F4CF03F0020E246E256AF3CF1FF0F4CF83 |
:1062A00020F054EC54F01FC002F020C003F0020EA6 |
:1062B000025E000E035A01500318E8AE02D0033408 |
:1062C00004D00250005C035001585FE2010EE66EFC |
:1062D000E66A90EC15F0F3CF00F0F4CF01F0040E75 |
:1062E000246E256AF3CF1FF0F4CF20F054EC54F065 |
:1062F0001FC000F020C001F01FC0E6FF20C0E6FF75 |
:1063000090EC15F0F3CF04F0F4CF05F0020E1F6E01 |
:10631000206ADECF24F0DDCF25F07AEC54F01D505A |
:10632000045C026E1E500558036E02C0E6FFE66E66 |
:1063300095EC15F0F3CF08F0F4CF09F0020E1F6EC4 |
:10634000206ADECF24F0DDCF25F07AEC54F01D502A |
:10635000085C066E1E500958076E06C0E6FFE66E22 |
:10636000DECFE6FFDDCFE6FFDECFE6FFDDCFE6FFE7 |
:1063700094EC0DF00A6E0C0EE15E0A505DEC2BF011 |
:10638000020EDE26000EDD2271D7020EE15C02E273 |
:10639000E16AE552E16EE552E7CFD9FF1200D9CFAD |
:1063A000E6FFE1CFD9FF030EE126010EDF6EDB6AC7 |
:1063B000020EDB6A010EDBCF00F0020EDBCF01F034 |
:1063C00000C0E6FF01C0E6FF90EC15F0E552E7CF14 |
:1063D00001F0E552E7CF00F0F3CF02F0F4CF03F085 |
:1063E000020E246E256AF3CF1FF0F4CF20F054EC98 |
:1063F00054F01FC002F020C003F0020E025E000E37 |
:10640000035A01500318E8AE02D0033404D00250FE |
:10641000005C0350015801E378D0DFCFE6FFE66A65 |
:1064200090EC15F0F3CF00F0F4CF01F0040E246EE1 |
:10643000256AF3CF1FF0F4CF20F054EC54F01FC0C6 |
:1064400000F020C001F01FC0E6FF20C0E6FF90EC86 |
:1064500015F0F3CF04F0F4CF05F0020E1F6E206AA2 |
:10646000010EDBCF24F0020EDBCF25F07AEC54F0E6 |
:106470001D50045C026E1E500558036E02C0E6FFFC |
:10648000E66E95EC15F0F3CF08F0F4CF09F0020EAC |
:106490001F6E206A010EDBCF24F0020EDBCF25F049 |
:1064A0007AEC54F01D50085C066E1E500958076EB9 |
:1064B00006C0E6FFE66E010EDBCFE6FF020EDBCF85 |
:1064C000E6FF010EDBCFE6FF020EDBCFE6FFB6EC08 |
:1064D0000FF00A6E0C0EE15E0A50DF50006E016A8A |
:1064E000010E001804E1015002E1DF6A02D0010E42 |
:1064F000DF6E5DEC2BF0D950010FE96EDACFEAFFC9 |
:10650000020EEE26000EED2255D7030EE15C02E2EC |
:10651000E16AE552E16EE552E7CFD9FF1200D9CF2B |
:10652000E6FFE1CFD9FF020EE126DE6ADD6ADECFAB |
:1065300000F0DDCF01F000C0E6FF01C0E6FF95EC02 |
:1065400015F0E552E7CF01F0E552E7CF00F0F3CFC9 |
:1065500002F0F4CF03F00150F418E8AE02D0033497 |
:1065600004D00250005C0350015825E2010EE66E93 |
:10657000E66A90EC15F0F3CF00F0F4CF01F00006DE |
:10658000000E015A00C0E6FF01C0E6FFDECFE6FFC5 |
:10659000DDCFE6FFE66EE66AE66EE66ABDEC00F089 |
:1065A000026E0A0EE15E02505DEC2BF0040EDE2658 |
:1065B000000EDD22BCD7DE6ADD6ADECF00F0DDCF63 |
:1065C00001F000C0E6FF01C0E6FF90EC15F0E552D7 |
:1065D000E7CF01F0E552E7CF00F0F3CF02F0F4CFC0 |
:1065E00003F00150F418E8AE02D0033404D0025096 |
:1065F000005C0350015825E2010EE66EE66ADECF2C |
:10660000E6FFDDCFE6FF95EC15F0F3CF00F0F4CF19 |
:1066100001F00006000E015A00C0E6FF01C0E6FFCF |
:10662000E66EE66AE66EE66ABDEC00F0026E0A0E01 |
:10663000E15E02505DEC2BF0040EDE26000EDD2242 |
:10664000BCD7E668F6EC55F0E5523BEC2BF0DE6A81 |
:10665000DD6ADECF00F0DDCF01F000C0E6FF01C053 |
:10666000E6FF95EC15F0E552E7CF01F0E552E7CFF4 |
:1066700000F0F3CF02F0F4CF03F00150F418E8AECD |
:1066800002D0033404D00250005C0350015826E2CB |
:10669000010EE66EE66A000EE66EE66ADECFE6FF03 |
:1066A000DDCFE6FF90EC15F0F3CF00F0F4CF01F072 |
:1066B0000006000E015A00C0E6FF01C0E6FFE66ECC |
:1066C000E66ABDEC00F0026E0A0EE15E02505DEC7F |
:1066D0002BF0040EDE26000EDD22BBD790EC15F069 |
:1066E000F3CF00F0F4CF01F00006000E015A00C015 |
:1066F000DEFF01C0DDFFDECF00F0DDCF01F00001E5 |
:10670000800E011434E1010EE66EE66ADECFE6FF8C |
:10671000DDCFE6FF95EC15F0F3CF00F0F4CF01F0FC |
:106720000006000E015A00C0E6FF01C0E6FF90EC33 |
:1067300015F0F3CF02F0F4CF03F00206000E035A77 |
:1067400002C0E6FF03C0E6FFE66EE66ABDEC00F0BD |
:10675000046E0A0EE15E04505DEC2BF0D9CFE9FF28 |
:10676000DACFEAFF040EEE5E000EED5AC4D7E668FB |
:10677000F6EC55F0E5523BEC2BF095EC15F0F3CF31 |
:1067800000F0F4CF01F00006000E015A00C0DEFF59 |
:1067900001C0DDFFDECF00F0DDCF01F00001800E93 |
:1067A000011435E1010EE66EE66A000EE66EE66A59 |
:1067B000DECFE6FFDDCFE6FF90EC15F0F3CF00F083 |
:1067C000F4CF01F00006000E015A00C0E6FF01C040 |
:1067D000E6FF95EC15F0F3CF02F0F4CF03F00206DC |
:1067E000000E035A02C0E6FF03C0E6FFBDEC00F056 |
:1067F000046E0A0EE15E04505DEC2BF0D9CFE9FF88 |
:10680000DACFEAFF040EEE5E000EED5AC3D790EC2D |
:1068100015F0F3CF00F0F4CF01F00006000E015A9E |
:1068200000C0DEFF01C0DDFFDECF00F0DDCF01F0F4 |
:106830000001800E011435E1010EE66EE66ADECF3E |
:10684000E6FFDDCFE6FF000EE66EE66A90EC15F09F |
:10685000F3CF00F0F4CF01F00006000E015A00C0A3 |
:10686000E6FF01C0E6FF95EC15F0F3CF02F0F4CFA0 |
:1068700003F00206000E035A02C0E6FF03C0E6FF63 |
:10688000BDEC00F0046E0A0EE15E04505DEC2BF0EE |
:10689000D9CFE9FFDACFEAFF040EEE5E000EED5A23 |
:1068A000C3D7E668F6EC55F0E5523BEC2BF0DE6A18 |
:1068B000DD6ADECF00F0DDCF01F000C0E6FF01C0F1 |
:1068C000E6FF90EC15F0E552E7CF01F0E552E7CF97 |
:1068D00000F0F3CF02F0F4CF03F00150F418E8AE6B |
:1068E00002D0033404D00250005C0350015826E269 |
:1068F000010EE66EE66ADECFE6FFDDCFE6FF000EB4 |
:10690000E66EE66AE66EE66A95EC15F0F3CF00F007 |
:10691000F4CF01F00006000E015A00C0E6FF01C0EE |
:10692000E6FFBDEC00F0026E0A0EE15E02505DEC87 |
:106930002BF0040EDE26000EDD22BBD7DE6ADD6AF8 |
:10694000DECF00F0DDCF01F000C0E6FF01C0E6FFC2 |
:1069500095EC15F0E552E7CF01F0E552E7CF00F0F6 |
:10696000F3CF02F0F4CF03F00150F418E8AE02D0F8 |
:10697000033404D00250005C0350015830E2010E91 |
:10698000E66EE66A90EC15F0F3CF00F0F4CF01F07C |
:106990000006000E015A00C0E6FF01C0E6FFDECF90 |
:1069A000E6FFDDCFE6FFE66EE66A95EC15F0F3CF85 |
:1069B00002F0F4CF03F00206000E035A02C0E6FF15 |
:1069C00003C0E6FFBDEC00F0046E0A0EE15E045069 |
:1069D0005DEC2BF0040EDE26000EDD22B1D7E6685A |
:1069E000F6EC55F0E552020EE15C02E2E16AE55296 |
:0A69F000E16EE552E7CFD9FF120077 |
:0669FA00948294948B844A |
:106A00008B94010EE66E71EC56F0E5528B84120009 |
:106A10000101140EB46F010EB56F140EB66F010EA6 |
:106A2000B76F040EE66EB40EE66E010EE66E86D803 |
:106A3000E552E552E552000901E1000C080EE66E50 |
:106A4000B40EE66E010EE66E6BEC3CF0E552E552DC |
:106A5000E5520101BB51026E036A150E021801E1F5 |
:106A6000035002E0000E01D0010E006E016AE850F2 |
:106A70001200D9CFE6FFE1CFD9FF040EE126DF6A8D |
:106A8000010EDB6A020EDB6A030EDB6A0101020EF5 |
:106A9000B46F010EE66EB40EE66E010EE66E4ED8D1 |
:106AA000E552E552E552000935E00C0EE66EB40EF3 |
:106AB000E66E010EE66E6BEC3CF0E552E552E552F7 |
:106AC000080EE66EE66A950EE66E0E0EE66EB40EE3 |
:106AD000E66E010EE66E92EC53F0026E060EE15E7B |
:106AE0000250006E016A00BE01680050011012E100 |
:106AF0000101BC51DF6EBD51E76E010EE7CFDBFF38 |
:106B0000BE51E76E020EE7CFDBFFBF51E76E030E0B |
:106B1000E7CFDBFFDECF1DF0DECF1EF0DECF1FF0B4 |
:106B2000DDCF20F0DD52DD52040EE15C02E2E16ACD |
:106B3000E552E16EE552E7CFD9FF1200D9CFE6FF6B |
:106B4000E1CFD9FF020EE126DE6ADD6AFC0EDB50E2 |
:106B5000E66EFD0EDBCFE6FFFE0EDBCFE6FF9CEC24 |
:106B60003CF0E552E552E5525EEC3CF0006E016A05 |
:106B7000010E001801E1015013E0010EDE26000EA7 |
:106B8000DD22D9CFE9FFDACFEAFFE80ED880EE5454 |
:106B9000030EED5409E3010EE66E71EC56F0E3D7F7 |
:106BA00024EC3CF0000902E1000E01D0010E006E61 |
:106BB000020EE15C02E2E16AE552E16E0050E5524C |
:106BC000E7CFD9FF1200D9CFE6FFE1CFD9FFE652D8 |
:106BD000DF6A01014A0EB46F010EB56FFE0EDB5085 |
:106BE000B66F030EE66EB40EE66E010EE66EA6DF1D |
:106BF000E552E552E55200091DE05EEC3CF0006E06 |
:106C0000016A010E0018F9E10150F7E1140EE66E79 |
:106C1000B40EE66E010EE66E6BEC3CF0E552E5520A |
:106C2000E5520101BC51006E016A010E001801E13C |
:106C3000015002E0000E3DD0C151E66EFA0EDBCFEE |
:106C4000E9FFFB0EDBCFEAFFE552E750EF6EDF6AAC |
:106C5000DF50006E016AFA0EDBCFE9FFFB0EDBCFDF |
:106C6000EAFFEF50000101AE02D0D89003D0005CE3 |
:106C7000000E01581DE2DF50EA6A0E0FE96E000EA9 |
:106C8000EA22B40EE926010EEA22EF50E66EDF504A |
:106C9000E76EFC0EDBCFE9FFFD0EDBCFEAFFE7502E |
:106CA000E926000EEA22E552E750EF6EDF2AD0D740 |
:106CB000010EE552E552E7CFD9FF1200D9CFE6FF2A |
:106CC000E1CFD9FFE150FB0FE96EFF0EDA20EA6E4B |
:106CD000800EEE5C000EEE58000EEE58000EEE58E0 |
:106CE00012E2FB0EDBCF02F0FC0EFD0EFE0E030ED9 |
:106CF0000216036A046A056A0250031004100510A4 |
:106D000012E1010E13D0FB0EDBCF02F0FC0EFD0EE4 |
:106D1000FE0E0F0E0216036A046A056A0250031083 |
:106D20000410051002E0000E01D0010E016AE850C7 |
:106D3000E552E7CFD9FF1200D9CFE6FFE1CFD9FF67 |
:106D4000E150FB0FE96EFF0EDA20EA6E800EEE5C7A |
:106D5000000EEE58000EEE58000EEE581DE2FB0E2F |
:106D6000DBCF02F0FC0EDBCF03F0FD0EDBCF04F037 |
:106D7000FE0EDBCF05F0022A000E032204220522BC |
:106D8000030E0216036A046A056A02500310041017 |
:106D900005101DE1010E1ED0FB0EDBCF02F0FC0E34 |
:106DA000DBCF03F0FD0EDBCF04F0FE0EDBCF05F0F2 |
:106DB000022A000E0322042205220F0E0216036A85 |
:106DC000046A056A025003100410051002E0000E68 |
:106DD00001D0010E016AE850E552E7CFD9FF120059 |
:106DE000D9CFE6FFE1CFD9FFE6520101400EB46FE3 |
:106DF000010EB56FF70EDB50026E036AE850031008 |
:106E000002E0600E01D0610E006E016AB66FF80EEE |
:106E1000DBCFB7F1DF6ADF50006E016AD890015016 |
:106E200004E6060E005C000E01581DE2DF50E76E1E |
:106E3000F50EDBCFE9FFF60EDBCFEAFFE750E926E0 |
:106E4000000EEA22EF50E66EDF50EA6A040FE96EA8 |
:106E5000000EEA22B40EE926010EEA22E552E750BE |
:106E6000EF6EDF2AD8D7DF6ADF50006E016AFC0EB2 |
:106E7000DB50000101AE02D0D89003D0005C000EC0 |
:106E800001581DE2DF50E76EFD0EDBCFE9FFFE0E7D |
:106E9000DBCFEAFFE750E926000EEA22EF50E66E6C |
:106EA000DF50EA6A0A0FE96E000EEA22B40EE92604 |
:106EB000010EEA22E552E750EF6EDF2AD5D7FC0E2D |
:106EC000DBCF00F00A0E0024E66EB40EE66E010E73 |
:106ED000E66E34DEE552E552E552000902E1000EAD |
:106EE0000CD00C0EE66EB40EE66E010EE66E6BEC88 |
:106EF0003CF0E552E552E552010EE552E552E7CF8E |
:106F0000D9FF1200D9CFE6FFE1CFD9FFE652010148 |
:106F1000400EB46F010EB56F300EB66FFE0EDB5033 |
:106F2000B76F040EE66EB40EE66E010EE66E06DE78 |
:106F3000E552E552E552000912E01A0EE66EB40E73 |
:106F4000E66E010EE66E6BEC3CF0E552E552E55262 |
:106F50000101BC51006E016A0050011002E0000EF8 |
:106F60002AD0DF6ADF50006E016AD890015004E633 |
:106F7000100E005C000E01581DE2DF50EA6A090F96 |
:106F8000E96E000EEA22B40EE926010EEA22EF5065 |
:106F9000E66EDF50E76EFC0EDBCFE9FFFD0EDBCFC8 |
:106FA000EAFFE750E926000EEA22E552E750EF6ECD |
:106FB000DF2AD8D7010EE552E552E7CFD9FF1200FC |
:106FC000D9CFE6FFE1CFD9FFE6520101400EB46F01 |
:106FD000010EB56FA00EB66FFE0EDB50B76FDF6A05 |
:106FE000DF50006E016AD890015004E6100E005C7C |
:106FF000000E01581DE2DF50E76EFC0EDBCFE9FF0B |
:10700000FD0EDBCFEAFFE750E926000EEA22EF5043 |
:10701000E66EDF50EA6A040FE96E000EEA22B40E53 |
:10702000E926010EEA22E552E750EF6EDF2AD8D7B3 |
:10703000140EE66EB40EE66E010EE66E7FDDE552CE |
:10704000E552E552000902E1000E0CD01A0EE66E80 |
:10705000B40EE66E010EE66E6BEC3CF0E552E552C6 |
:10706000E552010EE552E552E7CFD9FF1200D9CF24 |
:10707000E6FFE1CFD9FF300EE126140EDF6EDE52BF |
:10708000010EDD6E030EF36E020EF3CFDBFFE10E99 |
:10709000F36E030EF3CFDBFFF36E040EF3CFDBFFD3 |
:1070A000E10EF36E050EF3CFDBFF030EF36E060E5B |
:1070B000F3CFDBFFE10EF36E070EF3CFDBFF030E22 |
:1070C000F36E080EF3CFDBFFE10EF36E090EF3CF84 |
:1070D000DBFF030EF36E0A0EF3CFDBFFE10EF36E60 |
:1070E0000B0EF3CFDBFF030EF36E0C0EF3CFDBFFC3 |
:1070F000E10EF36E0D0EF3CFDBFF030EF36E0E0EFB |
:10710000F3CFDBFFE10EF36E0F0EF3CFDBFF030EC9 |
:10711000F36E100EF3CFDBFFE10EF36E110EF3CF23 |
:10712000DBFF030EF36E120EF3CFDBFFE10EF36E07 |
:10713000130EF3CFDBFF030EF36E140EF3CFDBFF62 |
:10714000E10EF36E150EF3CFDBFF030EF36E160E9A |
:10715000F3CFDBFFE10EF36E170EF3CFDBFF030E71 |
:10716000F36E180EF3CFDBFFE10EF36E190EF3CFC3 |
:10717000DBFF030EF36E1A0EF3CFDBFFE10EF36EAF |
:107180001B0EF3CFDBFF030EF36E1C0EF3CFDBFF02 |
:10719000E10EF36E1D0EF3CFDBFF030EF36E1E0E3A |
:1071A000F3CFDBFFE10EF36E1F0EF3CFDBFFA00E7C |
:1071B000F36E200EF3CFDBFFA10EF36E210EF3CFA3 |
:1071C000DBFFA20EF36E220EF3CFDBFFA30EF36EF6 |
:1071D000230EF3CFDBFFA40EF36E240EF3CFDBFF01 |
:1071E000A50EF36E250EF3CFDBFF780EF36E260EA1 |
:1071F000F3CFDBFF770EF36E270EF3CFDBFF880EA6 |
:10720000F36E280EF3CFDBFFC10EF36E290EF3CF22 |
:10721000DBFF2A0EDB682B0EDB682C0EDB682D0EE5 |
:10722000DB682E0EDB682F0EDB68D9CFE6FFDACFE6 |
:10723000E6FF010EE66EC4DEE552E552E5520009B6 |
:107240001CE0D950100FE66E000EDA20E66E020E3A |
:10725000E66EB6DEE552E552E55200090EE0D95081 |
:10726000200FE66E000EDA20E66E030EE66EA8DE54 |
:10727000E552E552E552000902E1000E01D0010E8F |
:10728000006E300EE15C02E2E16AE552E16E005010 |
:10729000E552E7CFD9FF1200D9CFE6FFE1CFD9FF02 |
:1072A000410EE126FB0EDBCFE6FFFC0EDBCFE6FF57 |
:1072B00084EC53F0E552E552F350DF6E010EDB6AC9 |
:1072C000020EDB6A030EF36EDB6EDFCF00F0050EFD |
:1072D0000024E76E040EE7CFDBFFD10EF36E050E40 |
:1072E000F3CFDBFF010EF36E060EF3CFDBFFDFCF34 |
:1072F00000F0010E0024E76E070EE7CFDBFF550E0E |
:10730000F36E080EF3CFDBFFFD0EDB50E76E090EC8 |
:10731000E7CFDBFF0A0EDB6A0B0EDB6A0C0EDB6AC3 |
:107320000D0EDB6A0E0EDB6A0F0EDB6A100EDB6AD7 |
:10733000110EDB6A120EDB6A130EDB6A140EDB6AB7 |
:10734000150EDB6A160EDB6A170EDB6A180EDB6A97 |
:10735000190EDB6A1A0EDB6A1B0EDB6A1C0EDB6A77 |
:107360001D0EDB6A1E0EDB6A1F0EDB6A200EDB6A57 |
:10737000210EDB6A220EDB6A230EDB6A240EDB6A37 |
:10738000250EDB6A260EDB6A270EDB6A280EDB6A17 |
:10739000290EDB6A2A0EDB6A2B0EDB6A2C0EDB6AF7 |
:1073A0002D0EDB6A2E0EDB6A2F0EDB6A300EDB6AD7 |
:1073B000D30EF36E310EF3CFDBFFF70EF36E320E0A |
:1073C000F3CFDBFFD30EF36E330EF3CFDBFFF70EFD |
:1073D000F36E340EF3CFDBFFD30EF36E350EF3CF27 |
:1073E000DBFFF70EF36E360EF3CFDBFF7F0EF36E8F |
:1073F000370EF3CFDBFF070EF36E380EF3CFDBFF54 |
:10740000880EF36E390EF3CFDBFF400EF36E3A0EAB |
:10741000F3CFDBFF3B0EDB683C0EDB683D0EDB6829 |
:107420003E0EDB683F0EDB68400EDB68FE0EDB5075 |
:10743000026E036AD890035004E6010E025C000E4F |
:1074400003580DE3FE0EDB50046E056A053404E2BA |
:1074500004500F08000E055402E3000E01D0010E87 |
:10746000006E016AE850011001E0DFD1DF50026ECA |
:10747000036AD890035004E6010E025C000E035824 |
:107480000CE3DF50046E056A053404E2045026085C |
:10749000000E055402E3000E01D0010E006E016AD9 |
:1074A000E850011001E0C1D1DF50006E016A0134E3 |
:1074B00004E200500608000E015425E3DFCFE6FF8A |
:1074C000E66AFB0EDBCFE6FFFC0EDBCFE6FFD95012 |
:1074D0000A0FE66E000EDA20E66E3FEC53F0006E07 |
:1074E000060EE15E0050D950010F006EDACF01F0B8 |
:1074F000DFCF02F0090E0224EA6AEA360024E96EC0 |
:10750000DA50EA223AD1DF50006E016A070E001805 |
:107510001BE1015019E1DFCFE6FFE66AFB0EDBCF8E |
:10752000E6FFFC0EDBCFE6FFD9500A0FE66E000E39 |
:10753000DA20E66E3FEC53F0006E060EE15E00507E |
:10754000FE0EF36E110EA9D0DF50026E036A0334F3 |
:1075500004E202500708000E03540CE3DF50046EEF |
:10756000056A053407E204501608000E055402E2CD |
:10757000000E01D0010E006E016AE850011046E0D5 |
:10758000070EE66EE66AFB0EDBCFE6FFFC0EDBCFF6 |
:10759000E6FFD9500A0FE66E000EDA20E66E3FECE9 |
:1075A00053F0006E060EE15E0050DF50006E016A7F |
:1075B000070E005E000E015A00C0E6FF01C0E6FFA4 |
:1075C000070EE76EFB0EDBCF02F0FC0EDBCF03F005 |
:1075D000E7500226000E032202C0E6FF03C0E6FFCA |
:1075E000D950110FE66E000EDA20E66E3FEC53F034 |
:1075F000046E060EE15E0450D950110F006EDACF12 |
:1076000001F0DF50026E036A070EAED0DF50006E4D |
:10761000016A170E001844E1015042E1070EE66EC0 |
:10762000E66AFB0EDBCFE6FFFC0EDBCFE6FFD950B0 |
:107630000A0FE66E000EDA20E66E3FEC53F0006EA5 |
:10764000060EE15E0050DF50006E016A070E005E1C |
:10765000000E015A00C0E6FF01C0E6FF070EE76E0C |
:10766000FB0EDBCF02F0FC0EDBCF03F0E75002266F |
:10767000000E032202C0E6FF03C0E6FFD950110F3F |
:10768000E66E000EDA20E66E3FEC53F0046E060E56 |
:10769000E15E0450FE0EF36E210EF3CFDBFF6FD0E0 |
:1076A000070EE66EE66AFB0EDBCFE6FFFC0EDBCFD5 |
:1076B000E6FFD9500A0FE66E000EDA20E66E3FECC8 |
:1076C00053F0006E060EE15E0050100EE66EE66AA4 |
:1076D000070EE76EFB0EDBCF00F0FC0EDBCF01F0F8 |
:1076E000E7500026000E012200C0E6FF01C0E6FFC1 |
:1076F000D950110FE66E000EDA20E66E3FEC53F023 |
:10770000026E060EE15E0250DF50006E016A180E36 |
:10771000005E000E015A00C0E6FF01C0E6FF170E32 |
:10772000E76EFB0EDBCF02F0FC0EDBCF03F0E75081 |
:107730000226000E032202C0E6FF03C0E6FFD95076 |
:10774000210FE66E000EDA20E66E3FEC53F0046E79 |
:10775000060EE15E0450D950210F006EDACF01F021 |
:10776000DF50026E036A160E025E000E035A0050CE |
:107770000224E96EDA500320EA6EFE0EEF6ED95055 |
:10778000010FE66E000EDA20E66EFE0EDB50040DF1 |
:10779000F350E66E15DCE552E552E552000945E08E |
:1077A000D950110FE66E000EDA20E66EFE0EDB50A9 |
:1077B000040DF3CF00F0F4CF01F0010EF324E66ED8 |
:1077C000E0EC37F0E552E552E55200092EE0D950E1 |
:1077D000210FE66E000EDA20E66EFE0EDB50040D81 |
:1077E000F3CF00F0F4CF01F0020EF324E66EE0ECEC |
:1077F00037F0E552E552E552000917E0D950310F54 |
:10780000E66E000EDA20E66EFE0EDB50040DF3CFBE |
:1078100000F0F4CF01F0030EF324E66EE0EC37F055 |
:10782000E552E552E552000902E1000E01D0010ED9 |
:10783000006E410EE15C02E2E16AE552E16E005049 |
:10784000E552E7CFD9FF1200D9CFE6FFE1CFD9FF4C |
:10785000070EE126060EE66ED9CFE6FFDACFE6FF89 |
:107860003AD8E552E552E552070EE66EE66A9D0EFD |
:10787000E66E0E0EE66ED9CFE6FFDACFE6FF92ECAB |
:1078800053F0046E060EE15E0450026E036A02BEFF |
:1078900003680250031002E0000E01D0010E006EDA |
:1078A000016AE850006E070EE15C02E2E16AE5520F |
:1078B000E16E0050E552E7CFD9FF12008250020B73 |
:1078C00001E0010E006E016A010E001803E1015093 |
:1078D00001E1000C010CD9CFE6FFE1CFD9FFE65260 |
:1078E000EDDF006E016A010E0018FAE10150F8E1C7 |
:1078F000FC0EDBCF00F0020E0024E66E240EE66ED6 |
:10790000E8EC43F0E552E55255EC47F0DF6EDF500E |
:10791000006E016AE8500110F7E0FD0EDBCFE6FFD4 |
:10792000FE0EDBCFE6FF97EC47F0E552E552E5525D |
:10793000E552E7CFD9FF1200D9CFE6FFE1CFD9FF5B |
:107940004C0EE126060EF36E4B0EF3CFDBFFFC0E62 |
:10795000DB2AD30EF36E020EF3CFDBFF030EDB6ADE |
:10796000040EDB6A050EDB68FC0EDB50E76E060ECC |
:10797000E7CFDBFFFC0EDB50006E016A001E011E2C |
:10798000010E0026000E0122070E00C0DBFFD40E00 |
:10799000F36E080EF3CFDBFFDE6ADD6ADECF00F0A8 |
:1079A000DDCF01F0FC0EDB50026E036A0206000E12 |
:1079B000035A01500318E8AE02D0033404D0025039 |
:1079C000005C035001583AE2FD0EDBCF01F0FE0EE1 |
:1079D000DBCF02F0DE500124E96EDD500220EA6EBA |
:1079E000EF50006E020EDBCFE7FF0050E726020EDD |
:1079F000E7CFDBFFFD0EDBCF02F0FE0EDBCF03F0A7 |
:107A0000DE500224E96EDD500320EA6EEF50E66E90 |
:107A1000D950030F006EDACF01F04B0EDB5000247B |
:107A2000E96E000EDA20EA6EE552E750EF6E4B0E7B |
:107A3000DB2ADF2A010EB2E3DB2AB0D7020EDB50CD |
:107A4000026E036A021E031ED950030F006EDACFC6 |
:107A500001F04B0EDB500F010024E96E000EDA201E |
:107A6000EA6E02C0EFFF4B0EDB2AD950030F006E07 |
:107A7000DACF01F04B0EDB500024E96E000EDA2065 |
:107A8000EA6EEF6A4B0EDB2AD950030FE66E000E4A |
:107A9000DA20E66E4B0EDB50E66E240EE66EA2ECAC |
:107AA00043F0E552E552E552E5524C0EE15C02E24C |
:0E7AB000E16AE552E16EE552E7CFD9FF120020 |
:027ABE009BEC3F |
:107AC00042F0FB0EDBCFF3FFDB06F35000090AE0C8 |
:107AD000E9EC42F0FA0E54EC43F0F3E1011CF1E161 |
:107AE000010E01D0000ECAEF42F09BEC42F03B0EBB |
:107AF000E12402E3E168E652E16E010EDB6A020E68 |
:107B0000DB6AF90EDBCFF6FFFA0EDBCFF7FFFB0ED9 |
:107B1000DBCFF8FF0800F550DF6EDF5002E1EEEF3B |
:107B200041F0250EDF5C02E0E1EF41F0030EDB6A7D |
:107B3000040EDB6A050EDB6A060EDB6A070EDB6AE3 |
:107B400003EC42F02D0EDF5C0CE02B0EDF5C09E055 |
:107B5000200EDF5C06E0230EDF5C03E0300EDF5C0E |
:107B60001AE1DF50300A14E0130A0FE0030A0AE0BA |
:107B70000B0A05E0060AE4E1030EDB80E1D7030E01 |
:107B8000DB82DED7030EDB84DBD7030EDB86D8D7A0 |
:107B9000030EDB88D5D72A0EDF5C1BE1FFEC41F03A |
:107BA0004DEC42F010E0030EDB801F682068130EDE |
:107BB000DBCF24F0140EDBCF25F07AEC54F0040E6A |
:107BC0001DC0DBFF03D0130E36EC42F003EC42F095 |
:107BD0000BD0090EDB6AA4EC42F003E018EC43F092 |
:107BE000FAD7090E36EC42F0030EDBB0DB982E0E0E |
:107BF000DF5C1BE103EC42F02A0EDF5C0BE1FFECE3 |
:107C000041F04DEC42F003E1130E88EC42F003EC3E |
:107C100042F00BD0090EDB6AA4EC42F003E018EC52 |
:107C200043F0FAD7090E88EC42F0680EDF5C07E1FA |
:107C300003EC42F0680EDF5C1DE1030E18D0740EF9 |
:107C4000DF5C17E07A0EDF5C14E0480EDF5C06E0D4 |
:107C5000540EDF5C03E05A0EDF5C02E1020E07D037 |
:107C60006C0EDF5C03E06A0EDF5C04E1010EDBEC0E |
:107C700042F0C9DBDF506E0A01E17FD31E0A01E149 |
:107C800092D1200A01E18FD13F0A01E149D11A0ABC |
:107C900001E146D10D0A01E143D1200A01E140D1C1 |
:107CA0003A0A01E13DD1200A01E13AD1260A01E177 |
:107CB00035D10D0A01E132D11A0A01E1D9D0200AE9 |
:107CC0004AE0300A1FE0460A0EE0250A01E083D3AD |
:107CD000D950F90FE96EFF0EDA20EA6E010EEE5E62 |
:107CE000000EEE5AEE5AE9EC42F0250EE66E95DBF8 |
:107CF00003E1011C01E169D3E5EC42F001E26BD341 |
:107D0000DB2A69D3080EDB6A040EDB50010806E2A9 |
:107D1000040EDB04ADEC42F0DB508BDB080EDB50D5 |
:107D200009E0030EDB50010B05E172DB01E04DD3EE |
:107D3000080EDB6A64DBEFCFDFFF5DEC43F003E1AD |
:107D4000011C01E142D3E5EC42F001E3DB2A60DBF8 |
:107D500001E141D33AD3070EDB5002080FE129ECD1 |
:107D600043F0030EF0EC42F00E0EEECFDBFF0F0EF1 |
:107D7000EECFDBFF100EEECFDBFF20D0F70EDBCF18 |
:107D800003F0F80EDBCF04F0020E035E000E045A7F |
:107D9000F70E03C0DBFFF80E04C0DBFF03C0E9FFF2 |
:107DA00004C0EAFFE0EC42F0026A0E0E00C0DBFF06 |
:107DB0000F0E01C0DBFF100E02C0DBFF0E0EDBCF8B |
:107DC000E6FF0F0EDBCFE6FF100EDBCFE6FFBDECCC |
:107DD00053F0E552E552E552130E1EC0DBFF140EC0 |
:107DE0001FC0DBFF060EDB5005E0130E24EC43F052 |
:107DF00001E26ADB48EC43F002E2130E37DB0BECE6 |
:107E000043F006E0040E24EC43F002E2050E2EDB04 |
:107E1000030EDBB005D0FCDA01E0D7D2080EDB6A36 |
:107E2000090EDB6A0E0EDBCFF6FF0F0EDBCFF7FF7E |
:107E3000100EDBCFF8FF0800F550DF6EDF5014E0C6 |
:107E40004EEC43F011E25DEC43F003E1011C01E173 |
:107E5000BCD2BBDB01E3DB2A090EDB2AD9500E0FB3 |
:107E6000E96E000ECBDBE7D7D3DA01E1B4D2ADD2B5 |
:107E7000C6DA110EEECFDBFF120EEDCFDBFF110ED7 |
:107E8000DBCFE6FF120EDBCFE6FF84EC53F0E552CA |
:107E9000E552130EF3CFDBFF140EF4CFDBFF060E1B |
:107EA000DB5004E0130ED0DB01E20EDB48EC43F0C4 |
:107EB00002E2130EDBDAAFDB05E0040EC5DB02E203 |
:107EC000050ED4DA030EDBB005D0A2DA01E07DD2D4 |
:107ED000080EDB6A090EDB6A110EDBCFE9FF120E1A |
:107EE000DBCFEAFFEFCFDFFFDF5014E0D7DB12E29A |
:107EF000E4DB03E1011C01E168D267DB01E3DB2A7B |
:107F0000090EDB2A110EDB2ADBCFE9FF120EE8E3B4 |
:107F1000DB2AE6D77DDA01E15ED257D2030EDB8E93 |
:107F2000070EDB0410E195DB040E5ADB0A0EEECFE0 |
:107F3000DBFF0B0EEECFDBFF0C0EEECFDBFF0D0EEB |
:107F4000EECFDBFF6CD0070EDB5003082CE1030EF5 |
:107F5000DBAE0DD0B2DA020E76DAEFCF00F0016AB6 |
:107F6000026A036A00AE39D00168026835D0F70EA4 |
:107F7000DBCF01F0F80EDBCF02F0020E015E000E47 |
:107F8000025AF70E01C0DBFFF80E02C0DBFF01C092 |
:107F9000E9FF02C0EAFFEFCF00F00A0E00C0DBFFEE |
:107FA0000B0EDB6A38D0070EDB50020809E1030E26 |
:107FB000DBAE04D059DB02AE10D00ED055DB0DD0B5 |
:107FC000030EDBAE12D079DA020E3DDAF9DA026A7C |
:107FD000036A01AE02D002680368E2DA0C0E02C046 |
:107FE000DBFF0D0E03C0DBFF1AD0F70EDBCF02F074 |
:107FF000F80EDBCF03F0020E025E000E035AF70EFE |
:1080000002C0DBFFF80E03C0DBFF02C0E9FF03C0C4 |
:10801000EAFFD6DAC5DA0C0EDB6A0D0EDB6A060E55 |
:10802000DB5005E1010EF36E050EF3CFDBFF150EFD |
:10803000DB6A160EDB6AD950370F006E000EDA20AD |
:10804000016E390E00C0DBFF3A0E01C0DBFF380EB7 |
:10805000DB6A080EDB6A0A0EAEDADF50780A12E03D |
:10806000200A10E0280A0CE0200A0AE03F0A06E095 |
:108070000D0A02E0200A08E1020E05D0080E03D026 |
:10808000080EDF26100E97DA030EDBBE02D0DB925D |
:10809000DB94DB50800B24E08ADAD890030EEB509F |
:1080A000000A08E6000EEE5C000EEE58000EEE58D8 |
:1080B000000EEE5815E213DA22682368246825685A |
:1080C0009AEC55F00A0E19C0DBFF0B0E1AC0DBFF4D |
:1080D0000C0E1BC0DBFF0D0E1CC0DBFF2D0E08D0ED |
:1080E000030EDBA202D02B0E03D0DBA408D0200E9F |
:1080F000F36E170EF3CFDBFF150EDB2A02D0170E3F |
:10810000DB6A050EDB5003E1B7D901E189D00E0E21 |
:10811000006EAD0E016E000E026E070EDBCF03F097 |
:10812000046A056A066A03C022F004C023F005C091 |
:1081300024F006C025F0D3D9D2EC55F00050192414 |
:10814000F36E01501A20F46E02501B20F86EF4CF2B |
:10815000F7FFF3CFF6FF0800090EF5CFDBFF580E4F |
:10816000DF5C0FE1610EF36E090E7BD90AE3200E8E |
:10817000006E090EDBCFE7FF0050E75E090EE7CF88 |
:10818000DBFF070EDBCF00F0016A026A036A0FDA39 |
:1081900000C022F001C023F002C024F003C025F08B |
:1081A000EECF1DF0EECF1EF0EECF1FF0EFCF20F0A0 |
:1081B000D2EC55F020C0EDFF1FC0EDFF1EC0EDFF5B |
:1081C0001DC0EFFF390EDBCFE9FFDB063A0EDBCF38 |
:1081D000EAFF01E2DB06090EDBCFEFFF150EDB2A1B |
:1081E0004BD995E1030EDBA61DD06F0EDF5C06E1D7 |
:1081F000C1D918E3150EDB285BDA14D0780EDF5CEA |
:1082000009E0580EDF5C06E0620EDF5C03E0420E20 |
:10821000DF5C08E1020EF36E160EF3CFDBFF02D037 |
:10822000150EDB6A030EDB50100B0EE0040EDBCFE5 |
:1082300000F0050EDB50D880005406E2060EDB503D |
:1082400003E1040EDB5034DA95D90AE2050EDBCFE8 |
:10825000E7FF150EDB50E75E050EE7CFDBFF02D030 |
:10826000050EDB6A040EDBCF00F0160E45D9D88070 |
:10827000005414E2160EDBCFE6FF150EDBCFE6FF4F |
:10828000040EDBCFE6FF050EDB50E552E75CE5525E |
:10829000D880E754E552D880E7545FD9030EDB500D |
:1082A000010B0BE1080EDB5008E0B2D801E08DD0E5 |
:1082B000080EDB50BED8080EDB6A170EDB5007E055 |
:1082C00088D9170EF1D903E1011C01E17ED0160E09 |
:1082D000DB5016E07ED9300EE66E9FD802E1011C1D |
:1082E00074E077D9DFCFE6FF58EC55F0E552E55260 |
:1082F000E552F4CF01F00001F31C02E1011C65E03E |
:10830000050EDBCF00F0160EDB50D880005409E2DA |
:10831000050EDBCFE7FF160EDB50E75E050EE7CF5D |
:10832000DBFF300EE66E050ECBD94FE1390EDB2AAE |
:10833000DBCFE9FF3A0E01E3DB2ADBCFEAFF090ED0 |
:10834000EFCFDBFFDB500EE044D9090EADD902E1DF |
:10835000011C3BE0390EDB2ADBCFE9FF3A0EEDE3EF |
:10836000DB2AEBD755D831E1160EDBCFE6FF080E3E |
:10837000C3D8E552E7245DD82ED0070EDB50030AA0 |
:108380001CE0010A14E0030A07E07BD9DBCFEEFF13 |
:10839000020EDBCFEDFF1FD0F5D8056A03AE02D089 |
:1083A000046805682CD8BCD805C0EEFF14D0EAD804 |
:1083B00003BE046824D8B4D80ED063D9DBCFEFFF56 |
:1083C0000AD07BD905E1011C03E1F368F46810D001 |
:1083D000FCD801E3DB2A79D98AEF3DF0010EDBCF2F |
:1083E00000F0020EDBCF01F000C0F3FF01C0F4FF8C |
:1083F0003B0EE15C02E2E16AE552E16ECBD029D9A5 |
:10840000020EF0EF42F061D90800F550DF6E120065 |
:10841000200EE66E080E60EF43F058EC55F0E55282 |
:10842000E552E552F3CF00F0F4CF01F00001F31C68 |
:108430001200006E016AD950010F4DD90050EE268E |
:108440000150ED221200045E000E055AF70E04C022 |
:10845000DBFFF80E05C0DBFF04C0E9FF05C0EAFF43 |
:108460001200DBCFF4FFF350F45C1200DB50E76E38 |
:10847000040EE7CFDBFF12000A0EDBCF00F00B0E7D |
:10848000DBCF01F00C0EDBCF02F00D0EDBCF03F0E3 |
:1084900000500110021003101200130EEECFDBFF8C |
:1084A000140EEDCFDBFF130EDBCF00F0140EDBCF8D |
:1084B00001F00001800E01141200F70EDBCF04F072 |
:1084C000F80EDBCF05F01200050EDB50E66ED9503A |
:1084D000130F01D9E552E750EE6EED6A12000A0E55 |
:1084E000DBCF1DF00B0EDBCF1EF00C0EDBCF1FF031 |
:1084F0000D0EDBCF20F01200DBCFE6FF150EDBCF39 |
:10850000E6FF050EDB50E552E724E552E7241200B2 |
:10851000DB50CED8010EF36E060EF3CFDBFF120058 |
:10852000EE50EFCFEAFFE96E02C0EEFF03C0EEFFB0 |
:1085300004C0EEFF1200D9CFE6FFDACFE6FFE1CFAD |
:10854000D9FFE2CFDAFF1200DFCFE6FFE66A23ECC5 |
:1085500056F0E552E552F3501200E76E080EE7CFF1 |
:10856000DBFF1200EECF00F0EECF01F0EFCF02F014 |
:10857000036A1200050EDBCF00F0150EDB50D88029 |
:1085800000541200010EDBCF02F0020EDBCF03F02D |
:10859000046A1200E552E5CFDAFFE7CFD9FF1200F7 |
:1085A0000A0E00C0DBFF0B0E01C0DBFF1200D9502A |
:1085B0000A0F6BEF43F0F36E070EF3CFDBFF1200F1 |
:1085C000EECF00F0EFCF01F01200010EDB2A020E19 |
:1085D0001200FC0EDBCFE6FFFD0EDBCFE6FF120044 |
:1085E000005E000E015AF70E00C0DBFFF80E01C05E |
:1085F000DBFF00C0E9FF01C0EAFF1200DA20EA6EEB |
:10860000EF2AEECFF6FF000EEF22EECFF7FFEF22BC |
:10861000EECFF8FF1200040EDBCFE6FF130EDB50A7 |
:10862000E552E75C9ADFDB5004DF060EDB501200F8 |
:10863000090EDB500A0DF350DF24D00FE76E090E50 |
:10864000E7CFDBFF03EF42F0DB50F36E050E31EFB7 |
:1086500042F0F70EDBCF00F0F80EDBCF01F0120096 |
:10866000DFCFE6FF0DEF42F028DF030EECDEB2EFC6 |
:1086700042F05FEC3DF0E552E552E552E55200096B |
:108680001200BDDEEE50EFCFEAFFE96E010E1200E0 |
:10869000130EDB50F36E040E31EF42F0040EDB508C |
:1086A000F36E090E31EF42F0DBCFE6FF0DEF42F043 |
:1086B000E76E050EE7CFDBFF12008BDF30EF43F0F4 |
:1086C000DBCFE6FF86DF39EF43F0D950F90FE96ED3 |
:1086D000FF0EFEEF42F0E96E000EDA20EA6E1200A5 |
:1086E0000001A06BA16BA26BA36BE56BE46BE66B67 |
:1086F000010EE76FE86BEB6BEC6BE96B230EEA6F37 |
:108700009D861200D9CFE6FFE1CFD9FF0001110EFF |
:10871000E66F94869488C76AC66AC56AF00EC61466 |
:108720000809C66EFE0EDB50016AE850011002E037 |
:10873000740E01D01A0EC86EC78EC68AE552E7CFF6 |
:10874000D9FF1200D9CFE6FFE1CFD9FFE652FD0EE7 |
:10875000DB50016AE850011036E0DF6ADF50006E3E |
:10876000016AFD0EDB50000101AE02D0D89003D0AB |
:10877000005C000E015819E2DF50E76EFB0EDBCF04 |
:10878000E9FFFC0EDBCFEAFFE750E926000EEA2204 |
:10879000EF50E66EDF50EA6A600FE96E000EEA22E3 |
:1087A000E552E750EF6EDF2AD9D7FD0EDB5000010E |
:1087B000A06FFE0EDB50E96FA26BA36B050EE76F97 |
:1087C000200EEA6FC580E552E552E7CFD9FF1200CF |
:1087D000D9CFE6FFE1CFD9FFFD0EDB50016AE850AB |
:1087E00001100EE0FD0EDB500001A06FFE0EDB500D |
:1087F000E96FA26BA36B050EE76F210EEA6FC580D0 |
:10880000E552E7CFD9FF1200D9CFE6FFE1CFD9FF7C |
:10881000E652FC0EDB50006E016AE850011012E1D6 |
:10882000FD0EDB50DF6ED9CFE6FFDACFE6FF010E9B |
:10883000E66EFE0EDB50E66E85DFE552E552E55250 |
:10884000E55211D0FD0EDB500001606FFC0EDB50D5 |
:10885000A06FFE0EDB50E96FA26BA36B050EE76FF6 |
:10886000220EEA6FC580E552E552E7CFD9FF12002C |
:10887000D9CFE6FFE1CFD9FF0001100EE66F948655 |
:108880009488FE0EDB50006E016AD89000360136E7 |
:108890000050C86EC76AC66AC56AF00EC6140E09D3 |
:1088A000C66EC78EC580C68AE552E7CFD9FF1200D3 |
:1088B0000001E651006E016A110E001804E101503A |
:1088C00002E16DEF44F0E651006E016A100E0018EF |
:1088D00003E1015001E188D912000001EA51006E64 |
:1088E000016A200E001853E1015051E1E751006E7A |
:1088F000016A070E001801E1015017E0050E00188B |
:1089000001E1015006E0010E001801E101503EE0D6 |
:108910001200070EE76FE951006E016AD890003629 |
:108920000136000E0010C96E1200C550400B01E068 |
:10893000010E006E016AE850011021E1A251006EA3 |
:10894000016AA051000101AE02D0D89003D0005CB2 |
:10895000000E01580BE20001A251EA6A600FE96EB5 |
:10896000000EEA22EF50C96EA22B12000001010E88 |
:10897000E76FC584230EEA6F300EE86F1200010E18 |
:10898000E76FC584230EEA6F310EE86F1200EA51DB |
:10899000006E016A210E001871E101506FE1E7518C |
:1089A000006E016A0B0E001801E101505FE00A0E33 |
:1089B000001801E1015056E0030E001801E10150DA |
:1089C0002DE0080E001801E1015017E0050E001817 |
:1089D00001E1015006E0010E001801E101504DE0F7 |
:1089E0001200080EE76FE951006E016AD890003658 |
:1089F0000136010E0010C96E1200C550400B01E097 |
:108A0000010E006E016AE85001102CE0010EE76FC4 |
:108A1000C584230EEA6F330EE86F1200C950E66E6C |
:108A2000A351EA6A600FE96E000EEA22E552E750B0 |
:108A3000EF6EA32BA351006E016AA051000101AE9D |
:108A400002D0D89003D0005C000E015805E200016E |
:108A50000A0EE76FC59A04D000010B0EE76FC58AB6 |
:108A6000C5881200030EE76FC5861200010EE76F7E |
:108A7000C584230EEA6F320EE86F1200EA51006ED1 |
:108A8000016A220E001801E0AED0015001E0ABD027 |
:108A9000E751006E016A0B0E001801E1015001E17F |
:108AA0009BD00A0E001801E1015001E191D0030EA4 |
:108AB000001801E1015068E0080E001801E10150C2 |
:108AC00052E0060E001801E1015041E0090E0018C5 |
:108AD00001E1015028E0070E001801E1015016E005 |
:108AE000050E001801E1015007E0010E001801E138 |
:108AF000015001E178D01200070EE76FE951006ED6 |
:108B0000016AD89000360136000E2AD0C550400BBD |
:108B100001E0010E006E016AE850011011E16051A0 |
:108B2000C96E090E0BD0C550400B01E0010E006E5E |
:108B3000016AE850011004E1C582060EE76F1200D9 |
:108B4000010EE76FC584230EEA6F310E1BD0080EAD |
:108B5000E76FE951006E016AD89000360136010EC8 |
:108B60000010C96E1200C550400B01E0010E006EEE |
:108B7000016AE85001102CE0010EE76FC584230E56 |
:108B8000EA6F330EE86F1200C950E66EA351EA6A2D |
:108B9000600FE96E000EEA22E552E750EF6EA32B5C |
:108BA000A351006E016AA051000101AE02D0D8901D |
:108BB00003D0005C000E015805E200010A0EE76FC9 |
:108BC000C59A04D000010B0EE76FC58AC588120054 |
:108BD000030EE76FC5861200010EE76FC584230EF2 |
:108BE000EA6F320EE86F1200D9CFE6FFE1CFD9FF6E |
:108BF000040EE126010EDB6A020EDB6A030EDB6A5D |
:108C0000C650400B01E0010E006E016A010E001813 |
:108C10000CE101500AE1C69C0001010EE76FF36E02 |
:108C2000030EF3CFDBFF360EE86FC750010B006E6B |
:108C3000016A010E001807E1015005E1C950DF6E1D |
:108C4000DE52010EDD6E030EDB50016AE8500110AA |
:108C500001E005D10001E751006E016A030E001822 |
:108C600001E1015001E17CD0040E001801E1015046 |
:108C700044E0020E001801E1015017E0010E001857 |
:108C800001E0EDD0015001E0EAD0C750080B01E04F |
:108C9000010E006E016A010E001801E0E0D00150E3 |
:108CA00001E0DDD0A16B020E98D0C750100B01E09F |
:108CB000010E006E016A010E001804E1015002E18C |
:108CC000010E8BD0010EDB50016AE850011001E16A |
:108CD000C6D0C750200B01E0010E016AE850011018 |
:108CE00001E0B9D0C750040B01E0010E016AE85061 |
:108CF000011001E0ADD0030E70D0EC51006E016A9E |
:108D0000005001100DE1EB51E66E49D9E552000922 |
:108D100024E00001A451C96E010EE56FEC6F18D07C |
:108D2000E551006E016AE451000101AE02D0D89015 |
:108D300003D0005C000E015810E20001E551EA6A20 |
:108D4000A40FE96E000EEA22EF50C96EE52B010E6A |
:108D5000F36E020EF3CFDBFF82D00001EC6B3CD050 |
:108D6000C750100B01E0010E006E016A010E0018E1 |
:108D700036E1015034E1010EDB50016AE850011088 |
:108D800029E0C750200B01E0010E006E016A010EC0 |
:108D900000181DE101501BE1DF50E66EA351EA6AA5 |
:108DA000600FE96E000EEA22E552E750EF6EA35124 |
:108DB000006E016A3F0E001804E1015002E1A36B4E |
:108DC00001D0A32BA12BDF50EB6F340E02D0010E8C |
:108DD000370EE86FA151A027010EE76F40D0010EBA |
:108DE000DB50016AE85001103AE0C750200B01E067 |
:108DF000010E006E016A010E00181DE101501BE119 |
:108E0000DF50E66EA351EA6A600FE96E000EEA22B7 |
:108E1000E552E750EF6EA351006E016A3F0E001855 |
:108E200004E1015002E1A36B01D0A32BA12BDF5081 |
:108E3000EB6F340E13D0C750040B01E0010E006E2F |
:108E4000016A010E001807E1015005E1A151A027B8 |
:108E5000040EE76F52D7010EE76F370EE86F010E71 |
:108E6000DB50036AE850031008E1020EDB50056A8C |
:108E7000E850051002E1000E01D0010E016AE85031 |
:108E8000011009E0C650100B01E0010E016AE85024 |
:108E9000011001E1C688040EE15C02E2E16AE552DC |
:108EA000E16EE552E7CFD9FF12000001E651006EF6 |
:108EB000016A110E00181BE1015019E1EA51026E1E |
:108EC000036A230E02180AE1035008E1A051046E60 |
:108ED000056A0450051002E0000E01D0010E006E7C |
:108EE000016AE850011001E0000CE8511200100E78 |
:108EF000E66FE85018E0E751026E036A010E0218AF |
:108F00000AE1035008E1A051046E056A04500510FF |
:108F100002E0000E01D0010E006E016AE85001105F |
:108F200001E0000CE85112000001A0511200D9CF5D |
:108F3000E6FFE1CFD9FFE652DF6A0001A051006EE3 |
:108F4000016A0050011025E0A251EA6A600FE96E43 |
:108F5000000EEA22EF50E66EDF50E76EFD0EDBCF2B |
:108F6000E9FFFE0EDBCFEAFFE750E926000EEA221A |
:108F7000E552E750EF6EDF2AA251006E016A3F0E04 |
:108F8000001804E1015002E1A26B01D0A22BA0075E |
:108F9000D4D7DF50E552E552E7CFD9FF1200D9CF41 |
:108FA000E6FFE1CFD9FFE652DF6AFE0EDB50006E2E |
:108FB000016ABB0E001801E101500BE0AA0E001877 |
:108FC00011E101500FE10001410EA46F010EE46FA9 |
:108FD00008D00001310EA46F320EA56F020EE46FAF |
:108FE000010EDF6EDF50E552E552E7CFD9FF1200E8 |
:108FF0000001700EED6F1200D9CFE6FFE1CFD9FF6F |
:10900000020EE126DE52210EDD6ED950010FE66E12 |
:10901000000EDA20E66E010EE66E0001ED51E66EFE |
:10902000A2EC43F0E552E552E552E55255EC47F02B |
:10903000DF6EDF50006E016AE8500110F7E0E66A6B |
:1090400048D8E5520F0EE66E0CD8E5529ED8020EB7 |
:10905000E15C02E2E16AE552E16EE552E7CFD9FF59 |
:109060001200D9CFE6FFE1CFD9FFE652FE0EDB506A |
:10907000006E016A01340AE200500F08000E01542C |
:1090800005E20F0EF36EFE0EF3CFDBFFFE0EDB8A62 |
:10909000DB8CDB8ED950FE0FE66EFF0EDA20E66E1B |
:1090A000010EE66E0001ED51E66EA2EC43F0E552D2 |
:1090B000E552E552E55255EC47F0DF6EDF50006EA9 |
:1090C000016AE8500110F7E0E552E552E7CFD9FF19 |
:1090D0001200D9CFE6FFE1CFD9FFE652FE0EDB50FA |
:1090E000006E016A013407E200500308000E0154CB |
:1090F00002E2FE0EDB6AFE0EDB50006E016AD890C3 |
:1091000000360136810E0010DF6ED9CFE6FFDACFD0 |
:10911000E6FF010EE66E0001ED51E66EA2EC43F0B3 |
:10912000E552E552E552E55255EC47F0DF6EDF506F |
:10913000006E016AE8500110F7E0E552E552E7CF12 |
:10914000D9FF1200D9CFE6FFE1CFD9FFE6520001E7 |
:10915000EE6BEE0EE66E000EE66E110EE66EED5153 |
:10916000E66EA2EC43F0E552E552E552E55255ECCD |
:1091700047F0DF6EDF50006E016AE8500110F7E043 |
:10918000E552E552E7CFD9FF1200D9CFE6FFE1CF94 |
:10919000D9FFE652DF6ADF50006E016AD8900150B5 |
:1091A00004E6110E005C000E015809E2DF50EA6A85 |
:1091B000EE0FE96E000EEA22EF6ADF2AECD7E552E5 |
:1091C000E552E7CFD9FF1200D9CFE6FFE1CFD9FFB3 |
:1091D000FE0EDB50016AE850011003E00001F36964 |
:1091E00002D00001F36BE552E7CFD9FF1200D9CFCF |
:1091F000E6FFE1CFD9FFFE0EDB50006E016A0134BD |
:1092000005E200500408000E015415E3FD0EDB508A |
:10921000E66EFE0EDB50E96EEA6AD890E936EA3671 |
:10922000010EE926000EEA22EE0EE926000EEA22E1 |
:10923000E552E750EF6EE552E7CFD9FF1200D9CFE4 |
:10924000E6FFE1CFD9FFFE0EDB50006E016A01346C |
:1092500005E200500408000E01542CE3FE0EDB5022 |
:10926000006E016A013407E200500108000E01544B |
:1092700002E2FE0EDB2AFD0EDB50EA6A850FE96E84 |
:109280000E0EEA22EFCF00F0016A00BE0168FC0E6C |
:10929000DB50026E036A070ED89002360336E804EC |
:1092A000FBE100500210E66EFE0EDB50E66E9FDF23 |
:1092B000E552E552E552E7CFD9FF1200D9CFE6FFDC |
:1092C000E1CFD9FFFE0EDB50006E016A013405E2EA |
:1092D00000500408000E01542CE3FE0EDB50006E1B |
:1092E000016A013407E200500108000E015402E255 |
:1092F000FE0EDB2AFD0EDB50EA6A8F0FE96E0E0EC2 |
:10930000EA22EFCF00F0016A00BE0168FC0EDB50DC |
:10931000026E036A070ED89002360336E804FBE1BA |
:1093200000500210E66EFE0EDB50E66E60DFE55286 |
:10933000E552E552E7CFD9FF1200D9CFE6FFE1CFE2 |
:10934000D9FFE66AFD0EDBCF00F0FE0EDBCF01F0A9 |
:10935000100E246E270E256E00C01FF001C020F0F5 |
:109360000DEC56F01BC000F01CC001F0E80E246E9E |
:10937000030E256E1BC01FF01CC020F00DEC56F034 |
:109380001FC000F020C001F01F50E66EE66A57DFF4 |
:10939000E552E552E552E66AFD0EDBCF00F0FE0E27 |
:1093A000DBCF01F0E80E246E030E256E00C01FF027 |
:1093B00001C020F00DEC56F01BC000F01CC001F005 |
:1093C000640E246E256A1BC01FF01CC020F00DEC3B |
:1093D00056F01FC000F020C001F01F50E66E010ED5 |
:1093E000E66E2DDFE552E552E552E66AFD0EDBCF73 |
:1093F00000F0FE0EDBCF01F0640E246E256A00C083 |
:109400001FF001C020F00DEC56F01BC000F01CC096 |
:1094100001F00A0E246E256A1BC01FF01CC020F04C |
:109420000DEC56F01FC000F020C001F01F50E66E9A |
:10943000020EE66E04DFE552E552E552E66AFD0EE5 |
:10944000DBCF00F0FE0EDBCF01F00A0E246E256AA2 |
:1094500000C01FF001C020F00DEC56F01BC000F062 |
:109460001CC001F01B50E66E030EE66EE8DEE5520E |
:10947000E552E552FD0EDBCF00F0FE0EDBCF01F032 |
:109480000A0E005C000E01580EE2E66AE66AAFDEE4 |
:10949000E552E552E66A010EE66EA9DEE552E552B6 |
:1094A000E66A030E12D0FD0EDBCF00F0FE0EDBCF1E |
:1094B00001F0640E005C000E015809E2E66AE66AFB |
:1094C00096DEE552E552E66A010EE66E0DD0FD0E1F |
:1094D000DBCF00F0FE0EDBCF01F0E80E005C030EE8 |
:1094E000015805E2E66AE66A82DEE552E5522ADEC6 |
:0894F000E552E7CFD9FF12009D |
:0894F80000000000003E5B4F84 |
:109500005B3E3E6B4F6B3E1C3E7C3E1C183C7E3CE3 |
:10951000181C577D571C1C5E7F5E1C00183C1800F1 |
:10952000FFE7C3E7FF0018241800FFE7DBE7FF3081 |
:10953000483A060E2629792926407F050507407FEF |
:1095400005253F5A3CE73C5A7F3E1C1C08081C1C62 |
:109550003E7F14227F22145F5F005F5F06097F0158 |
:109560007F006689956A606060606094A2FFA29443 |
:1095700008047E040810207E201008082A1C080811 |
:109580001C2A08081E101010100C1E0C1E0C30385F |
:109590003E3830060E3E0E06000000000000005F60 |
:1095A00000000007000700147F147F14242A7F2A7C |
:1095B000122313086462364956205000080703003E |
:1095C000001C2241000041221C002A1C7F1C2A088A |
:1095D000083E0808008070300008080808080000ED |
:1095E00060600020100804023E5149453E00427F61 |
:1095F000400072494949462141494D331814127FB0 |
:109600001027454545393C4A49493141211109074F |
:109610003649494936464949291E000014000000D0 |
:1096200040340000000814224114141414140041A2 |
:1096300022140802015909063E415D594E7C12115F |
:10964000127C7F494949363E414141227F41414197 |
:109650003E7F494949417F090909013E4141517312 |
:109660007F0808087F00417F41002040413F017F83 |
:10967000081422417F404040407F021C027F7F044B |
:1096800008107F3E4141413E7F090909063E415194 |
:10969000215E7F09192946264949493203017F0184 |
:1096A000033F4040403F1F2040201F3F4038403F85 |
:1096B000631408146303047804036159494D43009B |
:1096C0007F4141410204081020004141417F0402D2 |
:1096D0000102044040404040000307080020545469 |
:1096E00078407F2844443838444444283844442847 |
:1096F0007F385454541800087E090218A4A49C789A |
:109700007F0804047800447D40002040403D007FF5 |
:109710001028440000417F40007C047804787C08D5 |
:109720000404783844444438FC18242418182424A9 |
:1097300018FC7C08040408485454542404043F448E |
:10974000243C4040207C1C2040201C3C4030403CBD |
:1097500044281028444C9090907C4464544C44001D |
:109760000836410000007700000041360800020181 |
:109770000204023C2623263C1EA1A161123A40406D |
:10978000207A3854545559215555794121545478EB |
:1097900041215554784020545579400C1E52721284 |
:1097A000395555555939545454593955545458000C |
:1097B00000457C410002457D420001457C40F02986 |
:1097C0002429F0F0282528F07C54554500205454D5 |
:1097D0007C547C0A097F4932494949323248484819 |
:1097E00032324A4848303A4141217A3A4240207860 |
:1097F000009DA0A07D39444444393D4040403D3C5B |
:1098000024FF2424487E4943662B2FFC2F2BFF097D |
:1098100029F620C0887E0903205454794100004471 |
:109820007D413048484A32384040227A007A0A0A5C |
:10983000727D0D19317D2629292F282629292926CF |
:1098400030484D4020380808080808080808382F14 |
:1098500010C8ACBA2F102834FA00007B000008149E |
:109860002A142222142A1408AA005500AAAA55AACA |
:1098700055AA000000FF00101010FF00141414FF80 |
:10988000001010FF00FF1010F010F0141414FC0072 |
:109890001414F700FF0000FF00FF1414F404FC147C |
:1098A0001417101F10101F101F1414141F00101075 |
:1098B00010F0000000001F101010101F10101010EA |
:1098C000F010000000FF101010101010101010FF0A |
:1098D00010000000FF140000FF00FF00001F101721 |
:1098E0000000FC04F414141710171414F404F4000A |
:1098F00000FF00F714141414141414F700F71414D0 |
:1099000014171410101F101F141414F4141010F056 |
:1099100010F000001F101F0000001F14000000FCCA |
:10992000140000F010F01010FF10FF141414FF14B6 |
:109930001010101F00000000F010FFFFFFFFFFF0ED |
:10994000F0F0F0F0FFFFFF0000000000FFFF0F0F3E |
:109950000F0F0F38444438447C2A2A3E147E0202FA |
:109960000606027E027E0263554941633844443C48 |
:1099700004407E201E2006027E020299A5E7A599DA |
:109980001C2A492A1C4C7201724C304A4D4D303011 |
:1099900048784830BC625A463D3E494949007E01FC |
:1099A00001017E2A2A2A2A2A44445F444440514A1B |
:1099B000444040444A51400000FF0103E080FF0062 |
:1099C0000008086B6B083612362436060F090F069E |
:1099D000000018180000001010003040FF010100C6 |
:1099E0001F01011E00191D1712003C3C3C3C0000E9 |
:0399F00000000074 |
:0D99F30000000000003E5B4F5B3E3E6B4FEE |
:109A00006B3E1C3E7C3E1C183C7E3C181C577D5710 |
:109A10001C1C5E7F5E1C00183C1800FFE7C3E7FFBC |
:109A20000018241800FFE7DBE7FF30483A060E264F |
:109A300029792926407F050507407F05253F5A3CA7 |
:109A4000E73C5A7F3E1C1C08081C1C3E7F14227FEA |
:109A500022145F5F005F5F06097F017F00668995C2 |
:109A60006A606060606094A2FFA29408047E0408AB |
:109A700010207E201008082A1C08081C2A08081E2E |
:109A8000101010100C1E0C1E0C30383E3830060E14 |
:109A90003E0E06000000000000005F00000007000E |
:109AA0000700147F147F14242A7F2A1223130864CA |
:109AB0006236495620500008070300001C2241006E |
:109AC0000041221C002A1C7F1C2A08083E080800AE |
:109AD000807030000808080808000060600020104E |
:109AE0000804023E5149453E00427F400072494908 |
:109AF00049462141494D331814127F1027454545E9 |
:109B0000393C4A4949314121110907364949493609 |
:109B1000464949291E00001400000040340000009E |
:109B200008142241141414141400412214080201D0 |
:109B30005909063E415D594E7C1211127C7F4949FC |
:109B400049363E414141227F4141413E7F49494999 |
:109B5000417F090909013E414151737F0808087F8F |
:109B600000417F41002040413F017F081422417F96 |
:109B7000404040407F021C027F7F0408107F3E412E |
:109B800041413E7F090909063E4151215E7F091985 |
:109B90002946264949493203017F01033F4040409D |
:109BA0003F1F2040201F3F4038403F63140814638C |
:109BB00003047804036159494D43007F4141410248 |
:109BC00004081020004141417F040201020440408A |
:109BD000404040000307080020545478407F284448 |
:109BE00044383844444428384444287F3854545432 |
:109BF0001800087E090218A4A49C787F0804047841 |
:109C000000447D40002040403D007F10284400007B |
:109C1000417F40007C047804787C08040478384450 |
:109C2000444438FC1824241818242418FC7C080404 |
:109C30000408485454542404043F44243C40402025 |
:109C40007C1C2040201C3C4030403C4428102844D0 |
:109C50004C9090907C4464544C4400083641000081 |
:109C600000770000004136080002010204023C2691 |
:109C700023263C1EA1A161123A4040207A38545458 |
:109C800055592155557941215454784121555478DD |
:109C90004020545579400C1E527212395555555971 |
:109CA000395454545939555454580000457C410096 |
:109CB00002457D420001457C40F0292429F0F0282E |
:109CC0002528F07C545545002054547C547C0A09C6 |
:109CD0007F4932494949323248484832324A484835 |
:109CE000303A4141217A3A42402078009DA0A07D3F |
:109CF00039444444393D4040403D3C24FF242448FD |
:109D00007E4943662B2FFC2F2BFF0929F620C088A4 |
:109D10007E090320545479410000447D4130484875 |
:109D20004A32384040227A007A0A0A727D0D19318F |
:109D30007D2629292F28262929292630484D4020EB |
:109D4000380808080808080808382F10C8ACBA2FC7 |
:109D5000102834FA00007B000008142A1422221470 |
:109D60002A1408AA005500AAAA55AA55AA0000005C |
:109D7000FF00101010FF00141414FF001010FF005B |
:109D8000FF1010F010F0141414FC001414F700FF6E |
:109D90000000FF00FF1414F404FC141417101F102B |
:109DA000101F101F1414141F00101010F0000000DA |
:109DB000001F101010101F10101010F010000000E5 |
:109DC000FF101010101010101010FF10000000FFF6 |
:109DD000140000FF00FF00001F10170000FC04F437 |
:109DE00014141710171414F404F40000FF00F714EF |
:109DF000141414141414F700F71414141714101076 |
:109E00001F101F141414F4141010F010F000001F91 |
:109E1000101F0000001F14000000FC140000F010D0 |
:109E2000F01010FF10FF141414FF141010101F0076 |
:109E3000000000F010FFFFFFFFFFF0F0F0F0F0FF78 |
:109E4000FFFF0000000000FFFF0F0F0F0F0F38444F |
:109E50004438447C2A2A3E147E02020606027E0210 |
:109E60007E0263554941633844443C04407E201ED1 |
:109E70002006027E020299A5E7A5991C2A492A1C00 |
:109E80004C7201724C304A4D4D303048784830BCED |
:109E9000625A463D3E494949007E0101017E2A2A17 |
:109EA0002A2A2A44445F444440514A444040444A98 |
:109EB00051400000FF0103E080FF000008086B6BC9 |
:109EC000083612362436060F090F0600001818004F |
:109ED00000001010003040FF0101001F01011E00B2 |
:0E9EE000191D1712003C3C3C3C000000000025 |
:029EEE00D9CFCA |
:109EF000E6FFE1CFD9FF0E01070EFD6F0B0EC76F16 |
:109F00000A0EC56F93989394939E8A8E939C8A8C25 |
:109F1000939A8A9A739E739CFE0EDB50006E016AC0 |
:109F2000040E001806E1015004E1F00E721400095D |
:109F30001DD0FE0EDB50006E016A030E001806E114 |
:109F4000015004E1F00E72140A0910D0FE0EDB502D |
:109F5000006E016A020E001806E1015004E1F00EE5 |
:109F60007214010903D0F00E72140209726E728825 |
:109F7000728AA39E0E01426B406B416B836B846BB4 |
:109F8000E552E7CFD9FF1200D9CFE6FFE1CFD9FFE5 |
:109F9000E6527350010B016AE85001103CE00E01DB |
:109FA0004251006E016A3F0E001805E1015003E1C5 |
:109FB0007550DF6E30D07550E66E4151EA6A000F81 |
:109FC000E96E0E0EEA22E552E750EF6E4151006E47 |
:109FD000016A3F0E001804E1015002E1416B01D01B |
:109FE000412B422B8351006E016A8451026E036A39 |
:109FF0000250001802E1035001180AE08351EA6A96 |
:10A00000430FE96E0E0EEA22EF50756E832B03D0DC |
:10A010008A84836B846BE552E552E7CFD9FF120047 |
:10A02000D9CFE6FFE1CFD9FF030EE126DE6ADD6A74 |
:10A03000020EDB6A8A9EFB0EDB50DF1804E1FC0E89 |
:10A04000DB50DE52DD181EE0FD0EDBCF00F0FE0E11 |
:10A05000DBCF01F0DE500024E96EDD500120EA6E16 |
:10A06000EF50756EDF2A010E01E3DB2A7350010BFE |
:10A07000016AE8500110FAE07550E76E020EE7CF72 |
:10A08000DBFFD9D78A8E030EE15C02E2E16AE5527A |
:10A09000E16EE552E7CFD9FF1200D9CFE6FFE1CF5D |
:10A0A000D9FF030EE126DE6ADD6A020EDB6A8A9EB4 |
:10A0B000FC0EDB50DF1804E1FD0EDB50DE52DD1834 |
:10A0C00013E0FE0EDB50756EDF2A010E01E3DB2A82 |
:10A0D0007350010B016AE8500110FAE07550E76E09 |
:10A0E000020EE7CFDBFFE4D78A8E030EE15C02E2CB |
:10A0F000E16AE552E16EE552E7CFD9FF1200D9CF10 |
:10A10000E6FFE1CFD9FFE652DF6A8A9EDF6ADF50C1 |
:10A11000006E016AFE0EDB50000101AE02D0D89045 |
:10A1200003D0005C000E015821E2756A7350010BE8 |
:10A13000016AE8500110FAE07550E66E0E014151D7 |
:10A14000EA6A000FE96E0E0EEA22E552E750EF6E62 |
:10A150004151006E016A3F0E001804E1015002E116 |
:10A16000416B01D0412B422BDF2AD1D78A8EE55299 |
:10A17000E552E7CFD9FF12000E0142511200D9CFAC |
:10A18000E6FFE1CFD9FFE652DF6A0E014251006ED1 |
:10A19000016A0050011025E04051EA6A000FE96EA3 |
:10A1A0000E0EEA22EF50E66EDF50E76EFD0EDBCFBB |
:10A1B000E9FFFE0EDBCFEAFFE750E926000EEA22B8 |
:10A1C000E552E750EF6EDF2A4051006E016A3F0E04 |
:10A1D000001804E1015002E1406B01D0402B42071E |
:0EA1E000D4D7DF50E552E552E7CFD9FF120089 |
:02A1EE00949C3F |
:10A1F000948E7E96190EB06EAD84AD98AC8EAD9CEB |
:10A20000AC9CAC88AD9A9D889D8A0901806B816B5E |
:10A21000826B836B1200D9CFE6FFE1CFD9FFE65204 |
:10A220009E50200B01E0010E016AE85001103CE055 |
:10A23000AF50DF6EDF50E66E09018151EA6A000F10 |
:10A24000E96E090EEA22E552E750EF6E8151006E89 |
:10A25000016A7F0E001804E1015002E1816B01D018 |
:10A26000812B8351006E016AD890015004E6800E64 |
:10A27000005C000E015802E2832B0BD08051006E6F |
:10A28000016A7F0E001804E1015002E1806B01D0E9 |
:10A29000802BDF50006E016A0D0E001805E10150A1 |
:10A2A00003E18351826F836BAC50020B01E0010E1E |
:10A2B000006E016A010E001805E1015003E1AC983F |
:10A2C000AC88AD9AE552E552E7CFD9FF12000A01FA |
:10A2D0000451006E016A0551026E036A02500018B3 |
:10A2E00002E1035001180AE00451EA6A840FE96EA2 |
:10A2F000090EEA22EF50AE6E042B1200AD50020B95 |
:10A3000001E0010E006E016AE8500110F7E0AD9A1D |
:10A310000A01046B056B1200D9CFE6FFE1CFD9FF2C |
:10A32000020EE126AD50200B01E0010E016AE8505B |
:10A330000110F8E1D950FC0F006EFF0EDA20016E1B |
:10A3400000C0DEFFDD6EDECFE6FFDDCFE6FFFC0EF8 |
:10A35000DBCFE6FFFD0EDBCFE6FFFE0EDBCFE6FF39 |
:10A36000840EE66E090EE66E14EC55F0006E070ED4 |
:10A37000E15E0050840EE66E090EE66E84EC53F04A |
:10A38000E552E552F3CF05FA0A01010E046F84513C |
:10A39000AE6EAD8A020EE15C02E2E16AE552E16E68 |
:10A3A000E552E7CFD9FF1200D9CFE6FFE1CFD9FFC1 |
:10A3B000E652AD50200B01E0010E016AE850011099 |
:10A3C000F8E1FC0EDB500A01056F010E046FDF6A35 |
:10A3D000DF50006E016AFC0EDB50000101AE02D0BE |
:10A3E000D89003D0005C000E015819E2DF50E76EF0 |
:10A3F000FD0EDBCFE9FFFE0EDBCFEAFFE750E926DB |
:10A40000000EEA22EFCF00F0016ADF50EA6A840F03 |
:10A41000E96E090EEA2200C0EFFFDF2AD9D7090151 |
:10A420008451AE6EAD8AE552E552E7CFD9FF1200F6 |
:10A43000090182511200D9CFE6FFE1CFD9FFE652E0 |
:10A44000DF6A09018251006E016A0050011025E0A7 |
:10A450008051EA6A000FE96E090EEA22EF50E66EBB |
:10A46000DF50E76EFD0EDBCFE9FFFE0EDBCFEAFF2C |
:10A47000E750E926000EEA22E552E750EF6EDF2AA8 |
:10A480008051006E016A7F0E001804E1015002E164 |
:10A49000806B01D0802B8207D4D7DF50E552E55284 |
:06A4A000E7CFD9FF120016 |
:0AA4A6009F8A9F889F86A58E1200F2 |
:10A4B000D08EF28EF28C1200F250800B01E0010E71 |
:10A4C000036AE850031002E0000E01D0010E016A99 |
:10A4D000F36E01C0F4FF1200F250400B01E0010ED8 |
:10A4E000036AE850031002E0000E01D0010E016A79 |
:10A4F000F36E01C0F4FF1200F250400B01E0010EB8 |
:10A50000006E016A010E001802E1015004E0D4DF80 |
:10A51000F350F41002E0F36A02D0010EF36EF46A15 |
:10A520001200EADFF3CF02F0F4CF03F0F350F4109F |
:10A5300004E1C2DFF350F41002E0000E01D0010E7E |
:10A54000016AE850011003E0010EF36E01D0F36AD6 |
:10A55000F46A1200DACFE4FFE2CFDAFFE9CFE4FFDA |
:10A56000EACFE4FFF6CFE4FFF7CFE4FFF8CFE4FF54 |
:10A57000F5CFE4FFF3CFE4FFF4CFE4FFFACFE4FF3D |
:10A58000FBCFE4FF00EE17F0140EE80403E3EECF78 |
:10A59000E4FFFBD700EE00F0170EE80403E3EECF74 |
:10A5A000E4FFFBD7E652A450800B01E0010E2B6EB6 |
:10A5B0002C6AE8502C1004E0C4EC4FF0A49E26D086 |
:10A5C0009E50080B01E0010E2B6E2C6AE8502C10F7 |
:10A5D00004E058EC44F09E9619D09E50200B01E008 |
:10A5E000010E2B6E2C6AE8502C1004E00BEC51F09D |
:10A5F0009E9A0CD09E50100B01E0010E2B6E2C6A1F |
:10A60000E8502C1003E067EC51F09E98E55200EE04 |
:10A6100016F0170EE80403E3E5CFEDFFFBD700EEDD |
:10A620002AF0140EE80403E3E5CFEDFFFBD7E5CFF6 |
:10A63000FBFFE5CFFAFFE5CFF4FFE5CFF3FFE5CF72 |
:10A64000F5FFE5CFF8FFE5CFF7FFE5CFF6FFE5CF64 |
:10A65000EAFFE5CFE9FFE5CFDAFF1100D8CFE4FF4D |
:10A66000E0CFE4FFE46EDACFE4FFE652E552E5CF57 |
:0EA67000DAFFE550E5CFE0FFE5CFD8FF1000A0 |
:02A67E00D9CF32 |
:10A68000E6FFDACFE6FFFA0EE3CFD9FFFB0EE3CF0A |
:10A69000DAFFFC0EE3CFE9FFFD0EE3CFEAFFE9CFDF |
:10A6A000F3FFEACFF4FFF80EE35003E1F90EE350B5 |
:10A6B00008E0F80EE30602E2F90EE306DECFEEFF55 |
:10A6C000F2D7FF0EE3CFDAFFE552FF0EE3CFD9FF5B |
:10A6D000E5521200FE0EE3CFE9FFFF0EE3CFEAFFE3 |
:10A6E000E9CFF3FFEACFF4FFFB0EE35003E1FC0EEA |
:10A6F000E35009E0FB0EE30602E2FC0EE306FD0E6A |
:10A70000E350EE6EF1D71200FE0EE3CFE9FFFF0E2D |
:10A71000E3CFEAFFF36AF46AEE5203E0F34AF42A65 |
:10A72000FBD71200D9CFE6FFDACFE6FFFA0EE3CF70 |
:10A73000D9FFFB0EE3CFDAFFFC0EE3CFE9FFFD0EFE |
:10A74000E3CFEAFFF80EE35003E1F90EE3500AE02D |
:10A75000F80EE30602E2F90EE306DE50EF5C02E1DA |
:10A76000EE66F0D7F36EFF0EE3CFDAFFE552FF0E91 |
:10A77000E3CFD9FFE552F3501200FF0EE3CFF8FF0D |
:10A78000E552FF0EE3CFF7FFE552FF0EE3CFF6FFF2 |
:10A79000E552E66AE66AE66A0900F55209E0FD0E4E |
:10A7A000E32A05E1FE0EE32A02E1FF0EE32AF4D7D5 |
:10A7B000FD0EE3CF1EF0FE0EE3CF1FF0FF0EE3CF42 |
:04A7C00020F0120073 |
:0CA7C400D9CFE6FFE1CFD9FF3F0EE12620 |
:10A7D000DF6A010EDB6A020EDB6A8F0ED31470098A |
:10A7E000D36EFC0ED3140009D36E0F0148691F0EFF |
:10A7F000496FF7EC50F0030EE66E77EC4FF0E55240 |
:10A800009AEC15F0A7EC15F058EC52F053EC52F01E |
:10A810003C0EE66EE66AE66AD950030FE66E000E5D |
:10A82000DA20E66E6AEC53F0006E050EE15E005031 |
:10A8300001EC02F0030EE66E50EC15F0E552D95033 |
:10A84000030FE66E000EDA20E66E1BEC52F0E552C6 |
:10A85000E552E76E020EE7CFDBFFDB50006E016AC8 |
:10A86000E8500110ECE0D950030F006EDACF01F090 |
:10A87000020EDB500F010024E96E000EDA20EA6EB2 |
:10A88000EF6AD950030FE66E000EDA20E66E0E0E68 |
:10A89000E66E000EE66E000EE66EF9EC13F0006E4A |
:08A8A000050EE15E0050CBD76C |
:08A8A800176A25AE5DEF54F0C4 |
:10A8B000246C251EE86A2522171E20AE65EF54F091 |
:10A8C0001F6C201EE86A2022171E0DEC56F020BED9 |
:10A8D00075EF54F017AE000C1F6C201EE86A2022A2 |
:10A8E0001B6C1C1EE86A1C22000C17BE6CEF54F097 |
:10A8F0001888FF0C20C02AF01FC029F01F50240226 |
:10A90000F4CF1EF0F3CF1DF020502502F4CF20F03D |
:10A91000F3CF1FF02402F3501E26F4501F22E86AE2 |
:10A92000202229502502F3501E26F4501F22E86AE7 |
:10A93000202225AEA0EF54F029501F5E2A50205A45 |
:10A940002AAE000C24501F5E2550205A000C1FC058 |
:10A9500029F01F502402F4CF1EF0F3CF1DF0205039 |
:10A960002502F4CF20F0F3CF1FF02402F3501E266F |
:10A97000F4501F22E86A202229502502F3501E2697 |
:0AA98000F4501F22E86A2022000CA8 |
:06A98A001E0EF66E000E29 |
:10A99000F76E000EF86E01010900F550F96F09001D |
:10A9A000F550FA6F03E1F96701D03DD00900F55089 |
:10A9B000F46F0900F550F56F0900F550F66F0900C6 |
:10A9C0000900F550E96E0900F550EA6E090009002A |
:10A9D0000900F550F76F0900F550F86F09000900FC |
:10A9E000F6CFFBF1F7CFFCF1F8CFFDF1F4C1F6FFA4 |
:10A9F000F5C1F7FFF6C1F8FF0101F75302E1F85383 |
:10AA000007E00900F550EE6EF707F8E2F807F9D70E |
:10AA1000FBC1F6FFFCC1F7FFFDC1F8FF0101F9071B |
:08AA2000000EFA5BBFD7120023 |
:08AA2800D9CFE6FFDACFE6FF0B |
:10AA3000E1CFD9FFE2CFDAFFE652E652F70EDBCFE5 |
:10AA4000E6FFF80EDBCFE6FFF90EDBCFE6FFFA0EEE |
:10AA5000DBCFE6FFFB0EDBCFE6FFD950FC0FE66E47 |
:10AA6000FF0EDA20E66E75EC3DF0006E070EE15C3D |
:10AA700002E2E16AE552E16E0050F3CFDEFFF4CF6F |
:10AA8000DDFFFC0EDBCFE9FFFD0EDBCFEAFFEF6A57 |
:10AA9000DECF00F0DDCF01F000C0F3FF01C0F4FF16 |
:10AAA000E552E552E552E5CFDAFFE7CFD9FF1200D4 |
:10AAB000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF69 |
:10AAC000FB0EDBCF00F0FC0EDBCF01F00001800EAF |
:10AAD00001141AE1FB0EDBCFE9FFFC0EDBCFEAFF2E |
:10AAE000EECFF3FFEDCFF4FFEE2A000EEF22F3CF0F |
:10AAF000E9FFF4CFEAFFFD0EDBCFEFFFEF50016A75 |
:10AB0000F36E01C0F4FF10D0FB0EDB50FE0806E12F |
:10AB1000FD0EDBCFE6FF63EC56F005D0FD0EDBCF7C |
:10AB2000E6FF03EC00F0E552E552E5CFDAFFE7CFB0 |
:04AB3000D9FF120037 |
:0CAB34001D502202F3CF19F0F4CF1AF0EC |
:10AB40002302F3501A26000EF4201B6E1D5024021F |
:10AB5000F3501B26000EF4201C6E1D502502F350EE |
:10AB60001C261E502202F3501A26F4501B22000EFF |
:10AB70001C221E502302F3501B26F4501C221E5090 |
:10AB80002402F3501C261F502202F3501B26F450BF |
:10AB90001C221F502302F3501C2620502202F35087 |
:04ABA0001C2612005D |
:0CABA4001C6A1B6A1A6A196A200EE76E10 |
:10ABB000D8901D361E361F36203619361A361B36EB |
:10ABC0001C362250195C23501A5824501B5825500B |
:10ABD0001C5809E32250195E23501A5A24501B5A5C |
:0CABE00025501C5A1D2AE72EE4D7120055 |
:04ABEC00FF0EE35025 |
:10ABF0002E6EEF0E01D0F30EE76EE72EFDEF55F04F |
:10AC00000C0E2D6EE76AE72E03EF56F02D2E02EFA5 |
:0AAC100056F02E2EFBEF55F0120057 |
:06AC1A001C6A1B6A100E0B |
:10AC2000E76ED8901F3620361B361C3624501B5C2E |
:10AC300025501C5805E324501B5E25501C5A1F2A22 |
:06AC4000E72EF0D7120020 |
:0AAC4600F36AF46AFF0EE124E96EE0 |
:10AC5000FF0EE220EA6EED6607D02F0EEF6404D0FF |
:0AAC60003A0EEF6001D0F32A120053 |
:06AC6A00FF0EE3502E6E08 |
:10AC7000480E01D04C0EE76EE72EFED7E76AE72EAE |
:0AAC8000FED72E2EF7D700001200B9 |
:06AC8A00B00EF36E00EEB7 |
:10AC900000F00E0E01D81200EA6002D0EE6AFCD776 |
:0AACA000F350E9601200EE6AFCD7E1 |
:06ACAA001DEE00F02DEE8E |
:10ACB00000F0F86A189CC5EC54F009EC00F0E2ECE6 |
:06ACC00053F0FBD7120067 |
:0AACC600FF0EE350ADBA04D0B06AEF |
:10ACD000AC8EAD8A949CADA2FED7AE6EF36EF46AD4 |
:02ACE000120060 |
:0EACE200FF0EE350E84E1200000000D000D03C |
:08ACF00000D0E82EFAD7120093 |
:08ACF800F36AF46AF32A0F0B62 |
:0EAD000005E0D890F336F436E804FBE11200CB |
:02AD0E003031E2 |
:0FAD100032333435363738396162636465660033 |
:01AD1F000132 |
:0EAD20000000FF06FAD503010000FF00FF004F |
:02AD2E003F06DE |
:0EAD30005B4F666D7D077F6F777C395E7971B2 |
:020000040001F9 |
:01FFF800AA5E |
:01FFFA00FD09 |
:01FFFD00FB08 |
:00000001FF |
/PIC Stuff/PIC_27J13/i2c.c |
---|
0,0 → 1,553 |
#include "maindefs.h" |
#include "i2c.h" |
static I2C_DATA i2c_data; |
// Set up the data structures for the i2c code |
// Should be called once before any i2c routines are called |
void I2C_Init() { |
i2c_data.buffer_in_len = 0; |
i2c_data.buffer_in_len_tmp = 0; |
i2c_data.buffer_in_read_ind = 0; |
i2c_data.buffer_in_write_ind = 0; |
i2c_data.buffer_out_ind = 0; |
i2c_data.buffer_out_len = 0; |
i2c_data.operating_mode = 0; |
i2c_data.operating_state = I2C_IDLE; |
i2c_data.return_status = 0; |
i2c_data.slave_in_last_byte = 0; |
i2c_data.slave_sending_data = 0; |
i2c_data.master_dest_addr = 0; |
i2c_data.master_status = I2C_MASTER_IDLE; |
// Enable I2C interrupt |
PIE1bits.SSPIE = 1; |
} |
// Setup the PIC to operate as a master. |
void I2C_Configure_Master(unsigned char speed) { |
i2c_data.operating_mode = I2C_MODE_MASTER; |
TRISCbits.TRISC3 = 1; |
TRISCbits.TRISC4 = 1; |
SSPSTAT = 0x0; |
SSPCON1 = 0x0; |
SSPCON2 = 0x0; |
SSPCON1bits.SSPM = 0x8; // I2C Master Mode |
if (speed) { |
SSPADD = 0x74; // Operate at 100KHz (48MHz) |
} else { |
SSPADD = 0x1A; // Operate at 400KHz (48MHz) |
} |
SSPSTATbits.SMP = 1; // Disable Slew Rate Control |
SSPCON1bits.SSPEN = 1; // Enable MSSP Module |
} |
// Sends length number of bytes in msg to specified address (no R/W bit) |
void I2C_Master_Send(unsigned char address, unsigned char length, unsigned char *msg) { |
unsigned char i; |
if (length == 0) |
return; |
// Copy message to send into buffer and save length/address |
for (i = 0; i < length; i++) { |
i2c_data.buffer_in[i] = msg[i]; |
} |
i2c_data.buffer_in_len = length; |
i2c_data.master_dest_addr = address; |
i2c_data.buffer_in_read_ind = 0; |
i2c_data.buffer_in_write_ind = 0; |
// Change status to 'next' operation |
i2c_data.operating_state = I2C_SEND_ADDR; |
i2c_data.master_status = I2C_MASTER_SEND; |
// Generate start condition |
SSPCON2bits.SEN = 1; |
} |
// Reads length number of bytes from address (no R/W bit) |
void I2C_Master_Recv(unsigned char address, unsigned char length) { |
if (length == 0) |
return; |
// Save length and address to get data from |
i2c_data.buffer_in_len = length; |
i2c_data.master_dest_addr = address; |
i2c_data.buffer_in_read_ind = 0; |
i2c_data.buffer_in_write_ind = 0; |
// Change status to 'next' operation |
i2c_data.operating_state = I2C_SEND_ADDR; |
i2c_data.master_status = I2C_MASTER_RECV; |
// Generate start condition |
SSPCON2bits.SEN = 1; |
} |
// Writes msg to address then reads length number of bytes from address |
void I2C_Master_Restart(unsigned char address, unsigned char msg, unsigned char length) { |
unsigned char c; |
if (length == 0) { |
c = msg; |
I2C_Master_Send(address, 1, &c); |
return; |
} |
// Save length and address to get data from |
i2c_data.buffer_in[0] = msg; |
i2c_data.buffer_in_len = length; |
i2c_data.master_dest_addr = address; |
i2c_data.buffer_in_read_ind = 0; |
i2c_data.buffer_in_write_ind = 0; |
// Change status to 'next' operation |
i2c_data.operating_state = I2C_SEND_ADDR; |
i2c_data.master_status = I2C_MASTER_RESTART; |
// Generate start condition |
SSPCON2bits.SEN = 1; |
} |
// Setup the PIC to operate as a slave. The address must not include the R/W bit |
void I2C_Configure_Slave(unsigned char addr) { |
i2c_data.operating_mode = I2C_MODE_SLAVE; |
// Ensure the two lines are set for input (we are a slave) |
TRISCbits.TRISC3 = 1; |
TRISCbits.TRISC4 = 1; |
SSPADD = addr << 1; // Set the slave address |
SSPSTAT = 0x0; |
SSPCON1 = 0x0; |
SSPCON2 = 0x0; |
SSPCON1bits.SSPM = 0xE; // Enable Slave 7-bit w/ start/stop interrupts |
SSPSTATbits.SMP = 1; // Slew Off |
SSPCON2bits.SEN = 1; // Enable clock-stretching |
SSPCON1bits.SSPEN = 1; // Enable MSSP Module |
} |
void I2C_Interrupt_Handler() { |
// Call interrupt depending on which mode we are operating in |
if (i2c_data.operating_mode == I2C_MODE_MASTER) { |
I2C_Interrupt_Master(); |
} else if (i2c_data.operating_mode == I2C_MODE_SLAVE) { |
I2C_Interrupt_Slave(); |
} |
} |
// An internal subroutine used in the master version of the i2c_interrupt_handler |
void I2C_Interrupt_Master() { |
// If we are in the middle of sending data |
if (i2c_data.master_status == I2C_MASTER_SEND) { |
switch (i2c_data.operating_state) { |
case I2C_IDLE: |
break; |
case I2C_SEND_ADDR: |
// Send the address with read bit set |
i2c_data.operating_state = I2C_CHECK_ACK_SEND; |
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x0; |
break; |
case I2C_CHECK_ACK_SEND: |
// Check if ACK is received or not |
if (!SSPCON2bits.ACKSTAT) { |
// If an ACK is received, send next byte of data |
if (i2c_data.buffer_in_read_ind < i2c_data.buffer_in_len) { |
SSPBUF = i2c_data.buffer_in[i2c_data.buffer_in_read_ind]; |
i2c_data.buffer_in_read_ind++; |
} else { |
// If no more data is to be sent, send stop bit |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_SEND_OK; |
} |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_SEND_FAIL; |
} |
break; |
} |
// If we are in the middle of receiving data |
} else if (i2c_data.master_status == I2C_MASTER_RECV) { |
switch (i2c_data.operating_state) { |
case I2C_IDLE: |
break; |
case I2C_SEND_ADDR: |
// Send address with write bit set |
i2c_data.operating_state = I2C_CHECK_ACK_RECV; |
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x1; |
break; |
case I2C_CHECK_ACK_RECV: |
// Check if ACK is received |
if (!SSPCON2bits.ACKSTAT) { |
// If an ACK is received, set module to receive 1 byte of data |
i2c_data.operating_state = I2C_RCV_DATA; |
SSPCON2bits.RCEN = 1; |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_RECV_FAIL; |
} |
break; |
case I2C_RCV_DATA: |
// On receive, save byte into buffer |
// TODO: handle i2c buffer overflow |
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = SSPBUF; |
i2c_data.buffer_in_write_ind++; |
if (i2c_data.buffer_in_write_ind < i2c_data.buffer_in_len) { |
// If we still need to read, send an ACK to the slave |
i2c_data.operating_state = I2C_REQ_DATA; |
SSPCON2bits.ACKDT = 0; // ACK |
SSPCON2bits.ACKEN = 1; |
} else { |
// If we are done reading, send an NACK to the slave |
i2c_data.operating_state = I2C_SEND_STOP; |
SSPCON2bits.ACKDT = 1; // NACK |
SSPCON2bits.ACKEN = 1; |
} |
break; |
case I2C_REQ_DATA: |
// Set module to receive one byte of data |
i2c_data.operating_state = I2C_RCV_DATA; |
SSPCON2bits.RCEN = 1; |
break; |
case I2C_SEND_STOP: |
// Send the stop bit and copy message to send to Main() |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_RECV_OK; |
break; |
} |
} else if (i2c_data.master_status == I2C_MASTER_RESTART) { |
switch (i2c_data.operating_state) { |
case I2C_IDLE: |
break; |
case I2C_SEND_ADDR: |
// Send the address with read bit set |
i2c_data.operating_state = I2C_CHECK_ACK_SEND; |
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x0; |
break; |
case I2C_CHECK_ACK_SEND: |
// Check if ACK is received or not |
if (!SSPCON2bits.ACKSTAT) { |
// If an ACK is received, send first byte of data |
SSPBUF = i2c_data.buffer_in[0]; |
i2c_data.operating_state = I2C_CHECK_ACK_RESTART; |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_SEND_FAIL; |
} |
break; |
case I2C_CHECK_ACK_RESTART: |
if (!SSPCON2bits.ACKSTAT) { |
SSPCON2bits.RSEN = 1; |
i2c_data.operating_state = I2C_SEND_ADDR_2; |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_SEND_FAIL; |
} |
break; |
case I2C_SEND_ADDR_2: |
// Send the address with read bit set |
i2c_data.operating_state = I2C_CHECK_ACK_RECV; |
SSPBUF = (i2c_data.master_dest_addr << 1) | 0x1; |
break; |
case I2C_CHECK_ACK_RECV: |
// Check if ACK is received |
if (!SSPCON2bits.ACKSTAT) { |
// If an ACK is received, set module to receive 1 byte of data |
i2c_data.operating_state = I2C_RCV_DATA; |
SSPCON2bits.RCEN = 1; |
} else { |
// If a NACK is received, stop transmission and send error |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_RECV_FAIL; |
} |
break; |
case I2C_RCV_DATA: |
// On receive, save byte into buffer |
// TODO: handle i2c buffer overflow |
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = SSPBUF; |
i2c_data.buffer_in_write_ind++; |
if (i2c_data.buffer_in_write_ind < i2c_data.buffer_in_len) { |
// If we still need to read, send an ACK to the slave |
i2c_data.operating_state = I2C_REQ_DATA; |
SSPCON2bits.ACKDT = 0; // ACK |
SSPCON2bits.ACKEN = 1; |
} else { |
// If we are done reading, send an NACK to the slave |
i2c_data.operating_state = I2C_SEND_STOP; |
SSPCON2bits.ACKDT = 1; // NACK |
SSPCON2bits.ACKEN = 1; |
} |
break; |
case I2C_REQ_DATA: |
// Set module to receive one byte of data |
i2c_data.operating_state = I2C_RCV_DATA; |
SSPCON2bits.RCEN = 1; |
break; |
case I2C_SEND_STOP: |
// Send the stop bit and copy message to send to Main() |
i2c_data.operating_state = I2C_IDLE; |
SSPCON2bits.PEN = 1; |
i2c_data.master_status = I2C_MASTER_IDLE; |
i2c_data.return_status = I2C_RECV_OK; |
break; |
} |
} |
} |
void I2C_Interrupt_Slave() { |
unsigned char received_data; |
unsigned char data_read_from_buffer = 0; |
unsigned char data_written_to_buffer = 0; |
unsigned char overrun_error = 0; |
// Clear SSPOV (overflow bit) |
if (SSPCON1bits.SSPOV == 1) { |
DBG_PRINT_I2C("I2C: (ERROR) overflow detected\r\n"); |
SSPCON1bits.SSPOV = 0; |
// We failed to read the buffer in time, so we know we |
// can't properly receive this message, just put us in the |
// a state where we are looking for a new message |
i2c_data.operating_state = I2C_IDLE; |
overrun_error = 1; |
i2c_data.return_status = I2C_ERR_OVERRUN; |
} |
// Read SPPxBUF if it is full |
if (SSPSTATbits.BF == 1) { |
received_data = SSPBUF; |
// DBG_PRINT_I2C("I2C: data read from buffer: %x\r\n", SSPBUF); |
data_read_from_buffer = 1; |
} |
if (!overrun_error) { |
switch (i2c_data.operating_state) { |
case I2C_IDLE: |
{ |
// Ignore anything except a start |
if (SSPSTATbits.S == 1) { |
i2c_data.buffer_in_len_tmp = 0; |
i2c_data.operating_state = I2C_STARTED; |
// if (data_read_from_buffer) { |
// if (SSPSTATbits.D_A == 1) { |
// DBG_PRINT_I2C("I2C Start: (ERROR) no address recieved\r\n"); |
// // This is bad because we got data and we wanted an address |
// i2c_data.operating_state = I2C_IDLE; |
// i2c_data.return_status = I2C_ERR_NOADDR; |
// } else { |
// // Determine if we are sending or receiving data |
// if (SSPSTATbits.R_W == 1) { |
// i2c_data.operating_state = I2C_SEND_DATA; |
// } else { |
// i2c_data.operating_state = I2C_RCV_DATA; |
// } |
// } |
// } else { |
// i2c_data.operating_state = I2C_STARTED; |
// } |
} |
break; |
} |
case I2C_STARTED: |
{ |
// In this case, we expect either an address or a stop bit |
if (SSPSTATbits.P == 1) { |
// Return to idle mode |
i2c_data.operating_state = I2C_IDLE; |
} else if (data_read_from_buffer) { |
if (SSPSTATbits.D_A == 0) { |
// Address received |
if (SSPSTATbits.R_W == 0) { |
// Slave write mode |
i2c_data.operating_state = I2C_RCV_DATA; |
} else { |
// Slave read mode |
i2c_data.operating_state = I2C_SEND_DATA; |
// Process the first byte immediatly if sending data |
goto send; |
} |
} else { |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_data.operating_state = I2C_IDLE; |
i2c_data.return_status = I2C_ERR_NODATA; |
} |
} |
break; |
} |
send: |
case I2C_SEND_DATA: |
{ |
if (!i2c_data.slave_sending_data) { |
// If we are not currently sending data, figure out what to reply with |
if (I2C_Process_Send(i2c_data.slave_in_last_byte)) { |
// Data exists to be returned, send first byte |
SSPBUF = i2c_data.buffer_out[0]; |
i2c_data.buffer_out_ind = 1; |
i2c_data.slave_sending_data = 1; |
data_written_to_buffer = 1; |
} else { |
// Unknown request |
i2c_data.slave_sending_data = 0; |
i2c_data.operating_state = I2C_IDLE; |
} |
} else { |
// Sending remaining data back to master |
if (i2c_data.buffer_out_ind < i2c_data.buffer_out_len) { |
SSPBUF = i2c_data.buffer_out[i2c_data.buffer_out_ind]; |
i2c_data.buffer_out_ind++; |
data_written_to_buffer = 1; |
} else { |
// Nothing left to send |
i2c_data.slave_sending_data = 0; |
i2c_data.operating_state = I2C_IDLE; |
} |
} |
break; |
} |
case I2C_RCV_DATA: |
{ |
// We expect either data or a stop bit or a (if a restart, an addr) |
if (SSPSTATbits.P == 1) { |
// Stop bit detected, we need to check to see if we also read data |
if (data_read_from_buffer) { |
if (SSPSTATbits.D_A == 1) { |
// Data received with stop bit |
// TODO: handle i2c buffer overflow |
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = received_data; |
if (i2c_data.buffer_in_write_ind == MAXI2CBUF-1) { |
i2c_data.buffer_in_write_ind = 0; |
} else { |
i2c_data.buffer_in_write_ind++; |
} |
i2c_data.buffer_in_len_tmp++; |
// Save the last byte received |
i2c_data.slave_in_last_byte = received_data; |
i2c_data.return_status = I2C_DATA_AVAL; |
} else { |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_data.operating_state = I2C_IDLE; |
i2c_data.return_status = I2C_ERR_NODATA; |
} |
} |
i2c_data.buffer_in_len += i2c_data.buffer_in_len_tmp; |
i2c_data.operating_state = I2C_IDLE; |
} else if (data_read_from_buffer) { |
if (SSPSTATbits.D_A == 1) { |
// Data received |
i2c_data.buffer_in[i2c_data.buffer_in_write_ind] = received_data; |
if (i2c_data.buffer_in_write_ind == MAXI2CBUF-1) { |
i2c_data.buffer_in_write_ind = 0; |
} else { |
i2c_data.buffer_in_write_ind++; |
} |
i2c_data.buffer_in_len_tmp++; |
// Save the last byte received |
i2c_data.slave_in_last_byte = received_data; |
i2c_data.return_status = I2C_DATA_AVAL; |
} else { |
// Restart bit detected |
if (SSPSTATbits.R_W == 1) { |
i2c_data.buffer_in_len += i2c_data.buffer_in_len_tmp; |
i2c_data.operating_state = I2C_SEND_DATA; |
// Process the first byte immediatly if sending data |
goto send; |
} else { |
// Bad to recv an address again, we aren't ready |
DBG_PRINT_I2C("I2C: (ERROR) no data recieved\r\n"); |
i2c_data.operating_state = I2C_IDLE; |
i2c_data.return_status = I2C_ERR_NODATA; |
} |
} |
} |
break; |
} |
} |
} |
// Release the clock stretching bit (if we should) |
if (data_read_from_buffer || data_written_to_buffer) { |
// Release the clock |
if (SSPCON1bits.CKP == 0) { |
SSPCON1bits.CKP = 1; |
} |
} |
} |
/* Returns 0 if I2C module is currently busy, otherwise returns status code */ |
unsigned char I2C_Get_Status() { |
if (i2c_data.operating_mode == I2C_MODE_MASTER) { |
if (i2c_data.master_status != I2C_MASTER_IDLE || i2c_data.buffer_in_len == 0) { |
return 0; |
} else { |
return i2c_data.return_status; |
} |
} else if (i2c_data.operating_mode = I2C_MODE_SLAVE) { |
if (i2c_data.operating_state != I2C_IDLE || i2c_data.buffer_in_len == 0) { |
return 0; |
} else { |
return i2c_data.return_status; |
} |
} |
} |
unsigned char I2C_Buffer_Len() { |
return i2c_data.buffer_in_len; |
} |
/* Returns 0 if I2C module is currently busy, otherwise returns buffer length */ |
unsigned char I2C_Read_Buffer(char *buffer) { |
unsigned char i = 0; |
while (i2c_data.buffer_in_len != 0) { |
buffer[i] = i2c_data.buffer_in[i2c_data.buffer_in_read_ind]; |
i++; |
if (i2c_data.buffer_in_read_ind == MAXI2CBUF-1) { |
i2c_data.buffer_in_read_ind = 0; |
} else { |
i2c_data.buffer_in_read_ind++; |
} |
i2c_data.buffer_in_len--; |
} |
return i; |
} |
/* Put data to be returned here */ |
unsigned char I2C_Process_Send(unsigned char c) { |
unsigned char ret = 0; |
switch (c) { |
case 0xAA: |
i2c_data.buffer_out[0] = 'A'; |
i2c_data.buffer_out_len = 1; |
ret = 1; |
break; |
case 0xBB: |
i2c_data.buffer_out[0] = '1'; |
i2c_data.buffer_out[1] = '2'; |
i2c_data.buffer_out_len = 2; |
ret = 1; |
break; |
} |
return ret; |
} |
/PIC Stuff/PIC_27J13/main.c |
---|
0,0 → 1,762 |
#include "maindefs.h" |
#include "Adafruit_GFX.h" |
#include "interrupts.h" |
#include "uart.h" |
#include "i2c.h" |
#include "spi.h" |
#include "nfc.h" |
#include "led_backpack.h" |
#include "oled_ssd1306.h" |
#include "oled_ssd1331.h" |
#include <usart.h> |
#include <delays.h> |
#include <string.h> |
#pragma config WDTEN = OFF // Turn off watchdog timer |
#pragma config XINST = OFF // Turn off extended instruction set |
#pragma config OSC = HSPLL // Use external oscillator (101) |
#pragma config PLLDIV = 3 // Set PPL prescaler to 3 (to get 4MHz) |
#pragma config CFGPLLEN = ON // Enable PLL on startup |
#pragma config PLLSEL = PLL96 // Use 96MHz PLL 4MHz -> 96MHz / 2 = 48MHz |
//#pragma config SOSCSEL = HIGH // High Power T1OSC/SOSC circuit selected |
//#pragma config ADCSEL = BIT12 // 12-bit ADrC |
//#pragma config IOL1WAY = OFF // IOLOCK bit can be set and cleared as needed |
/* ----------- IO Pins ----------- |
* RA0 - |
* RA1 - |
* RA2 - |
* RA3 - |
* RA4 - [CANNOT BE USED (VDDCORE/VCAP)] |
* RA5 - |
* RA6 - Oscillator |
* RA7 - Oscillator |
* |
* RB0 - UART2 Tx |
* RB1 - UART2 Rx |
* RB2 - SPI2 MOSI |
* RB3 - SPI2 MISO |
* RB4 - SPI2 CLK |
* RB5 - SPI2 D/C |
* RB6 - SPI2 RESET |
* RB7 - SPI2 CS |
* |
* RC0 - |
* RC1 - IRQ |
* RC2 - Reset |
* RC3 - I2C CLK |
* RC4 - I2C DATA |
* RC5 - |
* RC6 - UART1 Tx |
* RC7 - UART1 Rx |
* ---------------------------- */ |
#ifdef _TEST_UART |
void main(void) { |
unsigned char length = 0; |
unsigned char buffer[100]; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
while (1) { |
length = UART1_Read((char *) buffer); |
if (length != 0) { |
UART1_WriteB((char *) buffer, length); |
} |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
#endif |
#ifdef _TEST_I2C_MASTER |
void main(void) { |
unsigned char i = 0; |
unsigned char length = 0; |
unsigned char result = 0; |
unsigned char buffer[100]; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
I2C_Init(); // Initialize the I2C handler code |
I2C_Configure_Master(); |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
while (1) { |
buffer[0] = 0xBB; |
I2C_Master_Send(0x30, 1, buffer); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
DBG_PRINT_MAIN("S:%X ", result); |
I2C_Master_Recv(0x30, 2); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
DBG_PRINT_MAIN("S:%X ", result); |
length = I2C_Read_Buffer(buffer); |
DBG_PRINT_MAIN("L:%d D:", length); |
for (i = 0; i < length; i++) { |
DBG_PRINT_MAIN("%c ", buffer[i]); |
} |
I2C_Master_Restart(0x30, 0xBB, 2); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
DBG_PRINT_MAIN("S:%X ", result); |
length = I2C_Read_Buffer(buffer); |
DBG_PRINT_MAIN("L:%d D:", length); |
for (i = 0; i < length; i++) { |
DBG_PRINT_MAIN("%c ", buffer[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
#endif |
#ifdef _TEST_I2C_SLAVE |
void main(void) { |
unsigned char i = 0; |
unsigned char length = 0; |
unsigned char result = 0; |
unsigned char buffer[100]; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
I2C_Init(); // Initialize the I2C handler code |
I2C_Configure_Slave(0x30); |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
while (1) { |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
DBG_PRINT_MAIN("%X ", result); |
length = I2C_Read_Buffer(buffer); |
DBG_PRINT_MAIN("%d ", length); |
for (i = 0; i < length; i++) { |
DBG_PRINT_MAIN("%X ", buffer[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
#endif |
#ifdef _TEST_NFC |
void main(void) { |
unsigned char i = 0; |
unsigned char length = 0; |
unsigned char result = 0; |
NFC_FIRMWARE_VERSION version; |
unsigned char buffer[50]; |
// NFC stuff |
unsigned char uid[7]; |
unsigned char uidLen; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
I2C_Init(); // Initialize the I2C handler code |
NFC_Init(); // Initialize the NFC chip (uses I2C) |
I2C_Configure_Master(I2C_400KHZ); |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
version = NFC_getFirmwareVersion(); |
while (!version.IC) { |
DBG_PRINT_MAIN("Waiting for NFC board..\r\n"); |
Delay10KTCYx(3); |
version = NFC_getFirmwareVersion(); |
} |
DBG_PRINT_MAIN("Found chip PN5%X\r\n", version.IC); |
DBG_PRINT_MAIN("Firmware ver. %d.%d\r\n", version.Ver, version.Rev); |
NFC_SAMConfig(); |
while (1) { |
// This call will hang until the NFC chip replies (card detected) |
if (NFC_readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLen)) { |
DBG_PRINT_MAIN("Card Found!\r\n"); |
DBG_PRINT_MAIN("UID Length: %d bytes\r\n", uidLen); |
DBG_PRINT_MAIN("UID: "); |
for (i = 0; i < uidLen; i++) { |
DBG_PRINT_MAIN("%02X ", uid[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
} |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
} |
} |
#endif |
#ifdef _TEST_LED_BACKPACK |
void main(void) { |
unsigned char i = 0; |
unsigned char length = 0; |
unsigned char buffer[100]; |
unsigned int counter = 0; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
I2C_Init(); // Initialize the I2C handler code |
LED_Init(); // Initialize the LED backpack (uses I2C); |
I2C_Configure_Master(I2C_400KHZ); |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
LED_Start(); |
LED_writeDigitNum(0, 1, 1); |
LED_writeDigitNum(1, 2, 0); |
LED_writeDigitNum(2, 3, 0); |
LED_writeDigitNum(3, 4, 0); |
LED_writeDisplay(); |
for (i = 0; i < 15; i++) { |
LED_setBrightness(15 - i); |
Delay10KTCYx(100); |
} |
for (i = 0; i < 15; i++) { |
LED_setBrightness(i); |
Delay10KTCYx(100); |
} |
LED_blinkRate(HT16K33_BLINK_OFF); |
while (1) { |
LED_writeNum(counter); |
counter++; |
if (counter > 9999) |
counter = 0; |
// Delay10KTCYx(255); |
} |
} |
#endif |
#ifdef _TEST_SPI |
void main(void) { |
unsigned char i = 0; |
unsigned char length = 0; |
unsigned char result = 0; |
unsigned char buffer[100]; |
unsigned char test[8] = "ASDF123"; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
while (1) { |
SPI2_Write(test, 7); |
while (result != 7) { |
length = SPI2_Buffer_Read(buffer); |
if (length) { |
result += length; |
} |
} |
result = 0; |
for (i = 0; i < result; i++) { |
DBG_PRINT_MAIN("%X ", buffer[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
} |
} |
#endif |
#ifdef _TEST_SSD1306_OLED |
void main(void) { |
unsigned int i = 0; |
unsigned long l = 0; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module |
SSD1306_Init(); // Initialize the OLED code |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
SSD1306_Begin(SSD1306_SWITCHCAPVCC); |
SSD1306_Display(); // Show splashscreen |
while (1) { |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// for (i = 0; i < 32; i++) { |
// SSD1306_Draw_Pixel(i, i, WHITE); |
// } |
// SSD1306_Display(); |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_DrawLine(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_DrawRect(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_FillRect(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_DrawCircle(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// GFX_fillCircle(GFX_width() / 2, GFX_height() / 2, 10, WHITE); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_DrawRoundRect(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_FillRoundRect(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_DrawTriangle(); |
// SSD1306_Display(); |
// |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_FillTriangle(); |
// SSD1306_Display(); |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// SSD1306_Test_DrawChar(); |
// SSD1306_Display(); |
// Delay10KTCYx(255); |
// Delay10KTCYx(255); |
// SSD1306_Clear_Display(); |
// GFX_setTextSize(1); |
// GFX_setTextColor(WHITE); |
// GFX_setCursor(0,0); |
// GFX_writeString("Hello World!\n"); |
//// GFX_setTextColorBG(BLACK, WHITE); |
// i = 65535; |
// GFX_writeString("%u %d\n", i, i); |
//// GFX_setTextSize(2); |
//// GFX_setTextColor(WHITE); |
// l = 0xDEADBEEF; |
// GFX_writeString("0x%X", (long)l); |
// SSD1306_Display(); |
SSD1306_Clear_Display(); |
GFX_setRotation(0); |
GFX_setTextSize(1); |
GFX_setTextColor(SSD1306_WHITE); |
GFX_setCursor(0, 0); |
GFX_writeString("%u", i); |
i++; |
SSD1306_Display(); |
} |
} |
#endif |
#ifdef _TEST_SSD1331_OLED |
void main(void) { |
unsigned int i = 0; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module |
SSD1331_Init(); // Initialize the OLED code |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
SSD1331_Begin(); |
while (1) { |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
SSD1331_Test_Pattern(); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_clearScreen(); |
GFX_setRotation(0); |
GFX_setCursor(0, 0); |
GFX_writeString("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa"); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_clearScreen(); |
GFX_setRotation(3); |
GFX_setCursor(0, 0); |
GFX_writeString("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa"); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
SSD1331_Test_DrawLines(SSD1331_YELLOW); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(3); |
SSD1331_Test_DrawLines(SSD1331_BLUE); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
SSD1331_Test_DrawRect(SSD1331_GREEN); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(1); |
SSD1331_Test_DrawRect(SSD1331_RED); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(2); |
SSD1331_Test_DrawRect(SSD1331_BLUE); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(3); |
SSD1331_Test_DrawRect(SSD1331_YELLOW); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
SSD1331_Test_FillRect(SSD1331_YELLOW, SSD1331_MAGENTA); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(3); |
SSD1331_Test_FillRect(SSD1331_BLUE, SSD1331_GREEN); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
GFX_clearScreen(); |
SSD1331_Test_FillCircle(10, SSD1331_BLUE); |
SSD1331_Test_DrawCircle(10, SSD1331_WHITE); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(3); |
GFX_clearScreen(); |
SSD1331_Test_FillCircle(10, SSD1331_MAGENTA); |
SSD1331_Test_DrawCircle(10, SSD1331_YELLOW); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
SSD1331_Test_DrawTria(); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(3); |
SSD1331_Test_DrawTria(); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(0); |
SSD1331_Test_DrawRoundRect(); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
GFX_setRotation(3); |
SSD1331_Test_DrawRoundRect(); |
// GFX_clearScreen(); |
// GFX_setRotation(3); |
// GFX_setCursor(0,0); |
// GFX_setTextColorBG(SSD1331_WHITE, SSD1331_BLACK); |
// GFX_writeString("%u", i); |
// i++; |
} |
} |
#endif |
#if !defined(_TEST_UART) && !defined(_TEST_I2C_MASTER) && \ |
!defined(_TEST_I2C_SLAVE) && !defined(_TEST_SPI) && \ |
!defined(_TEST_NFC) && !defined(_TEST_LED_BACKPACK) && \ |
!defined(_TEST_SSD1306_OLED) && !defined(_TEST_SSD1331_OLED) |
//static unsigned char lcd_buffer[8][17]; |
// |
//void main(void) { |
// char i = 0; |
// char j = 0; |
// unsigned char length = 0; |
// unsigned char buffer[60]; |
// char buffer_ind = 0; |
// |
// /* --------------------- Oscillator Configuration --------------------- */ |
// // OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
// OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
// OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
// /* -------------------------------------------------------------------- */ |
// |
// // Set all ports as digial I/O |
// ANCON0 = 0xFF; |
// ANCON1 = 0x1F; |
// |
// UART1_Init(); // Initialize the UART handler code |
// // I2C_Init(); // Initialize the I2C handler code |
// SPI2_Init(SPI2_FOSC_4); // Initialize the SPI module |
// SSD1331_Init(); // Initialize the SSD1331 OLED display (uses SPI2) |
// // NFC_Init(); // Initialize the NFC chip (uses I2C) |
// // LED_Init(); // Initialize the LED backpack (uses I2C); |
// |
// // I2C_Configure_Master(I2C_400KHZ); |
// SSD1331_Begin(); |
// |
// interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
// interrupt_init(); // Initialize the interrupt priorities |
// |
// DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
// |
// memset(lcd_buffer, 0, 136); |
// GFX_clearScreen(); |
// |
// while (1) { |
// length = UART1_Read_Buffer(buffer); |
// if (length != 0) { |
// // Save string into lcd_buffer at location buffer_ind |
// if (length < 17) { // If string is < 16 char + \n |
// for (i = 0; i < length; i++) // Copy everything including \n |
// lcd_buffer[buffer_ind][i] = buffer[i]; |
// lcd_buffer[buffer_ind][length] = 0; |
// } else { |
// for (i = 0; i < 16; i++) // Copy the first 16 char |
// lcd_buffer[buffer_ind][i] = buffer[i]; |
// lcd_buffer[buffer_ind][16] = 0; |
// } |
// |
//// for (i = 0; i < 8; i++) { |
//// for (j = 0; j < 17; j++) { |
//// DBG_PRINT_MAIN("%c", lcd_buffer[i][j]); |
//// } |
//// DBG_PRINT_MAIN("\r\n"); |
//// } |
//// DBG_PRINT_MAIN("\r\n"); |
// |
// // Print strings in lcd_buffer to display starting at buffer_ind |
// GFX_clearScreen(); |
// GFX_setCursor(0, 0); |
// for (i = 0; i < 8; i++) { |
// j = buffer_ind - i; |
// if (j >= 0) { |
// GFX_writeString("%s", lcd_buffer[j]); |
// } else { |
// GFX_writeString("%s", lcd_buffer[j + 8]); |
// } |
// } |
// |
// buffer_ind++; |
// if (buffer_ind > 7) |
// buffer_ind = 0; |
// } |
// } |
//} |
void main(void) { |
unsigned char i = 0; |
unsigned char j = 0; |
unsigned char length = 0; |
unsigned char buffer[60]; |
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
UART1_Init(); // Initialize the UART handler code |
// I2C_Init(); // Initialize the I2C handler code |
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module |
SSD1331_Init(); // Initialize the SSD1331 OLED display (uses SPI2) |
// NFC_Init(); // Initialize the NFC chip (uses I2C) |
// LED_Init(); // Initialize the LED backpack (uses I2C); |
// I2C_Configure_Master(I2C_400KHZ); |
SSD1331_Begin(); |
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
memset(buffer, 0, 60); |
GFX_clearScreen(); |
GFX_setRotation(3); |
while (1) { |
length = UART1_Read_Buffer(buffer); |
if (length != 0) { |
buffer[length] = 0; |
GFX_appendString("%s", buffer); |
} |
} |
} |
#endif |
/PIC Stuff/PIC_27J13/maindefs.h |
---|
0,0 → 1,44 |
#ifndef __maindefs_h |
#define __maindefs_h |
#include <p18f27j13.h> |
#include <stdio.h> |
#include "uart.h" |
//#define _DEBUG |
//#define _TEST_UART |
//#define _TEST_I2C_MASTER |
//#define _TEST_I2C_SLAVE |
//#define _TEST_SPI |
//#define _TEST_NFC |
//#define _TEST_LED_BACKPACK |
//#define _TEST_SSD1306_OLED |
//#define _TEST_SSD1331_OLED |
// Option to choose between active OLED displays |
//#define GFX_SSD1306 |
#define GFX_SSD1331 |
// Enable or disable debug prints depending on project preprocessor (_DEBUG) |
#ifdef _DEBUG |
#define DBG_PRINT_MAIN(x) printf(x) |
#define DBG_PRINT_UART(x) printf(x) |
#define DBG_PRINT_I2C(x) printf(x) |
#define DBG_PRINT_SPI(x) printf(x) |
#define DBG_PRINT_XBEE(x) |
#define DBG_PRINT_PORTB_INT(x) |
#define DBG_PRINT_INT(x) |
#define DBG_PRINT_BUFFER(x) |
#else |
#define DBG_PRINT_MAIN(x) |
#define DBG_PRINT_UART(x) |
#define DBG_PRINT_I2C(x) |
#define DBG_PRINT_SPI(x) |
#define DBG_PRINT_XBEE(x) |
#define DBG_PRINT_PORTB_INT(x) |
#define DBG_PRINT_INT(x) |
#define DBG_PRINT_BUFFER(x) |
#endif |
#endif |
/PIC Stuff/PIC_27J13/spi.c |
---|
0,0 → 1,200 |
#include "maindefs.h" |
#include "spi.h" |
static SPI_DATA spi_data; |
void SPI2_Init(unsigned char speed) { |
// Set up SPI2 with specified pins |
RPINR22 = 7; // SPI2 CLK Input (Pin RB4) |
RPOR7 = 11; // SPI2 CLK Output (Pin RB4) |
#ifndef SPI2_WRITE_ONLY |
RPINR21 = 6; // SPI2 Data Input (Pin RB3) |
#endif |
RPOR5 = 10; // SPI2 Data Output (MOSI) (Pin RB2) |
TRISBbits.TRISB4 = 0; // SPI2 clock pin (Pin RB4) |
#ifndef SPI2_WRITE_ONLY |
TRISBbits.TRISB3 = 1; // SPI2 data in pin (Pin RB3)(MISO) |
#endif |
TRISBbits.TRISB2 = 0; // SPI2 data out pin (Pin RB2)(MOSI) |
TRISBbits.TRISB7 = 0; // SPI2 slave select (Pin RB7) |
LATBbits.LATB7 = 1; // SPI2 SS high (Idle) |
TRISBbits.TRISB6 = 0; // SPI2 reset (Pin RB6) |
LATBbits.LATB6 = 1; // SPI2 reset active low |
TRISBbits.TRISB5 = 0; // SPI2 D/C select (Pin RB5) |
LATBbits.LATB5 = 0; |
SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time |
SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state |
if (speed == SPI2_FOSC_4) |
SSP2CON1bits.SSPM = 0b0000; // Clock = FOSC/4 |
else if (speed == SPI2_FOSC_8) |
SSP2CON1bits.SSPM = 0b1010; // Clock = FOSC/8 |
else if (speed == SPI2_FOSC_16) |
SSP2CON1bits.SSPM = 0b0001; // Clock = FOSC/16 |
else |
SSP2CON1bits.SSPM = 0b0010; // Clock = FOSC/64 |
SSP2CON1bits.CKP = 1; // Idle state for clock is a high level |
SSP2CON1bits.SSPEN = 1; // Enable MSSP module |
#ifdef SPI2_USE_INTERRUPT |
PIE3bits.SSP2IE = 1; // Enable MSSP2 interrupt |
#else |
PIE3bits.SSP2IE = 0; |
#endif |
spi_data.buffer_in_len = 0; |
spi_data.buffer_in_read_ind = 0; |
spi_data.buffer_in_write_ind = 0; |
spi_data.buffer_out_ind = 0; |
spi_data.buffer_out_len = 0; |
} |
void SPI2_Recv_Interrupt_Handler() { |
unsigned char c; |
if (SSP2STATbits.BF) { // Check if data receive flag is set |
if (spi_data.buffer_in_len == MAXSPIBUF - 1) { |
DBG_PRINT_SPI("SPI2: (ERROR) buffer overflow\r\n"); |
c = SSP2BUF; // Read SSP2BUF to clear it |
} else { |
// Save received data into buffer |
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF; |
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) { |
spi_data.buffer_in_write_ind = 0; |
} else { |
spi_data.buffer_in_write_ind++; |
} |
spi_data.buffer_in_len++; |
// Put next byte in SSP2BUF for transmit |
if (spi_data.buffer_out_ind != spi_data.buffer_out_len) { |
SSP2BUF = spi_data.buffer_out[spi_data.buffer_out_ind]; |
spi_data.buffer_out_ind++; |
} else { |
LATBbits.LATB2 = 1; // Bring SS line high |
spi_data.buffer_out_ind = 0; |
spi_data.buffer_out_len = 0; |
} |
} |
} |
} |
void SPI2_Write(unsigned char *msg, unsigned int length) { |
#ifdef SPI2_USE_INTERRUPT |
unsigned char i; |
spi_data.buffer_out_len = length; |
spi_data.buffer_out_ind = 1; |
for (i = 0; i < length; i++) { |
spi_data.buffer_out[i] = msg[i]; |
} |
LATBbits.LATB7 = 0; // Bring SS line low |
SSP2BUF = spi_data.buffer_out[0]; // Transmit first byte |
#else |
unsigned int i = 0; |
unsigned char tmp = 0; |
LATBbits.LATB7 = 0; |
while (i != length) { |
SSP2BUF = msg[i]; |
i++; |
while (!SSP2STATbits.BF); |
#ifndef SPI2_WRITE_ONLY |
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF; |
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) { |
spi_data.buffer_in_write_ind = 0; |
} else { |
spi_data.buffer_in_write_ind++; |
} |
spi_data.buffer_in_len++; |
#else |
// Read data in buffer to clear it |
tmp = SSP2BUF; |
#endif |
} |
LATBbits.LATB7 = 1; |
#endif |
} |
void SPI2_Write_Repeat(unsigned char c, unsigned int length) { |
#ifdef SPI2_USE_INTERRUPT |
// TODO |
#else |
unsigned int i = 0; |
unsigned char tmp = 0; |
LATBbits.LATB7 = 0; |
while (i != length) { |
SSP2BUF = c; |
i++; |
while (!SSP2STATbits.BF); |
#ifndef SPI2_WRITE_ONLY |
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF; |
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) { |
spi_data.buffer_in_write_ind = 0; |
} else { |
spi_data.buffer_in_write_ind++; |
} |
spi_data.buffer_in_len++; |
#else |
// Read data in buffer to clear it |
tmp = SSP2BUF; |
#endif |
} |
LATBbits.LATB7 = 1; |
#endif |
} |
void SPI2_Read(unsigned char length) { |
#ifdef SPI2_USE_INTERRUPT |
unsigned char i; |
spi_data.buffer_out_len = length; |
spi_data.buffer_out_ind = 1; |
for (i = 0; i < length; i++) { |
spi_data.buffer_out[i] = 0x0; |
} |
LATBbits.LATB7 = 0; // Bring SS line low |
SSP2BUF = spi_data.buffer_out[0]; // Transmit first byte |
#else |
unsigned char i = 0; |
LATBbits.LATB7 = 0; |
for (i = 0; i < length; i++) { |
SSP2BUF = 0x0; |
while (!SSP2STATbits.BF); |
spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF; |
if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) { |
spi_data.buffer_in_write_ind = 0; |
} else { |
spi_data.buffer_in_write_ind++; |
} |
spi_data.buffer_in_len++; |
} |
LATBbits.LATB7 = 1; |
#endif |
} |
unsigned char SPI2_Buffer_Len() { |
return spi_data.buffer_in_len; |
} |
unsigned char SPI2_Buffer_Read(unsigned char* buffer) { |
unsigned char i = 0; |
while (spi_data.buffer_in_len != 0) { |
buffer[i] = spi_data.buffer_in[spi_data.buffer_in_read_ind]; |
i++; |
if (spi_data.buffer_in_read_ind == MAXSPIBUF - 1) { |
spi_data.buffer_in_read_ind = 0; |
} else { |
spi_data.buffer_in_read_ind++; |
} |
spi_data.buffer_in_len--; |
} |
return i; |
} |
/PIC Stuff/PIC_27J13/spi.h |
---|
0,0 → 1,39 |
#ifndef SPI_H |
#define SPI_H |
#define MAXSPIBUF 64 |
// Option to use interrupt. If interrupt are used, SPI write does not block but |
// there is a longer delay between reading/writing data |
//#define SPI2_USE_INTERRUPT |
// Option to write only |
#define SPI2_WRITE_ONLY |
// SPI speed selection |
#define SPI2_FOSC_64 1 |
#define SPI2_FOSC_16 2 |
#define SPI2_FOSC_8 3 |
#define SPI2_FOSC_4 4 |
typedef struct __SPI_DATA { |
unsigned char buffer_in[MAXSPIBUF]; |
unsigned char buffer_in_read_ind; |
unsigned char buffer_in_write_ind; |
unsigned char buffer_in_len; |
unsigned char buffer_out[MAXSPIBUF]; |
unsigned char buffer_out_ind; |
unsigned char buffer_out_len; |
} SPI_DATA; |
void SPI2_Init(unsigned char speed); |
void SPI2_Recv_Interrupt_Handler(void); |
void SPI2_Write(unsigned char *msg, unsigned int length); |
void SPI2_Write_Repeat(unsigned char c, unsigned int length); |
void SPI2_Read(unsigned char length); |
unsigned char SPI2_Buffer_Len(void); |
unsigned char SPI2_Read_Buffer(unsigned char *buffer); |
#endif /* SPI_H */ |
/PIC Stuff/PIC_27J13/uart.c |
---|
0,0 → 1,164 |
#include "maindefs.h" |
#include "uart.h" |
#include <string.h> |
static UART_DATA uart_1_data; |
void UART1_Init() { |
// Configure the hardware USART device |
// UART1 TX RC6 |
// UART1 RX RC7 |
TRISCbits.TRISC6 = 0; // Tx pin set to output |
TRISCbits.TRISC7 = 1; // Rx pin set to input |
BAUDCON1bits.BRG16 = 0; // 8-bit baud rate generator |
SPBRG1 = 25; // Set UART speed to 115200 baud |
TXSTA1bits.BRGH = 1; // High speed mode |
TXSTA1bits.SYNC = 0; // Async mode |
RCSTA1bits.SPEN = 1; // Serial port enable |
TXSTA1bits.TX9 = 0; // 8 bit transmission |
RCSTA1bits.RX9 = 0; // 8 bit reception |
RCSTA1bits.CREN = 1; // Continuous receive mode |
#ifdef _DEBUG // In debug mode we want to have TXEN constantly enabled |
TXSTA1bits.TXEN = 1; // TX is always enabled |
PIE1bits.TX1IE = 0; // Disable TX interrupt |
#else |
TXSTA1bits.TXEN = 0; // Enable transmission |
PIE1bits.TX1IE = 1; // Enable TX interrupt |
#endif |
PIE1bits.RC1IE = 1; // Enable RX interrupt |
// Initialize the buffer that holds UART messages |
uart_1_data.buffer_in_read_ind = 0; |
uart_1_data.buffer_in_write_ind = 0; |
uart_1_data.buffer_in_len = 0; |
uart_1_data.buffer_in_len_tmp = 0; |
} |
//void uart_2_init() { |
// // Configure the PPS USART ports |
// |
// // UART2 RX Pin RP5 |
// RPINR16 = 5; // 5 is PPS RP5 |
// // UART2 TX Pin RP6 |
// RPOR6 = 6; // 6 is TX2/CK2 (EUSART2 Asynchronous Transmit/Asynchronous Clock Output) |
// |
// Open2USART(USART_TX_INT_OFF & // Interrupt on TX off |
// USART_RX_INT_ON & // Interrupt on RX on |
// USART_ASYNCH_MODE & // Operate in async mode |
// USART_EIGHT_BIT & // Operate in 8-bit mode |
// USART_CONT_RX & // Continuously recieve messages |
// USART_BRGH_HIGH, 25); // Set UART speed to 115200 baud |
//} |
void UART1_Recv_Interrupt_Handler() { |
unsigned char c; |
if (PIR1bits.RC1IF) { // Check if data receive flag is set |
c = RCREG1; |
// Save received data into buffer |
uart_1_data.buffer_in[uart_1_data.buffer_in_write_ind] = c; |
if (uart_1_data.buffer_in_write_ind == MAXUARTBUF - 1) { |
uart_1_data.buffer_in_write_ind = 0; |
} else { |
uart_1_data.buffer_in_write_ind++; |
} |
// Store the last MAXUARTBUF values entered |
if (uart_1_data.buffer_in_len_tmp < MAXUARTBUF) { |
uart_1_data.buffer_in_len_tmp++; |
} else { |
if (uart_1_data.buffer_in_read_ind == MAXUARTBUF - 1) { |
uart_1_data.buffer_in_read_ind = 0; |
} else { |
uart_1_data.buffer_in_read_ind++; |
} |
} |
// Update buffer size upon receiving newline (0x0D) |
if (c == UART1_BREAK_CHAR) { |
uart_1_data.buffer_in_len = uart_1_data.buffer_in_len_tmp; |
uart_1_data.buffer_in_len_tmp = 0; |
} |
} |
if (RCSTAbits.OERR == 1) { |
// We've overrun the USART and must reset |
RCSTA1bits.CREN = 0; // Reset UART1 |
RCSTA1bits.CREN = 1; |
DBG_PRINT_UART("UART1: (ERROR) overrun\r\n"); |
TXSTA1bits.TXEN = 0; // Kill anything currently sending |
} |
} |
//void uart_2_recv_interrupt_handler() { |
// if (DataRdy2USART()) { |
//// xbee_read_serial(Read2USART()); |
// } |
// |
// if (USART2_Status.OVERRUN_ERROR == 1) { |
// // We've overrun the USART and must reset |
// RCSTA2bits.CREN = 0; // Reset UART2 |
// RCSTA2bits.CREN = 1; |
// } |
//} |
void UART1_Send_Interrupt_Handler() { |
// Put remaining data in TSR for transmit |
if (uart_1_data.buffer_out_ind != uart_1_data.buffer_out_len) { |
TXREG1 = uart_1_data.buffer_out[uart_1_data.buffer_out_ind]; |
uart_1_data.buffer_out_ind++; |
} else { |
while (!TXSTA1bits.TRMT); // Wait for last byte to finish sending |
TXSTA1bits.TXEN = 0; // End transmission and disable TX interrupt |
uart_1_data.buffer_out_ind = 0; |
uart_1_data.buffer_out_len = 0; |
} |
} |
void UART1_WriteS(const rom char *fmt, ...) { |
va_list args; |
while (TXSTA1bits.TXEN); // Wait for previous message to finish sending |
va_start(args, fmt); |
vsprintf((char *) uart_1_data.buffer_out, fmt, args); |
va_end(args); |
uart_1_data.buffer_out_len = strlen((char *) uart_1_data.buffer_out); |
uart_1_data.buffer_out_ind = 1; |
TXREG1 = uart_1_data.buffer_out[0]; // Put first byte in TSR |
TXSTA1bits.TXEN = 1; // Begin transmission |
} |
void UART1_WriteB(const char *msg, unsigned char length) { |
unsigned char i; |
while (TXSTA1bits.TXEN); // Wait for previous message to finish sending |
uart_1_data.buffer_out_len = length; |
uart_1_data.buffer_out_ind = 1; |
for (i = 0; i < length; i++) { |
uart_1_data.buffer_out[i] = msg[i]; |
} |
TXREG1 = uart_1_data.buffer_out[0]; // Put first byte in TSR |
TXSTA1bits.TXEN = 1; // Begin transmission |
} |
unsigned char UART1_Buffer_Len() { |
return uart_1_data.buffer_in_len; |
} |
/* Reader interface to the UART buffer, returns the number of bytes read */ |
unsigned char UART1_Read_Buffer(unsigned char *buffer) { |
unsigned char i = 0; |
while (uart_1_data.buffer_in_len != 0) { |
buffer[i] = uart_1_data.buffer_in[uart_1_data.buffer_in_read_ind]; |
i++; |
if (uart_1_data.buffer_in_read_ind == MAXUARTBUF - 1) { |
uart_1_data.buffer_in_read_ind = 0; |
} else { |
uart_1_data.buffer_in_read_ind++; |
} |
uart_1_data.buffer_in_len--; |
} |
return i; |
} |
/PIC Stuff/PIC_27J13/uart.h |
---|
0,0 → 1,29 |
#ifndef __uart_h |
#define __uart_h |
#define MAXUARTBUF 128 |
#define UART1_BREAK_CHAR 0x0D //(CR) |
typedef struct __UART_DATA { |
unsigned char buffer_in[MAXUARTBUF]; |
unsigned char buffer_in_read_ind; |
unsigned char buffer_in_write_ind; |
unsigned char buffer_in_len; |
unsigned char buffer_in_len_tmp; |
unsigned char buffer_out[MAXUARTBUF]; |
unsigned char buffer_out_ind; |
unsigned char buffer_out_len; |
} UART_DATA; |
void UART1_Init(void); |
//void uart_2_init(void); |
void UART1_Recv_Interrupt_Handler(void); |
//void uart_2_recv_interrupt_handler(void); |
void UART1_Send_Interrupt_Handler(void); |
void UART1_WriteS(const rom char *fmt, ...); |
void UART1_WriteB(const char *msg, unsigned char length); |
unsigned char UART1_Buffer_Len(void); |
unsigned char UART1_Read_Buffer(unsigned char *buffer); |
#endif |
/PIC Stuff/PIC_27J13/18f27j13.lkr |
---|
0,0 → 1,79 |
// File: 18f27j13_g.lkr |
// Generic linker script for the PIC18F27J13 processor |
#DEFINE _CODEEND _DEBUGCODESTART - 1 |
#DEFINE _CEND _CODEEND + _DEBUGCODELEN |
#DEFINE _DATAEND _DEBUGDATASTART - 1 |
#DEFINE _DEND _DATAEND + _DEBUGDATALEN |
LIBPATH . |
#IFDEF _CRUNTIME |
#IFDEF _EXTENDEDMODE |
FILES c018i_e.o |
FILES clib_e.lib |
FILES p18f27j13_e.lib |
#ELSE |
FILES c018i.o |
FILES clib.lib |
FILES p18f27j13.lib |
#FI |
#FI |
#IFDEF _DEBUGCODESTART |
CODEPAGE NAME=page START=0x0 END=_CODEEND |
CODEPAGE NAME=debug START=_DEBUGCODESTART END=_CEND PROTECTED |
#ELSE |
CODEPAGE NAME=page START=0x0 END=0x1FFF7 |
#FI |
CODEPAGE NAME=config START=0x1FFF8 END=0x1FFFF PROTECTED |
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED |
#IFDEF _EXTENDEDMODE |
DATABANK NAME=gpre START=0x0 END=0x5F |
#ELSE |
ACCESSBANK NAME=accessram START=0x0 END=0x5F |
#FI |
DATABANK NAME=gpr0 START=0x60 END=0xFF |
DATABANK NAME=gpr1 START=0x100 END=0x1FF |
DATABANK NAME=gpr2 START=0x200 END=0x2FF |
DATABANK NAME=gpr3 START=0x300 END=0x3FF |
DATABANK NAME=gpr4 START=0x400 END=0x4FF |
DATABANK NAME=gpr5 START=0x500 END=0x5FF |
DATABANK NAME=gpr6 START=0x600 END=0x6FF |
DATABANK NAME=gpr7 START=0x700 END=0x7FF |
DATABANK NAME=gpr8 START=0x800 END=0x8FF |
//DATABANK NAME=gpr9 START=0x900 END=0x9FF |
//DATABANK NAME=gpr10 START=0xA00 END=0xAFF |
//DATABANK NAME=gpr11 START=0xB00 END=0xBFF |
//DATABANK NAME=gpr12 START=0xC00 END=0xCFF |
// Large (1024b) buffer allocated in RAM for LCD (replaces gpr9-12) |
DATABANK NAME=LCD_BUFFER START=0x900 END=0xCFF |
SECTION NAME=LCD_BUFFER RAM=LCD_BUFFER |
#IFDEF _DEBUGDATASTART |
DATABANK NAME=gpr13 START=0xD00 END=_DATAEND |
DATABANK NAME=dbgspr START=_DEBUGDATASTART END=_DEND PROTECTED |
#ELSE //no debug |
DATABANK NAME=gpr13 START=0xD00 END=0xDFF |
#FI |
DATABANK NAME=gpr14 START=0xE00 END=0xEAF |
DATABANK NAME=sfr14 START=0xEB0 END=0xEFF PROTECTED |
DATABANK NAME=sfr15 START=0xF00 END=0xF5F PROTECTED |
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED |
#IFDEF _CRUNTIME |
SECTION NAME=CONFIG ROM=config |
#IFDEF _DEBUGDATASTART |
STACK SIZE=0x100 RAM=gpr12 |
#ELSE |
STACK SIZE=0x100 RAM=gpr13 |
#FI |
#FI |
/PIC Stuff/PIC_27J13/adc.c |
---|
0,0 → 1,27 |
#include "adc.h" |
#include <adc.h> |
void adc_init() { |
TRISAbits.TRISA0 = 1; |
OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_0_TAD, |
ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, 0, |
ADC_1ANA); |
} |
void adc_start() { |
ConvertADC(); |
} |
void adc_stop() { |
CloseADC(); |
} |
void adc_interrupt_handler() { |
// Sends the ADC value to main() |
unsigned int ret; |
unsigned char length; |
ret = ReadADC(); |
length = 2; |
// MQ_sendmsg_ToMainFromLow(length, MSGTYPE_ADC_NEWVALUE, &ret); |
} |
/PIC Stuff/PIC_27J13/build/default/production/Adafruit_GFX.o.d |
---|
0,0 → 1,14 |
build/default/production/Adafruit_GFX.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/glcdfont.c \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
/PIC Stuff/PIC_27J13/build/default/production/glcdfont.o.d |
---|
0,0 → 1,3 |
build/default/production/glcdfont.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/glcdfont.c \ |
/PIC Stuff/PIC_27J13/build/default/production/i2c.o.d |
---|
0,0 → 1,10 |
build/default/production/i2c.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
/PIC Stuff/PIC_27J13/build/default/production/interrupts.o.d |
---|
0,0 → 1,12 |
build/default/production/interrupts.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/interrupts.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/interrupts.h \ |
/PIC Stuff/PIC_27J13/build/default/production/led_backpack.o.d |
---|
0,0 → 1,5 |
build/default/production/led_backpack.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/led_backpack.c \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/led_backpack.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \ |
/PIC Stuff/PIC_27J13/build/default/production/main.o.d |
---|
0,0 → 1,22 |
build/default/production/main.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/main.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/nfc.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/led_backpack.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/usart.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/interrupts.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/pconfig.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
/PIC Stuff/PIC_27J13/build/default/production/nfc.o.d |
---|
0,0 → 1,14 |
build/default/production/nfc.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/nfc.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/nfc.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/i2c.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
/PIC Stuff/PIC_27J13/build/default/production/oled_ssd1306.o.d |
---|
0,0 → 1,15 |
build/default/production/oled_ssd1306.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1306.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
/PIC Stuff/PIC_27J13/build/default/production/oled_ssd1331.o.d |
---|
0,0 → 1,15 |
build/default/production/oled_ssd1331.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/oled_ssd1331.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/Adafruit_GFX.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/delays.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18cxxx.h \ |
/PIC Stuff/PIC_27J13/build/default/production/spi.o.d |
---|
0,0 → 1,10 |
build/default/production/spi.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/spi.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
/PIC Stuff/PIC_27J13/build/default/production/uart.o.d |
---|
0,0 → 1,10 |
build/default/production/uart.o : \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.c \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdio.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/uart.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/string.h \ |
C:/Users/Kevin/Documents/PIC\ Code/PIC_27J13/maindefs.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/p18f27j13.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stdarg.h \ |
C:/Program\ Files\ (x86)/Microchip/mplabc18/v3.40/h/stddef.h \ |
/PIC Stuff/PIC_27J13/glcdfont.c |
---|
0,0 → 1,263 |
#ifndef FONT5X7_H |
#define FONT5X7_H |
// standard ascii 5x7 font |
static rom unsigned char font[] = { |
0x00, 0x00, 0x00, 0x00, 0x00, |
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, |
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, |
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, |
0x18, 0x3C, 0x7E, 0x3C, 0x18, |
0x1C, 0x57, 0x7D, 0x57, 0x1C, |
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, |
0x00, 0x18, 0x3C, 0x18, 0x00, |
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, |
0x00, 0x18, 0x24, 0x18, 0x00, |
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, |
0x30, 0x48, 0x3A, 0x06, 0x0E, |
0x26, 0x29, 0x79, 0x29, 0x26, |
0x40, 0x7F, 0x05, 0x05, 0x07, |
0x40, 0x7F, 0x05, 0x25, 0x3F, |
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, |
0x7F, 0x3E, 0x1C, 0x1C, 0x08, |
0x08, 0x1C, 0x1C, 0x3E, 0x7F, |
0x14, 0x22, 0x7F, 0x22, 0x14, |
0x5F, 0x5F, 0x00, 0x5F, 0x5F, |
0x06, 0x09, 0x7F, 0x01, 0x7F, |
0x00, 0x66, 0x89, 0x95, 0x6A, |
0x60, 0x60, 0x60, 0x60, 0x60, |
0x94, 0xA2, 0xFF, 0xA2, 0x94, |
0x08, 0x04, 0x7E, 0x04, 0x08, |
0x10, 0x20, 0x7E, 0x20, 0x10, |
0x08, 0x08, 0x2A, 0x1C, 0x08, |
0x08, 0x1C, 0x2A, 0x08, 0x08, |
0x1E, 0x10, 0x10, 0x10, 0x10, |
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, |
0x30, 0x38, 0x3E, 0x38, 0x30, |
0x06, 0x0E, 0x3E, 0x0E, 0x06, |
0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x5F, 0x00, 0x00, |
0x00, 0x07, 0x00, 0x07, 0x00, |
0x14, 0x7F, 0x14, 0x7F, 0x14, |
0x24, 0x2A, 0x7F, 0x2A, 0x12, |
0x23, 0x13, 0x08, 0x64, 0x62, |
0x36, 0x49, 0x56, 0x20, 0x50, |
0x00, 0x08, 0x07, 0x03, 0x00, |
0x00, 0x1C, 0x22, 0x41, 0x00, |
0x00, 0x41, 0x22, 0x1C, 0x00, |
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, |
0x08, 0x08, 0x3E, 0x08, 0x08, |
0x00, 0x80, 0x70, 0x30, 0x00, |
0x08, 0x08, 0x08, 0x08, 0x08, |
0x00, 0x00, 0x60, 0x60, 0x00, |
0x20, 0x10, 0x08, 0x04, 0x02, |
0x3E, 0x51, 0x49, 0x45, 0x3E, |
0x00, 0x42, 0x7F, 0x40, 0x00, |
0x72, 0x49, 0x49, 0x49, 0x46, |
0x21, 0x41, 0x49, 0x4D, 0x33, |
0x18, 0x14, 0x12, 0x7F, 0x10, |
0x27, 0x45, 0x45, 0x45, 0x39, |
0x3C, 0x4A, 0x49, 0x49, 0x31, |
0x41, 0x21, 0x11, 0x09, 0x07, |
0x36, 0x49, 0x49, 0x49, 0x36, |
0x46, 0x49, 0x49, 0x29, 0x1E, |
0x00, 0x00, 0x14, 0x00, 0x00, |
0x00, 0x40, 0x34, 0x00, 0x00, |
0x00, 0x08, 0x14, 0x22, 0x41, |
0x14, 0x14, 0x14, 0x14, 0x14, |
0x00, 0x41, 0x22, 0x14, 0x08, |
0x02, 0x01, 0x59, 0x09, 0x06, |
0x3E, 0x41, 0x5D, 0x59, 0x4E, |
0x7C, 0x12, 0x11, 0x12, 0x7C, |
0x7F, 0x49, 0x49, 0x49, 0x36, |
0x3E, 0x41, 0x41, 0x41, 0x22, |
0x7F, 0x41, 0x41, 0x41, 0x3E, |
0x7F, 0x49, 0x49, 0x49, 0x41, |
0x7F, 0x09, 0x09, 0x09, 0x01, |
0x3E, 0x41, 0x41, 0x51, 0x73, |
0x7F, 0x08, 0x08, 0x08, 0x7F, |
0x00, 0x41, 0x7F, 0x41, 0x00, |
0x20, 0x40, 0x41, 0x3F, 0x01, |
0x7F, 0x08, 0x14, 0x22, 0x41, |
0x7F, 0x40, 0x40, 0x40, 0x40, |
0x7F, 0x02, 0x1C, 0x02, 0x7F, |
0x7F, 0x04, 0x08, 0x10, 0x7F, |
0x3E, 0x41, 0x41, 0x41, 0x3E, |
0x7F, 0x09, 0x09, 0x09, 0x06, |
0x3E, 0x41, 0x51, 0x21, 0x5E, |
0x7F, 0x09, 0x19, 0x29, 0x46, |
0x26, 0x49, 0x49, 0x49, 0x32, |
0x03, 0x01, 0x7F, 0x01, 0x03, |
0x3F, 0x40, 0x40, 0x40, 0x3F, |
0x1F, 0x20, 0x40, 0x20, 0x1F, |
0x3F, 0x40, 0x38, 0x40, 0x3F, |
0x63, 0x14, 0x08, 0x14, 0x63, |
0x03, 0x04, 0x78, 0x04, 0x03, |
0x61, 0x59, 0x49, 0x4D, 0x43, |
0x00, 0x7F, 0x41, 0x41, 0x41, |
0x02, 0x04, 0x08, 0x10, 0x20, |
0x00, 0x41, 0x41, 0x41, 0x7F, |
0x04, 0x02, 0x01, 0x02, 0x04, |
0x40, 0x40, 0x40, 0x40, 0x40, |
0x00, 0x03, 0x07, 0x08, 0x00, |
0x20, 0x54, 0x54, 0x78, 0x40, |
0x7F, 0x28, 0x44, 0x44, 0x38, |
0x38, 0x44, 0x44, 0x44, 0x28, |
0x38, 0x44, 0x44, 0x28, 0x7F, |
0x38, 0x54, 0x54, 0x54, 0x18, |
0x00, 0x08, 0x7E, 0x09, 0x02, |
0x18, 0xA4, 0xA4, 0x9C, 0x78, |
0x7F, 0x08, 0x04, 0x04, 0x78, |
0x00, 0x44, 0x7D, 0x40, 0x00, |
0x20, 0x40, 0x40, 0x3D, 0x00, |
0x7F, 0x10, 0x28, 0x44, 0x00, |
0x00, 0x41, 0x7F, 0x40, 0x00, |
0x7C, 0x04, 0x78, 0x04, 0x78, |
0x7C, 0x08, 0x04, 0x04, 0x78, |
0x38, 0x44, 0x44, 0x44, 0x38, |
0xFC, 0x18, 0x24, 0x24, 0x18, |
0x18, 0x24, 0x24, 0x18, 0xFC, |
0x7C, 0x08, 0x04, 0x04, 0x08, |
0x48, 0x54, 0x54, 0x54, 0x24, |
0x04, 0x04, 0x3F, 0x44, 0x24, |
0x3C, 0x40, 0x40, 0x20, 0x7C, |
0x1C, 0x20, 0x40, 0x20, 0x1C, |
0x3C, 0x40, 0x30, 0x40, 0x3C, |
0x44, 0x28, 0x10, 0x28, 0x44, |
0x4C, 0x90, 0x90, 0x90, 0x7C, |
0x44, 0x64, 0x54, 0x4C, 0x44, |
0x00, 0x08, 0x36, 0x41, 0x00, |
0x00, 0x00, 0x77, 0x00, 0x00, |
0x00, 0x41, 0x36, 0x08, 0x00, |
0x02, 0x01, 0x02, 0x04, 0x02, |
0x3C, 0x26, 0x23, 0x26, 0x3C, |
0x1E, 0xA1, 0xA1, 0x61, 0x12, |
0x3A, 0x40, 0x40, 0x20, 0x7A, |
0x38, 0x54, 0x54, 0x55, 0x59, |
0x21, 0x55, 0x55, 0x79, 0x41, |
0x21, 0x54, 0x54, 0x78, 0x41, |
0x21, 0x55, 0x54, 0x78, 0x40, |
0x20, 0x54, 0x55, 0x79, 0x40, |
0x0C, 0x1E, 0x52, 0x72, 0x12, |
0x39, 0x55, 0x55, 0x55, 0x59, |
0x39, 0x54, 0x54, 0x54, 0x59, |
0x39, 0x55, 0x54, 0x54, 0x58, |
0x00, 0x00, 0x45, 0x7C, 0x41, |
0x00, 0x02, 0x45, 0x7D, 0x42, |
0x00, 0x01, 0x45, 0x7C, 0x40, |
0xF0, 0x29, 0x24, 0x29, 0xF0, |
0xF0, 0x28, 0x25, 0x28, 0xF0, |
0x7C, 0x54, 0x55, 0x45, 0x00, |
0x20, 0x54, 0x54, 0x7C, 0x54, |
0x7C, 0x0A, 0x09, 0x7F, 0x49, |
0x32, 0x49, 0x49, 0x49, 0x32, |
0x32, 0x48, 0x48, 0x48, 0x32, |
0x32, 0x4A, 0x48, 0x48, 0x30, |
0x3A, 0x41, 0x41, 0x21, 0x7A, |
0x3A, 0x42, 0x40, 0x20, 0x78, |
0x00, 0x9D, 0xA0, 0xA0, 0x7D, |
0x39, 0x44, 0x44, 0x44, 0x39, |
0x3D, 0x40, 0x40, 0x40, 0x3D, |
0x3C, 0x24, 0xFF, 0x24, 0x24, |
0x48, 0x7E, 0x49, 0x43, 0x66, |
0x2B, 0x2F, 0xFC, 0x2F, 0x2B, |
0xFF, 0x09, 0x29, 0xF6, 0x20, |
0xC0, 0x88, 0x7E, 0x09, 0x03, |
0x20, 0x54, 0x54, 0x79, 0x41, |
0x00, 0x00, 0x44, 0x7D, 0x41, |
0x30, 0x48, 0x48, 0x4A, 0x32, |
0x38, 0x40, 0x40, 0x22, 0x7A, |
0x00, 0x7A, 0x0A, 0x0A, 0x72, |
0x7D, 0x0D, 0x19, 0x31, 0x7D, |
0x26, 0x29, 0x29, 0x2F, 0x28, |
0x26, 0x29, 0x29, 0x29, 0x26, |
0x30, 0x48, 0x4D, 0x40, 0x20, |
0x38, 0x08, 0x08, 0x08, 0x08, |
0x08, 0x08, 0x08, 0x08, 0x38, |
0x2F, 0x10, 0xC8, 0xAC, 0xBA, |
0x2F, 0x10, 0x28, 0x34, 0xFA, |
0x00, 0x00, 0x7B, 0x00, 0x00, |
0x08, 0x14, 0x2A, 0x14, 0x22, |
0x22, 0x14, 0x2A, 0x14, 0x08, |
0xAA, 0x00, 0x55, 0x00, 0xAA, |
0xAA, 0x55, 0xAA, 0x55, 0xAA, |
0x00, 0x00, 0x00, 0xFF, 0x00, |
0x10, 0x10, 0x10, 0xFF, 0x00, |
0x14, 0x14, 0x14, 0xFF, 0x00, |
0x10, 0x10, 0xFF, 0x00, 0xFF, |
0x10, 0x10, 0xF0, 0x10, 0xF0, |
0x14, 0x14, 0x14, 0xFC, 0x00, |
0x14, 0x14, 0xF7, 0x00, 0xFF, |
0x00, 0x00, 0xFF, 0x00, 0xFF, |
0x14, 0x14, 0xF4, 0x04, 0xFC, |
0x14, 0x14, 0x17, 0x10, 0x1F, |
0x10, 0x10, 0x1F, 0x10, 0x1F, |
0x14, 0x14, 0x14, 0x1F, 0x00, |
0x10, 0x10, 0x10, 0xF0, 0x00, |
0x00, 0x00, 0x00, 0x1F, 0x10, |
0x10, 0x10, 0x10, 0x1F, 0x10, |
0x10, 0x10, 0x10, 0xF0, 0x10, |
0x00, 0x00, 0x00, 0xFF, 0x10, |
0x10, 0x10, 0x10, 0x10, 0x10, |
0x10, 0x10, 0x10, 0xFF, 0x10, |
0x00, 0x00, 0x00, 0xFF, 0x14, |
0x00, 0x00, 0xFF, 0x00, 0xFF, |
0x00, 0x00, 0x1F, 0x10, 0x17, |
0x00, 0x00, 0xFC, 0x04, 0xF4, |
0x14, 0x14, 0x17, 0x10, 0x17, |
0x14, 0x14, 0xF4, 0x04, 0xF4, |
0x00, 0x00, 0xFF, 0x00, 0xF7, |
0x14, 0x14, 0x14, 0x14, 0x14, |
0x14, 0x14, 0xF7, 0x00, 0xF7, |
0x14, 0x14, 0x14, 0x17, 0x14, |
0x10, 0x10, 0x1F, 0x10, 0x1F, |
0x14, 0x14, 0x14, 0xF4, 0x14, |
0x10, 0x10, 0xF0, 0x10, 0xF0, |
0x00, 0x00, 0x1F, 0x10, 0x1F, |
0x00, 0x00, 0x00, 0x1F, 0x14, |
0x00, 0x00, 0x00, 0xFC, 0x14, |
0x00, 0x00, 0xF0, 0x10, 0xF0, |
0x10, 0x10, 0xFF, 0x10, 0xFF, |
0x14, 0x14, 0x14, 0xFF, 0x14, |
0x10, 0x10, 0x10, 0x1F, 0x00, |
0x00, 0x00, 0x00, 0xF0, 0x10, |
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, |
0xFF, 0xFF, 0xFF, 0x00, 0x00, |
0x00, 0x00, 0x00, 0xFF, 0xFF, |
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, |
0x38, 0x44, 0x44, 0x38, 0x44, |
0x7C, 0x2A, 0x2A, 0x3E, 0x14, |
0x7E, 0x02, 0x02, 0x06, 0x06, |
0x02, 0x7E, 0x02, 0x7E, 0x02, |
0x63, 0x55, 0x49, 0x41, 0x63, |
0x38, 0x44, 0x44, 0x3C, 0x04, |
0x40, 0x7E, 0x20, 0x1E, 0x20, |
0x06, 0x02, 0x7E, 0x02, 0x02, |
0x99, 0xA5, 0xE7, 0xA5, 0x99, |
0x1C, 0x2A, 0x49, 0x2A, 0x1C, |
0x4C, 0x72, 0x01, 0x72, 0x4C, |
0x30, 0x4A, 0x4D, 0x4D, 0x30, |
0x30, 0x48, 0x78, 0x48, 0x30, |
0xBC, 0x62, 0x5A, 0x46, 0x3D, |
0x3E, 0x49, 0x49, 0x49, 0x00, |
0x7E, 0x01, 0x01, 0x01, 0x7E, |
0x2A, 0x2A, 0x2A, 0x2A, 0x2A, |
0x44, 0x44, 0x5F, 0x44, 0x44, |
0x40, 0x51, 0x4A, 0x44, 0x40, |
0x40, 0x44, 0x4A, 0x51, 0x40, |
0x00, 0x00, 0xFF, 0x01, 0x03, |
0xE0, 0x80, 0xFF, 0x00, 0x00, |
0x08, 0x08, 0x6B, 0x6B, 0x08, |
0x36, 0x12, 0x36, 0x24, 0x36, |
0x06, 0x0F, 0x09, 0x0F, 0x06, |
0x00, 0x00, 0x18, 0x18, 0x00, |
0x00, 0x00, 0x10, 0x10, 0x00, |
0x30, 0x40, 0xFF, 0x01, 0x01, |
0x00, 0x1F, 0x01, 0x01, 0x1E, |
0x00, 0x19, 0x1D, 0x17, 0x12, |
0x00, 0x3C, 0x3C, 0x3C, 0x3C, |
0x00, 0x00, 0x00, 0x00, 0x00, |
}; |
#endif |
/PIC Stuff/PIC_27J13/i2c.h |
---|
0,0 → 1,81 |
#ifndef __i2c_h |
#define __i2c_h |
#define MAXI2CBUF 64 |
// I2C Operating Speed |
#define I2C_400KHZ 0x0 |
#define I2C_100KHZ 0x1 |
// Operating State |
#define I2C_IDLE 0x1 |
#define I2C_STARTED 0x2 |
#define I2C_RCV_DATA 0x3 |
#define I2C_SEND_DATA 0x4 |
#define I2C_SEND_ADDR 0x5 |
#define I2C_SEND_ADDR_2 0x6 |
#define I2C_CHECK_ACK_SEND 0x7 |
#define I2C_CHECK_ACK_RECV 0x8 |
#define I2C_CHECK_ACK_RESTART 0x9 |
#define I2C_REQ_DATA 0xA |
#define I2C_SEND_STOP 0xB |
#define I2C_SEND_START 0xC |
// Operating Mode |
#define I2C_MODE_SLAVE 0x10 |
#define I2C_MODE_MASTER 0x11 |
// Master Status |
#define I2C_MASTER_SEND 0x20 |
#define I2C_MASTER_RECV 0x21 |
#define I2C_MASTER_RESTART 0x22 |
#define I2C_MASTER_IDLE 0x23 |
// Return Status |
#define I2C_SEND_OK 0x30 |
#define I2C_SEND_FAIL 0x31 |
#define I2C_RECV_OK 0x32 |
#define I2C_RECV_FAIL 0x33 |
#define I2C_DATA_AVAL 0x34 |
#define I2C_ERR_NOADDR 0x35 |
#define I2C_ERR_OVERRUN 0x36 |
#define I2C_ERR_NODATA 0x37 |
#define I2C_ERR_BUFFER_OVERRUN 0x38 |
typedef struct __I2C_DATA { |
unsigned char buffer_in[MAXI2CBUF]; |
unsigned char buffer_in_len; |
unsigned char buffer_in_len_tmp; |
unsigned char buffer_in_read_ind; |
unsigned char buffer_in_write_ind; |
unsigned char buffer_out[MAXI2CBUF]; |
unsigned char buffer_out_len; |
unsigned char buffer_out_ind; |
unsigned char operating_mode; |
unsigned char operating_state; |
unsigned char return_status; |
unsigned char master_dest_addr; |
unsigned char master_status; |
unsigned char slave_in_last_byte; |
unsigned char slave_sending_data; |
} I2C_DATA; |
void I2C_Init(void); |
void I2C_Interrupt_Handler(void); |
void I2C_Interrupt_Slave(void); |
void I2C_Interrupt_Master(void); |
void I2C_Configure_Slave(unsigned char); |
void I2C_Configure_Master(unsigned char speed); |
void I2C_Master_Send(unsigned char address, unsigned char length,unsigned char *msg); |
void I2C_Master_Recv(unsigned char address, unsigned char length); |
void I2C_Master_Restart(unsigned char address, unsigned char msg, unsigned char length); |
unsigned char I2C_Get_Status(void); |
unsigned char I2C_Buffer_Len(void); |
unsigned char I2C_Read_Buffer(char *buffer); |
unsigned char I2C_Process_Send(unsigned char); |
#endif |
/PIC Stuff/PIC_27J13/interrupts.c |
---|
0,0 → 1,223 |
#include "maindefs.h" |
#include "uart.h" |
#include "i2c.h" |
#include "spi.h" |
#include "interrupts.h" |
//---------------------------------------------------------------------------- |
// Note: This code for processing interrupts is configured to allow for high and |
// low priority interrupts. The high priority interrupt can interrupt the |
// the processing of a low priority interrupt. However, only one of each type |
// can be processed at the same time. It is possible to enable nesting of low |
// priority interrupts, but this code is not setup for that and this nesting |
// is not enabled. |
void interrupt_init() { |
// Peripheral interrupts can have their priority set to high or low |
// Decide on the priority of the enabled peripheral interrupts (0 is low, 1 is high) |
// High priority interrupts |
IPR1bits.RC1IP = 1; // USART1 RX interrupt |
IPR1bits.TX1IP = 1; // USART1 TX interrupt |
// IPR3bits.RC2IP = 1; // USART2 RX interrupt |
IPR1bits.SSPIP = 1; // I2C interrupt |
IPR3bits.SSP2IP = 1; // MSSP2 (SPI2) interrupt |
// Low priority interrupts |
// INTCON2bits.TMR0IP = 0; // Timer0 interrupt |
// IPR1bits.TMR1IP = 0; // Timer1 interrupt |
// IPR2bits.TMR3IP = 0; // Timer 3 interrupt |
// IPR1bits.ADIP = 0; // ADC interupt |
// INTCON2bits.RBIP = 0; // Port B interrupt |
// INTCON3bits.INT1IP = 0; // INT1 interrupt |
// Enable Port B interrupt |
// INTCONbits.RBIE = 1; |
// Enable interrupt for INT1 |
// INTCON3bits.INT1IE = 1; |
} |
void interrupt_enable() { |
// Peripheral interrupts can have their priority set to high or low. |
// Enable both high-priority interrupts and low-priority interrupts |
RCONbits.IPEN = 1; |
INTCONbits.GIEH = 1; |
INTCONbits.GIEL = 1; |
} |
int interrupt_in_high_interrupt_routine() { |
return (!INTCONbits.GIEH); |
} |
int interrupt_low_int_active() { |
return (!INTCONbits.GIEL); |
} |
int interrupt_in_low_interrupt_routine() { |
if (INTCONbits.GIEL == 1) { |
return (0); |
} else if (interrupt_in_high_interrupt_routine()) { |
return (0); |
} else { |
return (1); |
} |
} |
int interrupt_in_main_routine() { |
if ((!interrupt_in_low_interrupt_routine()) && (!interrupt_in_high_interrupt_routine())) { |
return (1); |
} else { |
return (0); |
} |
} |
// Set up the interrupt vectors |
void InterruptHandlerHigh(); |
void InterruptHandlerLow(); |
#pragma code InterruptVectorLow = 0x18 |
void InterruptVectorLow(void) { |
_asm |
goto InterruptHandlerLow //jump to interrupt routine |
_endasm |
} |
#pragma code InterruptVectorHigh = 0x08 |
void InterruptVectorHigh(void) { |
_asm |
goto InterruptHandlerHigh //jump to interrupt routine |
_endasm |
} |
//---------------------------------------------------------------------------- |
// High priority interrupt routine |
// this parcels out interrupts to individual handlers |
#pragma code |
#pragma interrupt InterruptHandlerHigh |
void InterruptHandlerHigh() { |
// We need to check the interrupt flag of each enabled high-priority interrupt to |
// see which device generated this interrupt. Then we can call the correct handler. |
// Check to see if we have an SPI2 interrupt |
if (PIR3bits.SSP2IF) { |
// Call the handler |
SPI2_Recv_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR3bits.SSP2IF = 0; |
return; |
} |
// Check to see if we have an I2C interrupt |
if (PIR1bits.SSPIF) { |
// Call the handler |
I2C_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.SSPIF = 0; |
return; |
} |
// Check to see if we have an interrupt on USART1 RX |
if (PIR1bits.RC1IF) { |
// Call the interrupt handler |
UART1_Recv_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.RC1IF = 0; |
return; |
} |
#ifndef _DEBUG // Disable UART1 TX interrupt for debug mode (using printf) |
// Check to see if we have an interrupt on USART1 TX |
if (PIR1bits.TX1IF) { |
// Call the interrupt handler |
UART1_Send_Interrupt_Handler(); |
// Clear the interrupt flag |
PIR1bits.TX1IF = 0; |
return; |
} |
#endif |
// // Check to see if we have an interrupt on USART2 RX |
// if (PIR3bits.RC2IF) { |
// DBG_PRINT_INT("INT: UART2 RX\r\n"); |
// // Call the interrupt handler |
// uart_2_recv_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR3bits.RC2IF = 0; |
// } |
} |
//---------------------------------------------------------------------------- |
// Low priority interrupt routine |
// this parcels out interrupts to individual handlers |
#pragma code |
#pragma interruptlow InterruptHandlerLow |
// This works the same way as the "High" interrupt handler |
void InterruptHandlerLow() { |
// // Check to see if we have an interrupt on INT1 |
// if (INTCON3bits.INT1IF) { |
// DBG_PRINT_INT("INT: INT1\r\n"); |
// int1_interrupt_handler(); |
// |
// INTCON3bits.INT1IF = 0; |
// } |
// // Check to see if we have an interrupt on any port B inputs <4:7> |
// if (INTCONbits.RBIF) { |
// DBG_PRINT_INT("INT: Port B\r\n"); |
// port_b_int_interrupt_handler(); |
// |
// INTCONbits.RBIF = 0; |
// } |
// // Check to see if we have an interrupt on timer 0 |
// if (INTCONbits.TMR0IF) { |
// DBG_PRINT_INT("INT: Timer 0\r\n"); |
// // Call the handler |
// timer0_interrupt_handler(); |
// |
// // Clear this interrupt flag |
// INTCONbits.TMR0IF = 0; |
// } |
// // Check to see if we have an interrupt on timer 1 |
// if (PIR1bits.TMR1IF) { |
// // Call the interrupt handler |
// timer1_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR1bits.TMR1IF = 0; |
// } |
// // Check to see if we have an interrupt on timer 3 |
// if (PIR2bits.TMR3IF) { |
// DBG_PRINT_INT("INT: Timer 3\r\n"); |
// timer3_interrupt_handler(); |
// |
// PIR2bits.TMR3IF = 0; |
// } |
// // Check to see if we have an interrupt on ADC |
// if (PIR1bits.ADIF) { |
// // Call the interrupt handler |
// adc_interrupt_handler(); |
// |
// // Clear the interrupt flag |
// PIR1bits.ADIF = 0; |
// } |
} |
/PIC Stuff/PIC_27J13/led_backpack.c |
---|
0,0 → 1,135 |
#include "led_backpack.h" |
#include "i2c.h" |
static const char numbertable[] = { |
0x3F /* 0 */, |
0x06 /* 1 */, |
0x5B /* 2 */, |
0x4F /* 3 */, |
0x66 /* 4 */, |
0x6D /* 5 */, |
0x7D, /* 6 */ |
0x07, /* 7 */ |
0x7F, /* 8 */ |
0x6F, /* 9 */ |
}; |
static const char alphatable[] = { |
0x77, /* a */ |
0x7C, /* b */ |
0x39, /* C */ |
0x5E, /* d */ |
0x79, /* E */ |
0x71, /* F */ |
}; |
static LED_DATA led_data; |
void LED_Init() { |
led_data.i2c_address = 0x70; |
} |
void LED_Start() { |
unsigned char result; |
unsigned char c = 0x21; // Cmd to turn on oscillator |
I2C_Master_Send(led_data.i2c_address, 1, &c); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
LED_blinkRate(HT16K33_BLINK_OFF); |
LED_setBrightness(15); // Max brightness |
LED_clear(); |
} |
void LED_setBrightness(unsigned char c) { |
unsigned char result; |
if (c > 15) c = 15; |
c |= 0xE0; |
I2C_Master_Send(led_data.i2c_address, 1, &c); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
} |
void LED_blinkRate(unsigned char c) { |
unsigned char buffer; |
if (c > 3) c = 0; |
buffer = HT16K33_BLINK_CMD | HT16K33_BLINK_DISPLAYON | (c << 1); |
I2C_Master_Send(led_data.i2c_address, 1, &buffer); |
buffer = I2C_Get_Status(); |
while (!buffer) { |
buffer = I2C_Get_Status(); |
} |
} |
void LED_writeDisplay() { |
unsigned char result; |
led_data.display_buffer[0] = 0x00; // Start at address 0x00 |
I2C_Master_Send(led_data.i2c_address, 17, led_data.display_buffer); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
} |
void LED_clear() { |
unsigned char c; |
for (c = 0; c < 17; c++) { |
led_data.display_buffer[c] = 0; |
} |
} |
void LED_drawColon(unsigned char c) { |
if (c) { |
led_data.display_buffer[5] = 0xFF; |
} else { |
led_data.display_buffer[5] = 0; |
} |
} |
void LED_writeDigitRaw(unsigned char loc, unsigned char bitmask) { |
if (loc > 4) return; |
led_data.display_buffer[(loc<<1)+1] = bitmask; |
} |
void LED_writeDigitNum(unsigned char loc, unsigned char num, unsigned char dot) { |
if (loc > 4) return; |
if (loc > 1) loc++; |
LED_writeDigitRaw(loc, numbertable[num] | dot << 7); |
} |
void LED_writeDigitAlpha(unsigned char loc, unsigned char alpha, unsigned char dot) { |
if (loc > 4) return; |
if (loc > 1) loc++; |
LED_writeDigitRaw(loc, alphatable[alpha] | dot << 7); |
} |
void LED_writeNum(unsigned int i) { |
LED_writeDigitNum(0, (i%10000)/1000, 0); |
LED_writeDigitNum(1, (i%1000)/100, 0); |
LED_writeDigitNum(2, (i%100)/10, 0); |
LED_writeDigitNum(3, i%10, 0); |
if (i < 10) { |
LED_writeDigitRaw(0, 0); |
LED_writeDigitRaw(1, 0); |
LED_writeDigitRaw(3, 0); |
} else if (i < 100) { |
LED_writeDigitRaw(0, 0); |
LED_writeDigitRaw(1, 0); |
} else if (i < 1000) { |
LED_writeDigitRaw(0, 0); |
} |
LED_writeDisplay(); |
} |
/PIC Stuff/PIC_27J13/led_backpack.h |
---|
0,0 → 1,32 |
#ifndef LED_BACKPACK_H |
#define LED_BACKPACK_H |
#define HT16K33_BLINK_CMD 0x80 |
#define HT16K33_BLINK_DISPLAYON 0x01 |
#define HT16K33_BLINK_OFF 0 |
#define HT16K33_BLINK_2HZ 1 |
#define HT16K33_BLINK_1HZ 2 |
#define HT16K33_BLINK_HALFHZ 3 |
#define HT16K33_CMD_BRIGHTNESS 0x0E |
typedef struct { |
unsigned char i2c_address; |
unsigned char display_buffer[17]; |
} LED_DATA; |
void LED_Init(void); |
void LED_Start(void); |
void LED_setBrightness(unsigned char c); |
void LED_blinkRate(unsigned char c); |
void LED_writeDisplay(void); |
void LED_clear(void); |
void LED_drawColon(unsigned char c); |
void LED_writeDigitRaw(unsigned char loc, unsigned char bitmask); |
void LED_writeDigitNum(unsigned char loc, unsigned char num, unsigned char dot); |
void LED_writeDigitAlpha(unsigned char loc, unsigned char alpha, unsigned char dot); |
void LED_writeNum(unsigned int i); |
#endif /* LED_BACKPACK_H */ |
/PIC Stuff/PIC_27J13/nbproject/Makefile-default.mk |
---|
0,0 → 1,245 |
# |
# Generated Makefile - do not edit! |
# |
# Edit the Makefile in the project folder instead (../Makefile). Each target |
# has a -pre and a -post target defined where you can add customized code. |
# |
# This makefile implements configuration specific macros and targets. |
# Include project Makefile |
include Makefile |
# Include makefile containing local settings |
ifeq "$(wildcard nbproject/Makefile-local-default.mk)" "nbproject/Makefile-local-default.mk" |
include nbproject/Makefile-local-default.mk |
endif |
# Environment |
MKDIR=gnumkdir -p |
RM=rm -f |
MV=mv |
CP=cp |
# Macros |
CND_CONF=default |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
IMAGE_TYPE=debug |
OUTPUT_SUFFIX=cof |
DEBUGGABLE_SUFFIX=cof |
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
else |
IMAGE_TYPE=production |
OUTPUT_SUFFIX=hex |
DEBUGGABLE_SUFFIX=cof |
FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
endif |
# Object Directory |
OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} |
# Distribution Directory |
DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} |
# Object Files Quoted if spaced |
OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/main.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_backpack.o ${OBJECTDIR}/nfc.o ${OBJECTDIR}/spi.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/oled_ssd1306.o ${OBJECTDIR}/glcdfont.o ${OBJECTDIR}/Adafruit_GFX.o ${OBJECTDIR}/oled_ssd1331.o |
POSSIBLE_DEPFILES=${OBJECTDIR}/main.o.d ${OBJECTDIR}/i2c.o.d ${OBJECTDIR}/interrupts.o.d ${OBJECTDIR}/led_backpack.o.d ${OBJECTDIR}/nfc.o.d ${OBJECTDIR}/spi.o.d ${OBJECTDIR}/uart.o.d ${OBJECTDIR}/oled_ssd1306.o.d ${OBJECTDIR}/glcdfont.o.d ${OBJECTDIR}/Adafruit_GFX.o.d ${OBJECTDIR}/oled_ssd1331.o.d |
# Object Files |
OBJECTFILES=${OBJECTDIR}/main.o ${OBJECTDIR}/i2c.o ${OBJECTDIR}/interrupts.o ${OBJECTDIR}/led_backpack.o ${OBJECTDIR}/nfc.o ${OBJECTDIR}/spi.o ${OBJECTDIR}/uart.o ${OBJECTDIR}/oled_ssd1306.o ${OBJECTDIR}/glcdfont.o ${OBJECTDIR}/Adafruit_GFX.o ${OBJECTDIR}/oled_ssd1331.o |
CFLAGS= |
ASFLAGS= |
LDLIBSOPTIONS= |
############# Tool locations ########################################## |
# If you copy a project from one host to another, the path where the # |
# compiler is installed may be different. # |
# If you open this project with MPLAB X in the new host, this # |
# makefile will be regenerated and the paths will be corrected. # |
####################################################################### |
# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build |
FIXDEPS=fixDeps |
.build-conf: ${BUILD_SUBPROJECTS} |
${MAKE} -f nbproject/Makefile-default.mk dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
MP_PROCESSOR_OPTION=18F27J13 |
MP_PROCESSOR_OPTION_LD=18f27j13 |
MP_LINKER_DEBUG_OPTION= |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: assemble |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
else |
endif |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: compile |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/main.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c |
@${DEP_GEN} -d ${OBJECTDIR}/main.o |
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/i2c.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c |
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o |
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/interrupts.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c |
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.o |
${OBJECTDIR}/led_backpack.o: led_backpack.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/led_backpack.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/led_backpack.o led_backpack.c |
@${DEP_GEN} -d ${OBJECTDIR}/led_backpack.o |
${OBJECTDIR}/nfc.o: nfc.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/nfc.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/nfc.o nfc.c |
@${DEP_GEN} -d ${OBJECTDIR}/nfc.o |
${OBJECTDIR}/spi.o: spi.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/spi.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/spi.o spi.c |
@${DEP_GEN} -d ${OBJECTDIR}/spi.o |
${OBJECTDIR}/uart.o: uart.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/uart.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c |
@${DEP_GEN} -d ${OBJECTDIR}/uart.o |
${OBJECTDIR}/oled_ssd1306.o: oled_ssd1306.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/oled_ssd1306.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1306.o oled_ssd1306.c |
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1306.o |
${OBJECTDIR}/glcdfont.o: glcdfont.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/glcdfont.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/glcdfont.o glcdfont.c |
@${DEP_GEN} -d ${OBJECTDIR}/glcdfont.o |
${OBJECTDIR}/Adafruit_GFX.o: Adafruit_GFX.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/Adafruit_GFX.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/Adafruit_GFX.o Adafruit_GFX.c |
@${DEP_GEN} -d ${OBJECTDIR}/Adafruit_GFX.o |
${OBJECTDIR}/oled_ssd1331.o: oled_ssd1331.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/oled_ssd1331.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -D__DEBUG -D__MPLAB_DEBUGGER_PK3=1 -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1331.o oled_ssd1331.c |
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1331.o |
else |
${OBJECTDIR}/main.o: main.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/main.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/main.o main.c |
@${DEP_GEN} -d ${OBJECTDIR}/main.o |
${OBJECTDIR}/i2c.o: i2c.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/i2c.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/i2c.o i2c.c |
@${DEP_GEN} -d ${OBJECTDIR}/i2c.o |
${OBJECTDIR}/interrupts.o: interrupts.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/interrupts.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/interrupts.o interrupts.c |
@${DEP_GEN} -d ${OBJECTDIR}/interrupts.o |
${OBJECTDIR}/led_backpack.o: led_backpack.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/led_backpack.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/led_backpack.o led_backpack.c |
@${DEP_GEN} -d ${OBJECTDIR}/led_backpack.o |
${OBJECTDIR}/nfc.o: nfc.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/nfc.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/nfc.o nfc.c |
@${DEP_GEN} -d ${OBJECTDIR}/nfc.o |
${OBJECTDIR}/spi.o: spi.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/spi.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/spi.o spi.c |
@${DEP_GEN} -d ${OBJECTDIR}/spi.o |
${OBJECTDIR}/uart.o: uart.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/uart.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/uart.o uart.c |
@${DEP_GEN} -d ${OBJECTDIR}/uart.o |
${OBJECTDIR}/oled_ssd1306.o: oled_ssd1306.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/oled_ssd1306.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1306.o oled_ssd1306.c |
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1306.o |
${OBJECTDIR}/glcdfont.o: glcdfont.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/glcdfont.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/glcdfont.o glcdfont.c |
@${DEP_GEN} -d ${OBJECTDIR}/glcdfont.o |
${OBJECTDIR}/Adafruit_GFX.o: Adafruit_GFX.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/Adafruit_GFX.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/Adafruit_GFX.o Adafruit_GFX.c |
@${DEP_GEN} -d ${OBJECTDIR}/Adafruit_GFX.o |
${OBJECTDIR}/oled_ssd1331.o: oled_ssd1331.c nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} ${OBJECTDIR} |
@${RM} ${OBJECTDIR}/oled_ssd1331.o.d |
${MP_CC} $(MP_EXTRA_CC_PRE) -p$(MP_PROCESSOR_OPTION) -oi -mL -I ${MP_CC_DIR}\\..\\h -fo ${OBJECTDIR}/oled_ssd1331.o oled_ssd1331.c |
@${DEP_GEN} -d ${OBJECTDIR}/oled_ssd1331.o |
endif |
# ------------------------------------------------------------------------------------ |
# Rules for buildStep: link |
ifeq ($(TYPE_IMAGE), DEBUG_RUN) |
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_LD} $(MP_EXTRA_LD_PRE) "18f27j13.lkr" -p$(MP_PROCESSOR_OPTION_LD) -w -x -u_DEBUG -z__MPLAB_BUILD=1 -u_CRUNTIME -z__MPLAB_DEBUG=1 -z__MPLAB_DEBUGGER_PK3=1 $(MP_LINKER_DEBUG_OPTION) -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} |
else |
dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk |
@${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} |
${MP_LD} $(MP_EXTRA_LD_PRE) "18f27j13.lkr" -p$(MP_PROCESSOR_OPTION_LD) -w -z__MPLAB_BUILD=1 -u_CRUNTIME -l ${MP_CC_DIR}\\..\\lib -o dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} |
endif |
# Subprojects |
.build-subprojects: |
# Subprojects |
.clean-subprojects: |
# Clean Targets |
.clean-conf: ${CLEAN_SUBPROJECTS} |
${RM} -r build/default |
${RM} -r dist/default |
# Enable dependency checking |
.dep.inc: .depcheck-impl |
DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) |
ifneq (${DEPFILES},) |
include ${DEPFILES} |
endif |
/PIC Stuff/PIC_27J13/nbproject/Makefile-genesis.properties |
---|
0,0 → 1,8 |
# |
#Wed Jul 11 23:10:42 EDT 2012 |
default.com-microchip-mplab-nbide-toolchainC18-C18LanguageToolchain.md5=fd3c294f650afc344cfb0579847b1618 |
default.languagetoolchain.dir=C\:\\Program Files (x86)\\Microchip\\mplabc18\\v3.40\\bin |
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=39edbdd4b2849b7912992109f4b86781 |
default.languagetoolchain.version=3.40 |
host.platform=windows |
conf.ids=default |
/PIC Stuff/PIC_27J13/nbproject/configurations.xml |
---|
0,0 → 1,161 |
<?xml version="1.0" encoding="UTF-8"?> |
<configurationDescriptor version="62"> |
<logicalFolder name="root" displayName="root" projectFiles="true"> |
<logicalFolder name="HeaderFiles" |
displayName="Header Files" |
projectFiles="true"> |
<itemPath>i2c.h</itemPath> |
<itemPath>interrupts.h</itemPath> |
<itemPath>led_backpack.h</itemPath> |
<itemPath>maindefs.h</itemPath> |
<itemPath>nfc.h</itemPath> |
<itemPath>spi.h</itemPath> |
<itemPath>uart.h</itemPath> |
<itemPath>oled_ssd1306.h</itemPath> |
<itemPath>Adafruit_GFX.h</itemPath> |
<itemPath>oled_ssd1331.h</itemPath> |
</logicalFolder> |
<logicalFolder name="LibraryFiles" |
displayName="Library Files" |
projectFiles="true"> |
</logicalFolder> |
<logicalFolder name="LinkerScript" |
displayName="Linker Files" |
projectFiles="true"> |
<itemPath>18f27j13.lkr</itemPath> |
</logicalFolder> |
<logicalFolder name="ObjectFiles" |
displayName="Object Files" |
projectFiles="true"> |
</logicalFolder> |
<logicalFolder name="SourceFiles" |
displayName="Source Files" |
projectFiles="true"> |
<itemPath>main.c</itemPath> |
<itemPath>i2c.c</itemPath> |
<itemPath>interrupts.c</itemPath> |
<itemPath>led_backpack.c</itemPath> |
<itemPath>nfc.c</itemPath> |
<itemPath>spi.c</itemPath> |
<itemPath>uart.c</itemPath> |
<itemPath>oled_ssd1306.c</itemPath> |
<itemPath>glcdfont.c</itemPath> |
<itemPath>Adafruit_GFX.c</itemPath> |
<itemPath>oled_ssd1331.c</itemPath> |
</logicalFolder> |
<logicalFolder name="ExternalFiles" |
displayName="Important Files" |
projectFiles="false"> |
<itemPath>Makefile</itemPath> |
</logicalFolder> |
</logicalFolder> |
<projectmakefile>Makefile</projectmakefile> |
<confs> |
<conf name="default" type="2"> |
<toolsSet> |
<developmentServer>localhost</developmentServer> |
<targetDevice>PIC18F27J13</targetDevice> |
<targetHeader></targetHeader> |
<platformTool>PICkit3PlatformTool</platformTool> |
<languageToolchain>C18</languageToolchain> |
<languageToolchainVersion>3.40</languageToolchainVersion> |
<platform>3</platform> |
</toolsSet> |
<compileType> |
<linkerTool> |
<linkerLibItems> |
</linkerLibItems> |
</linkerTool> |
<loading> |
<useAlternateLoadableFile>false</useAlternateLoadableFile> |
<alternateLoadableFile></alternateLoadableFile> |
</loading> |
</compileType> |
<makeCustomizationType> |
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled> |
<makeCustomizationPreStep></makeCustomizationPreStep> |
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled> |
<makeCustomizationPostStep></makeCustomizationPostStep> |
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID> |
<makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines> |
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile> |
</makeCustomizationType> |
<C18> |
<property key="code-model" value="mL"/> |
<property key="data-model" value="Oa-"/> |
<property key="default-char-unsigned" value="false"/> |
<property key="enable-all-optimizations" value="true"/> |
<property key="enable-int-promotion" value="true"/> |
<property key="enable-multi-bank-stack-model" value="false"/> |
<property key="enable-ob" value="true"/> |
<property key="enable-od" value="true"/> |
<property key="enable-om" value="true"/> |
<property key="enable-on" value="true"/> |
<property key="enable-op" value="true"/> |
<property key="enable-opa" value="true"/> |
<property key="enable-or" value="true"/> |
<property key="enable-os" value="true"/> |
<property key="enable-ot" value="true"/> |
<property key="enable-ou" value="true"/> |
<property key="enable-ow" value="true"/> |
<property key="extra-include-directories" value=""/> |
<property key="optimization-master" value="Enable all"/> |
<property key="preprocessor-macros" value=""/> |
<property key="procedural-abstraction-passes" value="0"/> |
<property key="storage-class" value="sca"/> |
<property key="verbose" value="false"/> |
<property key="warning-level" value="2"/> |
</C18> |
<C18-AS> |
<property key="cross.reference.file" value=""/> |
<property key="default.radix" value="HEX"/> |
<property key="enable.case.sensitivity" value="true"/> |
<property key="hex.output.format" value="INHX32"/> |
<property key="preprocessor.macros" value=""/> |
<property key="warning.level" value="0"/> |
</C18-AS> |
<C18-LD> |
<property key="cod-file" value="false"/> |
<property key="extra-lib-directories" value=""/> |
<property key="hex-output-format" value="INHX32"/> |
<property key="map-file" value=""/> |
</C18-LD> |
<C18LanguageToolchain> |
<property key="extended-mode" value="false"/> |
<property key="extended-mode-mcc18" value="false"/> |
<property key="extended-mode-mpasm" value="false"/> |
<property key="extended-mode-mplink" value="false"/> |
<property key="stack-analysis" value="false"/> |
<property key="stack-analysis-mcc18" value="false"/> |
<property key="stack-analysis-mplink" value="false"/> |
</C18LanguageToolchain> |
<PICkit3PlatformTool> |
<property key="AutoSelectMemRanges" value="auto"/> |
<property key="Freeze Peripherals" value="true"/> |
<property key="SecureSegment.SegmentProgramming" value="FullChipProgramming"/> |
<property key="ToolFirmwareFilePath" |
value="Press to browse for a specific firmware version"/> |
<property key="ToolFirmwareOption.UseLatestFirmware" value="true"/> |
<property key="hwtoolclock.frcindebug" value="false"/> |
<property key="memories.aux" value="false"/> |
<property key="memories.eeprom" value="false"/> |
<property key="memories.flashdata" value="true"/> |
<property key="memories.id" value="false"/> |
<property key="memories.programmemory" value="true"/> |
<property key="memories.programmemory.end" value="0x1fff7"/> |
<property key="memories.programmemory.start" value="0x0"/> |
<property key="poweroptions.powerenable" value="false"/> |
<property key="programmertogo.imagename" value=""/> |
<property key="programoptions.eraseb4program" value="true"/> |
<property key="programoptions.preserveeeprom" value="false"/> |
<property key="programoptions.preserveprogramrange" value="false"/> |
<property key="programoptions.preserveprogramrange.end" value="0x3f"/> |
<property key="programoptions.preserveprogramrange.start" value="0x0"/> |
<property key="programoptions.preserveuserid" value="false"/> |
<property key="programoptions.usehighvoltageonmclr" value="false"/> |
<property key="programoptions.uselvpprogramming" value="false"/> |
<property key="voltagevalue" value="3.25"/> |
</PICkit3PlatformTool> |
</conf> |
</confs> |
</configurationDescriptor> |
/PIC Stuff/PIC_27J13/nbproject/private/configurations.xml |
---|
0,0 → 1,25 |
<?xml version="1.0" encoding="UTF-8"?> |
<configurationDescriptor version="62"> |
<projectmakefile>Makefile</projectmakefile> |
<defaultConf>0</defaultConf> |
<confs> |
<conf name="default" type="2"> |
<platformToolSN>:=MPLABCommUSB:=04D8:=900A:=0002:=Microchip Technology Inc.:=PICkit 3:=BUR114189291:=x:=en</platformToolSN> |
<languageToolchainDir>C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin</languageToolchainDir> |
<mdbdebugger version="1"> |
<placeholder1>place holder 1</placeholder1> |
<placeholder2>place holder 2</placeholder2> |
</mdbdebugger> |
<runprofile version="6"> |
<args></args> |
<rundir></rundir> |
<buildfirst>true</buildfirst> |
<console-type>0</console-type> |
<terminal-type>0</terminal-type> |
<remove-instrumentation>0</remove-instrumentation> |
<environment> |
</environment> |
</runprofile> |
</conf> |
</confs> |
</configurationDescriptor> |
/PIC Stuff/PIC_27J13/nbproject/private/private.properties |
---|
--- nbproject/private/private.xml (nonexistent) |
+++ nbproject/private/private.xml (revision 122) |
@@ -0,0 +1,4 @@ |
+<?xml version="1.0" encoding="UTF-8"?> |
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1"> |
+ <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/> |
+</project-private> |
/PIC Stuff/PIC_27J13/nbproject/Makefile-impl.mk |
---|
0,0 → 1,69 |
# |
# Generated Makefile - do not edit! |
# |
# Edit the Makefile in the project folder instead (../Makefile). Each target |
# has a pre- and a post- target defined where you can add customization code. |
# |
# This makefile implements macros and targets common to all configurations. |
# |
# NOCDDL |
# Building and Cleaning subprojects are done by default, but can be controlled with the SUB |
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro |
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf |
# and .clean-reqprojects-conf unless SUB has the value 'no' |
SUB_no=NO |
SUBPROJECTS=${SUB_${SUB}} |
BUILD_SUBPROJECTS_=.build-subprojects |
BUILD_SUBPROJECTS_NO= |
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} |
CLEAN_SUBPROJECTS_=.clean-subprojects |
CLEAN_SUBPROJECTS_NO= |
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} |
# Project Name |
PROJECTNAME=PIC_27J13 |
# Active Configuration |
DEFAULTCONF=default |
CONF=${DEFAULTCONF} |
# All Configurations |
ALLCONFS=default |
# build |
.build-impl: .build-pre |
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf |
# clean |
.clean-impl: .clean-pre |
${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf |
# clobber |
.clobber-impl: .clobber-pre .depcheck-impl |
${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean |
# all |
.all-impl: .all-pre .depcheck-impl |
${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build |
# dependency checking support |
.depcheck-impl: |
# @echo "# This code depends on make tool being used" >.dep.inc |
# @if [ -n "${MAKE_VERSION}" ]; then \ |
# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ |
# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ |
# echo "include \$${DEPFILES}" >>.dep.inc; \ |
# echo "endif" >>.dep.inc; \ |
# else \ |
# echo ".KEEP_STATE:" >>.dep.inc; \ |
# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ |
# fi |
/PIC Stuff/PIC_27J13/nbproject/Makefile-local-default.mk |
---|
0,0 → 1,35 |
# |
# Generated Makefile - do not edit! |
# |
# |
# This file contains information about the location of compilers and other tools. |
# If you commmit this file into your revision control server, you will be able to |
# to checkout the project and build it from the command line with make. However, |
# if more than one person works on the same project, then this file might show |
# conflicts since different users are bound to have compilers in different places. |
# In that case you might choose to not commit this file and let MPLAB X recreate this file |
# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at |
# least once so the file gets created and the project can be built. Finally, you can also |
# avoid using this file at all if you are only building from the command line with make. |
# You can invoke make with the values of the macros: |
# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... |
# |
SHELL=cmd.exe |
PATH_TO_IDE_BIN=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/ |
# Adding MPLAB X bin directory to path. |
PATH:=C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/:$(PATH) |
# Path to java used to run MPLAB X when this makefile was created |
MP_JAVA_PATH="C:\Program Files (x86)\Microchip\MPLABX\sys\java\jre1.6.0_32-windows-x64\java-windows/bin/" |
OS_CURRENT="$(shell uname -s)" |
MP_CC="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mcc18.exe" |
# MP_BC is not defined |
MP_AS="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\..\mpasm\MPASMWIN.exe" |
MP_LD="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mplink.exe" |
MP_AR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mplib.exe" |
DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplab_ide/modules/../../bin/extractobjectdependencies.jar" |
MP_CC_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin" |
# MP_BC_DIR is not defined |
MP_AS_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\..\mpasm" |
MP_LD_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin" |
MP_AR_DIR="C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin" |
# MP_BC_DIR is not defined |
/PIC Stuff/PIC_27J13/nbproject/Makefile-variables.mk |
---|
0,0 → 1,13 |
# |
# Generated - do not edit! |
# |
# NOCDDL |
# |
CND_BASEDIR=`pwd` |
# default configuration |
CND_ARTIFACT_DIR_default=dist/default/production |
CND_ARTIFACT_NAME_default=PIC_27J13.production.hex |
CND_ARTIFACT_PATH_default=dist/default/production/PIC_27J13.production.hex |
CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package |
CND_PACKAGE_NAME_default=pic27j13.tar |
CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/pic27j13.tar |
/PIC Stuff/PIC_27J13/nbproject/Package-default.bash |
---|
0,0 → 1,73 |
#!/bin/bash -x |
# |
# Generated - do not edit! |
# |
# Macros |
TOP=`pwd` |
CND_CONF=default |
CND_DISTDIR=dist |
TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging |
TMPDIRNAME=tmp-packaging |
OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
OUTPUT_BASENAME=PIC_27J13.${IMAGE_TYPE}.${OUTPUT_SUFFIX} |
PACKAGE_TOP_DIR=pic27j13/ |
# Functions |
function checkReturnCode |
{ |
rc=$? |
if [ $rc != 0 ] |
then |
exit $rc |
fi |
} |
function makeDirectory |
# $1 directory path |
# $2 permission (optional) |
{ |
mkdir -p "$1" |
checkReturnCode |
if [ "$2" != "" ] |
then |
chmod $2 "$1" |
checkReturnCode |
fi |
} |
function copyFileToTmpDir |
# $1 from-file path |
# $2 to-file path |
# $3 permission |
{ |
cp "$1" "$2" |
checkReturnCode |
if [ "$3" != "" ] |
then |
chmod $3 "$2" |
checkReturnCode |
fi |
} |
# Setup |
cd "${TOP}" |
mkdir -p ${CND_DISTDIR}/${CND_CONF}/package |
rm -rf ${TMPDIR} |
mkdir -p ${TMPDIR} |
# Copy files and create directories and links |
cd "${TOP}" |
makeDirectory ${TMPDIR}/pic27j13/bin |
copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 |
# Generate tar file |
cd "${TOP}" |
rm -f ${CND_DISTDIR}/${CND_CONF}/package/pic27j13.tar |
cd ${TMPDIR} |
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/pic27j13.tar * |
checkReturnCode |
# Cleanup |
cd "${TOP}" |
rm -rf ${TMPDIR} |
/PIC Stuff/PIC_27J13/nbproject/project.properties |
---|
--- nbproject/project.xml (nonexistent) |
+++ nbproject/project.xml (revision 122) |
@@ -0,0 +1,16 @@ |
+<?xml version="1.0" encoding="UTF-8"?> |
+<project xmlns="http://www.netbeans.org/ns/project/1"> |
+ <type>com.microchip.mplab.nbide.embedded.makeproject</type> |
+ <configuration> |
+ <data xmlns="http://www.netbeans.org/ns/make-project/1"> |
+ <name>PIC_27J13</name> |
+ <creation-uuid>116783ce-ce82-4f46-901c-ed02c852cd72</creation-uuid> |
+ <make-project-type>0</make-project-type> |
+ <c-extensions>c</c-extensions> |
+ <cpp-extensions/> |
+ <header-extensions>h</header-extensions> |
+ <sourceEncoding>ISO-8859-1</sourceEncoding> |
+ <make-dep-projects/> |
+ </data> |
+ </configuration> |
+</project> |
/PIC Stuff/PIC_27J13/nfc.c |
---|
0,0 → 1,402 |
#include "maindefs.h" |
#include "nfc.h" |
#include "i2c.h" |
#include <string.h> |
#include <delays.h> |
static NFC_DATA nfc_data; |
// Const value arrays for comparison use |
static char pn532response_firmwarevers[] = {0x01, 0x00, 0x00, 0xFF, 0x06, 0xFA, 0xD5, 0x03}; |
static char pn532ack[] = {0x01, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00}; |
void NFC_Init() { |
TRISCbits.TRISC1 = 1; // IRQ Pin is RC5 |
TRISCbits.TRISC2 = 0; // Reset Pin is RC2 |
// Reset the PN532 |
LATCbits.LATC2 = 1; |
LATCbits.LATC2 = 0; |
Delay10TCYx(1); |
LATCbits.LATC2 = 1; |
} |
// Configures the SAM (Secure Access Module) |
unsigned char NFC_SAMConfig() { |
nfc_data.packetbuffer[0] = PN532_COMMAND_SAMCONFIGURATION; |
nfc_data.packetbuffer[1] = 0x01; // Normal mode |
nfc_data.packetbuffer[2] = 0x14; // Timeout 50ms * 20 = 1s |
nfc_data.packetbuffer[3] = 0x01; // Use IRQ pin |
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 4)) |
return 0; |
NFC_I2C_Read_Data(nfc_data.packetbuffer, 8); |
return (nfc_data.packetbuffer[7] == 0x15); |
} |
// Checks the firmware version of the PN5xx chip |
NFC_FIRMWARE_VERSION NFC_getFirmwareVersion(void) { |
NFC_FIRMWARE_VERSION response = {0,0,0,0}; |
// Create and send command |
nfc_data.packetbuffer[0] = PN532_COMMAND_GETFIRMWAREVERSION; |
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 1)) |
return response; |
// Read back data from the PN532 |
NFC_I2C_Read_Data(nfc_data.packetbuffer, 12); |
// Compare and check returned values |
if (strncmp((char *)nfc_data.packetbuffer, (char *)pn532response_firmwarevers, 8) != 0) |
return response; |
// Save and return info |
response.IC = nfc_data.packetbuffer[8]; |
response.Ver = nfc_data.packetbuffer[9]; |
response.Rev = nfc_data.packetbuffer[10]; |
response.Support = nfc_data.packetbuffer[11]; |
return response; |
} |
// Sends a command and waits a specified period for the ACK |
unsigned char NFC_sendCommandCheckAck(unsigned char *cmd, unsigned char cmdlen) { |
unsigned int timer = 0; |
// Write the command |
NFC_I2C_Write_Cmd(cmd, cmdlen); |
// Wait for chip to be ready |
while (NFC_I2C_Read_Status() != PN532_I2C_READY) { |
if (PN532_TIMEOUT != 0) { |
timer += 1; |
if (timer > PN532_TIMEOUT) |
return 0; |
} |
Delay10TCYx(1); |
} |
// Check ACK |
if (!NFC_I2C_Read_ACK()) { |
return 0; |
} |
return 1; |
} |
// Waits for an ISO14443A target to enter the field |
unsigned char NFC_readPassiveTargetID(unsigned char cardbaudrate, unsigned char * uid, unsigned char * uidLength) { |
unsigned char i = 0; |
nfc_data.packetbuffer[0] = PN532_COMMAND_INLISTPASSIVETARGET; |
nfc_data.packetbuffer[1] = 1; // max 1 cards at once (we can set this to 2 later) |
nfc_data.packetbuffer[2] = cardbaudrate; |
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 3)) |
return 0; |
// Wait for IRQ line |
while (NFC_I2C_Read_Status() != PN532_I2C_READY); |
NFC_I2C_Read_Data(nfc_data.packetbuffer, 20); |
/* ISO14443A card response should be in the following format: |
// (byte 0 is actually 0x01 (data ready)) |
byte Description |
------------- ------------------------------------------ |
b0..6 Frame header and preamble |
b7 Tags Found |
b8 Tag Number (only one used in this example) |
b9..10 SENS_RES |
b11 SEL_RES |
b12 NFCID Length |
b13..NFCIDLen NFCID */ |
// Check # of tags found |
if (nfc_data.packetbuffer[8] != 1) |
return 0; |
// Save UID length |
*uidLength = nfc_data.packetbuffer[13]; |
// Save UID |
for (i = 0; i < *uidLength; i++) { |
uid[i] = nfc_data.packetbuffer[14+i]; |
} |
return 1; |
} |
// Indicates whether the specified block number is the first block |
// in the sector (block 0 relative to the current sector) |
unsigned char NFC_mifareclassic_IsFirstBlock(unsigned long uiBlock) { |
// Test if we are in the small or big sectors |
if (uiBlock < 128) |
return ((uiBlock) % 4 == 0); |
else |
return ((uiBlock) % 16 == 0); |
} |
// Indicates whether the specified block number is the sector trailer |
unsigned char NFC_mifareclassic_IsTrailerBlock(unsigned long uiBlock) { |
// Test if we are in the small or big sectors |
if (uiBlock < 128) |
return ((uiBlock + 1) % 4 == 0); |
else |
return ((uiBlock + 1) % 16 == 0); |
} |
// Tries to authenticate a block of memory on a MIFARE card using the INDATAEXCHANGE command |
unsigned char NFC_mifareclassic_AuthenticateBlock(unsigned char *uid, unsigned char uidLen, unsigned long blockNumber, unsigned char keyNumber, unsigned char *keyData) { |
// See section 7.3.8 of the PN532 User Manual |
// blockNumber = The block number to authenticate. (0..63 for 1KB cards, and 0..255 for 4KB cards)\ |
// keyNumber = Which key type to use during authentication (0 = MIFARE_CMD_AUTH_A, 1 = MIFARE_CMD_AUTH_B) |
// keyData = Pointer to a byte array containing the 6 byte key value |
unsigned char i; |
// Assemble frame data |
nfc_data.packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE; /* Data Exchange Header */ |
nfc_data.packetbuffer[1] = 1; /* Max card numbers */ |
nfc_data.packetbuffer[2] = (keyNumber) ? MIFARE_CMD_AUTH_A : MIFARE_CMD_AUTH_B; |
nfc_data.packetbuffer[3] = blockNumber; /* Block Number (1K = 0..63, 4K = 0..255 */ |
for (i = 0; i < 6; i++) { |
nfc_data.packetbuffer[4+i] = keyData[i]; |
} |
for (i = 0; i < uidLen; i++) { |
nfc_data.packetbuffer[10+i] = uid[i]; |
} |
// Send frame and check for ACK |
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 10+uidLen)) |
return 0; |
// Read response from PN532 |
NFC_I2C_Read_Data(nfc_data.packetbuffer, 12); |
return 1; |
} |
// Tries to read an entire 16-byte data block at the specified block address |
unsigned char NFC_mifareclassic_ReadDataBlock(unsigned char blockNumber, unsigned char *data) { |
unsigned char i; |
// Assemble frame data |
nfc_data.packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE; |
nfc_data.packetbuffer[1] = 1; /* Card number */ |
nfc_data.packetbuffer[2] = MIFARE_CMD_READ; /* Mifare Read command = 0x30 */ |
nfc_data.packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */ |
// Send frame and check for ACK |
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 4)) |
return 0; |
// Read reponse |
NFC_I2C_Read_Data(nfc_data.packetbuffer, 26); |
// If byte 9 isnt 0x00 we probably have and error |
if (nfc_data.packetbuffer[8] != 0x00) { |
return 0; |
} |
// Copy the 16 data bytes into the data buffer |
// Block contents starts at byte 10 of a valid response |
for (i = 0; i < 16; i++) { |
data[i] = nfc_data.packetbuffer[9+i]; |
} |
return 1; |
} |
// Tries to write an entire 16-byte data block at the specified block address |
unsigned char NFC_mifareclassic_WriteDataBlock(unsigned char blockNumber, unsigned char *data) { |
unsigned char i; |
// Assemble frame data |
nfc_data.packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE; |
nfc_data.packetbuffer[1] = 1; /* Card number */ |
nfc_data.packetbuffer[2] = MIFARE_CMD_WRITE; /* Mifare Write command = 0xA0 */ |
nfc_data.packetbuffer[3] = blockNumber; /* Block Number (0..63 for 1K, 0..255 for 4K) */ |
for (i = 0; i < 16; i++) { /* Data Payload */ |
nfc_data.packetbuffer[4+i] = data[i]; |
} |
// Send frame and check for ACK |
if (!NFC_sendCommandCheckAck(nfc_data.packetbuffer, 20)) |
return 0; |
// Read response |
NFC_I2C_Read_Data(nfc_data.packetbuffer, 26); |
return 1; |
} |
// Formats a Mifare Classic card to store NDEF Records |
unsigned char NFC_mifareclassic_FormatNDEF(void) { |
unsigned char sectorbuffer1[16] = {0x14, 0x01, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1}; |
unsigned char sectorbuffer2[16] = {0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1, 0x03, 0xE1}; |
unsigned char sectorbuffer3[16] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0x78, 0x77, 0x88, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; |
// Write blocks 1 and 2 |
if (!NFC_mifareclassic_WriteDataBlock(1, sectorbuffer1)) |
return 0; |
if (!NFC_mifareclassic_WriteDataBlock(2, sectorbuffer2)) |
return 0; |
// Write key A and access rights |
if (!NFC_mifareclassic_WriteDataBlock(3, sectorbuffer3)) |
return 0; |
return 1; |
} |
// Writes an NDEF URI Record to the specified sector (1..15) |
/* Note that this function assumes that the Mifare Classic card is |
already formatted to work as an "NFC Forum Tag" and uses a MAD1 |
file system. You can use the NXP TagWriter app on Android to |
properly format cards for this. */ |
unsigned char NFC_mifareclassic_WriteNDEFURI(unsigned char sectorNumber, unsigned char uriIdentifier, const char * url) { |
// uriIdentifier = The uri identifier code (0 = none, 0x01 = "http://www.", etc.) |
// url = The uri text to write (max 38 characters) |
// Figure out how long the string is |
unsigned char len = strlen(url); |
unsigned char sectorbuffer1[16] = {0x00, 0x00, 0x03, len + 5, 0xD1, 0x01, len + 1, 0x55, uriIdentifier, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
unsigned char sectorbuffer2[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
unsigned char sectorbuffer3[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
unsigned char sectorbuffer4[16] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7, 0x7F, 0x07, 0x88, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; |
// Make sure we're within a 1K limit for the sector number |
if ((sectorNumber < 1) || (sectorNumber > 15)) |
return 0; |
// Make sure the URI payload is between 1 and 38 chars |
if ((len < 1) || (len > 38)) |
return 0; |
if (len <= 6) { |
// Unlikely we'll get a url this short, but why not ... |
memcpy(sectorbuffer1 + 9, url, len); |
sectorbuffer1[len + 9] = 0xFE; |
} else if (len == 7) { |
// 0xFE needs to be wrapped around to next block |
memcpy(sectorbuffer1 + 9, url, len); |
sectorbuffer2[0] = 0xFE; |
} else if ((len > 7) || (len <= 22)) { |
// Url fits in two blocks |
memcpy(sectorbuffer1 + 9, url, 7); |
memcpy(sectorbuffer2, url + 7, len - 7); |
sectorbuffer2[len - 7] = 0xFE; |
} else if (len == 23) { |
// 0xFE needs to be wrapped around to final block |
memcpy(sectorbuffer1 + 9, url, 7); |
memcpy(sectorbuffer2, url + 7, len - 7); |
sectorbuffer3[0] = 0xFE; |
} else { |
// Url fits in three blocks |
memcpy(sectorbuffer1 + 9, url, 7); |
memcpy(sectorbuffer2, url + 7, 16); |
memcpy(sectorbuffer3, url + 23, len - 24); |
sectorbuffer3[len - 22] = 0xFE; |
} |
// Now write all three blocks back to the card |
if (!(NFC_mifareclassic_WriteDataBlock(sectorNumber * 4, sectorbuffer1))) |
return 0; |
if (!(NFC_mifareclassic_WriteDataBlock((sectorNumber * 4) + 1, sectorbuffer2))) |
return 0; |
if (!(NFC_mifareclassic_WriteDataBlock((sectorNumber * 4) + 2, sectorbuffer3))) |
return 0; |
if (!(NFC_mifareclassic_WriteDataBlock((sectorNumber * 4) + 3, sectorbuffer4))) |
return 0; |
return 1; |
} |
// Reads and checks for the ACK signal |
unsigned char NFC_I2C_Read_ACK() { |
unsigned char buffer[7]; |
// Check ACK |
NFC_I2C_Read_Data(buffer, 6); |
// Return if the 7 bytes matches the ACK |
return (strncmp((char *)buffer, (char *)pn532ack, 7) == 0); |
} |
// Checks the IRQ pin to know if the PN532 is ready |
unsigned char NFC_I2C_Read_Status() { |
if (PORTCbits.RC1 == 1) { |
return PN532_I2C_BUSY; |
} else { |
return PN532_I2C_READY; |
} |
} |
// Reads n bytes of data from the PN532 via I2C |
void NFC_I2C_Read_Data(unsigned char *buffer, unsigned char length) { |
unsigned char result; |
// Wait for IRQ to go low |
while (NFC_I2C_Read_Status() != PN532_I2C_READY); |
// Read bytes from PN532 into buffer |
I2C_Master_Recv(PN532_I2C_ADDRESS, length+2); |
result = I2C_Get_Status(); |
while (!result) { |
result = I2C_Get_Status(); |
} |
I2C_Read_Buffer((char *)buffer); |
// Note: First byte is always 0x01 (ready status from PN532) |
/* Remaining packet byte layout is as follows: |
Byte Description |
----- ---------------------- |
* 0 Preamble (0x00) |
* 1-2 Start code (0x00,0xFF) |
* 3 Length (TFI to N) |
* 4 Length Checksum (Length + LCS = 0x00) |
* 5 TFI (Frame identifier) |
* 0xD4 - Host to PN532 |
* 0xD5 - PN532 to Host |
* 6-N Data (Length - 1 bytes) |
* N+1 Data checksum (TFI + Data~N + DCS = 0x00) |
* N+2 Postamble (0x00) */ |
} |
// Writes a command to the PN532, automatically inserting the preamble and required frame details (checksum, len, etc.) |
void NFC_I2C_Write_Cmd(unsigned char* cmd, unsigned char cmdlen) { |
int i; |
unsigned char checksum; |
unsigned char buffer[PN532_PACKBUFFSIZ+8]; |
unsigned char buffer_ind = 6; |
cmdlen++; |
checksum = PN532_PREAMBLE + PN532_PREAMBLE + PN532_STARTCODE2 + PN532_HOSTTOPN532; |
// Fill out required frame fields |
buffer[0] = PN532_PREAMBLE; |
buffer[1] = PN532_PREAMBLE; |
buffer[2] = PN532_STARTCODE2; |
buffer[3] = cmdlen; |
buffer[4] = ~cmdlen + 1; |
buffer[5] = PN532_HOSTTOPN532; |
// Copy cmd to be sent |
for (i = 0; i < cmdlen-1; i++) { |
checksum += cmd[i]; |
buffer[buffer_ind] = cmd[i]; |
buffer_ind++; |
} |
buffer[buffer_ind] = ~checksum; |
buffer_ind++; |
buffer[buffer_ind] = PN532_POSTAMBLE; |
buffer_ind++; |
I2C_Master_Send(PN532_I2C_ADDRESS, buffer_ind, buffer); |
} |
/PIC Stuff/PIC_27J13/nfc.h |
---|
0,0 → 1,163 |
#ifndef NFC_H |
#define NFC_H |
/* PN532 NFC Reader from Adafruit */ |
#define PN532_PREAMBLE (0x00) |
#define PN532_STARTCODE1 (0x00) |
#define PN532_STARTCODE2 (0xFF) |
#define PN532_POSTAMBLE (0x00) |
#define PN532_HOSTTOPN532 (0xD4) |
// PN532 Commands |
#define PN532_COMMAND_DIAGNOSE (0x00) |
#define PN532_COMMAND_GETFIRMWAREVERSION (0x02) |
#define PN532_COMMAND_GETGENERALSTATUS (0x04) |
#define PN532_COMMAND_READREGISTER (0x06) |
#define PN532_COMMAND_WRITEREGISTER (0x08) |
#define PN532_COMMAND_READGPIO (0x0C) |
#define PN532_COMMAND_WRITEGPIO (0x0E) |
#define PN532_COMMAND_SETSERIALBAUDRATE (0x10) |
#define PN532_COMMAND_SETPARAMETERS (0x12) |
#define PN532_COMMAND_SAMCONFIGURATION (0x14) |
#define PN532_COMMAND_POWERDOWN (0x16) |
#define PN532_COMMAND_RFCONFIGURATION (0x32) |
#define PN532_COMMAND_RFREGULATIONTEST (0x58) |
#define PN532_COMMAND_INJUMPFORDEP (0x56) |
#define PN532_COMMAND_INJUMPFORPSL (0x46) |
#define PN532_COMMAND_INLISTPASSIVETARGET (0x4A) |
#define PN532_COMMAND_INATR (0x50) |
#define PN532_COMMAND_INPSL (0x4E) |
#define PN532_COMMAND_INDATAEXCHANGE (0x40) |
#define PN532_COMMAND_INCOMMUNICATETHRU (0x42) |
#define PN532_COMMAND_INDESELECT (0x44) |
#define PN532_COMMAND_INRELEASE (0x52) |
#define PN532_COMMAND_INSELECT (0x54) |
#define PN532_COMMAND_INAUTOPOLL (0x60) |
#define PN532_COMMAND_TGINITASTARGET (0x8C) |
#define PN532_COMMAND_TGSETGENERALBYTES (0x92) |
#define PN532_COMMAND_TGGETDATA (0x86) |
#define PN532_COMMAND_TGSETDATA (0x8E) |
#define PN532_COMMAND_TGSETMETADATA (0x94) |
#define PN532_COMMAND_TGGETINITIATORCOMMAND (0x88) |
#define PN532_COMMAND_TGRESPONSETOINITIATOR (0x90) |
#define PN532_COMMAND_TGGETTARGETSTATUS (0x8A) |
#define PN532_WAKEUP (0x55) |
#define PN532_SPI_STATREAD (0x02) |
#define PN532_SPI_DATAWRITE (0x01) |
#define PN532_SPI_DATAREAD (0x03) |
#define PN532_SPI_READY (0x01) |
#define PN532_I2C_ADDRESS (0x48 >> 1) |
#define PN532_I2C_READBIT (0x01) |
#define PN532_I2C_BUSY (0x00) |
#define PN532_I2C_READY (0x01) |
#define PN532_I2C_READYTIMEOUT (20) |
#define PN532_MIFARE_ISO14443A (0x00) |
// Mifare Commands |
#define MIFARE_CMD_AUTH_A (0x60) |
#define MIFARE_CMD_AUTH_B (0x61) |
#define MIFARE_CMD_READ (0x30) |
#define MIFARE_CMD_WRITE (0xA0) |
#define MIFARE_CMD_TRANSFER (0xB0) |
#define MIFARE_CMD_DECREMENT (0xC0) |
#define MIFARE_CMD_INCREMENT (0xC1) |
#define MIFARE_CMD_STORE (0xC2) |
// Prefixes for NDEF Records (to identify record type) |
#define NDEF_URIPREFIX_NONE (0x00) |
#define NDEF_URIPREFIX_HTTP_WWWDOT (0x01) |
#define NDEF_URIPREFIX_HTTPS_WWWDOT (0x02) |
#define NDEF_URIPREFIX_HTTP (0x03) |
#define NDEF_URIPREFIX_HTTPS (0x04) |
#define NDEF_URIPREFIX_TEL (0x05) |
#define NDEF_URIPREFIX_MAILTO (0x06) |
#define NDEF_URIPREFIX_FTP_ANONAT (0x07) |
#define NDEF_URIPREFIX_FTP_FTPDOT (0x08) |
#define NDEF_URIPREFIX_FTPS (0x09) |
#define NDEF_URIPREFIX_SFTP (0x0A) |
#define NDEF_URIPREFIX_SMB (0x0B) |
#define NDEF_URIPREFIX_NFS (0x0C) |
#define NDEF_URIPREFIX_FTP (0x0D) |
#define NDEF_URIPREFIX_DAV (0x0E) |
#define NDEF_URIPREFIX_NEWS (0x0F) |
#define NDEF_URIPREFIX_TELNET (0x10) |
#define NDEF_URIPREFIX_IMAP (0x11) |
#define NDEF_URIPREFIX_RTSP (0x12) |
#define NDEF_URIPREFIX_URN (0x13) |
#define NDEF_URIPREFIX_POP (0x14) |
#define NDEF_URIPREFIX_SIP (0x15) |
#define NDEF_URIPREFIX_SIPS (0x16) |
#define NDEF_URIPREFIX_TFTP (0x17) |
#define NDEF_URIPREFIX_BTSPP (0x18) |
#define NDEF_URIPREFIX_BTL2CAP (0x19) |
#define NDEF_URIPREFIX_BTGOEP (0x1A) |
#define NDEF_URIPREFIX_TCPOBEX (0x1B) |
#define NDEF_URIPREFIX_IRDAOBEX (0x1C) |
#define NDEF_URIPREFIX_FILE (0x1D) |
#define NDEF_URIPREFIX_URN_EPC_ID (0x1E) |
#define NDEF_URIPREFIX_URN_EPC_TAG (0x1F) |
#define NDEF_URIPREFIX_URN_EPC_PAT (0x20) |
#define NDEF_URIPREFIX_URN_EPC_RAW (0x21) |
#define NDEF_URIPREFIX_URN_EPC (0x22) |
#define NDEF_URIPREFIX_URN_NFC (0x23) |
#define PN532_GPIO_VALIDATIONBIT (0x80) |
#define PN532_GPIO_P30 (0) |
#define PN532_GPIO_P31 (1) |
#define PN532_GPIO_P32 (2) |
#define PN532_GPIO_P33 (3) |
#define PN532_GPIO_P34 (4) |
#define PN532_GPIO_P35 (5) |
#define PN532_PACKBUFFSIZ 64 |
#define PN532_TIMEOUT 1000 |
typedef struct { |
unsigned char IC; |
unsigned char Ver; |
unsigned char Rev; |
unsigned char Support; |
} NFC_FIRMWARE_VERSION; |
typedef struct __NFC_DATA { |
unsigned char packetbuffer[PN532_PACKBUFFSIZ]; |
} NFC_DATA; |
void NFC_Init(void); |
// Generic PN532 functions |
unsigned char NFC_SAMConfig(void); |
NFC_FIRMWARE_VERSION NFC_getFirmwareVersion(void); |
unsigned char NFC_sendCommandCheckAck(unsigned char *cmd, unsigned char cmdlen); |
//unsigned char NFC_writeGPIO(unsigned char pinstate); |
//unsigned char NFC_readGPIO(void); |
// ISO14443A functions |
unsigned char NFC_readPassiveTargetID(unsigned char cardbaudrate, unsigned char * uid, unsigned char * uidLength); |
// Mifare Classic functions |
unsigned char NFC_mifareclassic_IsFirstBlock(unsigned long uiBlock); |
unsigned char NFC_mifareclassic_IsTrailerBlock(unsigned long uiBlock); |
unsigned char NFC_mifareclassic_AuthenticateBlock(unsigned char *uid, unsigned char uidLen, unsigned long blockNumber, unsigned char keyNumber, unsigned char *keyData); |
unsigned char NFC_mifareclassic_ReadDataBlock(unsigned char blockNumber, unsigned char *data); |
unsigned char NFC_mifareclassic_WriteDataBlock(unsigned char blockNumber, unsigned char *data); |
unsigned char NFC_mifareclassic_FormatNDEF(void); |
unsigned char NFC_mifareclassic_WriteNDEFURI(unsigned char sectorNumber, unsigned char uriIdentifier, const char * url); |
// Mifare Ultralight functions |
//unsigned char NFC_mifareultralight_ReadPage(unsigned char page, unsigned char * buffer); |
// Low level SPI functions |
unsigned char NFC_I2C_Read_ACK(void); |
unsigned char NFC_I2C_Read_Status(void); |
void NFC_I2C_Read_Data(unsigned char *buffer, unsigned char length); |
void NFC_I2C_Write_Cmd(unsigned char *cmd, unsigned char cmdlen); |
#endif |
/PIC Stuff/PIC_27J13/oled_ssd1306.c |
---|
0,0 → 1,369 |
#include "maindefs.h" |
#include "oled_ssd1306.h" |
#include "spi.h" |
#include "string.h" |
#include "Adafruit_GFX.h" |
#include <delays.h> |
// 512 (128x32) or 1024 (128x64) bytes allocated for LCD buffer |
// See linker file for details |
#ifdef GFX_SSD1306 |
static unsigned char LCD_Buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = { |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, |
0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, |
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF, |
0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, |
0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8, |
0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, |
0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01, |
0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF, |
0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00, |
0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF, |
0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, |
0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F, |
0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, |
0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03, |
0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, |
0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, |
0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, |
0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03, |
0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
#if (SSD1306_LCDHEIGHT == 64) |
0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, |
0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF, |
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, |
0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, |
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, |
0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E, |
0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, |
0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06, |
0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8, |
0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, |
0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C, |
0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, |
0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, |
0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07, |
0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
#endif |
}; |
#else |
static unsigned char LCD_Buffer[1]; |
#endif |
void SSD1306_Init() { |
GFX_Init(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT); |
} |
void SSD1306_Begin(unsigned char vccstate) { |
// Toggle reset pin |
LATBbits.LATB6 = 0; |
Delay10KTCYx(1); |
LATBbits.LATB6 = 1; |
#if defined SSD1306_128_32 |
// Init sequence for 128x32 OLED module |
SSD1306_Command(SSD1306_DISPLAYOFF); // 0xAE |
SSD1306_Command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5 |
SSD1306_Command(0x80); // The suggested ratio 0x80 |
SSD1306_Command(SSD1306_SETMULTIPLEX); // 0xA8 |
SSD1306_Command(0x1F); |
SSD1306_Command(SSD1306_SETDISPLAYOFFSET); // 0xD3 |
SSD1306_Command(0x0); // No offset |
SSD1306_Command(SSD1306_SETSTARTLINE | 0x0); // Line #0 |
SSD1306_Command(SSD1306_CHARGEPUMP); // 0x8D |
if (vccstate == SSD1306_EXTERNALVCC) { |
SSD1306_Command(0x10); |
} else { |
SSD1306_Command(0x14); |
} |
SSD1306_Command(SSD1306_MEMORYMODE); // 0x20 |
SSD1306_Command(0x00); // 0x0 act like ks0108 |
SSD1306_Command(SSD1306_SEGREMAP | 0x1); |
SSD1306_Command(SSD1306_COMSCANDEC); |
SSD1306_Command(SSD1306_SETCOMPINS); // 0xDA |
SSD1306_Command(0x02); |
SSD1306_Command(SSD1306_SETCONTRAST); // 0x81 |
SSD1306_Command(0x8F); |
SSD1306_Command(SSD1306_SETPRECHARGE); // 0xd9 |
if (vccstate == SSD1306_EXTERNALVCC) { |
SSD1306_Command(0x22); |
} else { |
SSD1306_Command(0xF1); |
} |
SSD1306_Command(SSD1306_SETVCOMDETECT); // 0xDB |
SSD1306_Command(0x40); |
SSD1306_Command(SSD1306_DISPLAYALLON_RESUME); // 0xA4 |
SSD1306_Command(SSD1306_NORMALDISPLAY); // 0xA6 |
#endif |
#if defined SSD1306_128_64 |
// Init sequence for 128x64 OLED module |
SSD1306_Command(SSD1306_DISPLAYOFF); // 0xAE |
SSD1306_Command(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5 |
SSD1306_Command(0x80); // The suggested ratio 0x80 |
SSD1306_Command(SSD1306_SETMULTIPLEX); // 0xA8 |
SSD1306_Command(0x3F); |
SSD1306_Command(SSD1306_SETDISPLAYOFFSET); // 0xD3 |
SSD1306_Command(0x0); // No offset |
SSD1306_Command(SSD1306_SETSTARTLINE | 0x0); // Line #0 |
SSD1306_Command(SSD1306_CHARGEPUMP); // 0x8D |
if (vccstate == SSD1306_EXTERNALVCC) { |
SSD1306_Command(0x10); |
} else { |
SSD1306_Command(0x14); |
} |
SSD1306_Command(SSD1306_MEMORYMODE); // 0x20 |
SSD1306_Command(0x00); // 0x0 act like ks0108 |
SSD1306_Command(SSD1306_SEGREMAP | 0x1); |
SSD1306_Command(SSD1306_COMSCANDEC); |
SSD1306_Command(SSD1306_SETCOMPINS); // 0xDA |
SSD1306_Command(0x12); |
SSD1306_Command(SSD1306_SETCONTRAST); // 0x81 |
if (vccstate == SSD1306_EXTERNALVCC) { |
SSD1306_Command(0x9F); |
} else { |
SSD1306_Command(0xCF); |
} |
SSD1306_Command(SSD1306_SETPRECHARGE); // 0xd9 |
if (vccstate == SSD1306_EXTERNALVCC) { |
SSD1306_Command(0x22); |
} else { |
SSD1306_Command(0xF1); |
} |
SSD1306_Command(SSD1306_SETVCOMDETECT); // 0xDB |
SSD1306_Command(0x40); |
SSD1306_Command(SSD1306_DISPLAYALLON_RESUME); // 0xA4 |
SSD1306_Command(SSD1306_NORMALDISPLAY); // 0xA6 |
#endif |
SSD1306_Command(SSD1306_DISPLAYON); // Turn on OLED panel |
} |
void SSD1306_Command(unsigned char cmd) { |
unsigned char c = cmd; |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(&c, 1); |
} |
void SSD1306_Data(unsigned char data) { |
unsigned char c = data; |
LATBbits.LATB5 = 1; // D/C high (data) |
SPI2_Write(&c, 1); |
} |
void SSD1306_Clear_Display() { |
memset(LCD_Buffer, 0, (SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8)); |
} |
void SSD1306_Invert_Display(unsigned char c) { |
if (c) { |
SSD1306_Command(SSD1306_INVERTDISPLAY); |
} else { |
SSD1306_Command((SSD1306_NORMALDISPLAY)); |
} |
} |
void SSD1306_Display() { |
unsigned int i; |
unsigned char c = 0; |
SSD1306_Command(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0 |
SSD1306_Command(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0 |
SSD1306_Command(SSD1306_SETSTARTLINE | 0x0); // line #0 |
LATBbits.LATB5 = 1; // D/C high (data) |
SPI2_Write(LCD_Buffer, SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8); |
// if (SSD1306_LCDHEIGHT == 32) { |
// SPI2_Write_Repeat(0, SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8); |
// } |
} |
void SSD1306_Draw_Pixel(int x, int y, unsigned int color) { |
if ((x < 0) || (x >= GFX_width()) || (y < 0) || (y >= GFX_height())) |
return; |
// check rotation, move pixel around if necessary |
switch (GFX_getRotation()) { |
case 1: |
GFX_Swap(&x, &y); |
x = SSD1306_LCDWIDTH - x - 1; |
break; |
case 2: |
x = SSD1306_LCDWIDTH - x - 1; |
y = SSD1306_LCDHEIGHT - y - 1; |
break; |
case 3: |
GFX_Swap(&x, &y); |
y = SSD1306_LCDHEIGHT - y - 1; |
break; |
} |
// x is which column |
if (color == SSD1306_WHITE) |
LCD_Buffer[x + (y / 8) * SSD1306_LCDWIDTH] |= 1<<(y % 8); |
else |
LCD_Buffer[x + (y / 8) * SSD1306_LCDWIDTH] &= ~(1<<(y % 8)); |
} |
void SSD1306_Test_DrawChar() { |
unsigned char i; |
GFX_setTextSize(1); |
GFX_setTextColor(SSD1306_WHITE); |
GFX_setCursor(0, 0); |
for (i = 0; i < 168; i++) { |
if (i == '\n') continue; |
GFX_write(i); |
// if ((i > 0) && (i % 21 == 0)) |
// GFX_write('\n'); |
} |
SSD1306_Display(); |
} |
void SSD1306_Test_DrawCircle() { |
int i; |
for (i = 0; i < GFX_height(); i += 2) { |
GFX_drawCircle(GFX_width() / 2, GFX_height() / 2, i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
} |
void SSD1306_Test_DrawRect(void) { |
int i; |
for (i = 0; i < GFX_height() / 2; i += 2) { |
GFX_drawRect(i, i, GFX_width() - 2 * i, GFX_height() - 2 * i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
} |
void SSD1306_Test_FillRect(void) { |
unsigned char color = 1; |
int i; |
for (i = 0; i < GFX_height() / 2; i += 3) { |
// alternate colors |
GFX_fillRect(i, i, GFX_width() - i * 2, GFX_height() - i * 2, color % 2); |
SSD1306_Display(); |
color++; |
} |
} |
void SSD1306_Test_DrawTriangle(void) { |
int i; |
int min = GFX_width() < GFX_height() ? GFX_width() : GFX_height(); |
for (i = 0; i < min / 2; i += 5) { |
GFX_drawTriangle(GFX_width() / 2, GFX_height() / 2 - i, |
GFX_width() / 2 - i, GFX_height() / 2 + i, |
GFX_width() / 2 + i, GFX_height() / 2 + i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
} |
void SSD1306_Test_FillTriangle(void) { |
unsigned char color = SSD1306_WHITE; |
int i; |
int min = GFX_width() < GFX_height() ? GFX_width() : GFX_height(); |
for (i = min / 2; i > 0; i -= 5) { |
GFX_fillTriangle(GFX_width() / 2, GFX_height() / 2 - i, |
GFX_width() / 2 - i, GFX_height() / 2 + i, |
GFX_width() / 2 + i, GFX_height() / 2 + i, SSD1306_WHITE); |
if (color == SSD1306_WHITE) color = SSD1306_BLACK; |
else color = SSD1306_WHITE; |
SSD1306_Display(); |
} |
} |
void SSD1306_Test_DrawRoundRect(void) { |
int i; |
for (i = 0; i < GFX_height() / 2 - 2; i += 2) { |
GFX_drawRoundRect(i, i, GFX_width() - 2 * i, GFX_height() - 2 * i, GFX_height() / 4, SSD1306_WHITE); |
SSD1306_Display(); |
} |
} |
void SSD1306_Test_FillRoundRect(void) { |
unsigned char color = SSD1306_WHITE; |
int i; |
for (i = 0; i < GFX_height() / 2 - 2; i += 2) { |
GFX_fillRoundRect(i, i, GFX_width() - 2 * i, GFX_height() - 2 * i, GFX_height() / 4, color); |
if (color == SSD1306_WHITE) color = SSD1306_BLACK; |
else color = SSD1306_WHITE; |
SSD1306_Display(); |
} |
} |
void SSD1306_Test_DrawLine(void) { |
int i; |
for (i = 0; i < GFX_width(); i += 4) { |
GFX_drawLine(0, 0, i, GFX_height() - 1, SSD1306_WHITE); |
SSD1306_Display(); |
} |
for (i = 0; i < GFX_height(); i += 4) { |
GFX_drawLine(0, 0, GFX_width() - 1, i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
Delay10KTCYx(255); |
SSD1306_Clear_Display(); |
for (i = 0; i < GFX_width(); i += 4) { |
GFX_drawLine(0, GFX_height() - 1, i, 0, SSD1306_WHITE); |
SSD1306_Display(); |
} |
for (i = GFX_height() - 1; i >= 0; i -= 4) { |
GFX_drawLine(0, GFX_height() - 1, GFX_width() - 1, i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
Delay10KTCYx(255); |
SSD1306_Clear_Display(); |
for (i = GFX_width() - 1; i >= 0; i -= 4) { |
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, i, 0, SSD1306_WHITE); |
SSD1306_Display(); |
} |
for (i = GFX_height() - 1; i >= 0; i -= 4) { |
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, 0, i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
Delay10KTCYx(255); |
SSD1306_Clear_Display(); |
for (i = 0; i < GFX_height(); i += 4) { |
GFX_drawLine(GFX_width() - 1, 0, 0, i, SSD1306_WHITE); |
SSD1306_Display(); |
} |
for (i = 0; i < GFX_width(); i += 4) { |
GFX_drawLine(GFX_width() - 1, 0, i, GFX_height() - 1, SSD1306_WHITE); |
SSD1306_Display(); |
} |
Delay10KTCYx(255); |
} |
/PIC Stuff/PIC_27J13/oled_ssd1306.h |
---|
0,0 → 1,83 |
#ifndef OLED_SSD1306_H |
#define OLED_SSD1306_H |
/*========================================================================= |
SSD1306 Displays |
----------------------------------------------------------------------- |
The driver is used in multiple displays (128x64, 128x32, etc.). |
Select the appropriate display below to create an appropriately |
sized framebuffer, etc. |
SSD1306_128_64 128x64 pixel display |
SSD1306_128_32 128x32 pixel display |
You also need to set the LCDWIDTH and LCDHEIGHT defines to an |
appropriate size |
-----------------------------------------------------------------------*/ |
// #define SSD1306_128_64 |
#define SSD1306_128_32 |
/*=========================================================================*/ |
#if defined SSD1306_128_64 |
#define SSD1306_LCDWIDTH 128 |
#define SSD1306_LCDHEIGHT 64 |
#endif |
#if defined SSD1306_128_32 |
#define SSD1306_LCDWIDTH 128 |
#define SSD1306_LCDHEIGHT 32 |
#endif |
#define SSD1306_BLACK 0 |
#define SSD1306_WHITE 1 |
#define SSD1306_I2C_ADDRESS 0x3D // 011110+SA0+RW |
#define SSD1306_SETCONTRAST 0x81 |
#define SSD1306_DISPLAYALLON_RESUME 0xA4 |
#define SSD1306_DISPLAYALLON 0xA5 |
#define SSD1306_NORMALDISPLAY 0xA6 |
#define SSD1306_INVERTDISPLAY 0xA7 |
#define SSD1306_DISPLAYOFF 0xAE |
#define SSD1306_DISPLAYON 0xAF |
#define SSD1306_SETDISPLAYOFFSET 0xD3 |
#define SSD1306_SETCOMPINS 0xDA |
#define SSD1306_SETVCOMDETECT 0xDB |
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5 |
#define SSD1306_SETPRECHARGE 0xD9 |
#define SSD1306_SETMULTIPLEX 0xA8 |
#define SSD1306_SETLOWCOLUMN 0x00 |
#define SSD1306_SETHIGHCOLUMN 0x10 |
#define SSD1306_SETSTARTLINE 0x40 |
#define SSD1306_MEMORYMODE 0x20 |
#define SSD1306_COMSCANINC 0xC0 |
#define SSD1306_COMSCANDEC 0xC8 |
#define SSD1306_SEGREMAP 0xA0 |
#define SSD1306_CHARGEPUMP 0x8D |
#define SSD1306_EXTERNALVCC 0x1 |
#define SSD1306_SWITCHCAPVCC 0x2 |
void SSD1306_Init(void); |
void SSD1306_Begin(unsigned char vcc); |
void SSD1306_Command(unsigned char cmd); |
void SSD1306_Data(unsigned char data); |
void SSD1306_Clear_Display(void); |
void SSD1306_Invert_Display(unsigned char); |
void SSD1306_Display(void); |
void SSD1306_Draw_Pixel(int x, int y, unsigned int color); |
void SSD1306_Test_DrawChar(void); |
void SSD1306_Test_DrawCircle(void); |
void SSD1306_Test_DrawRect(void); |
void SSD1306_Test_FillRect(void); |
void SSD1306_Test_DrawTriangle(void); |
void SSD1306_Test_FillTriangle(void); |
void SSD1306_Test_DrawRoundRect(void); |
void SSD1306_Test_FillRoundRect(void); |
void SSD1306_Test_DrawLine(void); |
#endif /* OLED_SSD1306_H */ |
/PIC Stuff/PIC_27J13/oled_ssd1331.c |
---|
0,0 → 1,538 |
#include "maindefs.h" |
#include "oled_ssd1331.h" |
#include "spi.h" |
#include "string.h" |
#include "Adafruit_GFX.h" |
#include <delays.h> |
void SSD1331_Init() { |
GFX_Init(SSD1331_LCDWIDTH, SSD1331_LCDHEIGHT); |
} |
void SSD1331_Begin() { |
unsigned char buffer[37]; |
// Toggle reset pin |
LATBbits.LATB6 = 0; |
Delay10KTCYx(1); |
LATBbits.LATB6 = 1; |
// Initialization Sequence |
buffer[0] = SSD1331_CMD_DISPLAYOFF; // 0xAE |
buffer[1] = SSD1331_CMD_SETREMAP; // 0xA0 |
#if defined SSD1331_COLORORDER_RGB |
buffer[2] = 0x72; // RGB Color |
#else |
buffer[2] = 0x76; // BGR Color |
#endif |
buffer[3] = SSD1331_CMD_STARTLINE; // 0xA1 |
buffer[4] = 0x0; |
buffer[5] = SSD1331_CMD_DISPLAYOFFSET; // 0xA2 |
buffer[6] = 0x0; |
buffer[7] = SSD1331_CMD_NORMALDISPLAY; // 0xA4 |
buffer[8] = SSD1331_CMD_SETMULTIPLEX; // 0xA8 |
buffer[9] = 0x3F; // 0x3F 1/64 duty |
buffer[10] = SSD1331_CMD_SETMASTER; // 0xAD |
buffer[11] = 0x8E; |
buffer[12] = SSD1331_CMD_POWERMODE; // 0xB0 |
buffer[13] = 0x0B; |
buffer[14] = SSD1331_CMD_PRECHARGE; // 0xB1 |
buffer[15] = 0x31; |
buffer[16] = SSD1331_CMD_CLOCKDIV; // 0xB3 |
buffer[17] = 0xF0; // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio (A[3:0]+1 = 1..16) |
buffer[18] = SSD1331_CMD_PRECHARGEA; // 0x8A |
buffer[19] = 0x64; |
buffer[20] = SSD1331_CMD_PRECHARGEB; // 0x8B |
buffer[21] = 0x78; |
buffer[22] = SSD1331_CMD_PRECHARGEA; // 0x8C |
buffer[23] = 0x64; |
buffer[24] = SSD1331_CMD_PRECHARGELEVEL; // 0xBB |
buffer[25] = 0x3A; |
buffer[26] = SSD1331_CMD_VCOMH; // 0xBE |
buffer[27] = 0x3E; |
buffer[28] = SSD1331_CMD_MASTERCURRENT; // 0x87 |
buffer[29] = 0x06; |
buffer[30] = SSD1331_CMD_CONTRASTA; // 0x81 |
buffer[31] = 0x91; |
buffer[32] = SSD1331_CMD_CONTRASTB; // 0x82 |
buffer[33] = 0x50; |
buffer[34] = SSD1331_CMD_CONTRASTC; // 0x83 |
buffer[35] = 0x7D; |
buffer[36] = SSD1331_CMD_DISPLAYON; //--turn on oled panel |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(buffer, 37); |
} |
void SSD1331_GoTo(int x, int y) { |
unsigned char buffer[6]; |
if ((x >= SSD1331_LCDWIDTH) || (y >= SSD1331_LCDHEIGHT)) return; |
// set x and y coordinate |
buffer[0] = (SSD1331_CMD_SETCOLUMN); |
buffer[1] = (x); |
buffer[2] = (SSD1331_LCDWIDTH - 1); |
buffer[3] = (SSD1331_CMD_SETROW); |
buffer[4] = (y); |
buffer[5] = (SSD1331_LCDHEIGHT - 1); |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(buffer, 6); |
} |
void SSD1331_Reset() { |
} |
void SSD1331_Command(unsigned char cmd) { |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(&cmd, 1); |
} |
void SSD1331_Data(unsigned char data) { |
LATBbits.LATB5 = 1; // D/C high (data) |
SPI2_Write(&data, 1); |
} |
void SSD1331_Draw_Pixel(int x, int y, unsigned int color) { |
unsigned char buffer[2]; |
buffer[0] = color >> 8; |
buffer[1] = color; |
if ((x < 0) || (x >= GFX_width()) || (y < 0) || (y >= GFX_height())) return; |
// check rotation, move pixel around if necessary |
switch (GFX_getRotation()) { |
case 1: |
GFX_Swap(&x, &y); |
x = SSD1331_LCDWIDTH - x - 1; |
break; |
case 2: |
x = SSD1331_LCDWIDTH - x - 1; |
y = SSD1331_LCDHEIGHT - y - 1; |
break; |
case 3: |
GFX_Swap(&x, &y); |
y = SSD1331_LCDHEIGHT - y - 1; |
break; |
} |
SSD1331_GoTo(x, y); |
// setup for data |
LATBbits.LATB5 = 1; // D/C high (data) |
SPI2_Write(buffer, 2); |
} |
void SSD1331_Draw_Line(int x0, int y0, int x1, int y1, unsigned int color) { |
unsigned char buffer[8]; |
// check rotation, move pixel around if necessary |
switch (GFX_getRotation()) { |
case 1: |
GFX_Swap(&x0, &y0); |
GFX_Swap(&x1, &y1); |
x0 = SSD1331_LCDWIDTH - x0 - 1; |
x1 = SSD1331_LCDWIDTH - x1 - 1; |
break; |
case 2: |
x0 = SSD1331_LCDWIDTH - x0 - 1; |
y0 = SSD1331_LCDHEIGHT - y0 - 1; |
x1 = SSD1331_LCDWIDTH - x1 - 1; |
y1 = SSD1331_LCDHEIGHT - y1 - 1; |
break; |
case 3: |
GFX_Swap(&x0, &y0); |
GFX_Swap(&x1, &y1); |
y0 = SSD1331_LCDHEIGHT - y0 - 1; |
y1 = SSD1331_LCDHEIGHT - y1 - 1; |
break; |
} |
// Boundary check |
if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT)) |
return; |
if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH)) |
return; |
if (x0 >= SSD1331_LCDWIDTH) |
x0 = SSD1331_LCDWIDTH - 1; |
if (y0 >= SSD1331_LCDHEIGHT) |
y0 = SSD1331_LCDHEIGHT - 1; |
if (x1 >= SSD1331_LCDWIDTH) |
x1 = SSD1331_LCDWIDTH - 1; |
if (y1 >= SSD1331_LCDHEIGHT) |
y1 = SSD1331_LCDHEIGHT - 1; |
if (x0 < 0) |
x0 = 0; |
if (y0 < 0) |
y0 = 0; |
if (x1 < 0) |
x1 = 0; |
if (y1 < 0) |
y1 = 0; |
buffer[0] = SSD1331_CMD_DRAWLINE; |
buffer[1] = x0; |
buffer[2] = y0; |
buffer[3] = x1; |
buffer[4] = y1; |
buffer[5] = (color >> 11) << 1; |
buffer[6] = (color >> 5) & 0x3F; |
buffer[7] = (color << 1) & 0x3F; |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(buffer, 8); |
} |
void SSD1331_Draw_Rect(int tx0, int ty0, int tx1, int ty1, unsigned int color) { |
unsigned char buffer[13]; |
int x0,y0,x1,y1; |
// check rotation, move pixel around if necessary |
switch (GFX_getRotation()) { |
case 0: |
x0 = tx0; |
y0 = ty0; |
x1 = tx1; |
y1 = ty1; |
break; |
case 1: |
x0 = SSD1331_LCDWIDTH - ty1 - 1; |
y0 = tx0; |
x1 = SSD1331_LCDWIDTH - ty0 - 1; |
y1 = tx1; |
break; |
case 2: |
x0 = SSD1331_LCDWIDTH - tx1 - 1; |
y0 = SSD1331_LCDHEIGHT - ty1 - 1; |
x1 = SSD1331_LCDWIDTH - tx0 - 1; |
y1 = SSD1331_LCDHEIGHT - ty0 - 1; |
break; |
case 3: |
x0 = ty0; |
y0 = SSD1331_LCDHEIGHT - tx1 - 1; |
x1 = ty1; |
y1 = SSD1331_LCDHEIGHT - tx0 - 1; |
break; |
} |
// Boundary check |
if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT)) |
return; |
if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH)) |
return; |
if (x0 >= SSD1331_LCDWIDTH) |
x0 = SSD1331_LCDWIDTH - 1; |
if (y0 >= SSD1331_LCDHEIGHT) |
y0 = SSD1331_LCDHEIGHT - 1; |
if (x1 >= SSD1331_LCDWIDTH) |
x1 = SSD1331_LCDWIDTH - 1; |
if (y1 >= SSD1331_LCDHEIGHT) |
y1 = SSD1331_LCDHEIGHT - 1; |
if (x0 < 0) |
x0 = 0; |
if (y0 < 0) |
y0 = 0; |
if (x1 < 0) |
x1 = 0; |
if (y1 < 0) |
y1 = 0; |
buffer[0] = SSD1331_CMD_FILL; |
buffer[1] = 0; |
buffer[2] = SSD1331_CMD_DRAWRECT; |
buffer[3] = x0; |
buffer[4] = y0; |
buffer[5] = x1; |
buffer[6] = y1; |
buffer[7] = (color >> 11) << 1; |
buffer[8] = (color >> 5) & 0x3F; |
buffer[9] = (color << 1) & 0x3F; |
buffer[10] = 0; |
buffer[11] = 0; |
buffer[12] = 0; |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(buffer, 13); |
} |
void SSD1331_Fill_Rect(int tx0, int ty0, int tx1, int ty1, unsigned int color) { |
unsigned char buffer[13]; |
int x0,y0,x1,y1; |
// check rotation, move pixel around if necessary |
switch (GFX_getRotation()) { |
case 0: |
x0 = tx0; |
y0 = ty0; |
x1 = tx1; |
y1 = ty1; |
break; |
case 1: |
x0 = SSD1331_LCDWIDTH - ty1 - 1; |
y0 = tx0; |
x1 = SSD1331_LCDWIDTH - ty0 - 1; |
y1 = tx1; |
break; |
case 2: |
x0 = SSD1331_LCDWIDTH - tx1 - 1; |
y0 = SSD1331_LCDHEIGHT - ty1 - 1; |
x1 = SSD1331_LCDWIDTH - tx0 - 1; |
y1 = SSD1331_LCDHEIGHT - ty0 - 1; |
break; |
case 3: |
x0 = ty0; |
y0 = SSD1331_LCDHEIGHT - tx1 - 1; |
x1 = ty1; |
y1 = SSD1331_LCDHEIGHT - tx0 - 1; |
break; |
} |
// Boundary check |
if ((y0 >= SSD1331_LCDHEIGHT) && (y1 >= SSD1331_LCDHEIGHT)) |
return; |
if ((x0 >= SSD1331_LCDWIDTH) && (x1 >= SSD1331_LCDWIDTH)) |
return; |
if (x0 >= SSD1331_LCDWIDTH) |
x0 = SSD1331_LCDWIDTH - 1; |
if (y0 >= SSD1331_LCDHEIGHT) |
y0 = SSD1331_LCDHEIGHT - 1; |
if (x1 >= SSD1331_LCDWIDTH) |
x1 = SSD1331_LCDWIDTH - 1; |
if (y1 >= SSD1331_LCDHEIGHT) |
y1 = SSD1331_LCDHEIGHT - 1; |
if (x0 < 0) |
x0 = 0; |
if (y0 < 0) |
y0 = 0; |
if (x1 < 0) |
x1 = 0; |
if (y1 < 0) |
y1 = 0; |
buffer[0] = SSD1331_CMD_FILL; |
buffer[1] = 1; |
buffer[2] = SSD1331_CMD_DRAWRECT; |
buffer[3] = x0; |
buffer[4] = y0; |
buffer[5] = x1; |
buffer[6] = y1; |
buffer[7] = (color >> 11) << 1; |
buffer[8] = (color >> 5) & 0x3F; |
buffer[9] = (color << 1) & 0x3F; |
buffer[10] = (color >> 11) << 1; |
buffer[11] = (color >> 5) & 0x3F; |
buffer[12] = (color << 1) & 0x3F; |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(buffer, 13); |
Delay1KTCYx(4); |
} |
void SSD1331_Clear_Display() { |
unsigned char buffer[5]; |
buffer[0] = SSD1331_CMD_CLEARWINDOW; |
buffer[1] = 0; |
buffer[2] = 0; |
buffer[3] = SSD1331_LCDWIDTH-1; |
buffer[4] = SSD1331_LCDHEIGHT-1; |
LATBbits.LATB5 = 0; // D/C low (cmd) |
SPI2_Write(buffer, 5); |
Delay1KTCYx(4); |
} |
unsigned int SSD1331_Color565(unsigned char r, unsigned char g, unsigned char b) { |
unsigned int c; |
c = r >> 3; |
c <<= 6; |
c |= g >> 2; |
c <<= 5; |
c |= b >> 3; |
return c; |
} |
void SSD1331_Test_DrawLines(unsigned int color) { |
int x, y; |
GFX_clearScreen(); |
for (x = 0; x < GFX_width() - 1; x += 6) { |
GFX_drawLine(0, 0, x, GFX_height() - 1, color); |
} |
for (y = 0; y < GFX_height() - 1; y += 6) { |
GFX_drawLine(0, 0, GFX_width() - 1, y, color); |
} |
GFX_clearScreen(); |
for (x = 0; x < GFX_width() - 1; x += 6) { |
GFX_drawLine(GFX_width() - 1, 0, x, GFX_height() - 1, color); |
} |
for (y = 0; y < GFX_height() - 1; y += 6) { |
GFX_drawLine(GFX_width() - 1, 0, 0, y, color); |
} |
GFX_clearScreen(); |
for (x = 0; x < GFX_width() - 1; x += 6) { |
GFX_drawLine(0, GFX_height() - 1, x, 0, color); |
} |
for (y = 0; y < GFX_height() - 1; y += 6) { |
GFX_drawLine(0, GFX_height() - 1, GFX_width() - 1, y, color); |
} |
GFX_clearScreen(); |
for (x = 0; x < GFX_width() - 1; x += 6) { |
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, x, 0, color); |
} |
for (y = 0; y < GFX_height() - 1; y += 6) { |
GFX_drawLine(GFX_width() - 1, GFX_height() - 1, 0, y, color); |
} |
} |
void SSD1331_Test_DrawRect(unsigned int color) { |
int x; |
GFX_clearScreen(); |
if (GFX_height() < GFX_width()) { |
for (x = 0; x < GFX_height() - 1; x += 6) { |
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color); |
} |
} else { |
for (x = 0; x < GFX_width() - 1; x += 6) { |
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color); |
} |
} |
} |
void SSD1331_Test_FillRect(unsigned int color1, unsigned int color2) { |
int x; |
GFX_clearScreen(); |
if (GFX_height() < GFX_width()) { |
for (x = GFX_height() - 1; x > 6; x -= 6) { |
GFX_fillRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color1); |
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color2); |
} |
} else { |
for (x = GFX_width() - 1; x > 6; x -= 6) { |
GFX_fillRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color1); |
GFX_drawRect((GFX_width() - 1) / 2 - x / 2, (GFX_height() - 1) / 2 - x / 2, x, x, color2); |
} |
} |
} |
void SSD1331_Test_DrawCircle(unsigned int radius, unsigned int color) { |
int x, y; |
for (x = 0; x < GFX_width() - 1 + radius; x += radius * 2) { |
for (y = 0; y < GFX_height() - 1 + radius; y += radius * 2) { |
GFX_drawCircle(x, y, radius, color); |
} |
} |
} |
void SSD1331_Test_FillCircle(unsigned int radius, unsigned int color) { |
unsigned char x, y; |
for (x = radius; x < GFX_width() - 1; x += radius * 2) { |
for (y = radius; y < GFX_height() - 1; y += radius * 2) { |
GFX_fillCircle(x, y, radius, color); |
} |
} |
} |
void SSD1331_Test_DrawTria(void) { |
int color = 0xF800; |
int t; |
int w = GFX_width() / 2; |
int x = GFX_height(); |
int y = 0; |
int z = GFX_width(); |
GFX_clearScreen(); |
for (t = 0; t <= 15; t += 1) { |
GFX_drawTriangle(w, y, y, x, z, x, color); |
x -= 4; |
y += 4; |
z -= 4; |
color += 100; |
} |
} |
void SSD1331_Test_DrawRoundRect(void) { |
int color = 100; |
int i, t, x, y, w, h; |
GFX_clearScreen(); |
for (t = 0; t <= 4; t += 1) { |
x = 0; |
y = 0; |
w = GFX_width(); |
h = GFX_height(); |
for (i = 0; i <= 24; i += 1) { |
GFX_drawRoundRect(x, y, w, h, 5, color); |
x += 2; |
y += 3; |
w -= 4; |
h -= 6; |
color += 1100; |
} |
color += 100; |
} |
} |
void SSD1331_Test_MediaButtons(void) { |
// play |
GFX_clearScreen(); |
GFX_fillRoundRect(25, 10, 78, 60, 8, SSD1331_WHITE); |
GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_RED); |
Delay10KTCYx(100); |
// pause |
GFX_fillRoundRect(25, 90, 78, 60, 8, SSD1331_WHITE); |
GFX_fillRoundRect(39, 98, 20, 45, 5, SSD1331_GREEN); |
GFX_fillRoundRect(69, 98, 20, 45, 5, SSD1331_GREEN); |
Delay10KTCYx(100); |
// play color |
GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_BLUE); |
Delay10KTCYx(100); |
// pause color |
GFX_fillRoundRect(39, 98, 20, 45, 5, SSD1331_RED); |
GFX_fillRoundRect(69, 98, 20, 45, 5, SSD1331_RED); |
// play color |
GFX_fillTriangle(42, 20, 42, 60, 90, 40, SSD1331_GREEN); |
} |
void SSD1331_Test_Pattern(void) { |
unsigned char buffer[2]; |
unsigned int i, j; |
SSD1331_GoTo(0, 0); |
for (i = 0; i < 64; i++) { |
for (j = 0; j < 96; j++) { |
if (i > 55) { |
buffer[0] = (SSD1331_WHITE >> 8); |
buffer[1] = (SSD1331_WHITE); |
} else if (i > 47) { |
buffer[0] = (SSD1331_BLUE >> 8); |
buffer[1] = (SSD1331_BLUE); |
} else if (i > 39) { |
buffer[0] = (SSD1331_GREEN >> 8); |
buffer[1] = (SSD1331_GREEN); |
} else if (i > 31) { |
buffer[0] = (SSD1331_CYAN >> 8); |
buffer[1] = (SSD1331_CYAN); |
} else if (i > 23) { |
buffer[0] = (SSD1331_RED >> 8); |
buffer[1] = (SSD1331_RED); |
} else if (i > 15) { |
buffer[0] = (SSD1331_MAGENTA >> 8); |
buffer[1] = (SSD1331_MAGENTA); |
} else if (i > 7) { |
buffer[0] = (SSD1331_YELLOW >> 8); |
buffer[1] = (SSD1331_YELLOW); |
} else { |
buffer[0] = (SSD1331_BLACK >> 8); |
buffer[1] = (SSD1331_BLACK); |
} |
LATBbits.LATB5 = 1; // D/C high (data) |
SPI2_Write(buffer, 2); |
} |
} |
} |
/PIC Stuff/PIC_27J13/oled_ssd1331.h |
---|
0,0 → 1,78 |
#ifndef OLED_SSD1331_H |
#define OLED_SSD1331_H |
#define SSD1331_LCDWIDTH 96 |
#define SSD1331_LCDHEIGHT 64 |
// Select one of these defines to set the pixel color order |
#define SSD1331_COLORORDER_RGB |
// #define SSD1331_COLORORDER_BGR |
// SSD1331 Commands |
#define SSD1331_CMD_DRAWLINE 0x21 |
#define SSD1331_CMD_DRAWRECT 0x22 |
#define SSD1331_CMD_CLEARWINDOW 0x25 |
#define SSD1331_CMD_FILL 0x26 |
#define SSD1331_CMD_SETCOLUMN 0x15 |
#define SSD1331_CMD_SETROW 0x75 |
#define SSD1331_CMD_CONTRASTA 0x81 |
#define SSD1331_CMD_CONTRASTB 0x82 |
#define SSD1331_CMD_CONTRASTC 0x83 |
#define SSD1331_CMD_MASTERCURRENT 0x87 |
#define SSD1331_CMD_SETREMAP 0xA0 |
#define SSD1331_CMD_STARTLINE 0xA1 |
#define SSD1331_CMD_DISPLAYOFFSET 0xA2 |
#define SSD1331_CMD_NORMALDISPLAY 0xA4 |
#define SSD1331_CMD_DISPLAYALLON 0xA5 |
#define SSD1331_CMD_DISPLAYALLOFF 0xA6 |
#define SSD1331_CMD_INVERTDISPLAY 0xA7 |
#define SSD1331_CMD_SETMULTIPLEX 0xA8 |
#define SSD1331_CMD_SETMASTER 0xAD |
#define SSD1331_CMD_DISPLAYOFF 0xAE |
#define SSD1331_CMD_DISPLAYON 0xAF |
#define SSD1331_CMD_POWERMODE 0xB0 |
#define SSD1331_CMD_PRECHARGE 0xB1 |
#define SSD1331_CMD_CLOCKDIV 0xB3 |
#define SSD1331_CMD_PRECHARGEA 0x8A |
#define SSD1331_CMD_PRECHARGEB 0x8B |
#define SSD1331_CMD_PRECHARGEC 0x8C |
#define SSD1331_CMD_PRECHARGELEVEL 0xBB |
#define SSD1331_CMD_VCOMH 0xBE |
// Color definitions |
#define SSD1331_BLACK 0x0000 |
#define SSD1331_BLUE 0x001F |
#define SSD1331_RED 0xF800 |
#define SSD1331_GREEN 0x07E0 |
#define SSD1331_CYAN 0x07FF |
#define SSD1331_MAGENTA 0xF81F |
#define SSD1331_YELLOW 0xFFE0 |
#define SSD1331_WHITE 0xFFFF |
void SSD1331_Init(void); |
void SSD1331_Begin(void); |
void SSD1331_GoTo(int x, int y); |
void SSD1331_Command(unsigned char c); |
void SSD1331_Data(unsigned char d); |
void SSD1331_Draw_Pixel(int x, int y, unsigned int color); |
void SSD1331_Draw_Line(int x0, int y0, int x1, int y1, unsigned int color); |
void SSD1331_Draw_Rect(int x0, int y0, int x1, int y1, unsigned int color); |
void SSD1331_Fill_Rect(int x0, int y0, int x1, int y1, unsigned int color); |
void SSD1331_Clear_Display(void); |
unsigned int SSD1331_Color565(unsigned char r, unsigned char g, unsigned char b); |
void SSD1331_Test_DrawLines(unsigned int color); |
void SSD1331_Test_DrawRect(unsigned int color); |
void SSD1331_Test_FillRect(unsigned int color1, unsigned int color2); |
void SSD1331_Test_DrawCircle(unsigned int radius, unsigned int color); |
void SSD1331_Test_FillCircle(unsigned int radius, unsigned int color); |
void SSD1331_Test_DrawTria(void); |
void SSD1331_Test_DrawRoundRect(void); |
void SSD1331_Test_MediaButtons(void); |
void SSD1331_Test_Pattern(void); |
#endif /* OLED_SSD1331_H */ |
/PIC Stuff/PIC_27J13/timers.c |
---|
0,0 → 1,57 |
/* The processor calls these handlers when an interrupt is triggered */ |
#include "maindefs.h" |
#include <timers.h> |
#include "timers.h" |
void timers_init() { |
/*--------------------Timer Delay Formulas-------------------- */ |
/* InitTMR0 = 256 - ( Delay * Frequency ) / ( 4* Prescaler) */ |
/* Delay = (256 - InitTMR0 * Prescaler) / (Frequency / 4) */ |
/* ----------------------------------------------------------- */ |
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16); |
T0CONbits.TMR0ON = 0; // Timer 0 initially off |
// // Set timer 1 to overflow every two seconds |
// OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & |
// T1_SOURCE_PINOSC & T1_PS_1_1 & |
// T1_OSC1EN_ON & T1_SYNC_EXT_OFF, |
// TIMER_GATE_OFF & TIMER_GATE_INT_OFF); |
// Open timer 2 for ECCP1 (PWM) |
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1); |
// Open timer 3 for PWM IR signaling |
OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_SOURCE_FOSC_4 & |
T3_OSC1EN_OFF & T3_PS_1_1 & T3_SYNC_EXT_OFF, TIMER_GATE_OFF); |
T3CONbits.TMR3ON = 0; // Timer 3 initially off |
} |
// Interrupt handler for timer 0 |
void timer0_interrupt_handler() { |
} |
void timer0_enable() { |
T0CONbits.TMR0ON = 1; |
} |
void timer0_disable() { |
T0CONbits.TMR0ON = 0; |
} |
// Interrupt handler for timer 1 |
void timer1_interrupt_handler() { |
} |
void timer3_interrupt_handler() { |
} |
void timer3_enable() { |
T3CONbits.TMR3ON = 1; |
} |
void timer3_disable() { |
T3CONbits.TMR3ON = 0; |
} |
/PIC Stuff/PIC_27J13/Makefile |
---|
0,0 → 1,108 |
# |
# There exist several targets which are by default empty and which can be |
# used for execution of your targets. These targets are usually executed |
# before and after some main targets. They are: |
# |
# .build-pre: called before 'build' target |
# .build-post: called after 'build' target |
# .clean-pre: called before 'clean' target |
# .clean-post: called after 'clean' target |
# .clobber-pre: called before 'clobber' target |
# .clobber-post: called after 'clobber' target |
# .all-pre: called before 'all' target |
# .all-post: called after 'all' target |
# .help-pre: called before 'help' target |
# .help-post: called after 'help' target |
# |
# Targets beginning with '.' are not intended to be called on their own. |
# |
# Main targets can be executed directly, and they are: |
# |
# build build a specific configuration |
# clean remove built files from a configuration |
# clobber remove all built files |
# all build all configurations |
# help print help mesage |
# |
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and |
# .help-impl are implemented in nbproject/makefile-impl.mk. |
# |
# Available make variables: |
# |
# CND_BASEDIR base directory for relative paths |
# CND_DISTDIR default top distribution directory (build artifacts) |
# CND_BUILDDIR default top build directory (object files, ...) |
# CONF name of current configuration |
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) |
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) |
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) |
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) |
# CND_PACKAGE_NAME_${CONF} name of package (current configuration) |
# CND_PACKAGE_PATH_${CONF} path to package (current configuration) |
# |
# NOCDDL |
# Environment |
MKDIR=mkdir |
CP=cp |
CCADMIN=CCadmin |
RANLIB=ranlib |
# build |
build: .build-post |
.build-pre: |
# Add your pre 'build' code here... |
.build-post: .build-impl |
# Add your post 'build' code here... |
# clean |
clean: .clean-post |
.clean-pre: |
# Add your pre 'clean' code here... |
.clean-post: .clean-impl |
# Add your post 'clean' code here... |
# clobber |
clobber: .clobber-post |
.clobber-pre: |
# Add your pre 'clobber' code here... |
.clobber-post: .clobber-impl |
# Add your post 'clobber' code here... |
# all |
all: .all-post |
.all-pre: |
# Add your pre 'all' code here... |
.all-post: .all-impl |
# Add your post 'all' code here... |
# help |
help: .help-post |
.help-pre: |
# Add your pre 'help' code here... |
.help-post: .help-impl |
# Add your post 'help' code here... |
# include project implementation makefile |
include nbproject/Makefile-impl.mk |
# include project make variables |
include nbproject/Makefile-variables.mk |
/PIC Stuff/PIC_27J13/adc.h |
---|
0,0 → 1,9 |
#ifndef __adc_h |
#define __adc_h |
void adc_init(void); |
void adc_start(void); |
void adc_stop(void); |
void adc_interrupt_handler(void); |
#endif |
/PIC Stuff/PIC_27J13/interrupts.h |
---|
0,0 → 1,29 |
#ifndef __interrupts_h |
#define __interrupts_h |
// Note: As the interrupt system is currently setup, at the end |
// of each high-priority interrupt, the system will check to |
// see if the processor may be put to sleep. This is done |
// with the call sleep_high_interrupt_if_okay() which is defined |
// in msg_queues.h -- init_queues() MUST be called prior to |
// enabling interrupts if sleep_high_interrupt_if_okay() is called! |
// Initialize the interrupts |
void interrupt_init(void); |
// enable the interrupts (high and low priority) |
void interrupt_enable(void); |
// Are we calling from a high-priority interrupt? |
int interrupt_in_high_interrupt_routine(void); |
// Is a low-priority interrupt active? |
int interrupt_low_int_active(void); |
// Are we calling from a low-priority interrupt? |
int interrupt_in_low_interrupt_routine(void); |
// Are we calling this from the "main" routine (i.e., not an interrrupt handler?) |
int interrupt_in_main_routine(void); |
#endif |
/PIC Stuff/PIC_27J13/pin_interrupts.c |
---|
0,0 → 1,101 |
#include "maindefs.h" |
#include "pin_interrupts.h" |
#include "pwm.h" |
#include "msg_queues.h" |
#include <delays.h> |
static unsigned char port_b_prev_state; |
void intx_init() { |
TRISAbits.TRISA5 = 1; |
TRISCbits.TRISC2 = 0; |
LATCbits.LATC2 = 0; |
RPINR1 = 2; // Bind INT1 interrupt to RP2 |
INTCON2bits.INTEDG1 = 0; // Trigger on falling edge |
} |
void int1_interrupt_handler() { |
LATCbits.LATC2 = 1; |
Delay10TCYx(255); |
LATCbits.LATC2 = 0; |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_INT1, (void *) 0); |
} |
void port_b_int_init() { |
port_b_prev_state = 0x0F; |
INTCON2bits.RBPU = 0; |
// Set pins as inputs |
TRISBbits.TRISB4 = 1; |
TRISBbits.TRISB5 = 1; |
TRISBbits.TRISB6 = 1; |
TRISBbits.TRISB7 = 1; |
// Turn on internal voltage pull-up |
PORTBbits.RB4 = 1; |
PORTBbits.RB5 = 1; |
PORTBbits.RB6 = 1; |
PORTBbits.RB7 = 1; |
LATBbits.LATB4 = 1; |
LATBbits.LATB5 = 1; |
LATBbits.LATB6 = 1; |
LATBbits.LATB7 = 1; |
} |
void port_b_int_interrupt_handler() { |
// Pull the new pin values |
unsigned char new_state = (PORTB & 0xF0) >> 4; |
// Query which pin input value changed and send value to main() |
if ((new_state ^ port_b_prev_state) & 0x01) { |
if (port_b_prev_state & 0x01) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B4 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_4_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B4 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_4_UP, (void *) 0); |
} |
} |
if ((new_state ^ port_b_prev_state) & 0x02) { |
if (port_b_prev_state & 0x02) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B5 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_5_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B5 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_5_UP, (void *) 0); |
} |
} |
if ((new_state ^ port_b_prev_state) & 0x04) { |
if (port_b_prev_state & 0x04) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B6 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_6_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B6 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_6_UP, (void *) 0); |
} |
} |
if ((new_state ^ port_b_prev_state) & 0x08) { |
if (port_b_prev_state & 0x08) { |
// Pin transitioned HIGH -> LOW (button pressed) |
DBG_PRINT_PORTB_INT("Port B7 HIGH->LOW\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_7_DOWN, (void *) 0); |
} else { |
// Pin transitioned LOW -> HIGH (button released) |
DBG_PRINT_PORTB_INT("Port B7 LOW->HIGH\r\n"); |
MQ_sendmsg_ToMainFromLow(0, MSGTYPE_PORTB_7_UP, (void *) 0); |
} |
} |
// Save the new state of pins |
port_b_prev_state = new_state; |
} |
/PIC Stuff/PIC_27J13/pin_interrupts.h |
---|
0,0 → 1,10 |
#ifndef __pin_interrupts_h |
#define __pin_interrupts_h |
void intx_init(void); |
void int1_interrupt_handler(void); |
void port_b_int_init(void); |
void port_b_int_interrupt_handler(void); |
#endif |
/PIC Stuff/PIC_27J13/pwm.c |
---|
0,0 → 1,31 |
#include "maindefs.h" |
#include "pwm.h" |
#include <pwm.h> |
void pwm_init() { |
// Configure pins RC5 and RC7 as outputs |
TRISCbits.TRISC0 = 0; |
TRISCbits.TRISC1 = 0; |
LATCbits.LATC0 = 0; |
LATCbits.LATC1 = 0; |
RPOR11 = 14; // Set RP11 to ECCP1 PWM Output Channel A |
RPOR12 = 15; // Set RP12 to ECCP1 PWM Output Channel B |
} |
void pwm_start() { |
OpenEPWM1(0xFF, ECCP_1_SEL_TMR12); // 38kHz Frequency |
SetDCEPWM1(512); // 50% Duty Cycle |
// Wait for completion of a full PWM cycle before enabling output mode |
while(!PIR1bits.TMR2IF); |
SetOutputEPWM1(SINGLE_OUT, PWM_MODE_1); |
// Enable ECCP1 output channels A and B |
PSTR1CONbits.STRA = 1; |
PSTR1CONbits.STRB = 1; |
} |
void pwm_stop() { |
CloseEPWM1(); |
} |
/PIC Stuff/PIC_27J13/pwm.h |
---|
0,0 → 1,10 |
#ifndef __pwm_h |
#define __pwm_h |
void pwm_init(void); |
void pwm_start(void); |
void pwm_stop(void); |
static char pwm_on = 0; |
#endif |
/PIC Stuff/PIC_27J13/timers.h |
---|
0,0 → 1,14 |
#ifndef __timer_interrupt_handler_h |
#define __timer_interrupt_handler_h |
void timers_init(void); |
void timer0_interrupt_handler(void); |
void timer0_enable(void); |
void timer0_disable(void); |
void timer1_interrupt_handler(void); |
void timer2_interrupt_handler(void); |
void timer3_interrupt_handler(void); |
void timer3_enable(void); |
void timer3_disable(void); |
#endif |
/PIC Stuff/PIC_27J13/xbee.c |
---|
0,0 → 1,211 |
#include "maindefs.h" |
#include "msg_queues.h" |
#include "xbee.h" |
#include <usart.h> |
#include <delays.h> |
static XBEE_DATA *xbee_data_ptr; |
static void *xbee_data_array_ptr; |
/* Initialize variables used by this library */ |
void xbee_init(XBEE_DATA *xd) { |
TRISBbits.TRISB0 = 1; // RB0 is CTS, set by XBee chip |
TRISBbits.TRISB1 = 0; // RB1 is RTS, set by PIC |
LATBbits.LATB0 = 0; // Pin set high to signal stop sending data to XBee |
LATBbits.LATB1 = 0; // Pin set high to indicate stop sending data to PIC |
xbee_data_ptr = xd; |
xbee_data_ptr->dataind = 0; |
xbee_data_ptr->checksum_sum = 0; |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
// Grab a pointer to where the unique frame array starts |
xbee_data_array_ptr = &(xbee_data_ptr->rcv_frame.FRAME); |
} |
/* Here we handle the serial input from the UART interrupt */ |
void xbee_read_serial(unsigned char c) { |
// Reset on start bit and start saving data |
if (c == XBEE_START_DELIMITER) { |
// On detect start delimiter, clear out initial array |
xbee_data_ptr->dataind = 0; |
xbee_data_ptr->checksum_sum = 0; |
xbee_data_ptr->rcv_frame.start_delimiter = XBEE_START_DELIMITER; |
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_HIGH; |
} else { |
switch(xbee_data_ptr->read_state) { |
case XBEE_STATE_READ_START: |
// Do nothing and wait till start bit is read |
break; |
case XBEE_STATE_READ_LENGTH_HIGH: |
// Read length (MSB) |
xbee_data_ptr->rcv_frame.length.INT_16.char_value[1] = c; |
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_LOW; |
break; |
case XBEE_STATE_READ_LENGTH_LOW: |
// Read length (LSB) |
xbee_data_ptr->rcv_frame.length.INT_16.char_value[0] = c; |
xbee_data_ptr->read_state = XBEE_STATE_READ_FRAME_DATA; |
break; |
case XBEE_STATE_READ_FRAME_DATA: |
// Read unique frame data |
if (xbee_data_ptr->dataind < xbee_data_ptr->rcv_frame.length.INT_16.int_value) { |
*((char*)xbee_data_array_ptr + xbee_data_ptr->dataind) = c; |
xbee_data_ptr->checksum_sum += c; |
xbee_data_ptr->dataind++; |
} |
// If total length is read, the next byte is the expected checksum |
if (xbee_data_ptr->dataind == xbee_data_ptr->rcv_frame.length.INT_16.int_value) { |
xbee_data_ptr->read_state = XBEE_STATE_READ_CHECKSUM; |
} |
break; |
case XBEE_STATE_READ_CHECKSUM: |
// Calculate and compare checksum |
if (0xFF - xbee_data_ptr->checksum_sum == c) { |
// Frame was recieved successfully |
xbee_process_recieved_frame(); |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
} else { |
// If checksum does not match, drop frame |
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n"); |
xbee_data_ptr->read_state = XBEE_STATE_READ_START; |
} |
break; |
} |
} |
} |
/* This is called when a full frame arrives to process the frame data */ |
void xbee_process_recieved_frame() { |
char ret_status; |
// Here we want to process each frame and send the data to Main() |
// Send the frame to main() with the message type depending on the frame type |
switch(*((unsigned char *) xbee_data_array_ptr)) { |
case XBEE_RX_AT_COMMAND_RESPONSE: |
DBG_PRINT_XBEE("XBEE: parsing recieved AT command response frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_DATA_PACKET: |
DBG_PRINT_XBEE("XBEE: parsing recieved data recieved frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_PACKET, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_DATA_TX_STATUS: |
DBG_PRINT_XBEE("XBEE: parsing recieved TX status frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_TX_STATUS, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_IO_DATA_SAMPLE: |
DBG_PRINT_XBEE("XBEE: parsing recieved IO data sample frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_IO_DATA_SAMPLE, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_EXPLICIT_COMMAND: |
DBG_PRINT_XBEE("XBEE: parsing recieved explicit command frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_EXPLICIT_COMMAND, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE: |
DBG_PRINT_XBEE("XBEE: parsing recieved remote AT command frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_ROUTE_RECORD: |
DBG_PRINT_XBEE("XBEE: parsing recieved route record frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_ROUTE_RECORD, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_NODE_IDENTIFICATION: |
DBG_PRINT_XBEE("XBEE: parsing recieved node identification frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_NODE_IDENTIFICATION, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
case XBEE_RX_FRAME_MODEM_STATUS: |
DBG_PRINT_XBEE("XBEE: parsing recieved modem status frame\r\n"); |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS, (void *)xbee_data_array_ptr); |
if (ret_status < 0) { |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status); |
} |
break; |
default: |
DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n"); |
} |
} |
//void xbee_process_transmit_frame_interrupt(void) { |
// unsigned char i; |
// char length; |
// |
// if (MQ_peek_FromMainToHigh() == MSGTYPE_XBEE_TX_FRAME) { |
// length = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *) xbee_data_ptr->msgtype, (void *) xbee_data_array_ptr); |
// xbee_data_ptr->checksum_sum = 0; |
// Write2USART(XBEE_START_DELIMITER); |
// while (Busy2USART()); |
// Write2USART(0x00); |
// while (Busy2USART()); |
// Write2USART(length); |
// while (Busy2USART()); |
// for (i = 0; i < length; i++) { |
// Write2USART(*((unsigned char *) xbee_data_array_ptr + i)); |
// xbee_data_ptr->checksum_sum += *((unsigned char *) xbee_data_array_ptr + i); |
// while (Busy2USART()); |
// } |
// Write2USART(0xFF - xbee_data_ptr->checksum_sum); |
// while (Busy2USART()); |
// } |
//} |
void xbee_process_transmit_frame(void *data, unsigned char length) { |
unsigned char i; |
unsigned char checksum = 0; |
Write2USART(XBEE_START_DELIMITER); |
while (Busy2USART() || xbee_read_CTS()); |
Write2USART(0x00); |
while (Busy2USART() || xbee_read_CTS()); |
Write2USART(length); |
while (Busy2USART() || xbee_read_CTS()); |
for (i = 0; i < length; i++) { |
Write2USART(*((unsigned char *) data + i)); |
checksum += *((unsigned char *) data + i); |
while (Busy2USART() || xbee_read_CTS()); |
} |
Write2USART(0xFF - checksum); |
while (Busy2USART()); |
} |
void xbee_set_RTS(unsigned char c) { |
if (c) { |
LATBbits.LATB1 = 1; // Set high to stop receiving data |
} else { |
LATBbits.LATB1 = 0; // Set low to resume receiving data |
} |
} |
unsigned char xbee_read_CTS() { |
unsigned char c = PORTBbits.RB0; |
if (c) { |
return 0x1; // High indicates stop sending data |
} else { |
return 0x0; // Low indicates ok to send data |
} |
} |
/PIC Stuff/PIC_27J13/xbee.h |
---|
0,0 → 1,256 |
#ifndef __xbee_h |
#define __xbee_h |
#define XBEE_BUFFER_SIZE MSGLEN |
#define XBEE_START_DELIMITER 0x7E |
// Expected 'next' state |
#define XBEE_STATE_READ_START 10 |
#define XBEE_STATE_READ_LENGTH_HIGH 11 |
#define XBEE_STATE_READ_LENGTH_LOW 12 |
#define XBEE_STATE_READ_FRAME_DATA 14 |
#define XBEE_STATE_READ_CHECKSUM 15 |
// Command Frame Type |
#define XBEE_TX_AT_COMMAND 0x08 |
#define XBEE_TX_AT_COMMAND_QUEUE 0x09 |
#define XBEE_RX_AT_COMMAND_RESPONSE 0x88 |
#define XBEE_TX_DATA_PACKET 0x10 |
#define XBEE_RX_DATA_PACKET 0x90 |
#define XBEE_RX_DATA_TX_STATUS 0x8B |
#define XBEE_RX_IO_DATA_SAMPLE 0x92 |
#define XBEE_TX_EXPLICIT_COMMAND 0x11 |
#define XBEE_RX_EXPLICIT_COMMAND 0x91 |
#define XBEE_TX_REMOTE_AT_COMMAND 0x17 |
#define XBEE_RX_REMOTE_AT_COMMAND_RESPONSE 0x97 |
#define XBEE_TX_CREATE_SOURCE_ROUTE 0x21 |
#define XBEE_RX_ROUTE_RECORD 0xA1 |
#define XBEE_RX_NODE_IDENTIFICATION 0x95 |
#define XBEE_RX_FRAME_MODEM_STATUS 0x8A |
typedef struct { |
union { |
unsigned long long_value; |
unsigned char char_value[4]; // Little Endian!! |
} UPPER_32; |
union { |
unsigned long long_value; |
unsigned char char_value[4]; // Little Endian!! |
} LOWER_32; |
} XBEE_ADDRESS_64; |
typedef struct { |
union { |
unsigned int int_value; |
unsigned char char_value[2]; // Little Endian!! |
} INT_16; |
} XBEE_ADDRESS_16; |
// Unique Frame Components |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
unsigned char command[2]; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_AT_COMMAND_FRAME; |
#define XBEE_TX_AT_COMMAND_FRAME_SIZE 4 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
unsigned char command[2]; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_AT_COMMAND_QUEUE_FRAME; |
#define XBEE_TX_AT_COMMAND_QUEUE_FRAME_SIZE 4 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
unsigned char command[2]; |
unsigned char command_status; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_RX_AT_COMMAND_RESPONSE_FRAME; |
#define XBEE_RX_AT_COMMAND_RESPONSE_FRAME_SIZE 5 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char broadcast_radius; |
unsigned char options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_DATA_PACKET_FRAME; |
#define XBEE_TX_DATA_PACKET_FRAME_SIZE 14 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_RX_DATA_PACKET_FRAME; |
#define XBEE_RX_DATA_PACKET_FRAME_SIZE 12 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_16 destination_16; |
unsigned char transmit_retry_count; |
unsigned char delivery_status; |
unsigned char discovery_status; |
} XBEE_RX_DATA_TX_STATUS_FRAME; |
#define XBEE_RX_DATA_TX_STATUS_FRAME_SIZE 7 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
unsigned char number_of_samples; |
unsigned char digital_ch_mask[2]; |
unsigned char analog_ch_mask; |
unsigned char digital_samples[2]; |
unsigned char analog_samples[8]; |
} XBEE_RX_IO_DATA_SAMPLE_FRAME; |
#define XBEE_RX_IO_DATA_SAMPLE_FRAME_SIZE 26 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char source_endpoint; |
unsigned char destination_endpoint; |
unsigned char cluster_id[2]; |
unsigned char profile_id[2]; |
unsigned char broadcast_radius; |
unsigned char transmit_options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_EXPLICIT_COMMAND_FRAME; |
#define XBEE_TX_EXPLICIT_COMMAND_FRAME_SIZE 20 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char source_endpoint; |
unsigned char destination_endpoint; |
unsigned char cluster_id[2]; |
unsigned char profile_id[2]; |
unsigned char recieve_options; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_RX_EXPLICIT_COMMAND_FRAME; |
#define XBEE_RX_EXPLICIT_COMMAND_FRAME_SIZE 18 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char remote_options; |
unsigned char command[2]; |
unsigned char data[XBEE_BUFFER_SIZE]; |
} XBEE_TX_REMOTE_AT_COMMAND_FRAME; |
#define XBEE_TX_REMOTE_AT_COMMAND_FRAME_SIZE 15 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char command[2]; |
unsigned char command_status; |
unsigned char command_data[4]; |
} XBEE_RX_REMOTE_AT_COMMAND_FRAME; |
#define XBEE_RX_REMOTE_AT_COMMAND_FRAME_SIZE 19 |
typedef struct { |
unsigned char frame_type; |
unsigned char frame_id; |
XBEE_ADDRESS_64 destination_64; |
XBEE_ADDRESS_16 destination_16; |
unsigned char route_options; |
unsigned char num_of_addresses; |
unsigned char addresses[XBEE_BUFFER_SIZE]; |
} XBEE_TX_CREATE_SOURCE_ROUTE_FRAME; |
#define XBEE_TX_CREATE_SOURCE_ROUTE_FRAME_SIZE 14 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
unsigned char num_of_addresses; |
unsigned char addresses[XBEE_BUFFER_SIZE]; |
} XBEE_RX_ROUTE_RECORD_FRAME; |
#define XBEE_RX_ROUTE_RECORD_FRAME_SIZE 13 |
typedef struct { |
unsigned char frame_type; |
XBEE_ADDRESS_64 source_64; |
XBEE_ADDRESS_16 source_16; |
unsigned char recieve_options; |
XBEE_ADDRESS_16 remote_16; |
XBEE_ADDRESS_64 remote_64; |
unsigned char NI_string[2]; |
XBEE_ADDRESS_16 parent_16; |
unsigned char device_type; |
unsigned char source_event; |
unsigned char profile_id[2]; |
unsigned char manufacturer_id[2]; |
} XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME; |
#define XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME_SIZE 32 |
typedef struct { |
unsigned char frame_type; |
unsigned char status; |
} XBEE_RX_MODEM_STATUS_FRAME; |
#define XBEE_RX_MODEM_STATUS_FRAME_SIZE 2 |
// Common Frame Components |
typedef struct __XBEE_FRAME { |
unsigned char start_delimiter; |
XBEE_ADDRESS_16 length; |
union { |
XBEE_TX_AT_COMMAND_FRAME TX_AT_COMMAND; |
XBEE_TX_AT_COMMAND_QUEUE_FRAME TX_AT_COMMAND_QUEUE; |
XBEE_RX_AT_COMMAND_RESPONSE_FRAME RX_AT_COMMAND_RESPONSE; |
XBEE_TX_DATA_PACKET_FRAME TX_DATA_PACKET; |
XBEE_RX_DATA_PACKET_FRAME RX_DATA_PACKET; |
XBEE_RX_DATA_TX_STATUS_FRAME RX_DATA_TX_STATUS; |
XBEE_RX_IO_DATA_SAMPLE_FRAME RX_IO_DATA_SAMPLE; |
XBEE_TX_EXPLICIT_COMMAND_FRAME TX_EXPLICIT_COMMAND; |
XBEE_RX_EXPLICIT_COMMAND_FRAME RX_EXPLICIT_COMMAND; |
XBEE_TX_REMOTE_AT_COMMAND_FRAME TX_REMOTE_AT_COMMAND; |
XBEE_RX_REMOTE_AT_COMMAND_FRAME RX_REMOTE_AT_COMMAND; |
XBEE_TX_CREATE_SOURCE_ROUTE_FRAME TX_CREATE_SOURCE_ROUTE; |
XBEE_RX_ROUTE_RECORD_FRAME RX_ROUTE_RECORD; |
XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME RX_NODE_IDENTIFICATION; |
XBEE_RX_MODEM_STATUS_FRAME RX_MODEM_STATUS; |
} FRAME; |
} XBEE_FRAME; |
// Overall Data Structure |
typedef struct __xbee_data { |
XBEE_FRAME rcv_frame; |
unsigned char dataind; |
unsigned char checksum_sum; |
unsigned char read_state; |
unsigned char msgtype; |
} XBEE_DATA; |
void xbee_init(XBEE_DATA *); |
void xbee_read_serial(unsigned char); |
void xbee_process_recieved_frame(void); |
//void xbee_process_transmit_frame_interrupt(void); |
void xbee_process_transmit_frame(void *data, unsigned char length); |
void xbee_set_RTS(unsigned char); |
unsigned char xbee_read_CTS(void); |
#endif |