Brief:
Basically this is a basic password lock system. It asks for
password and then if password is correct it will do the appropriate action. In
this case the appropriate action is driving the motor. L293D motor driving IC
is used for driving a single motor.
So in short type the password if password is correct run the
motor.
Features:
- Says hello and opens a scrollable menu.
- Menu can be scrolled using keys 8 and 2.
- After reaching down to last item the action to key 8 is disabled.
- Similarly while reaching from bottom to up when the first item is reached the 2 key action becomes disabled.
- Will asks for password 3 times. If all three times password is entered incorrect the buzzer will start.
- The menu item is stored as text in program memory.
- The password is stored in eeprom.
- The password can be any 4 digit. Password can be changed and it will again be stored in eeprom.
- By storing password in eeprom the changed password will be retained even after the power to the controller is turned off.
- The keys of the keypad are quite responsive and fast.
Limitations:
- Only 2 menus right now, enter password and change password.
- It is not designed to come out of menu item enter password. One will hasve to turn of the controller or reset it to go to main menu.
- Usees PORTB 8 data bit lcd interface can be used as four.
- Uses PORTD for interfacing keypad hence disabling any scope for serial communication.
- Uses PORTA for control interfacing of 16x2 character LCD.
- Uses letter D for hitting enter.
- Multiple character from same key not enabled.
Components:
- Any avr development board
- 4x4 keypad.
- LCD
- L293D motor driving IC.
- Motor and a prefer separate supply for Motor and for controller. Use a smps unit for development purposes.
Modules:
The project has been divide into separate independent
modules so one can attach or detach each module depending on one’s final
control element.
- Timer module having function relating to hardware timer. For creating hardware timer delay.
- Display Module having all basic control functions required to interface a character LCD.
- Keypad Module handles interfacing of keypad.
- EEPROM Module handles writing and reading from the eeprom.
- Menu Module creates and control the menu.
- Main Modules contains the whole application logic and functions.
All the files and the complete source of the project can be
downloaded from my open source project link provide here.
All
the files are well documented with comments describing each function. This post
will only show major lines from each files and will not go into detail of how
and why. For the future I will try to write a separate post for implementation
of each module and why and how certain techniques were used. Right now I am
just logging all my old work so I can be descriptive in future.
Timer Module
Function
Name
|
Description
|
void Delay1Sec(void);
|
Returns: void
Parameter: void
Description: Creates
a hardware delay of 1 sec using timers and counters.
|
void DelayXSec(unsigned int number);
|
Returns: void
Parameter:
Unsigned int number (Number of Seconds)
Description: Creates
a hardware delay of X secs using timers and counters, the x is the number
provided by the user.
|
void Delay1mSec(void);
|
Returns: void
Parameter: void
Description:
Creates a hardware delay of 1 millisecond using timers and
counters.
|
void DelayXmSec(unsigned int number);
|
Returns: void
Parameter:
Unsigned int number (Number of milliseconds)
Description: Creates
a hardware delay of X milliseconds using timers and counters, the x is the
number provided by the user.
|
Keypad Module
Macro
Name
|
Macro
Purpose
|
#define KEY_PRT PORTD
|
Port at which output of keypad to be passed
|
#define KEY_DDR DDRD
|
DDR register for that port. Will define which pins to be considered
as input and which as output
|
#define KEY_PIN PIND
|
Pin for port at which input from the columns of the
keypad will be taken.
|
Function
Name
|
Function
Description
|
void KEYPAD_Init(void);
|
Returns: void
Parameter: void
Description: Initializes
Keypad port and DDR register.
|
unsigned char GetKeyPressed(void);
|
Returns: unsigned
char (char of the key pressed)
Parameter: void
Description: Returns
the character of the key pressed.
|
Display Modules
Macro
Name
|
Macro
Purpose
|
#define LCD_DATA_PORT PORTB
|
Port at which data output to LCD will be passed
|
#define LCD_DATA_DDR DDRB
|
DDR Register for DATA port determining the direction of data.
|
#define LCD_DATA_PIN PINB
|
Pin port for reading data from the buffer of the LCD
|
#define LCD_CMD_PORT PORTA
|
Port at which command to LCD will be passed.
|
#define LCD_CMD_DDR DDRA
|
DDR register for COMMAND port determining the
direction of the command.
|
#define LCD_CMD_PIN PINA
|
Pin port for reading command from command register from command
buffer of LCD.
|
#define LCD_RS 0
|
LCD Register select pin.
|
#define LCD_RW 1
|
LCD read-write pin
|
#define LCD_EN 2
|
LCD Enable Pin
|
Function
Name
|
Function
Description
|
void LCD_Init(void);
|
Returns: void
Parameter: void
Description: Initializes
LCD port and DDR register.
|
void LCD_GotoXY(unsigned char row, unsigned char
col);
|
Returns: void
Parameter: Unsigned
char row and unsigned character column.(meaning x and y)
Description: Jumps
to the row and column as provided by the user.
|
void LCD_Write_Command(unsigned char command);
|
Returns: void
Parameter: unsigned
char command(command in form of hexadecimal or in form of character)
Description: Writes
the command to the LCD
|
void LCD_Write_Data(unsigned char data);
|
Returns: void
Parameter: unsigned
char data (writes the ascii data directly to the LCD buffer hence displaying
it on LCD)
Description: Writes
data to the LCD like text or string.
|
void LCD_Clear(void);
|
Returns: void
Parameter: void
Description: Clears
LCD
|
void LCD_Print(char *str);
|
Returns: void
Parameter: char *
str
Description: Prints
the passed string to the LCD.
|
void LCD_Write_Char(char c);
|
Returns: void
Parameter: char c
Description: Prints
the passed character to the LCD.
|
EEPROM Module
Function
Name
|
Function
Description
|
void write_eeprom(unsigned char *text)
|
Returns: void
Parameter: unsigned
char *text(text to be written to eeprom)
Description:Writes
text to eeprom.
|
void read_eeprom(unsigned char *text)
|
Returns: void
Parameter: unsigned
char *text(variable to which text is to be written)
Description: Read
the eeprom and writes the read text on the provided variable.
|
Menu Module
Program
Memory Strings
|
Description
|
static const char menuitem_1_line_1[]
PROGMEM= "1) - Enter ";
|
Initialize Items to be written on program memory
|
static const char common_line_2[] PROGMEM= " Password";
|
Initialize Items to be written on program memory
|
static const char menuitem_2_line_1[] PROGMEM= "2) - Change ";
|
Initialize Items to be written on program memory
|
PGM_P string_table[] PROGMEM =
{
menuitem_1_line_1,
common_line_2,
menuitem_2_line_1
};
|
Making strings in program memory accessible by using string table.
|
strcpy_P(buffer,
(PGM_P)pgm_read_word(&(string_table[0])));
|
Using of string table by use of string copy function
as shown. Here buffer is a variable with size equivalent to the number of
columns in the character LCD.
|
Function
Name
|
Function
Description
|
int create_and_show_menu(void);
|
Returns: int(1
or 2 depending on the choice of menu item)
Parameter:
void
Description: Returns
integer value 1 if menu item 1 is selected and 2 if menu item 2 is selected.
|
Main Module
Function
Name
|
Function
Description
|
void sayHello(void);
|
Returns: void
Parameter:
void
Description: Says
hello on LCD. Can be used as a test function to check connection of LCD.
|
void enter_password_handler(void);
|
Returns: void
Parameter: void
Description: Called
when enter password menu is selected. Does whatever comes after hitting enter
password menu item.
|
void change_password_handler(void);
|
Returns: void
Parameter:
void
Description: Called
when change password menu is selected. Does whatever comes after hitting
change password menu item.
|
void system_error_handler(void);
|
Returns: void
Parameter: void
Description: Called
when non of the though value is arised.
|
void main(void);
|
Returns: void
Parameter:
void
Description: Main
function.
|
MCUCSR = (1<<JTD);
|
Statemen to disable JTAG
|