Tải bản đầy đủ (.pdf) (20 trang)

Màn hình quảng cáo ở chế độ văn bản sử dụng ma trận LED 5x7 có điều khiển bằng máy tính, chương 10 ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (206.52 KB, 20 trang )

ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
36
Chương 10: m· nguån
//Chuong trinh dieu khien bang quang cao dung
ma tran LED 5x7
// (Do an mon hoc: Thiet ke mach Logic)
//Nguoi viet: Le Minh Hung
// Nguyen Duc Linh
// Lop DT6-K43-DHBKHN
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <dos.h>
#define DataReg 0x378
#define StatusReg 0x379
#define ControlReg 0x37A
void Initialize();
void Interfacing();
void Print_Code(int code);
void ItoSofB(int i,char up[],char down[]);
void Print_Character(int column,int row,int
code);
void Print_Column(int column);
void Print_Row(int row);
void Print_Cell(int column,int row,char
value);
void Print_Matrix(int code);
int Out_Char(int column,int row,int code);
void Reset();


ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
37
void Power();
//

int character[64][6]={
//character[x][0-4]: code of
character'column
//character[x][5]: ASCII code
{126,17,17,17,126,65}, // 0-A
{127,73,73,73,54,66}, // 1-B
{62,65,65,65,34,67}, // 2-C
{127,65,65,34,28,68}, // 3-D
{127,73,73,73,65,69}, // 4-E
{127,9,9,9,1,70}, // 5-F
{62,65,73,73,58,71}, // 6-G
{127,8,8,8,127,72}, // 7-H
{0,65,127,65,0,73}, // 8-I
{32,64,65,63,1,74}, // 9-J
{127,8,20,34,65,75}, //10-K
{127,64,64,64,64,76}, //11-L
{127,2,12,2,127,77}, //12-M
{127,4,8,16,127,78}, //13-N
{62,65,65,65,62,79}, //14-O
{127,9,9,9,6,80}, //15-P
{62,65,81,33,94,81}, //16-Q
{127,9,25,41,70,82}, //17-R
{38,73,73,73,50,83}, //18-S
{1,1,127,1,1,84}, //19-T
{63,64,64,64,63,85}, //20-U

{31,32,64,32,31,86}, //21-V
{63,64,48,64,63,87}, //22-W
{99,20,8,20,99,88}, //23-X
{7,8,120,8,7,89}, //24-Y
{97,81,73,69,67,90}, //25-Z
{62,81,73,69,62,48}, //26-0
{0,66,127,64,0,49}, //27-1
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
38
{66,97,81,73,70,50}, //28-2
{33,65,69,75,49,51}, //29-3
{24,20,18,127,16,52}, //30-4
{39,69,69,69,57,53}, //31-5
{60,74,73,73,48,54}, //32-6
{1,113,9,5,3,55}, //33-7
{54,73,73,73,54,56}, //34-8
{6,73,73,41,30,57}, //35-9
{8,8,62,8,8,43}, //36-+
{8,8,8,8,8,45}, //37
{20,8,62,8,20,42}, //38-*
{32,16,8,4,2,47}, //39-/
{20,20,20,20,20,61}, //40-=
{0,65,34,20,8,62}, //41->
{8,20,34,65,0,60}, //42-<
{0,96,96,0,0,46}, //43
{0,80,48,0,0,44}, //44-,
{0,54,54,0,0,58}, //45-:
{0,86,54,0,0,59}, //46-;
{0,5,3,0,0,39}, //47-'
{0,3,0,3,0,34}, //48-"

{0,28,34,65,0,40}, //49-(
{0,65,34,28,0,41}, //50-)
{0,127,65,65,0,91}, //51-[
{0,65,65,127,0,93}, //52-]
{0,0,95,0,0,33}, //53-!
{2,1,81,9,6,63}, //54-?
{50,73,121,65,62,64}, //55-@
{20,62,20,62,20,35}, //56-#
{36,42,127,42,18,36}, //57-$
{35,19,8,100,98,37}, //58-%
{4,2,1,2,4,94}, //59-^
{54,73,85,34,80,38}, //60-&
{2,4,8,16,32,92}, //61-\
{0,0,127,0,0,124}, //62-|
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
39
{0,0,0,0,0,32}, //63-
};
int matrix[128];
int power;
//

