1 #include <libopencm3/stm32/rcc.h>
2 #include <libopencm3/stm32/gpio.h>
6 typedef unsigned char byte;
10 for (int i=0; i<7200; i++)
14 static void set_reg(int reg, int data)
18 gpio_clear(GPIOB, GPIO13);
21 for (int mask=0x8000; mask; mask >>= 1) {
23 gpio_set(GPIOB, GPIO12);
25 gpio_clear(GPIOB, GPIO12);
27 gpio_set(GPIOB, GPIO14);
29 gpio_clear(GPIOB, GPIO14);
33 gpio_set(GPIOB, GPIO13);
40 static unsigned char smile[8] = {
52 static void refresh_display(void)
54 for (int i=1; i<=8; i++)
55 set_reg(i, display[8-i]);
58 static signed char dirs[4][2] = {{1,0}, {0,-1}, {-1,0}, {0,1}};
60 static byte snake_dir;
62 static byte snake[SNAKE_MAX][2];
63 static byte snake_tail, snake_head;
65 static unsigned int rng_state = 0xdeadbeef;
67 static byte buttons[2];
69 static void gen_food(void)
71 food[0] = (rng_state >> 28) & 7;
72 food[1] = (rng_state >> 20) & 7;
73 rng_state *= 0x3771cadb;
76 static void snake_init(void)
86 static void snake_show(void)
88 memset(display, 0, 8);
89 for (int i=snake_tail; i != snake_head; i = (i+1) % SNAKE_MAX)
90 display[snake[i][0]] |= 1 << snake[i][1];
91 display[food[0]] |= 1 << food[1];
95 static void snake_step(void)
98 snake_dir = (snake_dir+3) % 4;
100 snake_dir = (snake_dir+1) % 4;
102 int hi = (snake_head + SNAKE_MAX - 1) % SNAKE_MAX;
103 int x = snake[hi][0] + dirs[snake_dir][0];
104 int y = snake[hi][1] + dirs[snake_dir][1];
106 if (x < 0 || x > 7 || y < 0 || y > 7)
109 snake[snake_head][0] = x;
110 snake[snake_head][1] = y;
111 snake_head = (snake_head + 1) % SNAKE_MAX;
113 if (x == food[0] && y == food[1])
116 snake_tail = (snake_tail + 1) % SNAKE_MAX;
123 rcc_clock_setup_in_hse_8mhz_out_72mhz();
124 rcc_periph_clock_enable(RCC_GPIOA);
125 rcc_periph_clock_enable(RCC_GPIOB);
126 rcc_periph_clock_enable(RCC_GPIOC);
128 // PC13 = BluePill LED
129 gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
131 // PB12 = display DIN
132 // PB13 = display CS*
133 // PB14 = display CLK
134 gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12 | GPIO13 | GPIO14);
135 gpio_clear(GPIOB, GPIO12);
136 gpio_set(GPIOB, GPIO13);
137 gpio_clear(GPIOB, GPIO14);
140 // PA1 = right button
141 gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO0 | GPIO1);
142 gpio_set(GPIOA, GPIO0 | GPIO1);
146 set_reg(10, 0); // intensity
148 set_reg(13, 0); // test
149 set_reg(12, 1); // shutdown
155 buttons[0] = buttons[1] = 0;
156 for (int i=0; i<1000000; i++) {
157 if (!gpio_get(GPIOA, GPIO0))
159 if (!gpio_get(GPIOA, GPIO1))
164 gpio_toggle(GPIOC, GPIO13);