Xem mẫu
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
CHƯƠNG I: PHÂN TÍCH CHƯƠNG TRÌNH
Chương trình điều khiển được viết bằng ngôn ngữ C, chạy trong môi trường DOS.
Yêu cầu của chương trình là phải có một giao diện thân thiện, giúp người dùng dễ dàng
dùng máy tính để nhập các ký tự cần hiển thị tại vị trí mong muốn trên ma trận LED bên
ngoài.
Khi thực hiện, chương trình phải thường xuyên trao đổi dữ liệu với mạch ngoài
qua cổng song song bằng cách truy nhập vào ba thanh ghi của cổng song song là: thanh ghi
dữ liệu, thanh ghi trạng thái, thanh ghi điều khiển. Chương trình mặc định lấy cổng song
song ở đây là LPT1 với địa chỉ các thanh ghi được cho (tính ở hệ đếm 16) như sau:
Thanh ghi Địa chỉ
Dữ liệu 378h
Trạng thái 379h
Điều khiển 37Ah
Để thuận tiện, trong chương trình ta dùng lệnh #define để định nghĩa cho các thanh
ghi: #define DataReg 0x378
#define StatusReg 0x379
#define ControlReg 0x37A
Thanh ghi dữ liệu có 8 bit (D0 ÷ D7) dùng để đưa ra địa chỉ và mã của ký tự cần ghi vào
RAM ở mạch ngoài. Sử dụng lệnh: outportb(DataReg, dữ liệu). Địa chỉ của ký tự cần ghi
vào RAM sẽ xác định vị trí của ký tự trên bảng quảng cáo bên ngoài, nó gồm có địa chỉ cột (4
bit đầu, từ D0 đến D3) và địa chỉ cột (3 bit tiếp theo, từ D4 đến D6), tức là cần 7 bit địa chỉ D0
÷ D6, bit thứ 8 là D7 không dùng. Gọi column là địa chỉ cột và row là địa chỉ hàng của ký tự
cần hiển thị thì địa chỉ của ký tự đó trong RAM là add được tính như sau:
row
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
1 0 1
G 6 00011 3 29 01110 ] 52 11010
0 1 0
H 7 00011 4 30 01111 ! 53 11010
1 0 1
I 8 00100 5 31 01111 ? 54 11011
0 1 0
J 9 00100 6 32 10000 @ 55 11011
1 0 1
K 10 00101 7 33 10000 # 56 11100
0 1 0
L 11 00101 8 34 10001 $ 57 11100
1 0 1
M 12 00110 9 35 10001 % 58 11101
0 1 0
N 13 00110 + 36 10010 ^ 59 11101
1 0 1
O 14 00111 - 37 10010 & 60 11110
0 1 0
P 15 00111 * 38 10011 \ 61 11110
1 0 1
Q 16 01000 / 39 10011 | 62 11111
0 1 0
R 17 01000 = 40 10100 spac 63 11111
1 0 e 1
S 18 01001 > 41 10100
0 1
T 19 01001 < 42 10101
1 0
U 20 01010 . 43 10101
0 1
V 21 01010 , 44 10110
1 0
W 22 01011 : 45 10110
0 1
Thanh ghi trạng thái có 8 bit (S0 ÷ S7), dùng để thu nhận những thông tin từ mạch
bên ngoài gửi đến qua các chân: 10 và 13. Chức năng từng chân được nêu như bảng dưới
đây:
Bit tương ứng
Chân trên thanh ghi Chức năng
trạng thái
Mạch ngoài gửi mức logic 1 để thông báo là đang
10 S6 đọc RAM. Khi nó có mức logic 0 thì có nghĩa là
37
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
RAM đã được đọc xong và máy tính có thể ghi dữ
liệu lên RAM.
13 S4 Ở mức logic 1 khi mạch ngoài đã đóng công tắc
nguồn (có thể chưa cấp nguồn cho mạch ngoài).
Khi bắt đầu thực hiện, chương trình phải kiểm tra xem công tắc nguồn ở mạch ngoài đã
được đóng chưa thông qua việc đọc dữ liệu từ thanh ghi trạng thái và kiểm tra bit S4 có ở
trạng thái 1 không bằng các lệnh:
result = inportb(StatusReg);
k = result & 16; // Phép AND giữa result và 16
Số 16 biểu diễn dưới dạng nhị phân là: 00010000. Khi k ≠ 0 thì S4 = 1.
Trước khi ghi dữ liệu lên RAM phải kiểm tra xem bit S6 có ở trạng thái 0 không. Quá trình
kiểm tra được thực hiện ở chế độ hỏi vòng bằng cách dùng lệnh for(i=0;i
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
CHƯƠNG II: 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
#include
#include
#include
39
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
#include
#include
#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();
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
40
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
{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
{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-|
{0,0,0,0,0,32}, //63-
};
int matrix[128];
int power;
//-----------------------------------------------------------------
void main()
41
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
{
int column=0,row=0,pos=0,i;
char scan,ch;
Interfacing();
Initialize();
for(i=0;i0) pos--;
if(column==0)
{
if(row>0)
{
column=16;
row--;
}
else column=1;
}
column--;
}
break;
case 77: //Right Arrow
if(power==1)
{
42
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
if(pos15)
{
if(row0)
{
pos=pos-16;
row--;
}
}
break;
case 80: //Down Arrow
if(power==1)
{
if(row
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
if((row
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
}
//-----------------------------------------------------------------
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)
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);
45
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
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
}
}
//-----------------------------------------------------------------
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);clrscr();
textcolor(LIGHTGRAY);
textbackground(BLACK);window(5,2,35,17);clrscr();
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ");
cprintf("ÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄÅÄ");
cprintf(" ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ \r");
textbackground(LIGHTGRAY);window(5,17,35,17);clrscr();
window(19,18,36,25);clrscr();
textbackground(BLACK);window(31,18,35,24);clrscr();
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");
window(5,22,17,23);clrscr();cprintf("ESC - Exit");
}
//-----------------------------------------------------------------
46
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
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);
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();
47
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
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);
window(31+column,18+row,31+column,18+row);clrscr();
printf("%c",value);
}
//-----------------------------------------------------------------
void Print_Matrix(int code)
{
int i,j,k,len;
char up[9];
char down[9];
for(i=0;i
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
int i;
unsigned char result;
int add;
row=row
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
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 I I I . 1 – Gi ao di ện của chương
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.
50
- ThiÕt kÕ m¹ch logic sè
PhÇn III: PhÇn mÒm ®iÒu khiÓn
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 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.
51
Hì nh I I I . 2 – Hì nh ảnh của chương
nguon tai.lieu . vn