summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Year_3/LSM/ex_20191009.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/Year_3/LSM/ex_20191009.c b/Year_3/LSM/ex_20191009.c
new file mode 100644
index 0000000..b381a0a
--- /dev/null
+++ b/Year_3/LSM/ex_20191009.c
@@ -0,0 +1,133 @@
+#include "stm32_unict_lib.h"
+#include <stdio.h>
+
+#define X_INCR 20
+#define Y_INCR 5
+
+#define GET_MONEY 0
+#define EROGATING 1
+#define EROGATED 2
+
+#define PRICE_L 1.5
+
+/*
+ * X = PB10
+ * Y = PB4
+ * Z = PB5
+ * T = PB6
+ * output:
+ * red = PB0
+ * yellow = PC2
+ */
+
+int money_tot = 0;
+int status = GET_MONEY;
+float erogated = 0;
+char s[5];
+int flashing = 0;
+
+int
+main()
+{
+ GPIO_init(GPIOB);
+ GPIO_init(GPIOC);
+
+ GPIO_config_output(GPIOC, 2);
+ GPIO_config_output(GPIOB, 0);
+ TIM_init(TIM2);
+ TIM_set(TIM2, 0);
+ TIM_on(TIM2);
+ TIM_enable_irq(TIM2, IRQ_UPDATE);
+ TIM_config_timebase(TIM2, 8400, 5000);
+
+ GPIO_config_input(GPIOB, 10); /* X */
+ GPIO_config_input(GPIOB, 4); /* Y */
+ GPIO_config_input(GPIOB, 5); /* Z */
+ GPIO_config_input(GPIOB, 6); /* T */
+
+ DISPLAY_init();
+
+ GPIO_config_EXTI(GPIOB, EXTI10);
+ EXTI_enable(EXTI10, FALLING_EDGE);
+ GPIO_config_EXTI(GPIOB, EXTI4);
+ EXTI_enable(EXTI4, FALLING_EDGE);
+ GPIO_config_EXTI(GPIOB, EXTI5);
+ EXTI_enable(EXTI5, FALLING_EDGE);
+ GPIO_config_EXTI(GPIOB, EXTI6);
+ EXTI_enable(EXTI6, FALLING_EDGE);
+
+ for (;;) {
+ if (status == GET_MONEY) {
+ sprintf(s, "%4d", money_tot);
+ DISPLAY_puts(0, s);
+ } else if (status == EROGATING) {
+ sprintf(s, "%g", erogated);
+ DISPLAY_puts(0, s);
+ }
+ }
+
+ return 0;
+}
+
+void
+EXTI15_10_IRQHandler(void)
+{
+ if (EXTI_isset(EXTI10)) {
+ if (status == GET_MONEY) {
+ money_tot += X_INCR;
+ }
+ EXTI_clear(EXTI10);
+ }
+}
+
+void
+EXTI4_IRQHandler(void)
+{
+ if (EXTI_isset(EXTI4)) {
+ if (status == GET_MONEY) {
+ money_tot += Y_INCR;
+ }
+ EXTI_clear(EXTI4);
+ }
+}
+
+void
+EXTI9_5_IRQHandler(void)
+{
+ if (EXTI_isset(EXTI5)) {
+ if (status == GET_MONEY) {
+ money_tot = 0;
+ }
+ EXTI_clear(EXTI5);
+ }
+
+ if (EXTI_isset(EXTI6)) {
+ if (status == GET_MONEY) {
+ status = EROGATING;
+ } else if (status == EROGATED) {
+ GPIO_write(GPIOB, 0, 0);
+ status = GET_MONEY;
+ erogated = 0;
+ money_tot = 0;
+ }
+ EXTI_clear(EXTI6);
+ }
+}
+
+void
+TIM2_IRQHandler(void)
+{
+ if (erogated >= (money_tot / PRICE_L)) {
+ if (status == EROGATING) {
+ status = EROGATED;
+ GPIO_write(GPIOB, 0, 1);
+ GPIO_write(GPIOC, 2, 0);
+ }
+ } else {
+ if (status == EROGATING) {
+ GPIO_toggle(GPIOC, 2);
+ erogated += 0.375;
+ }
+ }
+ TIM_update_clear(TIM2);
+}