Mở rộng đầu ra với 74595, Giao tiếp LCD&VDK qua 74595

daotruongpro

http://vtechpro.vn
#1
Chắc hẳn các bạn đã quá quen thuộc với 74595 dùng để mở rộng đầu ra, Còn việc mở rộng đầu ra dùng để giao tiếp LCD và VDK chắc cũng có ít người làm.
Mình viết bài này cho mọi người tham khảo:
Trong chương trình này quan trọng nhất là cách mã hóa dữ liệu
Mã:
//Chuong trinh ma hoa du lieu
 
void Write_data(unsigned char d1, int1 d2, int1 d3, int1 d4)
 
{
 
Data=0x00;
 
Data=Data|(d1>>4);
 
// ghi EN
 
Data<<=1;
 
Data|=d2;
 
// ghi RW
 
Data<<=1;
 
Data|=d3;
 
Data<<=1;
 
Data|=d4;
 
Write_595(Data);
 
}
 
//Chuong trinh hoàn chỉnh
 
file main.c
 
/******************************************************************************
 
Chip type : PIC16F877A
 
Program type : Application
 
Clock frequency : 20 MHz
 
Project : 74595&LCD
 
Version : V1.0
 
Date : 21/06/2013
 
Author : DAO XUAN TRUONG
 
Gmail : daotruongpro@gmail.com
 
Mobile : 0979.20.90.10
 
Company : Chua ai nhan
 
Comments : Chuong trinh viet giao tiep LCD &VDK qua 74595
 
*******************************************************************************/
 
#include <16F877A.h>
 
#device adc=16
 
#FUSES NOWDT //No Watch Dog Timer
 
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
 
#FUSES NOBROWNOUT //No brownout reset
 
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
 
#use delay(clock=20000000)
 
#use fast_io(A)
 
#byte PORTA = 0x05
 
#bit SDI = PORTA.1 // >> PIN11 (74595)
 
#bit CLK = PORTA.0 // >> PIN14 (74595)
 
#bit STR = PORTA.2 // >> PIN12 (74595)
 
#define LCD_clear 0x01 //Xoa man hinh LCD
 
#define LCD_home 0x02 //Tro ve dau dong
 
#define LCD_normal 0x06 //Che do nhap du lieu binh thuong
 
#define LCD_normal_s 0x07 //Che do nhap du lieu binh thuong, dich man hinh
 
#define LCD_off 0x08 //Tat man hinh
 
#define LCD_on 0x0C //Bat man hinh
 
#define LCD_on_crsr 0x0E //Bat man hinh va con tro
 
#define LCD_on_blink 0x0F //Bat man hinh va con tro (nhap nhay)
 
#define LCD_4b2l 0x28 //Che do 2 dong, giao tiep 4 bit du lieu
 
#define LCD_homeL1 0x80 //Ve dau dong 1
 
#define LCD_homeL2 0xC0 //Ve dau dong 2
 
#define LCD_start 0x32
 
int1 RS,EN,RW;
 
unsigned char Data;
 
void Sys_init();
 
char buf[16];
 
void Write_595(unsigned int in)
 
{
 
unsigned int k=128,i;
 
for(i=0;i<8;i++)
 
{
 
if((in&k)==k)
 
SDI=1;
 
else
 
SDI=0;
 
CLK=1;
 
#asm
 
Nop;
 
#endasm
 
CLK=0;
 
k>>=1;
 
}
 
STR=1;
 
#asm
 
Nop;
 
#endasm
 
STR=0;
 
}
 
//Chuong trinh ma hoa du lieu
 
void Write_data(unsigned char d1, int1 d2, int1 d3, int1 d4)
 
{
 
Data=0x00;
 
Data=Data|(d1>>4);
 
// ghi EN
 
Data<<=1;
 
Data|=d2;
 
// ghi RW
 
Data<<=1;
 
Data|=d3;
 
Data<<=1;
 
Data|=d4;
 
Write_595(Data);
 
}
 
//Ghi lenh ra LCD
 
void Write_cmd(unsigned char lenh)
 
{ unsigned char tg;
 
// ghi 4 bit cao
 
RS = 0;
 
tg=lenh & 0xF0;
 
EN=0;
 
Write_data(tg,EN,RW,RS);
 
delay_us(50);
 
EN=1;
 
Write_data(tg,EN,RW,RS);
 
//ghi 4 bit thap
 
tg=(lenh<<4)&0xf0;
 
EN=0;
 
Write_data(tg,EN,RW,RS);
 
delay_us(50);
 
EN=1;
 
Write_data(tg,EN,RW,RS);
 
}
 
//__________________________ham ghi ki tu ra LCD:_____________________________________________
 
void Lcd_putc(unsigned char kt)
 
{ unsigned char tg;
 
RS = 1;
 
if(kt=='\n'){Write_cmd(0xC0);return;}
 
tg=kt & 0xF0;
 
EN=0;
 
Write_data(tg,EN,RW,RS);
 
delay_us(50);
 
EN=1;
 
Write_data(tg,EN,RW,RS);
 
//ghi 4 bit thap
 
tg=(kt<<4)&0xf0;
 
EN=0;
 
Write_data(tg,EN,RW,RS);
 
delay_us(50);
 
EN=1;
 
Write_data(tg,EN,RW,RS);
 
}
 
//_________________________Ham hien thi 1 xau ra lcd:___________________________________________
 
void Write_tring(unsigned char *s)
 
{
 
Write_cmd(0x80);
 
while(*s)
 
Lcd_putc(*s++);
 
}
 
void lcd_init()
 
{
 
Write_cmd(LCD_start);
 
Write_cmd(LCD_4b2l); // 4-bit, 2 hang, ma tran 5x7
 
Write_cmd(LCD_normal); // bat hien thi, tat con tro
 
Write_cmd(LCD_on); // dich con tro sang phai
 
Write_cmd(LCD_clear); // xoa man hinh
 
}
 
void main()
 
{
 
Sys_init();
 
lcd_init();
 
delay_ms(100);
 
sprintf(buf,"DAO XUAN TRUONG");
 
Write_tring(buf);
 
sprintf(buf,"\n VINH PHUC PRO");
 
Write_tring(buf);
 
for(;;)
 
{
 
;
 
}
 
}
 
void Sys_init()
 
{
 
Set_tris_A(0);
 
}
Chúc các bạn thành công!
 

daotruongpro

http://vtechpro.vn
#2
không thấy anh em nào tham gia TUT này nhỉ.hj
 

daotruongpro

http://vtechpro.vn
#4
em đang dùng mạng qua điện thoại không thể up đc ảnh nên, phải đợi khi nào có mạng em mới up ảnh lên được

Nếu mọi người hào hứng mình sẽ hướng dẫn mọi người sử dụng 74595 Scan 7segLed qua 2 chân vdk. Nếu dùng 595 để Scan 7segLed + Outdata chỉ cần dùng 5 chân vdk. 3 chân Outdata 2 chân Scan.
 

kim jong

Sinh viên đại học
#5
bạn chỉ đưa đoạn code hok có đầu đuôi.hok mô phỏng thì mọi ng khó thảo luận
 

nguyendoan

Học sinh phổ thông
#7
dùng 1 chân vđk được ko bạn, mình thấy bạn mình có 1 thằng chỉ cần dùng 1 chân 11 của 595 vẫn điều khiển đc
 

Quảng cáo Google