#include "Driver.h" static volatile long long ticks; static volatile long long delay_ticks; static volatile uint8_t scrn_data[16]; static volatile int btn[4] = {0}; static GPIO_InitTypeDef keyboard_gpio; static EXTI_InitTypeDef keyboard_exti; static NVIC_InitTypeDef keyboard_nvic; static void init_general() { init_usart(); ticks = 0; delay_ticks = 0; SysTick_Config(SystemCoreClock / 10000); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // disable JTAG and JTAG-DP PB4 main function. GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); } static void init_keyboard() { RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); keyboard_gpio.GPIO_Pin = K1_PIN | K2_PIN | K3_PIN | K4_PIN; keyboard_gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &keyboard_gpio); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); keyboard_exti.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line8 | EXTI_Line9; keyboard_exti.EXTI_Mode = EXTI_Mode_Interrupt; keyboard_exti.EXTI_Trigger = EXTI_Trigger_Rising; keyboard_exti.EXTI_LineCmd = ENABLE; EXTI_Init(&keyboard_exti); keyboard_nvic.NVIC_IRQChannel = EXTI9_5_IRQn; keyboard_nvic.NVIC_IRQChannelPreemptionPriority = 0; keyboard_nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&keyboard_nvic); } static void init_out() { GPIO_InitTypeDef screen_gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); screen_gpio.GPIO_Pin = LAT_PIN | CLK_PIN | DI1_PIN | DI2_PIN | DBG0_PIN | DBG1_PIN | DBG2_PIN | DBG3_PIN; screen_gpio.GPIO_Speed = GPIO_Speed_2MHz; screen_gpio.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &screen_gpio); } static void scr_low(uint32_t bit) { GPIOA->BRR = bit; } static void scr_hi(uint32_t bit) { GPIOA->BSRR = bit; } static void send_byte_para (uint8_t byte1, uint8_t byte2) { int j; scr_low(DI1_PIN); scr_low(DI2_PIN); for (j = 0; j < side; j++) { scr_low(CLK_PIN); driver_toogle(byte1 & (1 << j), DI1_PIN); driver_toogle(byte2 & (1 << j), DI2_PIN); scr_hi(CLK_PIN); scr_low(DI1_PIN); scr_low(DI2_PIN); } } static void driver_scrn_refresh (uint8_t row_ind) { volatile uint8_t *first = scrn_data; volatile uint8_t *second = scrn_data + side; // open latch ready to receive data (really?) scr_low(LAT_PIN); uint8_t row = (1 << row_ind); send_byte_para(~row, ~row); send_byte_para(first[row_ind], second[row_ind]); // Close the latch, sending the data in the registers out to the matrix scr_hi(LAT_PIN); } int driver_getkey (int key) { if (key < 0 || key > 3) return 0; return btn[key]; } void driver_low (uint32_t arg) { scr_low(arg); } void driver_hi (uint32_t arg) { scr_hi(arg); } void driver_toogle (int dir, uint32_t bit) { if (dir) scr_hi(bit); else scr_low(bit); } void driver_init() { init_general(); init_keyboard(); init_out(); } void driver_keyboard_irq (int line) { } void driver_draw (uint8_t *data) { int i; __disable_irq(); for (i = 0; i < side * 2; i++) scrn_data[i] = data[i]; __enable_irq(); } void driver_sys_tick() { ticks++; delay_ticks++; if (!(ticks & 0xff)) { btn[0] = !!(GPIOB->IDR & K1_PIN); btn[1] = !!(GPIOB->IDR & K2_PIN); btn[2] = !!(GPIOB->IDR & K3_PIN); btn[3] = !!(GPIOB->IDR & K4_PIN); int dbg_btn = btn[0] + btn[1] * 2 + btn[2] * 3 + btn[3] * 4; driver_toogle(dbg_btn & 1, DBG1_PIN); driver_toogle(dbg_btn & 2, DBG2_PIN); driver_toogle(dbg_btn & 4, DBG3_PIN); } if (!(ticks & 0x3fff)) { static int var = 0; driver_toogle(var++ & 1, DBG0_PIN); } if (!(ticks & 0xf)) { static int row_ind = 0; driver_scrn_refresh(row_ind++ & 0x7); } } void driver_delay (long long arg) { while (delay_ticks < arg) asm volatile (""); delay_ticks = 0; }