Tải bản đầy đủ (.doc) (16 trang)

QUANG báo HIỂN THỊ LED MA TRẬN GIAO TIẾP bàn PHÍM chuong 6 nguyen ly hoat dong , luu do giai thuat va code

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 (59.88 KB, 16 trang )

CHƯƠNG 6: NGUYÊN LÝ HOẠT ĐỘNG , LƯU ĐỒ
GIẢI THUẬT VÀ CHƯƠNG TRÌNH
6.1. NGUYÊN LÝ HOẠT ĐỘNG CỦA MẠCH QUANG BÁO
Khi khởi động mạch quang báo, vi điều khiển sẽ đọc thông tin được lưu
trước trong ROM về tốc độ chạy chữ, kiểu chạy chữ ( phải sang trái…), kích
thước hiển thị, nội dung của bản tin. Sau đó vi điều khiển sẽ đối chiếu từng kí tự
trong nội dung bản tin để copy font tương ứng vào RAM của chương trình hiển
thị, rồi gọi chương trình hiển thị để hiển thị nội dung ra bảng quang báo.
sau khi nhập dữ liệu từ bàn phím vi điều khiển sẽ lưu nội dung vừa nhận
được vào ROM để phục vụ cho việc hiển thị bảng quang báo.
Kỹ thuật quét led:
Là cấp tín hiệu điều khiển theo dạng xung theo kiểu quét cho các hàng cần
hiển thị tần số quét nhỏ nhất cho mỗi chu kỳ cần khoảng 25Hz (40ms) nhằm bảo
đảm cho mắt thấy các led sáng đều không nhấp nháy.
Dữ liệu font chữ được đổ qua 64 cột.
Khi quét hết 8 hàng thì được một hình
Khi chạy chữ chỉ cần hiển thị một hình khác đã được dịch đi một cột.

50


6.2 LƯU ĐỒ GIẢI THUẬT VÀ CODE CHƯƠNG TRÌNH
6.2.1. LƯU ĐỒ GIẢI THUẬT
BEGIN

Khai báo I
I/O

Chương
trình chính
No


Quét
phí
m

Yes

Xác định
chữ
Xử lý chữ

Lưu vào
RAM

END

6.1. lưu đồ giải thuật chương trình
51


6.2.2 Chương trình hiển thị

Begin

Khai Báo Biến

Số hàng quét =0

Số hàng quét ++

Dịch font từ Ram vào

595
No

Yes

Đủ dữ
liệu 8
byte ?

Xuat dulieu hang quet
No
Đủ 8
hàng

Yes

Kết thúc

Hình 6.3: Lưu đồ giải thuật chương trình hiển thị

52


6.2.3. Chương trình copy font vào RAM

Begin

I=0

I++


Copy font vào
RAM[i] dt[i]

No
i>n
Yes
Kết thúc

Hình 6.4: lưu đồ copy font vào RAM

53


6.2.4 Chương trình quét phím
6.2.4.1 Quét hàng 1

Quet phim

H1=O;H2=H3=H4=
C1=C2=C3=C4=1

Ma phim=1+ln

IF(C1=0)

Ma phim=4+ln

C2=0


Ma phim=7+ln

C3=0

Ma phim=10+ln

C4=0

54


6.2.4.1 Quét hàng 2

Quet phim

H2=O;H1=H3=H4=
C1=C2=C3=C4=1

Ma phim=13+ln

IF(C1=0)

Ma phim=16+ln

C2=0

Ma phim=19+ln

C3=0


Ma phim=22+ln

C4=0

55


6.2.4.1 Quét hàng 3

Quet phim

H3=O;H2=H1=H4=
C1=C2=C3=C4=1

Ma phim=25+ln

IF(C1=0)

Ma phim=28+ln

C2=0

Ma phim=31+ln

C3=0

Ma phim=34+ln

C4=0


56


6.2.4.1 Quét hàng 4

Quet phim

H4=O;H1=H2=H3=
C1=C2=C3=C4=1

Ma phim=37

IF(C1=0)

Ma phim=38

C2=0

Ma phim=39

C3=0

Ma phim=40

C4=0

57


6.3 CODE CỦA CHƯƠNG TRÌNH

#include <16F877A.h>
#include <def_877a.h>
#include <string.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,
NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
//#include <input.c>
#include <font_ascii.c> //File chua bo font ma hoa ky tu ASCII
// Dinh nghia cac chan cho ket noi 74595
#bit data = 0x05.1
#bit clk = 0x05.2
#bit latch = 0x05.0
#bit tt = 0x05.3
#define h1 RD4
#define h2 RD5
#define h3 RD6
#define h4 RD7
#define c1 RD0
#define c2 RD1
#define c3 RD2
#define c4 RD3
// Bo nho dem man hinh hien thi
int8 ha[8] = {1,2,4,8,16,32,64,128};
int8 buff_disp[65]; //Bo nho dem cho man hinh LED
int8 n;
//SO ky tu hien thi toi da
int8 time=15;
//Bien quy dinh toc do chu chay
int8 count=0; int is = 0;
int8 ln,isln;

