📄 mycellphone.c
字号:
//************************************************
//* Matrix keyboard decoder
//* Test application
//*
//* Filename: myCellPhone.c
//* Version: 1.0
//*
//* Device: ATmega162
//* Clock: Internal 1.000 MHz RC oscillator
//*
//* This test application implements a cellphone-like
//* keyboard. Using three one-shot alternation keys,
//* the whole alphabet is available. A capslock
//* function is also implemented.
//* Miscellaneous status information is output on Port A
//* for LED connection on e.g. STK500
//*
//************************************************
#include <iom162.h>
#include <inavr.h>
#include <ctype.h>
#include "keymatrix.h"
#pragma language=extended
/*** Macros and definitions ***/
#define CPUFREQ 1000.000 // CPU frequency 1.000 MHz
#define BAUDRATE 19.200 // USART Baud rate 19.2 kbps
#define BAUDFACTOR CPUFREQ/(16*BAUDRATE)-1 // Factor used in UBRRL
//*** Character conversion table ***
//*
//* keyboard layout:
//*
//* 1 2 3 A . . . .
//* 4 5 6 B . . . .
//* 7 8 9 C . . . .
//* * 0 # D . . . .
//* . . . . . . . .
//* . . . . . . . .
//* . . . . . . . .
//* . . . . . . . .
//*
//* Four rightmost columns and lower four rows
//* not connected. The application uses a 4x4 keypad only.
//*
//* Alternation key functions:
//*
//* none - ordinary digit key function
//* A - use first character on digit key
//* B - use second character on digit key
//* C - use third character on digit key
//* D - caps lock, use uppercase letters
//*
//* The digit keys thus represent characters
//* when alternation keys are used:
//*
//* 1 - ABC, 2 - DEF, 3 - GHI
//* 4 - JKL, 5 - MNO, 6 - PQR
//* 7 - STU, 8 - VWX, 9 - YZ-
//* * - ***, 0 - .?!, # - ###
char __flash characters[4][32] = {
{ '1', '2', '3', 0, 0, 0, 0, 0, // No alternation
'4', '5', '6', 0, 0, 0, 0, 0,
'7', '8', '9', 0, 0, 0, 0, 0,
'*', '0', '#', 0, 0, 0, 0, 0 },
{ 'a', 'd', 'g', 0, 0, 0, 0, 0, // First character
'j', 'm', 'p', 0, 0, 0, 0, 0,
's', 'v', 'y', 0, 0, 0, 0, 0,
'*', '.', '#', 0, 0, 0, 0, 0 },
{ 'b', 'e', 'h', 0, 0, 0, 0, 0, // Second character
'k', 'n', 'q', 0, 0, 0, 0, 0,
't', 'w', 'z', 0, 0, 0, 0, 0,
'*', '?', '#', 0, 0, 0, 0, 0 },
{ 'c', 'f', 'i', 0, 0, 0, 0, 0, // Third character
'l', 'o', 'r', 0, 0, 0, 0, 0,
'u', 'x', '-', 0, 0, 0, 0, 0,
'*', '!', '#', 0, 0, 0, 0, 0 }
};
/*** Transmit one byte using USART1 ***/
void sendChar( char data )
{
if( data ) // Don't transmit 0
{
while( !(UCSR1A & (1<<UDRE1)) ); // Wait for data register ready flag
UCSR1A |= (1<<TXC1); // Clear transmit complete flag
UDR1 = data; // Transmit byte
PORTA = ~data; // Put to port A also, connected to STK500 LEDs
while( !(UCSR1A & (1<<TXC1)) ); // Wait for transmit complete
} // before reentering sleep mode.
} // This is only reqired when using sleep modes.
/*** Convert scancode to character ***/
char convertKey()
{
char tempChar;
if( key_code.altKey0 ) // First char ?
{
tempChar = characters[1][key_code.scan];
} else if( key_code.altKey1 ) // Second char ?
{
tempChar = characters[2][key_code.scan];
} else if( key_code.altKey2 ) // Third char ?
{
tempChar = characters[3][key_code.scan];
} else // No alternation ?
{
tempChar = characters[0][key_code.scan];
}
if( key_code.lckKey0 ) // Uppercase if caps lock
{
tempChar = toupper( tempChar );
}
return tempChar;
}
/*** Main test application loop ***/
void main()
{
/* Enable sleep mode */
MCUCR |= (1<<SE);
/* Init USART */
UCSR1B |= (1<<TXEN1); // Enable transmitter
UBRR1L = BAUDFACTOR; // Set baud rate
/* Init keyboard driver */
key_stop();
key_init();
__enable_interrupt();
/* Init ports */
DDRA = 0xFF; // Port A all output
//PORTA = 0;
DDRB = 0xFF;
/* Get keys and transmit forever */
do
{
char tempChar;
key_get(); // Wait for keypress
PORTA = ~key_altState; // Show flags on STK500 LEDs
tempChar = convertKey(); // Convert to character
// while( key_code.scan != 0xFF ) // Uncomment to implement simple key repetition
{
sendChar( tempChar ); // Transmit character until key released
}
} while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -