scan keyboard
This commit is contained in:
parent
f4f70853c1
commit
84b6888d7e
4
Makefile
4
Makefile
@ -1,9 +1,9 @@
|
|||||||
SDCC ?= sdcc
|
SDCC ?= sdcc
|
||||||
STCCODESIZE ?= 4089
|
STCCODESIZE ?= 4089
|
||||||
SDCCOPTS ?= --code-size $(STCCODESIZE) --xram-size 0 --data-loc 0x30
|
SDCCOPTS ?= --std-c99 --code-size $(STCCODESIZE) --xram-size 0 --data-loc 0x30
|
||||||
FLASHFILE ?= main.hex
|
FLASHFILE ?= main.hex
|
||||||
|
|
||||||
SRC = src/lcd.c src/utils.c
|
SRC = src/lcd.c src/key.c src/utils.c
|
||||||
|
|
||||||
OBJ=$(patsubst src%.c,build%.rel, $(SRC))
|
OBJ=$(patsubst src%.c,build%.rel, $(SRC))
|
||||||
|
|
||||||
|
62
src/key.c
Normal file
62
src/key.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* key.c
|
||||||
|
*
|
||||||
|
* Created on: Mar 20, 2019
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "stc15.h"
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t keys[5];
|
||||||
|
|
||||||
|
void KeyInit(void){
|
||||||
|
//set column drivers bits 7:4 to quasi-bidirectional w/ pullup M[1:0]=b00
|
||||||
|
//and row inputs bits 3:0 to quasi-bidirectional w/ pullup M[1:0]=b00
|
||||||
|
P1M1 = 0x00;
|
||||||
|
P1M0 = 0x00;
|
||||||
|
//all initially pulled up
|
||||||
|
P1 = 0xff;
|
||||||
|
|
||||||
|
//read top row input buttons using quasi-bidirectional w/ pullup M[1:0]=b00
|
||||||
|
//P3[1:0]
|
||||||
|
P3M1 &= ~(0x3);
|
||||||
|
P3M0 &= ~(0x3);
|
||||||
|
P3 |= 0x3; //pull up
|
||||||
|
//P5[5:4]
|
||||||
|
P5M1 &= ~(0x30);
|
||||||
|
P5M0 &= ~(0x30);
|
||||||
|
P5 |= 0x30; //pull up
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void KeyScan(void){
|
||||||
|
//top row not part of matrix
|
||||||
|
static const uint8_t M_ROWS = 4;
|
||||||
|
static const uint8_t M_COLS = 4;
|
||||||
|
uint8_t i, j;
|
||||||
|
|
||||||
|
//scan top row
|
||||||
|
keys[0] = 0; //initially
|
||||||
|
keys[0] += (P3_0 ? 0 : (1<<0)); //on
|
||||||
|
keys[0] += (P3_1 ? 0 : (1<<1));
|
||||||
|
keys[0] += (P5_4 ? 0 : (1<<2));
|
||||||
|
keys[0] += (P5_5 ? 0 : (1<<3));
|
||||||
|
//scan matrix
|
||||||
|
for (i = 0; i < M_ROWS; i++){
|
||||||
|
keys[i+1] = 0; //initially
|
||||||
|
for (j = 0; j < M_COLS; j++){
|
||||||
|
uint8_t read;
|
||||||
|
P1 = (~(1 << (j+4))); //pulldown column (all others pull up)
|
||||||
|
read = (P1 & (1<<i)); //read button
|
||||||
|
read = (read == 0 ? 1 : 0); //pressed if grounded by column driver
|
||||||
|
keys[i+1] += (read << j);
|
||||||
|
P1 = 0xff; //reset all as pullups
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* GetKeys(void){
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
15
src/key.h
Normal file
15
src/key.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* key.h
|
||||||
|
*
|
||||||
|
* Created on: Mar 20, 2019
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SRC_KEY_H_
|
||||||
|
#define SRC_KEY_H_
|
||||||
|
|
||||||
|
void KeyInit(void);
|
||||||
|
void KeyScan(void);
|
||||||
|
uint8_t* GetKeys(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SRC_KEY_H_ */
|
19
src/lcd.c
19
src/lcd.c
@ -150,13 +150,13 @@ static void LCD_OutChar(unsigned char c) {
|
|||||||
void LCD_Open(void) {
|
void LCD_Open(void) {
|
||||||
static int open_error = 0;
|
static int open_error = 0;
|
||||||
if (!OpenFlag) {
|
if (!OpenFlag) {
|
||||||
//set ports to output
|
//set ports to push-pull output M[1:0] = b01
|
||||||
//P2
|
//P2 entire port
|
||||||
P2M1 = 0;
|
P2M1 = 0;
|
||||||
P2M0 = 0xff;
|
P2M0 = 0xff;
|
||||||
//P3
|
//P3 pins 7:4
|
||||||
P3M1 &= ~(0xfe);
|
P3M1 &= ~(0xf0);
|
||||||
P3M0 |= (0xfe);
|
P3M0 |= (0xf0);
|
||||||
|
|
||||||
_delay_ms(30); // to allow LCD powerup
|
_delay_ms(30); // to allow LCD powerup
|
||||||
outCsrBlindNibble(0x03); // (DL=1 8-bit mode)
|
outCsrBlindNibble(0x03); // (DL=1 8-bit mode)
|
||||||
@ -251,6 +251,15 @@ short TERMIO_PutChar(unsigned char letter) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LCD_OutNibble(uint8_t x){
|
||||||
|
x &= 0xf; //ensure only bottom nibble
|
||||||
|
if (x <= 9){
|
||||||
|
TERMIO_PutChar(x + '0');
|
||||||
|
} else {
|
||||||
|
TERMIO_PutChar(x - 10 + 'a');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LCD_Clear() {
|
void LCD_Clear() {
|
||||||
if (OpenFlag) {
|
if (OpenFlag) {
|
||||||
outCsr(0x01);
|
outCsr(0x01);
|
||||||
|
@ -12,6 +12,7 @@ void LCD_SingleLineGoTo(unsigned int row_to);
|
|||||||
|
|
||||||
void LCD_OutString(const char* string);
|
void LCD_OutString(const char* string);
|
||||||
short TERMIO_PutChar(unsigned char letter);
|
short TERMIO_PutChar(unsigned char letter);
|
||||||
|
void LCD_OutNibble(uint8_t x);
|
||||||
|
|
||||||
unsigned char LCD_Timeout_Error(void);
|
unsigned char LCD_Timeout_Error(void);
|
||||||
|
|
||||||
|
15
src/main.c
15
src/main.c
@ -5,6 +5,7 @@
|
|||||||
#include "stc15.h"
|
#include "stc15.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
#include "key.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#define FOSC 11059200
|
#define FOSC 11059200
|
||||||
@ -13,7 +14,7 @@
|
|||||||
#define WDT_CLEAR() (WDT_CONTR |= 1 << 4)
|
#define WDT_CLEAR() (WDT_CONTR |= 1 << 4)
|
||||||
void timer0_isr() __interrupt 1 __using 1
|
void timer0_isr() __interrupt 1 __using 1
|
||||||
{
|
{
|
||||||
P3_1 ^= 1;
|
// P3_1 ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -40,8 +41,11 @@ char buf[17];
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
uint8_t* keys;
|
||||||
|
uint8_t key_i;
|
||||||
Timer0Init(); // display refresh & switch read
|
Timer0Init(); // display refresh & switch read
|
||||||
LCD_Open();
|
LCD_Open();
|
||||||
|
KeyInit();
|
||||||
P3_4 = 0; //turn on led backlight
|
P3_4 = 0; //turn on led backlight
|
||||||
LCD_OutString("Hello world !!!!");
|
LCD_OutString("Hello world !!!!");
|
||||||
LCD_GoTo(1,0);
|
LCD_GoTo(1,0);
|
||||||
@ -51,6 +55,15 @@ int main()
|
|||||||
// LOOP
|
// LOOP
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
LCD_GoTo(0,0);
|
||||||
|
//scan keyboard
|
||||||
|
KeyScan();
|
||||||
|
keys = GetKeys();
|
||||||
|
for (key_i = 0; key_i < 5; key_i++){
|
||||||
|
LCD_OutNibble(keys[key_i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//counter
|
||||||
LCD_GoTo(1,7);
|
LCD_GoTo(1,7);
|
||||||
LCD_OutString(u32str(i, buf, 10));
|
LCD_OutString(u32str(i, buf, 10));
|
||||||
i++;
|
i++;
|
||||||
|
11
src/stc15.h
11
src/stc15.h
@ -18,6 +18,17 @@ __sbit __at (0xC5) P4_5 ;
|
|||||||
__sbit __at (0xC6) P4_6 ;
|
__sbit __at (0xC6) P4_6 ;
|
||||||
__sbit __at (0xC7) P4_7 ;
|
__sbit __at (0xC7) P4_7 ;
|
||||||
|
|
||||||
|
/* P5 */
|
||||||
|
__sfr __at (0xc8) P5 ;
|
||||||
|
__sbit __at (0xc8) P5_0 ;
|
||||||
|
__sbit __at (0xc9) P5_1 ;
|
||||||
|
__sbit __at (0xca) P5_2 ;
|
||||||
|
__sbit __at (0xcb) P5_3 ;
|
||||||
|
__sbit __at (0xcc) P5_4 ;
|
||||||
|
__sbit __at (0xcd) P5_5 ;
|
||||||
|
__sbit __at (0xce) P5_6 ;
|
||||||
|
__sbit __at (0xcf) P5_7 ;
|
||||||
|
|
||||||
__sfr __at 0x94 P0M0;
|
__sfr __at 0x94 P0M0;
|
||||||
__sfr __at 0x93 P0M1;
|
__sfr __at 0x93 P0M1;
|
||||||
__sfr __at 0x92 P1M0;
|
__sfr __at 0x92 P1M0;
|
||||||
|
Loading…
Reference in New Issue
Block a user