⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycellphone.c

📁 一个按件扫描程序
💻 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 + -