Một Số Bài Toán Ứng Dụng Cho Trình biên
dịch Keil C (compiler)
Điều khiển Led đơn, Led 7 thanh và nút nhấn
I. Hiển thị Led đơn
Bài toán:Ghép nối LED dơn với chân P1.0 của vi điều khiển, viết chương trình điều
khiển LED nhấp nháy với thời gian trễ là 1s.
+ Lưu đồ thuật toán của bài LED nháy:
+ Chương trình điều khiển:
*/==================Bo tien xu li===================*/
#include<AT89x51.h> // Dinh kem file thu vien
#define bat 1 // Dinh nghia gia tri bat den Led
#define tat 0 // Dinh nghia gia tri tat den Led
/*==================khai bao bien==================*/
sbit Led = P1^0;
// Khai bao bien Led kieu bit chan P1.0
void delay(long time)
{
while(time );
}
/* ham chinh */
void main(void)
{
while(1)
{
Led = bat; // bat Led
delay(25000); // tre 1s
Led = tat; // tat Led
START
Khởi tạo hệ thống
Sáng Led
Led = tat
Start =
0
Stop =
0
Led = tat
Led = bat
}
if((START==1)&&(STOP==0)){
Led = tat;
}
}
}
2. Phối hợp Led 7 thanh và nút nhấn
Các số
hiển
thị
P1.0
g
P1.1
f
P1.2
e
P1.3
d
P1.4
c
P1.5
b
P1.6
// 0x81h,0xcfh,0x92h,0x86h,0xcch,0xa4,0xa0h,0x8fh,0x80h,0x84h.
sbit ctac = P3^4;
unsigned char dem=0;
/*====================Khai bao ham==================*/
/* ham delay========================*/
void delay(long time)
{
while(time );
}
/* chuong trinh con kiem tra co phim nhan */
void phim_an(void)
{
if(ctac==0) //co phim nhan
{
delay(500); //chong rung phim
while(ctac==0); //Cho nha phim
delay(500); // chong rung phim
dem++; //tang bien dem
if(dem==10) dem=0;
}
}
/* hien thi so lan an phim */
void solan_an(void)
{
switch(dem)
{
case 0: {dataP=0x81;break;}
case 1: {dataP=0xcf;break;}
case 2: {dataP=0x92;break;}
case 3: {dataP=0x86;break;}
- Cấp nguồn điều khiển tương phản
4 RS I RS=0 chon thanh ghi lệnh
RS=1 chon thanh ghi dữ liệu
5 R/W I R/W=1 đọc dữ liệu, R/W=0 ghi
6 E I/O Cho phép
7 DB0 I/O Bit dữ liệu
8 DB1 I/O Nt
9 DB2 I/O Nt
10 DB3 I/O Nt
11 DB4 I/O Nt
12 DB5 I/O Nt
13 DB6 I/O Nt
14 DB7 I/O Nt
Chân 15 và 16 là A và K. Nó được nối với 2 chân của 1 con Led dùng để sáng LCD
trong bóng tối chúng ta không sử dụng.
- Sơ đồ ghép nối LCD với vi điều khiển:
2. Nguyên lí hoạt động của LCD.
- Chân V
CC
, V
ss
, và V
EE
: các chân V
CC
và V
SS
cáp dương nguồn 5v và mass tương ứng.
Chân V
EE
1c Dịch toàn bộ hiển thị sang phải
80 Ép con trỏ về đầu dòng thứ nhất
0c0 Ép con trỏ về đầu dòng thứ 2
38 Hai dòng và ma tận 5x7.
3. Phần luyện tập:
Hãy viết chương trình hiển thị trên LCD:
Dòng 1 chữ “VIETNAM” bằng cách hiển thị tưng kí tự
Dòng 2 chữ "VI DIEU KHIEN" bằng cách hiển thị cả chữ. Với sơ đồ mạch
cho dướí đây.
Chương trình:
/*=========bo tien xu li===============*/
#include<AT89x51.h>
#include<string.h>
/*===========khai bao bien toan cuc============*/
sfr LCDdata = 0xA0; // cong P2, 8 bit du lieu.
sbit BF = 0xA7; // co ban, bit DB7.
sbit RS = P3^0; // chon thanh ghi
sbit RW = P3^1; // doc/ghi
sbit EN = P3^2; //cho phep chot du lieu
/*===========cac chuong trinh con cua LCD==========*/
/* kiem tra su san sang cua LCD */
void delay(unsigned int ms)
{
unsigned char k;
while (ms )
{
for (k = 0; k < 114; k++);
}
}
{
RS=1;//ghi du lieu
RW=0;//ghi du lieu len LCD
LCDdata=c;//gia tri C
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//cho
}
void LCDwrites(unsigned char *s)
{
unsigned char data lens,count;
lens=strlen(s);// lay do dai bien duoc tro boi con tro
for(count=0;count<lens;count++)
{
LCDwrite(*(s+count));
}
}
/*=====================chuong trinh tre================*/
/*========================ham chinh==================*/
void main(void)
{
LCDinit(); // khoi tao LCD
LCDcontrol(0x82);// dua con tro den vi tri thu 4 dong 1
LCDwrite(‘V’);
LCDwrite(‘I’);
LCDwrite(‘E’);
LCDwrite(‘T’);
LCDwrite(‘ ’);
LCDwrite(‘N’);
sbit RS = P3^0; // chon thanh ghi
Trả lại kết quả phím đã
nhấn
Đúng
sbit RW = P3^1; // doc/ghi
sbit EN = P3^2; //cho phep chot du lieu
/*chuong trinh con*/
void wait(void)
{
RS=0; //chon thanh ghi lenh
RW=1; //đoc tu LCD
LCDdata=0xff; //gia tri 0xff
while(BF) //kiem tra co ban
{
EN=0; //dua xung cao xuong thap đe chot.
EN=1; //dua chan cho phep len cao
}
}
/* thiet lap lenh cho LCD */
void LCDcontrol(unsigned char x)
{
RS=0;//chon thanh ghi lenh
RW=0;//ghi len LCD.
LCDdata=x ;// gia tri x
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//đoi LCD san sang.
}
/* Khoi tao LCD */
void LCDinit(void)
}
/* ham doc phim nhan tu ma tran phim 4x4 */
unsigned char Phim(void)
{
unsigned char phimnhan, dem, chot;
phimnhan=0;
chot=128;
dem=4;
while(dem ){
P1=~chot;
if(!H1){
delay(500);
phimnhan=dem+1;
delay(500);
}else if(!H2){
delay(500);
phimnhan=dem+5;
delay(500);
}else if(!H3){
delay(500);
phimnhan=dem+9;
delay(500);
}else if(!H4){
delay(500);
phimnhan=dem+13;
delay(500);
}
chot>>=1;
}
return phimnhan;
dong chữ "LAP TRINH VI DIEU KHIEN BANG NGON NGU C", với dong chữ chạy từ trái
sang phải.
+ Chương trình:
// Khai bao chi thi tien xu ly
#include<AT89x51.h>
// Dinh nghia cac cong va cac chan dieu khien
#define CLOCK P3_2
#define DATA P3_3
#define CLEAR P3_4
#define Pxanh P1
#define Pdo P2
// Dinh nghia cac hang so
#define Nhanh 10
#define Trungbinh 25
#define Cham 50
#define Cuccham 75
#define Sieucham 150
#define Mxanh 1
#define Mdo 2
#define Mcam 3
// Khai bao mang chu hien thi
unsigned char code Mcode[256]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,255,1,1,1,1,/* L */
0,63,72,136,72,63,/* A */
0,255,144,144,144,96,/* P */
0,
0,128,128,255,128,128,/* T */
0,255,144,144,144,111,/* R */
0,129,129,255,129,129,/* I */
0,
0,126,129,129,129,70,/* C */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
// Khai bao bien toan cuc
unsigned char data Start,End,Tocdolap,i,j,k;
unsigned char data Mdata1[32],Mdata2[32],Mau;
unsigned char data Dk1,Dk2,Dk3,Dk4,Dk5;
// Khai bao nguyen mau cac ham
void delay(unsigned long time);
unsigned char Mu2(unsigned char somu);
void Do(unsigned char chiso);
void Xanh(unsigned char chiso);
void Cam(unsigned char chiso);
void Dobyte(unsigned char chiso);
void Xanhbyte(unsigned char chiso);
void Cambyte(unsigned char chiso);
void Chaychudo(void);
void Chaychuxanh(void);
void Chaychucam(void);
void Chaychu(void);
void Taomangnhapnhay(void);
void Nhapnhayxanh(void);
void Nhapnhaycam(void);
void Nhapnhaydo(void);
void Taomanglen(void);
void Lxanh(void);
void Ldo(void);
void Lcam(void);
void Len(void);
Pxanh=Mcode[chiso];
Pdo=Pxanh;
delay(12);
Pdo=0;
Pxanh=0;
}
void Chaychucam(void)
{
for(i=Start+1;i<Dk1;i++)
{
Tocdolap=Nhanh;
while(Tocdolap )
{
DATA=1;
Dk2=i+32;
for(j=i;j<Dk2;j++)Cam(j);
}
}
}
void Chaychuxanh(void)
{
for(i=Start+1;i<Dk1;i++)
{
Tocdolap=Nhanh;
while(Tocdolap )
{
DATA=1;
Dk2=i+32;
for(j=i;j<Dk2;j++)Xanh(j);
}