Hiện tại em đang làm đồ án về xuất nhập mật khẩu , và em dự định dùng EEPROM nội trong ATmega16 để ghi và truy xuất mật khẩu .
Thuật toán của em là :
- Khai báo một mảng trống trong eeprom tên là a[] ( không định địa trỉ trong EEPROM )
- Kiểm tra :
+ (1) Nếu mảng a[] không có dữ liệu , tiến hành nhập dữ liệu ( mật khẩu 6 số ) , bằng cách quét ma trận phím và lưu ký tự của phím vào mảng a[]
+ (2) Nếu mảng a[] có dữ liệu , tiến hành quét phím , lưu giá trị vào một mảng b[] và so sánh với a[] , nếu đúng => mk đúng , còn không thì ngược lại .
*Khó khăn của em :
- Chưa hiểu rõ cách khai báo một mảng trong EEPROM , không biết đúng hay sai .
- Không biết giá trị của các phần tử của a[] trong EEROM khi chưa gán giá trị , mặc định bằng bao nhiêu .
- Mô Phỏng bằng Proteus , vi điều khiển luôn chuyển sang (2) tức là đã có dữ liệu sẵn trong EEPROM rồi .
- Không hiểu khi khởi động con chip nhiều lần , mảng a[] có chỉ đúng vào địa chỉ lần đầu tiên của nó hay không , hay lại chuyển sang một vùng địa chỉ khác trong eeprom
Rất mong các bác đọc CODE dưới đây em viết và giải thích cho em . Em mới lần mò học AVR nên nhiều cái không rõ lắm .
Sau đây là phần Code chính
Thuật toán của em là :
- Khai báo một mảng trống trong eeprom tên là a[] ( không định địa trỉ trong EEPROM )
- Kiểm tra :
+ (1) Nếu mảng a[] không có dữ liệu , tiến hành nhập dữ liệu ( mật khẩu 6 số ) , bằng cách quét ma trận phím và lưu ký tự của phím vào mảng a[]
+ (2) Nếu mảng a[] có dữ liệu , tiến hành quét phím , lưu giá trị vào một mảng b[] và so sánh với a[] , nếu đúng => mk đúng , còn không thì ngược lại .
*Khó khăn của em :
- Chưa hiểu rõ cách khai báo một mảng trong EEPROM , không biết đúng hay sai .
- Không biết giá trị của các phần tử của a[] trong EEROM khi chưa gán giá trị , mặc định bằng bao nhiêu .
- Mô Phỏng bằng Proteus , vi điều khiển luôn chuyển sang (2) tức là đã có dữ liệu sẵn trong EEPROM rồi .
- Không hiểu khi khởi động con chip nhiều lần , mảng a[] có chỉ đúng vào địa chỉ lần đầu tiên của nó hay không , hay lại chuyển sang một vùng địa chỉ khác trong eeprom
Rất mong các bác đọc CODE dưới đây em viết và giải thích cho em . Em mới lần mò học AVR nên nhiều cái không rõ lắm .
Sau đây là phần Code chính
Code:
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#define KEYPAD_DDR DDRB
#define KEYPAD_PORT PORTB
#define KEYPAD_PIN PINB
unsigned char hang[4]={0x0E,0x0D,0x0B,0x07};
unsigned char matran[4][4]=
{'7','8','9','/',
'4','5','6','*',
'1','2','3','-',
'N','0','=','+'};
unsigned char key=0;
unsigned char checkpad();
int t=0;
int x=0;
eeprom unsigned char a[6] ;
unsigned char b[6];
void main(void)
{
KEYPAD_PORT=0x0f;// Khoi tao cac Port cua chip cho viec quet led
KEYPAD_DDR=0xf0;
lcd_init(16);
_lcd_ready();
/*********** Vong lap kiem tra cac gia tri cua mang a[] trong eeprom*******************/
for(t=0;t<6;t++)
{
if(a[t]==0)
x++;
}
// Neu x=6 => mang a[]=0 voi moi (t)=> eeprom chua duoc nap du lieu
// neu x!=0 => eeprom da duoc nap du lieu
if(x==6) // Khi mang a[]=0 voi moi gia tri (t) , bat dau qua trinh nap du lieu vao eeprom
{
lcd_putsf("Chua co MK ");
delay_ms(500);
lcd_clear();
lcd_putsf(" Moi ban dat MK ");
delay_ms(500);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("MK gom 6 so ");
lcd_gotoxy(0,1);
/********************** Vong lap nap du lieu cho eeprom**************************/
for(t=0;t<6;t++)
{
do
{
key=checkpad();
if(key)lcd_putchar(key);
}
while(!key);
key=a[t];
_lcd_write_data(0x06);
delay_ms(500);
}
if(t==6)delay_ms(500);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("ban da nhap xong mat khau");
/***********************Ket thuc viec nap du lieu*********************************/
}
else
{
lcd_putsf("Moi ban dat mat khau");
delay_ms(2000);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Mk gom 6 so : ");
lcd_gotoxy(0,1);
for(t=0;t<6;t++)
{
do
{
key=checkpad();
if(key!=0)lcd_putchar(key);
}
while(!key);
key=b[t];
_lcd_write_data(0x06);
delay_ms(500);
}
if(t==6)delay_ms(500);
lcd_clear();
lcd_gotoxy(0,0);
t=0;
while((a[t]==b[t])&&(t<6))
{
t++;
}
if(t==5) lcd_putsf("ban da nhap dung mk ");
else lcd_putsf("ban da nhap sai mk");
}
}
unsigned char checkpad()
{
int i,j,keyin;
for(i=0;i<4;i++)
{
KEYPAD_PORT=0xff-(1<<(i+4));
delay_ms(10);
keyin=KEYPAD_PIN&0x0f;
if(keyin!=0x0f)
{
for(j=0;j<4;j++)
if(keyin==hang[j]) return matran[j][i];
}
}
return 0;
}


Comment