Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 16 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
16
Dung lượng
168,5 KB
Nội dung
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
CHƯƠNG I:PHÂNTÍCHCHƯƠ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ươngtrì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ươngtrì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ươngtrì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ươngtrì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 (D
0
÷ D
7
) 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ừ
D
0
đến D
3
) và địa chỉ cột (3 bit tiếp theo, từ D
4
đến D
6
), tức là cần 7 bit địa chỉ D
0
÷ D
6
, bit thứ
8 là D
7
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 << 4; // dịch phải 4 bit
add = row | column; // cộng đại số row và column
Mã của ký tự dùng 6 bit (D
0
÷ D
5
) để biểu diễn, tức là có thể biểu diễn được 64 ký tự có mã từ 0
đến 63, được qui ước như bảng dưới đây:
Ký
tự
Mã Ký
tự
Mã Ký
tự
Mã
Hệ
10
Hệ 2 Hệ
10
Hệ 2 Hệ
10
Hệ 2
A 0 00000
0
X 23 01011
1
; 46 10111
0
B 1 00000
1
Y 24 01100
0
' 47 10111
1
C 2 00001
0
Z 25 01100
1
" 48 11000
0
D 3 00001
1
0 26 01101
0
( 49 11000
1
E 4 00010
0
1 27 01101
1
) 50 11001
0
F 5 00010
1
2 28 01110
0
[ 51 11001
1
36
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
G 6 00011
0
3 29 01110
1
] 52 11010
0
H 7 00011
1
4 30 01111
0
! 53 11010
1
I 8 00100
0
5 31 01111
1
? 54 11011
0
J 9 00100
1
6 32 10000
0
@ 55 11011
1
K 10 00101
0
7 33 10000
1
# 56 11100
0
L 11 00101
1
8 34 10001
0
$ 57 11100
1
M 12 00110
0
9 35 10001
1
% 58 11101
0
N 13 00110
1
+ 36 10010
0
^ 59 11101
1
O 14 00111
0
- 37 10010
1
& 60 11110
0
P 15 00111
1
* 38 10011
0
\ 61 11110
1
Q 16 01000
0
/ 39 10011
1
| 62 11111
0
R 17 01000
1
= 40 10100
0
spac
e
63 11111
1
S 18 01001
0
> 41 10100
1
T 19 01001
1
< 42 10101
0
U 20 01010
0
. 43 10101
1
V 21 01010
1
, 44 10110
0
W 22 01011
0
: 45 10110
1
Thanh ghi trạng thái có 8 bit (S
0
÷ S
7
), 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:
Chân
Bit tương ứng
trên thanh ghi
trạng thái
Chức năng
10 S
6
Mạch ngoài gửi mức logic 1 để thông báo là đang
đọc RAM. Khi nó có mức logic 0 thì có nghĩa là
RAM đã được đọc xong và máy tính có thể ghi dữ
liệu lên RAM.
37
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
13 S
4
Ở 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ươngtrì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 S
4
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ì S
4
= 1.
Trước khi ghi dữ liệu lên RAM phải kiểm tra xem bit S
6
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<1000;i++), tức là liên
tục đọc thanh ghi trạng thái, bắt đầu từ lúc ký tự được nhập vào từ bàn phím. Sau một thời gian,
nếu chân 10 vẫn ở mức logic 1 thì sẽ tự thoát ra và quá trình gửi ký tự là không thành công.
Thanh ghi điều khiển có 8 bit (C
0
÷ C
7
) dùng để gửi thông tin điều khiển từ máy tính
ra mạch bên ngoài bằng các chân: 1, 14, 17. Chức năng các chân được cho như bảng dưới đây:
Chân
Bit tương ứng
trên thanh ghi
điều khiển
Chức năng
1 C
0
Chương trình sẽ gửi một mức logic 1 ra chân này để
chốt địa chỉ của ký tự gửi ra trên mạch chốt 74373,
đồng thời mở bộ đệm 74244 đưa địa chỉ tới RAM.
14 C
1
Sau khi địa chỉ và dữ liệu đã đưa tới RAM, chương
trình sẽ làm cho chân này chuyển xuống mức logic
0 để tạo ra tín hiệu ghi vào RAM.
17 C
3
Khi người dùng nhấn phím F1 để bật chương trình,
nếu công tắc nguồn mạch ngoài đã được đóng,
chương trình sẽ gửi một mức logic 0 ra chân này để
tạo ra tín hiệu cấp nguồn cho mạch.
38
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 <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <dos.h>
#define DataReg 0x378
#define StatusReg 0x379
39
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
#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
{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
40
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
{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()
{
int column=0,row=0,pos=0,i;
char scan,ch;
Interfacing();
41
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
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
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)
42
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
{
column=0;
row++;
}
else column=15;
}
}
break;
case 72: //Up Arrow
if(power==1)
{
if(row>0)
{
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++;
column=0;
43
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
}
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++;
}
else column=14;
}
column++;
} // for if(isprint(ch))
break;
} // for switch(ch)
} // for else
}
}
//
void Initialize()
{
//Dong mach ngoai: chan 17,bit3=1
44
ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn
outportb(ControlReg,8); // 8 = 00001000b
power=0; //Chua cho phep chuongtrinh 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 chuongtrinh 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 chuongtrinh 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
45
[...]... giao dien } // -CHƯƠNG III: HƯỚNG DẪN SỬ DỤNG CHƯƠNG TRÌNHChươngtrì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ươngtrình sẽ xuất hiện như hình III.1 49 Hình III.1 – Giao diện của chươngtrình điều ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn Phần chính của giao diện là... cấp nguồn thì chươngtrì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ươngtrì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ì 50 ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn chươngtrình sẽ hiện ra thông báo là: "Chưa đóng nguồn cho mạch ngoài !" Khi chươngtrình đang được bật mà nhấn F1 thì chươngtrình sẽ gửi... đồng thời tắt chươngtrình + F2 – Reset: Thiết lập lại Khi chươngtrình đang được bật mà nhấn F2 thì chươngtrì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... 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ươngtrì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. .. 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ươngtrì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ươngtrình sẽ gửi... thông báo: "Không gửi được ký tự !" Hình III.2 là hình ảnh của chươngtrì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 III.2 – Hình ảnh của chươngtrình khi được ... 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); } // - 47 ThiÕt kÕ m¹ch logic sè PhÇn III: PhÇn mÒm ®iÒu khiÓn 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();... 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 . 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. matrix[i]=63;
Interfacing(); //Ve lai giao dien
}
//
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,