void main()
{
int column=0,row=0,pos=0,i;
char scan,ch;
Interfacing();
Initialize();
for(i=0;i<128;i++)
matrix[i]=63;

for(;;)
{
Print_Column(column);
Print_Row(row);
Print_Matrix(matrix[pos]);
Print_Code(matrix[pos]);
window(5+column*2,2+row*2,5+column*2,2+row*2);
if((scan=getch())==0)
{
ch=getch();
switch(ch)
{
case 59:
//F1

Power();
break;
case 60:
//F2

if(power==1)
Reset();
break;
case 75:
//Left Arrow
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
40
if(power==1)
{
if(pos>0) pos ;

if(column==0)
{
if(row>0)
{
column=16;
row ;
}
else column=1;
}
column ;
}
break;
case 77:
//Right Arrow

if(power==1)
{
if(pos<127) pos++;
column++;
if(column>15)
{
if(row<7)
{
column=0;
row++;
}
else column=15;
}
}
break;

case 72:
//Up Arrow

if(power==1)
{
if(row>0)
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
41
{
pos=pos-16;
row ;
}
}
break;
case 80:
//Down Arrow

if(power==1)
{
if(row<7)
{
pos=pos+16;
row++;
}
}
break;
} // for switch(ch)

} // for if((scan=getch())==0)
else

{
ch=scan;
switch(ch)
{
case 27:
//ESC
//Dua ra tin hieu tat mach ngoai (chan
17,bit3=1)

outportb(ControlReg,8); // 8 =
00001000b

return;
case 13:
//Enter

if((row<7)&&(power==1))
{
pos=pos+(16-column);
row++;
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
42
column=0;
}
break;
default:
if((isprint(ch))&&(power==1))
{
ch=toupper(ch);
for(i=0;i<64;i++)

if(character[i][5]==ch)
{
Print_Character(column,row,ch);
if(Out_Char(column,row,i)==0)
{
textbackground(LIGHTGRAY);
textcolor(RED);
window(4,25,30,25);clrscr();
cprintf("Khong gui duoc ky tu
!");
}
else
{
textbackground(LIGHTGRAY);
window(4,25,30,25);clrscr();
}
matrix[pos]=i;
break;
}
if(pos<127) pos++;
if(column==15)
{
if(row<7)
{
column=-1;
row++;
}
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
43
else column=14;

}
column++;
}
// for if(isprint(ch))

break;
} // for switch(ch)

} // for else

}
}
//

void Initialize()
{
//Dong mach ngoai: chan 17,bit3=1
outportb(ControlReg,8); // 8 = 00001000b

power=0; //Chua cho phep chuong trinh hoat
dong

textbackground(BLACK);
textcolor(WHITE);
window(16,20,18,20);clrscr();
printf("OFF");
}
//

void Power()

{
unsigned char result;
if(power==0)
{
//Kiem tra xem chan 13 co o muc cao (bit4=1)
result=inportb(StatusReg);
if(result&16 !=0)
// 16=10000b

{
//Neu bit4=1 (mach ngoai da duoc cap
nguon)
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
44
power=1; //Cho phep chuong trinh hoat dong

textbackground(RED);
textcolor(WHITE);
window(16,20,18,20);clrscr();
printf("ON");
//Dua ra tin hieu dong mach ngoai (chan
17,bit3=0)
//va thiet lap trang thai ban dau: dong bo
dem 74244(chan
//1,bit0=0),khong cho phep ghi vao
RAM(chan 14,bit1=1)
outportb(ControlReg,2); // 2 = 00000010b
}
else
{

textbackground(LIGHTGRAY);
textcolor(RED);
window(4,25,30,25);clrscr();
cprintf("Chua dong nguon cho mach!");
}
}
else
{
//Khong cho phep chuong trinh hoat dong
power=0;
textbackground(BLACK);
textcolor(WHITE);
window(16,20,18,20);clrscr();
printf("OFF");
//Dua ra tin hieu tat mach ngoai (chan
17,bit3=1)
outportb(ControlReg,8); // 8 = 00001000b

}
}
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
45
//