//so lan nhan 1 phim
int8 maphim = 41; //ban phim co 40 ma, khai bao 41 tuc la chua bam phim
char dt[64];
58


//=========KHAI BAO CAC CHUONH TRINH CON================
void send_2_595(int8 temp);
void display();
void copy_2_ram1(int8 index_char);
void copy_2_ram2(int8 index_char);
void luudata();
//==============================
void luudata()
{
int i;
for(i=0;iwrite_eeprom(i,dt[i]);
write_eeprom(i,32); write_eeprom(i+1,32); write_eeprom(i+2,32);
write_eeprom(i+3,32); write_eeprom(i+4,32);
write_eeprom(i+5,32); write_eeprom(i+6,32); write_eeprom(i+7,32);
write_eeprom(i+8,32); write_eeprom(i+9,32);
write_eeprom(i+10,32); write_eeprom(i+11,32); write_eeprom(i+12,32);
write_eeprom(0xff,n+12); // Luu so ky tu toi da vao ROM
}
//=============================================
void ktphim()
{
maphim = 41;
h1 = 0; h2 = h3 = h4 = c1 = c2 = c3 = c4 = 1;

if(c1==0) {while(c1==0){} if(isln==1 && ln<2) ln++; else {ln=0;isln=1;}
maphim = 1+ln; }
if(c2==0) {while(c2==0){} if(isln==2 && ln<2) ln++; else {ln=0;isln=2;}
maphim = 4+ln;}
if(c3==0) {while(c3==0){} if(isln==3 && ln<2) ln++; else {ln=0;isln=3;}
maphim = 7+ln;}
if(c4==0) {while(c4==0){} if(isln==4 && ln<2) ln++; else {ln=0;isln=4;}
maphim = 10+ln;}
h2 = 0; h1 = h3 = h4 = c1 = c2 = c3 = c4 = 1;
if(c1==0) {while(c1==0){} if(isln==5 && ln<2) ln++; else {ln=0;isln=5;}
maphim = 13+ln;}
if(c2==0) {while(c2==0){} if(isln==6 && ln<2) ln++; else {ln=0;isln=6;}
maphim = 16+ln;}
if(c3==0) {while(c3==0){} if(isln==7 && ln<2) ln++; else {ln=0;isln=7;}
maphim = 19+ln;}
59


if(c4==0) {while(c4==0){} if(isln==8 && ln<2) ln++; else {ln=0;isln=8;}
maphim = 22+ln;}
h3 = 0; h2 = h1 = h4 = c1 = c2 = c3 = c4 = 1;
if(c1==0) {while(c1==0){} if(isln==9 && ln<2) ln++; else {ln=0;isln=9;}
maphim = 25+ln;}
if(c2==0) {while(c2==0){} if(isln==10 && ln<2) ln++; else {ln=0;isln=10;}
maphim = 28+ln;}
if(c3==0) {while(c3==0){} if(isln==11 && ln<2) ln++; else {ln=0;isln=11;}
maphim = 31+ln;}
if(c4==0) {while(c4==0){} if(isln==12 && ln<2) ln++; else {ln=0;isln=12;}
maphim = 34+ln;}
h4 = 0; h2 = h3 = h1 = c1 = c2 = c3 = c4 = 1;

if(c1==0) {while(c1==0){} maphim = 37;}
if(c2==0) {while(c2==0){} maphim = 38;}
if(c3==0) {while(c3==0){} maphim = 39;}
if(c4==0) {while(c4==0){} maphim = 40;}
}
void layma()
//lay ma cua cac ki tu dag nhap dua vao buff de hien thi
{
int s,v,t,u;
if(n>10) v = n-10; else v = 0;
s = 63;
while(s>0)
// Clear RAM of buff_disp
{
t=dt[v]-32;
//Lay gia tri ASCII cua ky tu
if (t<=51)
{
for (u=0;u<5;u++)
{
buff_disp[s]=font[t].b[u]; // Luu ma ascii vao RAM
s--;
}
buff_disp[s]=0xff; s--;
}
else
{
t=t-51;
for (u=0;u<5;u++)
60



{
buff_disp[s]=font2[t].b[u]; // Luu ma ascii vao RAM
s--;
}
buff_disp[s]=0xff; s--;
}
if(v}
}
void nhap()
{
int iscase=0;
char machu;
int k;

// bien chon cach nhap hoa - thuong
//ki tu nhap tu ban phim

for (k=0;k<=64;k++)
// Clear RAM of buff_disp
buff_disp[k]=0xff;
isln = 0;
n = 1;
//tong so ky tu, bien chung
dt[0] = 63; layma();
while(1)
{
display();

ktphim();
if(maphim<36)
{
if(iscase==0)
//nhap chu hoa
{
if(maphim>26)
machu = maphim + 21;
else
machu = maphim + 64;
}
else //nhap chu thuong
{
if(maphim>26)
machu = maphim + 12;
else
machu = maphim + 96;
}
dt[n-1] = machu; layma();
61


}
if(maphim == 37)
//phim xac nhan ky tu nhap
{
dt[n] = 63; n++; layma();
}
if(maphim == 38)
//phim doi nhap ki tu hoa - thuong

{
if(iscase<1) iscase++; else iscase = 0;
}
if(maphim == 39)
// phim nhap khoang trang
{
dt[n-1] = 32; dt[n] = 63; n++; layma();
}
if(maphim == 40)//phim xoa khi chua xac nhan ki tu dong thoi la ket thuc nhap
{
luudata(); return;
}
if(n>50) //so ky tu nhap toi da la 50
{
//dt[n-1] = 32; n++; dt[n-1] = 32; n++; dt[n-1] = 32; n++; dt[n-1] = 32; n++;
dt[n-1] = 32; n++;
//dt[n-1] = 32; n++; dt[n-1] = 32; n++; dt[n-1] = 32; n++; dt[n-1] = 32; n++;
dt[n-1] = 32; n++;
luudata(); return;
}
}
}
//===========Chuong trinh chinh================
void main() {
int8 i,j;
//===========================================
TRISA=0x00;
// Thiet lap chan vao ra
TRISB=0x00;
// khai bao hang ngo ra, cot ngo vao

TRISD=0x0F;
delay_ms(10);
//===========================================
//=======BEGIN DISPLAY FUNCTION==============
//Doan chuong trinh nay se hien thi noi dung ban tin luu trong EEPROM
tudau:
62


n = read_eeprom(0xff);
while(1)
{
for (i=0;i<=64;i++)
// Clear RAM of buff_disp
buff_disp[i]=0xff;
for (i=0;i<=n;i++)
// Begin of text
{
j=read_eeprom(i)-32;
//Lay gia tri ASCII cua ky tu
if (j<=51)
copy_2_ram1(j);
else
{
j=j-51;
copy_2_ram2(j);
}
h4 = 0; h2 = h3 = h1 = c1 = c2 = c3 = c4 = 1;
if(c1==0) {while(c1==0){} nhap(); goto tudau;}
}

}
}
//========= END MAIN ==============
// === CAC CHUONG TRINH CON =========
//=======Gui du lieu theo duong noi tiep toi 595============
void send_2_595(int8 temp) {
clk=0;
for(count=0;count<64;count++)
{
if((buff_disp[count] & temp)>0)
data=0;
//bit 1
else data=1; //bit 0
clk=1;
clk=0;
}
}
//===========Chuong trinh con hien thi=========
void display() {
int8 count;
63


int8 i,j;
for (i=0;i<=time;i++)
//Toc do chu chay thay doi boi bien time
{
for(j=8;j>0;j--)
{
send_2_595(ha[j-1]);

PORTB = 0x00;
latch=1;
//Chot du lieu
latch=0;
PORTB = ha[j-1];
//255-buff_disp[count];
delay_us(40);
}
}
}
//========Copy to Ram1=====================
void copy_2_ram1(int8 index_char)
{
int8 i,j;
for (j=0;j<=5;j++)
{
// Dich RAM
for (i=64;i>0;i--)
buff_disp[i]= buff_disp[i-1];
// Dich RAM sang trai
buff_disp[0]=font[index_char].b[j]; // Luu ma ascii vao RAM
display(); // Goi hien thi
}
buff_disp[0]=0xff;
}
//========Copy to Ram 2===================
void copy_2_ram2(int8 index_char) {
int8 i,j;
for (j=0;j<=5;j++)
{

for (i=64;i>0;i--)
// Dich RAM
buff_disp[i]= buff_disp[i-1];
//Dich RAM sang trai
buff_disp[0]=font2[index_char].b[j]; //Luu ma ascii vao RAM
display();
// Goi hien thi
64


}
buff_disp[0]=0xff;

// Them mot khoang trang giua hai ky tu

}

65



×