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
Trang 1CHƯƠ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
Trang 26.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
Quét phí m
Xác định chữ
Xử lý chữ
Lưu vào RAM No
Yes
Trang 36.2.2 Chương trình hiển thị
Hình 6.3: Lưu đồ giải thuật chương trình hiển thị
Begin
Khai Báo Biến
Số hàng quét =0
Dịch font từ Ram vào 595
Đủ dữ liệu 8 byte ?
Đủ 8 hàng Kết thúc
No
No Yes
Yes Xuat dulieu hang quet
Số hàng quét ++
Trang 46.2.3 Chương trình copy font vào RAM
Hình 6.4: lưu đồ copy font vào RAM
I=0
Copy font vào RAM[i] dt[i]
i>n
No
Yes Begin
Kết thúc I++
Trang 56.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)
C2=0
C3=0
C4=0
Ma phim=4+ln
Ma phim=7+ln
Ma phim=10+ln
Trang 66.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)
C2=0
C3=0
C4=0
Ma phim=16+ln
Ma phim=19+ln
Ma phim=22+ln
Trang 76.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)
C2=0
C3=0
C4=0
Ma phim=28+ln
Ma phim=31+ln
Ma phim=34+ln
Trang 86.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)
C2=0
C3=0
C4=0
Ma phim=38
Ma phim=39
Ma phim=40
Trang 96.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];
Trang 10//=========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;i<n;++i)
write_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;}
Trang 11if(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++)
Trang 12{
buff_disp[s]=font2[t].b[u]; // Luu ma ascii vao RAM s ;
}
buff_disp[s]=0xff; s ;
}
if(v<n-1) v++; else return;
}
}
void nhap()
{
int iscase=0; // bien chon cach nhap hoa - thuong char machu; //ki tu nhap tu ban phim
int k;
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
{
Trang 13}
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:
Trang 14n = 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;
Trang 15int8 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
Trang 16buff_disp[0]=0xff; // Them mot khoang trang giua hai ky tu
}