BÁO CÁO BÀI TẬP LỚN MÔN KIẾN TRÚC MÁY TÍNH
ĐỀ TÀI: THIẾT KẾ MẠCH VÀ VIẾT CHƢƠNG TRÌNH ĐIỀU KHIỂN HIỂN
THỊ MỘT DÒNG CHỮ BẤT KÌ CHẠY TRÊN LCD
GV: TỐNG VĂN LUYÊN SVTH: NGUYỄN TRÍ TRƢỞNG
NGUYỄN VIẾT VỮNG
I / TỔNG QUAN VỀ LCD VÀ CÁCH GIAO TIẾP CỦA LCD VỚI 89S52
1 . Tổng quan LCD
Ngày nay LCD với những tính năng nổi trội của nó đã được sử dụng rất nhiều trong vi
điều khiển. Khả năng hiện thị của LCD là rất đa dạng, trực quan (chữ, số và nhiều loại kí
tự đồ họa khác ), dễ dàng đưa vào mạch ứng dụng chẳng hạn như : điện thoại di động,
máy game và các lĩnh vực khác mà giá thành rẻ…
LCD sử dụng trong mạc là LCD : LM016L
LCD LM016L là loại màn hình hiển thị được 16 kí tự × 2 dòng, bao gồm tất cả các kí tự
chuẩn ngoài ra còn có một số kí tự đặc biệt nhưng không có kí tự dấu tiếng Việt.
Hình dáng và sơ đồ chân của LCD:
2 / CÁCH GIAO TIẾP CỦA LCD VỚI 89S52
Giao tiếp của LCD với 89S52 trong mạch được kết nối với nhau thông qua Port P1 <
P1.0 – P1.7 >
3 / Giới thiệu về 89S52
Sơ đồ chân của 89S52
4. Giới thiệu về MAX232
Vi mạch MAX 232 của hãng MAXIM là 1 vi mạch chuyên dùng trong giao diện nối tiếp
với máy tính. Chúng có nhiệm vụ chuyển đổi mức TTL ở lối vào thành mức +10V hoặc –
10V ở phía truyền và các mức +3…+15V hoặc -3…-15V thành mức TTL ở phía nhận.
Vi mạch MAX 232 có hai bộ đệm và hai bộ nhận. Đường dẫn điều khiển lối vào
CTS,điều khiển việc xuất ra dữ liệu ở cổng nối tiếp khi cần thiết, được nối với chân 9 của
vimạch MAX 232. Còn chân RST (chân 10 của vi mạch MAX ) nối với đường dẫn bắt
tay để điều khiển quá trình nhận.
5 / Phần chƣơng trình
Chương trình cho VDK:
#include <REGX52.H>
#include <stdio.h>
#include<serial.h>
#include<lcd.h>
int timer=0;
char datax[10];
int dem=0,k=0;
void delay(timer)
{
int ix,jx;
for(ix=0;ix<timer;ix++)
for(jx=0;jx<=150;jx++);
}
void receive_data() interrupt 4
{
if(RI==1)
{
RI=0;
if (SBUF=='@')
dem=0 ;
datax[dem]=SBUF ;
dem++;
}
}
void main(void)
{
uart_init() ;
setting();
home();
command(LCD_DISPLAY_ON );
get_x_y(1,16);
print_str("SINH VIEN THUC HIEN");
for(k=0;k<=17;k++)
{
move_display(1,1);
delay(150);
}
clear();
delay(100);
get_x_y(1,16);
print_str("NGUYEN TRI TRUONG");
for(k=0;k<=15;k++)
{
move_display(1,1);
delay(100);
}
for(k=0;k<=4;k++)
{
command(LCD_CURSOR_ON);
delay(100);
command(LCD_DISPLAY_ON);
delay(150);
}
clear();
get_x_y(1,7);
print_str("*Vs*");
delay(100);
for(k=0;k<=4;k++)
{
command(LCD_CURSOR_ON);
delay(100);
command(LCD_DISPLAY_ON);
delay(100);
}
clear();
get_x_y(1,16);
print_str("NGUYEN VIET VUNG");
for(k=0;k<=14;k++)
{
move_display(1,1);
delay(100);
}
for(k=0;k<=4;k++)
{
command(LCD_CURSOR_ON);
delay(100);
command(LCD_DISPLAY_ON);
delay(150);
}
clear();
command(LCD_DISPLAY_ON );
while(1)
{
home();
if (datax[6]=='^' )
print_str("HN ");
else
print_str("HCM");
get_x_y(1,6);
print_char(datax[1]/10+0x30);
print_char(datax[1]%10+0x30);
print_char('/');
print_char(datax[2]/10+0x30);
print_char(datax[2]%10+0x30);
print_str("/200");
print_char(datax[3]/10+0x30);
print_char(datax[3]%10+0x30);
get_x_y(2,1);
print_char(datax[4]/10+0x30);
print_char(datax[4]%10+0x30);
print_char(':');
print_char(datax[5]/10+0x30);
print_char(datax[5]%10+0x30);
get_x_y(2,9);
print_char(datax[7]/10+0x30);
print_char(datax[7]%10+0x30);
print_char(0xdf);
print_char('C');
}
}
Chương trình cho cổng nối tiếp:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA"
(ByVal pCaller As Long, _
ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal
lpfnCB As Long) As Long
Private Declare Function DeleteUrlCacheEntry Lib "Wininet.dll" Alias "DeleteUrlCacheEntryA"
(ByVal lpszUrlName As String) As Long
Private Declare Function InternetGetConnectedStateEx Lib "Wininet.dll" (ByRef lpdwFlags As
Long, ByVal lpszConnectionName As String, ByVal dwNameLen As Integer, ByVal
dwReserved As Long) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As
Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As
Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As
Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As
Long, ByVal bRedraw As Boolean) As Long
Dim Ret As Long
Dim sConnType As String * 255
Dim SearchString, SearchChar, MyPos
Dim ak As Long
Private Const pi As Double = 3.14159265358979
Private Sub MakeRoundObject(objObject As Object, Value As Long)
Static lngHeight, lngLong, lngReturn, lngWidth As Long
lngWidth = objObject.Width / Screen.TwipsPerPixelX
lngHeight = objObject.Height / Screen.TwipsPerPixelY
SetWindowRgn objObject.hWnd, CreateRoundRectRgn(0, 0, lngWidth, lngHeight, Value,
Value), True
End Sub
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyEscape Then
App.TaskVisible = False
Unload Me
End
End If
End Sub
Private Sub Form_Load()
Dim intX As Integer
Call MakeRoundObject(frmMain, 20)
Call tmrClock_Timer
Dim Ret As Long
Ret = InternetGetConnectedStateEx(Ret, sConnType, 254, 0)
Combo1.AddItem "HA NOI", 0
Combo1.AddItem "HO CHI MINH", 1
For intX = 0 To 360 Step 6
If intX Mod 30 = 0 Then
Me.DrawWidth = 6
Me.PSet (1100 * Cos(intX * pi / 180) + lineSecond.X1, 1100 * Sin(intX * pi / 180) +
lineSecond.Y1)
Else
Me.DrawWidth = 3
Me.PSet (1100 * Cos(intX * pi / 180) + lineSecond.X1, 1100 * Sin(intX * pi / 180) +
lineSecond.Y1)
End If
Next intX
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Me.hWnd, &HA1, 2, 0&
End Sub
Private Sub lblTime_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Call Form_MouseDown(Button, Shift, X, Y)
End Sub
Private Sub Timer1_Timer()
MSComm1.Output = "@"
MSComm1.Output = Chr(Day(Now))
MSComm1.Output = Chr(Month(Now))
MSComm1.Output = Chr(Year(Now) - 2000)
MSComm1.Output = Chr(Hour(Now))
MSComm1.Output = Chr(Minute(Now))
If Combo1 = "HO CHI MINH" Then
MSComm1.Output = "*"
Else
MSComm1.Output = "^"
End If
ak = lable4
MSComm1.Output = Chr(Abs(ak))
End Sub
Private Sub tmrClock_Timer()
Dim dblSecond As Double, dblMinute As Double, dblHour As Double
dblSecond = Second(Now) * 6 - 90
dblMinute = (Minute(Now) + Second(Now) / 60) * 6 - 90
dblHour = (Hour(Now) + Minute(Now) / 60) * 30 - 90
lineSecond.X2 = 1000 * Cos(dblSecond * pi / 180) + lineSecond.X1
lineSecond.Y2 = 1000 * Sin(dblSecond * pi / 180) + lineSecond.Y1
lineMinute.X2 = 900 * Cos(dblMinute * pi / 180) + lineMinute.X1
lineMinute.Y2 = 900 * Sin(dblMinute * pi / 180) + lineMinute.Y1
lineHour.X2 = 700 * Cos(dblHour * pi / 180) + lineHour.X1
lineHour.Y2 = 700 * Sin(dblHour * pi / 180) + lineHour.Y1
lblTime.Caption = Format(Now, "hh:mm:ss")
Label1.Caption = Format(Now, "dd/mm/yyyy")
End Sub
Private Sub Combo1_Click()
If Ret = 0 Then
If Combo1 = "HA NOI" Then
Call DownloadFile1
lable4 = "38"
Picture1.Picture = LoadPicture(App.Path & "\1.gif")
Else
Call DownloadFile2
lable4 = "40"
Picture1.Picture = LoadPicture(App.Path & "\2.gif")
End If
' Set fso = CreateObject("Scripting.FileSystemObject").OpenTextFile("D:\Date.sys", 1)
'S = fso.ReadAll: S = Right(S, Len(S) - InStrRev(S, " ") - 3)
' S = Left(S, 38): MsgBox Left(S, InStrRev(S, ":") - 1)
' Set fso = Nothing: Kill "D:\Date.sys"
Else
MsgBox "KHONG THE KET NOI VAO MANG"
End If
End Sub
5 / Mạch mô phỏng