void Interfacing()
{
textmode(C40);

textbackground(BLUE);window(0,0,40,25);clrscr(
);


textbackground(BLACK);window(5,2,37,25);clrscr
();
textcolor(BLUE);

textbackground(LIGHTGRAY);window(4,1,36,17);cl
rscr();
textcolor(LIGHTGRAY);

textbackground(BLACK);window(5,2,35,17);clrscr
();
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
46
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³

");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
");

cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³
\r");

textbackground(LIGHTGRAY);window(5,17,35,17);c
lrscr();
window(19,18,36,25);clrscr();

textbackground(BLACK);window(31,18,35,24);clrs
cr();
textcolor(BLUE);textbackground(LIGHTGRAY);

window(20,19,30,19);clrscr();cprintf("Column:"
);

window(20,21,30,21);clrscr();cprintf("Row:");

window(20,23,30,23);clrscr();cprintf("Code:");
window(4,19,17,23);clrscr();
window(4,25,30,25);clrscr();

window(6,20,17,21);clrscr();cprintf("F1 -
Power");
window(6,21,17,22);clrscr();cprintf("F2 -
Reset");
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
47
window(5,22,17,23);clrscr();cprintf("ESC -
Exit");
}
//

void ItoSofB(int i,char up[],char
down[])
//Chuyen so nguyen
// sang
chuoi cac so nhi phan

{
int j=0,k=0;
do
{
if(i%2==0) up[j]='0';
else up[j]='1';
j++;
i=i/2;
} while(i!=0);
up[j]='\0';
do
{
down[k]=up[j-1];

k++;j ;
} while(j>=0);
down[k-1]='\0';
}
//

void Print_Code(int code)
{
char up[7];
char down[7];
textcolor(RED);textbackground(LIGHTGRAY);
window(27,23,30,23);clrscr();
itoa(code,up,10);cprintf("%s",up);
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
48
window(22,24,30,24);clrscr();
ItoSofB(code,up,down);cprintf("%sB",down);
}
//

void Print_Column(int column)
{
char up[7],down[7];
textcolor(RED);textbackground(LIGHTGRAY);
window(27,19,30,19);clrscr();
itoa(column,up,10);cprintf("%s",up);
window(22,20,30,20);clrscr();

ItoSofB(column,up,down);cprintf("%sB",down);
}

//

void Print_Row(int row)
{
char up[7],down[7];
textcolor(RED);textbackground(LIGHTGRAY);
window(27,21,30,21);clrscr();
itoa(row,up,10);cprintf("%s",up);
window(22,22,30,22);clrscr();
ItoSofB(row,up,down);cprintf("%sB",down);
}
//

void Print_Cell(int column,int row,char value)
{
if(value=='0')
textbackground(BLACK);
else
textbackground(RED);
textcolor(WHITE);
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
49

window(31+column,18+row,31+column,18+row);clrs
cr();
printf("%c",value);
}
//

void Print_Matrix(int code)

{
int i,j,k,len;
char up[9];
char down[9];
for(i=0;i<5;i++)
{
k=0;
ItoSofB(character[code][i],up,down);
len=strlen(up);
while(k<8-len)
{
up[len+k]='0';
k++;
}
for(j=0;j<7;j++)
Print_Cell(i,j,up[j]);
}
}
//

void Print_Character(int column,int row,int
code)
{
textcolor(RED);textbackground(BLACK);

window(5+column*2,2+row*2,5+column*2,2+row*2);
clrscr();
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
50
printf("%c",code);

}
//

int Out_Char(int column,int row,int code)
//Dua ky tu co ma
// code
ra cong song song

{
int i;
unsigned char result;
int add;
row=row<<4;
add=row|column;
//Dia chi o nho cua RAM

for(i=0;i<1000;i++) //Hoi vong

{
result=inportb(StatusReg);
//Doc trang thai
vao
if(result&64==0) //Kiem tra xem chan 10 co o
muc thap
//(bit7=0)

{ //64 = 01000000b
//Dua dia chi ra cong song song

outportb(DataReg,add);//Ghi du lieu vao

thanh ghi du lieu
//Dua ra tin hieu chot dia chi 74373
//va mo bo dem 74244 (chan 1,bit0=1)

outportb(ControlReg,3);//Ghi du lieu vao
thanh ghi dieu
// khien
// 3 = 00000011b
//Dua ma ky tu ra cong song song

outportb(DataReg,code);
//Dua ra tin hieu ghi vao RAM (chan
14,bit1=0);
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
51
outportb(ControlReg,1); // 1 = 00000001b
//Dua ra tin hieu dong bo dem 74244
(bit0=0)
// va khong cho ghi vao RAM (bit1=1)

outportb(ControlReg,2); // 2 = 00000010b

return 1; // Ket thuc ghi vao RAM

}
}
return 0;
}
//


void Reset()
{
int i;
//Dua ra tin hieu dong mach (chan 17,
bit3=1)

outportb(ControlReg,10); // 10 = 00001010b

delay(500); // Tre 0.5s
//Thiet lap lai trang thai ban dau:
bit0=0(dong bo dem 74244),
//bit1=1(khong cho ghi vao RAM), bit3=0(mo
mach)

outportb(ControlReg,2); // 2 = 00000010b

for(i=0;i<128;i++) //Xoa mang chua cac ky
tu ve ky tu trong

matrix[i]=63;
Interfacing();
//Ve lai giao dien

}
//

Thiết kế mạch logic số Phần III: Phần mềm điều khiển
52
ch-ơng III: H-ớng dẫn sử dụng ch-ơng trình
Ch-ơng trình điều khiển chỉ chứa trong một file tên là:

Quangcao.exe, chạy trong môi tr-ờng MSDOS. Khi kích hoạt file đó
thì giao diện của ch-ơng trình sẽ xuất hiện nh- hình III.1.
Hình III.1

Giao diện của ch-ơng trình điều khiển
Thiết kế mạch logic số Phần III: Phần mềm điều khiển
53
Phần chính của giao diện là một ma trận các ô gồm 8 hàng x 16
cột mô phỏng ma trận đèn quảng cáo của mạch thực. Mỗi ô là nơi để
hiển thị ký tự mà ng-ời dùng nhập vào.
ở góc d-ới bên phải giao diện
là các thông số của ô chữ tại vị trí con trỏ màn hình xuất hiện gồm có:
+ Column (cột): chỉ số thứ tự của cột (từ 0 đến 15) mà con
trỏ màn hình xuất hiện.
+ Row (hàng): chỉ số thứ tự của hàng (từ 0 đến 7) mà con trỏ
màn hình xuất hiện.
+ Code (mã): chỉ mã của ký tự (theo bảng mã qui -ớc của
chúng tôi đã đ-ợc đ-a ra ở ch-ơng I của phần này) xuất hiện tại vị trí
con trỏ màn hình.
Bên cạnh đó là ma trận 5x7 các ô vuông biểu thị các bit 1 (đèn LED
sáng) và bit 0 (đèn LED tắt) của ma trận 5x7 LED ứng với ký tự hiển
thị.
ở góc d-ới bên trái giao diện là bảng chỉ dẫn các phím chức
năng:
+ F1 Power: Bật / tắt ch-ơng trình. Lúc này, ch-ơng trình
ch-a đ-ợc bật nên bên cạnh đó là chữ OFF (tắt). Khi nhấn F1, ch-ơng
trình sẽ kiểm tra qua cổng song song xem mạch ngoài đã đ-ợc cấp
nguồn hay ch-a. Nếu mạch ngoài đã đ-ợc cấp nguồn thì ch-ơng trình
sẽ gửi tín hiệu ra cổng song song cho phép mạch ngoài hoạt động,
đồng thời cho phép ch-ơng trình hoạt động. Lúc đó, chữ OFF sẽ

chuyển thành ON. Nếu mạch ngoài ch-a đ-ợc cấp nguồn thì ch-ơng
trình sẽ hiện ra thông báo là: "Ch-a đóng nguồn cho mạch ngoài !".
Khi ch-ơng trình đang đ-ợc bật mà nhấn F1 thì ch-ơng trình sẽ gửi tín
Thiết kế mạch logic số Phần III: Phần mềm điều khiển
54
hiệu ra cổng song song không cho phép mạch ngoài hoạt động, đồng
thời tắt ch-ơng trình.
+ F2 Reset: Thiết lập lại. Khi ch-ơng trình đang đ-ợc bật
mà nhấn F2 thì ch-ơng trình sẽ gửi tín hiệu ra cổng song song cắt
nguồn cấp cho mạch ngoài khoảng 0.5 s, sau đó đóng lại nhằm thiết
lập lại hệ thống trở về trạng thái ban đầu. Đồng thời sẽ xoá toàn bộ ma
trận các ô ký tự thành ký tự trắng (mã 63).
+ ESC
exit: Thoát. Khi nhấn phím ESC sẽ thoát khỏi ch-ơng
trình điều khiển. Tr-ớc khi thoát, ch-ơng trình sẽ gửi tín hiệu ra cổng
song song để cắt cắt nguồn cấp cho mạch ngoài.
Khi ch-ơng trình đã đ-ợc bật, ta có thể dùng các phím mũi tên
(
, , , ) để di chuyển con trỏ đến vị trí bất kỳ trên trang màn hình
để nhập ký tự cần hiển thị. Khi ký tự đ-ợc nhập vào, nó hiển thị tại vị
trí con trỏ màn hình vừa đứng, sau đó, con trỏ tự động nhảy sang vị trí
bên cạnh. Ch-ơng trình sẽ gửi thông tin về ký tự vừa nhập ra cổng
song song để mạch ngoài hiển thị, nếu không thành công thì sẽ có
thông báo: "Không gửi đ-ợc ký tự !".
Hình III.2 là hình ảnh của ch-ơng trình khi đã đ-ợc bật và nhập
các ký tự. Lúc này, con trỏ màn hình đã đ-ợc dịch chuyển đến cột 2,
hàng 2, ký tự tại ô này là "L", có mã là 11. Thông tin của ký tự đó có
thể thấy ở góc d-ới bên phải bằng cả số thập phân và số nhị phân.
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
55

H×nh III.2

H×nh ¶nh cña ch-¬ng tr×nh khi ®-îc bËt

×