aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
blob: 4982ba05cd347afb949f7e212f887920770193f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "CH58x_common.h"
#include "CH58x_sys.h"
#include "leddrv.h"

#define FB_WIDTH 	LED_COLS*4
#define SCROLL_IRATIO 	3

uint16_t fb[2][FB_WIDTH];

uint8_t test_font[][11] = {
	0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, // F
	0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, // O
	0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, // S
	0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, // S
	0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, // A
	0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, // S
	0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // I
	0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, // A
};

void draw2fb(uint16_t *fb, int c, int col) 
{
	uint16_t tmpfb[8] = {0};
	for (int i=0; i<8; i++) {
		for (int j=0; j<11; j++) {
			tmpfb[i] |= ((test_font[c][j] >> (8-i)) & 0x01) << j;
		}
	}
	for (int i=0; i<8; i++) {
		fb[col+i] = tmpfb[i];
	}
}

volatile int fb_sel = 0;

int main()
{
	SetSysClock(CLK_SOURCE_PLL_60MHz);

	led_init();
	draw2fb(fb[0], 0, 8*5);
	draw2fb(fb[0], 1, 8*6);
	draw2fb(fb[0], 2, 8*7);
	draw2fb(fb[0], 3, 8*8);
	draw2fb(fb[0], 4, 8*9);
	draw2fb(fb[0], 5, 8*10);
	draw2fb(fb[0], 6, 8*11);
	draw2fb(fb[0], 7, 8*12);

	draw2fb(fb[1], 4, 8*5);
	draw2fb(fb[1], 5, 8*6);
	draw2fb(fb[1], 6, 8*7);
	draw2fb(fb[1], 7, 8*8);
	draw2fb(fb[1], 0, 8*9);
	draw2fb(fb[1], 1, 8*10);
	draw2fb(fb[1], 2, 8*11);
	draw2fb(fb[1], 3, 8*12);

	TMR0_TimerInit(1500);
	TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END);
	PFIC_EnableIRQ(TMR0_IRQn);

	while (1) {
	}
}

__attribute__((interrupt))
void TMR0_IRQHandler(void)
{
	static int i, scroll;

	if (TMR0_GetITFlag(TMR0_3_IT_CYC_END)) {

		i += 2;
		if (i >= LED_COLS) {
			i = 0;
			scroll++;
			if (scroll >= (FB_WIDTH-LED_COLS)*SCROLL_IRATIO) {
				scroll = 0;
				fb_sel = fb_sel == 0;
			}
		}
		// This is a mess
		led_write2dcol(i/2, fb[fb_sel][i+scroll/SCROLL_IRATIO], fb[fb_sel][i+scroll/SCROLL_IRATIO+1]);

		TMR0_ClearITFlag(TMR0_3_IT_CYC_END);
	}
}