A. Code chương trình
// chuong trinh dieu khien dong co servo
#include<reg51.h>
#define data P2 // khai báo P2 xuất dữ liệu ra LCD
#define key P0 // Port0 sử dụng cho bàn phím
#define port P1
sbit output = port^0; //khai bao bien
sbit rs = port^3;
sbit rw = port^4;
sbit en = port^5;
sbit hang1 = key^0;
sbit hang2 = key^1;
sbit hang3 = key^2;
sbit hang4 = key^3;
sbit cot1 = key^4;
sbit cot2 = key^5;
sbit cot3 = key^6;
int dem=0,time=0,ktra, so[3];
void delay(unsigned int ms) // chuong trinh delay
{
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1275;j++);
}
void lcd_cmd(unsigned char item) // chương trình hiển thị lệnh lên LCD
{
data = item;
rs= 0; // rs=0 thanh ghi lenh; rs=1 thanh ghi du lieu
rw=0; // ghi vao LCD
en=1; //
delay(1); // tao xung cho LCD chay
en=0;
return; // ket thuc chuong trinh con
}
void lcd_data(unsigned char item) // nạp dữ liệu vào LCD
{
data = item;
rs= 1; // dua du lieu vao LCD
rw=0;
en=1;
delay(1);
en=0;
return; //ket thuc chuong trinh con
}
void lcd_data_string(unsigned char *str) // tạo chuỗi ký tự.
{
int i=0;
while(str[i]!='\0') // lap vong tai i, khac 0 thi lap lai
{
lcd_data(str[i]); // hien thi ky tu thuong trong i
i++; // tang i len 1 don vi
delay(10);
}
return;
}
void lcd_data_int(int time_val) // tao 3 so hien thi goc quay tren LCD
{
int int_amt; //
int_amt = time_val/100; // lay gia tri cua time/100 duoc chu so hang tram
lcd_data(int_amt+48); // chuyen ma ASCII ve so thap phan va hien thi
time_val = time_val%100; // lay phan du khi time/100 gan vao time_val
int_amt = time_val/10; // lay phan du o tren /10 duoc chu so hang chuc
lcd_data(int_amt+48); // chuyen ma ASCII thanh thap phan, hien thi
int_amt = time_val%10; // lay phan du cua time_val/10 duoc so hang d/vi
lcd_data(int_amt+48); // chuyen ma ASCII thanh thap phan, hien thi
}
void shape() // hien thi do len LCD
{
lcd_cmd(64);
lcd_data(2);
lcd_data(5);
lcd_data(2);
lcd_data(0);
lcd_data(0);
lcd_data(0);
lcd_data(0);
lcd_data(0);
}
void timer(unsigned int ms) // tao xung de dieu khien servo
{
unsigned int i;
TR1=1;
for(i=0;i<ms;i++)
{
while(TF1==0);
TF1=0;
}
TR1=0;
}
void digit_set(int num) // kiem soat so dang nhan nhan phim
{
if(dem==4) // số lần nhấn bằng 4
{
lcd_cmd(0x01);
lcd_data_string("thuc hien:"); // hien thi len lcd
ktra=num; // kiem tra so da nhan
}
else
{
ktra=0;
if(dem==1) //gia tri dem bang 1
so[0]=num; // so thu nhat
else
{
if(dem==2) // gia tri dem bang 2
{
so[1]=so[0]; // so thu 2
so[0]=num; // so thu nhat
}
else
if(dem==3) // giá tri dem bang 3
{
so[2]=so[1]; //so thu 3 thay the vi tri so thu 2
so[1]=so[0]; // so thu 2 thay the vi tri so thu 1
so[0]=num; // so dau tien bang num
}
}
lcd_data((num+48)); // chuyen ma ASCII => thap phan, hien thi
}
}
void ktra_cot1() // kiem tra cot 1
{
hang1=hang2=hang3=hang4=1;
hang1=0;
if(cot1==0) // Key 1
{
delay(20);
dem=dem+1; // gia tri dang dem +1
digit_set(1); // cai dat so dang nhan la 1
}
hang1=1;
hang2=0;
if(cot1==0) // Key 4
{
delay(20);
dem=dem+1;
digit_set(4);
}
hang2=1;
hang3=0;
if(cot1==0) // Key 7
{
delay(20);
dem=dem+1;
digit_set(7);
}
hang3=1;
hang4=0;
if(cot1==0) // Key *
{
delay(20);
dem=dem+1;
if(dem==4) // gia tri dem = 4 (nhan nut lan thu 4)
{
digit_set(10); // dat so 10
}
else
{
dem=4;
digit_set(10);
}
}
hang4=1;
}
void ktra_cot2() //kiem tra cot 2
{
hang1=hang2=hang3=hang4=1;
hang1=0;
if(cot2==0) // Key 2
{
delay(20);
dem=dem+1; // gia tri dang dem tang len 1
digit_set(2);
}
hang1=1;
hang2=0;
if(cot2==0) // Key 5
{
delay(20);
dem=dem+1;
digit_set(5);
}
hang2=1;
hang3=0;
if(cot2==0) // Key 8
{
delay(20);
dem=dem+1;
digit_set(8);
}
hang3=1;
hang4=0;
if(cot2==0) // Key 0
{
delay(20);
dem=dem+1;
digit_set(0);
}
hang4=1;
}
void ktra_cot3() // Col3 check
{
hang1=hang2=hang3=hang4=1;
hang1=0;
if(cot3==0) // Key 3
{
delay(20);
dem=dem+1;
digit_set(3);
}
hang1=1;
hang2=0;
if(cot3==0) // Key 6
{
delay(20);
dem=dem+1;
digit_set(6);
}
hang2=1;
hang3=0;
if(cot3==0) // Key 9
{
delay(20);
dem=dem+1;
digit_set(9);
}
hang3=1;
hang4=0;
if(cot3==0) // Key #
{
delay(20);
dem=dem+1;
lcd_data_string("du lieu sai"); // hien thi noi dung "" truc tiep len LCD
lcd_cmd(0x01); // cai dat lai vi tri hien thi
lcd_data_string("nhap goc:"); // khoi dong lai dong lenh ban dau
lcd_cmd(0xc5); // hien vi tri nhap goc tai o so 6
dem=0;
}
hang4=1;
}
void keypad()
{
if(cot1==0)