Tải bản đầy đủ (.pdf) (18 trang)

[Giáo Trình] Tổng Quan Về Họ Vi Điều Khiển PIC phần 6 pptx

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 (124.48 KB, 18 trang )



RETLW b’10000001’
RETLW b’01000010’
RETLW b’00100100’
RETLW b’00011000’
RETLW b’00100100’

delay100ms

MOVLW d’100’
MOVWF count1
d1 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1 ; delay 100ms
RETURN ; trở về chương trình chính

END ; kết thúc chương trình

Ứng dụng 4.3: Test chức năng Input/Output của các pin của vi điều khiển.

Ở các ứng dụng trước ta chỉ làm một việc là xuất tín hiệu điều khiển ra các PORT
theo một số qui tắc đònh sẵn nào đó. Trong ứng dụng này ta sẽ phát triển thêm một chức


năng nữa của các PORT là khả năng nhận tín hiệu điều khiển từ bên ngoài. Vi điều khiển sẽ
đọc tín hiệu 0 (điện áp 0 V) và 1 (điện áp 5 V) được tạo ra bằng cách sử dụng các công tắc
ấn từ các pin RB0:RB3 của PORTB , sau đó kiểm tra xem công tắc nào được ấn và bật LED
tương ứng với công tắc đó (các LED này được bố trí ở các pin RB7:RB4) sáng lên. Để kiểm
tra được ứng dụng này ta cần xây dựng sơ đồ mạch như sau:

R9
4 MHz
0
R3
R8
HI
SW2
R5R7
R6
SW5
R4
U1
PIC16F877A
31
12
1
13
11
32
2
3
4
5
6

7 33
34
35
36
37
38
39
40
15
16
17
18 23
24
25
26
19
20 21
22
27
28
29
30
8
9
10
14
GND
GND
MCLR/VPP
OSC1/CLK

VDD
VDD
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/T0CLK/C1OUT
RA5/AN4/SS/C20UT
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T1CLK
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1 RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
OSC2/CLKOUT
0
SW4
D3
SW3
HI
R1
0
0
HI
HI
D1
D4
R2
SW1
D2

Hình 4.2 Mạch test chức năng I/O cho ứng dụng 3.

Chương trình viết cho ứng dụng này như sau:

;Chương trình 4.1.7
processor 16f877a
include <p16f877a.inc>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &
_WRT_OFF & _LVP_OFF & _CPD_OFF

;
;Khai báo hằng
;
SW1 EQU 0
SW2 EQU 1
SW3 EQU 2
SW4 EQU 3
LED1 EQU 4
LED2 EQU 5
LED3 EQU 6
LED4 EQU 7

ORG 0x000
GOTO start
start
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTB
BSF STATUS,RP0
MOVLW b'00001111' ; thiết lập chức năng I/O cho từng pin trong
;PORTB
MOVWF TRISB
BCF STATUS,RP0
loop
BTFSS PORTB,SW1 ; kiểm tra công tắc 1
CALL switch1 ; thưc thi lệnh này nếu công tắc 1 được ấn
BTFSS PORTB,SW2 ; nếu công tắc ; 1 không được ấn, kiểm tra công
; tắc 2
CALL switch2 ; tiếp tục quá trình đối với các công tắc còn lại
BTFSS PORTB,SW3

CALL switch3
BTFSS PORTB,SW4
CALL switch4
GOTO loop
switch1
CLRF PORTB
BSF PORTB,LED1
RETURN
switch2
CLRF PORTB
BSF PORTB,LED2
RETURN

switch3
CLRF PORTB
BSF PORTB,LED3
RETURN

switch4
CLRF PORTB
BSF PORTB,LED4
RETURN
END

Trong chương trình trên ta ứng dụng thuật toán hỏi vòng thông qua vòng lặp loop
trong phần chương trình chính. Khi công tắc không được nhấn, mức logic tại các pin nối với
công tắc là mức 1. Khi công tắc được ấn, các pin trên sem như nối đất và mang mức logic 0.
Ta chỉ việc kiểm tra liên tục trạng thái logic của các pin đó và bật LED tương ứng với công
tắc thông qua các chương trình con switch1, switch2, switch3 và swtich4 khi phát hiện một
công tắc nào đó được ấn. Tuy nhiên cần chú ý là phải thiết lập trạng thái I/O thích hợp cho

từng pin trong PORTB (thiết lập RB3:RB0 là input, RB7:RB4 là output).

Một điểm quan trong cần lưu ý là các công tắc ấn thường bò “dội”, tức là khi ấn xuống
hoặc thả ra, điện áp tại các công tắc sẽ phải trải qua một giai đoạn quá độ, điện áp sẽ dao
động không ổn đònh trong một khoảng thời gian nào đó, ngoài ra trạng thái logic của pin cũng
sẽ thay đổi do một tác động tức thời từ một trường bên ngoài mà không phải do ta ấn công
tắc. Các yếu tố trên sẽ làm ảnh hưởng tới hoạt động của vi điều khiển. Để khắc phục nhược
điểm trên ta có hai phương pháp:

Phương pháp chống “dội” bằng phần cứng: ta thêm các tụ điện vào các công tắc để
lọc bớt các tín hiệu nhỏ gây nhiễu và các tín hiệu không ổn đònh trong thời gian quá độ.
Phương pháp này cũng hiệu quả nhưng gây tốn kém về linh kiện và mạch nguyên lí trở nên
phức tạp.

Phương pháp chống “dội” bằng phần mềm: ta cho vi điều khiển delay trong một thời
gian ngắn và kiểm tra xem công tắc còn được ấn không, nếu công tắc thực sự còn đươc ấn
thì mới tiến hành các thao tác tương ứng với công tắc đó.

Chương trình cải tiến để khắc phục nhược điểm trên có thể được viết như sau:
;Chương trình 4.1.8
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &
_WRT_OFF & _LVP_OFF & _CPD_OFF
;
;Khai báo hằng
;
SW1 EQU 0
SW2 EQU 1
SW3 EQU 2

SW4 EQU 3
LED1 EQU 4
LED2 EQU 5
LED3 EQU 6
LED4 EQU 7
;
;Khai báo biến
;
count1 EQU 0x20
counta EQU 0x21
countb EQU 0x22
;
;Các khai báo khác
;
SWdel SET del150 ; gán SWdel với label del150
;
;Chương trình
;
ORG 0x000
GOTO start
start ; vò trí bắt đầu chương trình chính
BCF STATUS,RP1
BCF STATUS,RP0 ; chọn BANK0
CLRF PORTB
BSF STATUS,RP0 ; chọn BANK1
MOVLW b'00001111'
MOVWF TRISB
BCF STATUS,RP0 ; chọn BANK0
loop ; vòng lặp kiểm tra công tác nào được ấn
BTFSS PORTB,SW1 ; kiểm tra SW1

CALL switch1 ; nhảy tới chương trình con switch1 nếu
; SW1 được ấn
BTFSS PORTB,SW2 ; nếu SW1 không được ấn tiếp tục kiểm tra
; SW2
CALL switch2 ; thao tác tương tự như SW1
BTFSS PORTB,SW3
CALL switch3
BTFSS PORTB,SW4
CALL switch4
GOTO loop

switch1
CLRF PORTB ; xóa PORTB
CALL SWdel ; gọi chương trình delay del150
BTFSC PORTB,SW1 ; kiểm tra công tắc 1 còn nhấn hay không
RETURN ; nếu không còn nhấn thì trở về chương
; trình chính
led1_ON
BSF PORTB,LED1 ; bật LED1 sáng
BTFSC PORTB,SW1 ; xác nhận lại trạng thái công tắc 1
RETURN ; trở về chương trình chính nếu công tắc
; không còn ấn
GOTO led1_ON ; tiếp tục giữ LED1 sáng nếu công tắc còn
; được ấn
switch2 ; thao tác tương tự với các công tắc còn lại
CLRF PORTB
CALL SWdel
BTFSC PORTB,SW2
RETURN
led2_ON

BSF PORTB,LED2
BTFSC PORTB,SW2
RETURN
GOTO led2_ON

switch3
CLRF PORTB
CALL SWdel
BTFSC PORTB,SW3
RETURN
led3_ON
BSF PORTB,LED3
BTFSC PORTB,SW3
RETURN
GOTO led3_ON

switch4
CLRF PORTB
CALL SWdel
BTFSC PORTB,SW4
RETURN
led4_ON
BSF PORTB,LED4
BTFSC PORTB,SW4
RETURN
GOTO led4_ON
;
;Chương trình delay cải tiến cho phép nhiều khoảng thời gian delay khác nhau
;
del0

RETURN
del1
MOVLW d'1'
GOTO delay
del5
MOVLW d'5'
GOTO delay
del10
MOVLW d'10'
GOTO delay
del20
MOVLW d'20'
GOTO delay
del50
MOVLW d'50'
GOTO delay
del100
MOVLW d'100'
GOTO delay
del150
MOVLW d'150'
GOTO delay
del200
MOVLW d'200'
GOTO delay
delay
MOVWF count1
d1 ; tạo thời gian delay 1 mS
MOVLW 0xC7
MOVWF counta

MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
END

Với chương trình trên, thời gian ấn công tắc phải lâu hơn thời gian delay được chỉ đònh
bởi hằng số SWdel do công tắc sẽ được kiểm tra lại trạng thái sau thời gian delay . Nếu thời
gian ấn công tắc không đạt yêu cầu, thao tác bật LED tương ứng với công tắc đó sáng lên sẽ
không được thực hiện và vi điều khiển sẽ tiếp tục quá trình kiểm tra trạng thái các công tắc
còn lại.
Thời gian delay cần được kiểm đònh bằng thực nghiệm và được ấn đònh một cách thích
hợp để chống “dội” một cách hiệu quả, đồng thời cũng không được lâu quá, như vậy sẽ gây
sự khó chòu trong việc sử dụng công tắc do phải ấn công tắc trong một khoảng thời gian đủ
lâu.
Việc thay đổi thời gian delay trong chương trình có thể được thực hiện đơn giản bằng
cách thay đổi label của chương trình delay gán cho tham số SWdel. Thực ra ta có thể trực
tiếp đưa tham số thời gian delay trực tiếp vào thanh ghi count1 mà không cần thông qua tham
số SWdel, điều đó làm cho chương trình trở nên dài và phức tạp hơn. Tuy nhiên chương trình
trên cũng đã cho ta thấy được một điểm khác biệt giữa lệnh “EQU” và lệnh “SET”, giúp ta
hiểu rõ hơn và sử dụng một cách thích hợp các lệnh trên trong các ứng dụng khác.

Ứng dụng 4. 4: ứng dụng tổng hợp.
Trong ứng dụng này ta sẽ tập hợp lại tất cả các kó năng được sử dụng trong các ứng

dụng trước. Yêu cầu đặt ra cũng như ứng dụng 3, tuy nhiên bên cạnh việc bật LED tương ứng
với công tắc sáng lên, ta phải tiếp tục thực hiện một thao tác nữa là ra lệnh cho vi điều khiển
hiển thò 8 LED được gắn vào PORTD theo một thứ tự tương ứng. Cụ thể như sau:

Ấn SW1: LED1 sáng, 8 LED PORTD chạy từ trái sang phải (LED sáng chạy).
Ấn SW2: LED2 sáng, 8 LED PORTD chạy từ trái sang phải (LED tắt chạy).
Ấn SW3: LED3 sáng, 8 LED PORTD chạy từ trái sang phải (2 LED sáng chạy).
Ấn SW4: LED4 sáng, 8 LED PORTD chạy từ trái sang phải (2 LED tắt chạy).

Để test được ứng dụng này, ta cần phát triển thêm mạch test của ứng dụng 3 bằng
cách thêm vào 8 LED ở PORTD thông qua các điện trở. Cụ thể như sau:

D9
0.33 K
4 MHz
0
D1
HI
SW1
R2
0.33 K
D7
R1
D10
R7
0
U1
PIC16F877A
31
12

1
13
11
32
2
3
4
5
6
7 33
34
35
36
37
38
39
40
15
16
17
18 23
24
25
26
19
20 21
22
27
28
29

30
8
9
10
14
GND
GND
MCLR/VPP
OSC1/CLK
VDD
VDD
RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/T0CLK/C1OUT
RA5/AN4/SS/C20UT
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T1CLK
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL RC4/SDI/SDA
RC5/SDO

RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1 RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
OSC2/CLKOUT
HI
D2
SW3
0.33 K
0.33 K
SW5
R8
0.33 K
R4
0.33 K
0.33 K
0
D8
D12
0
SW4
SW2

D4
0.33 K
R9
R3
D5
D3
HI
HI
R5
D11
D6
R6

Hình 4.3 Mạch test ứng dụng 4.

Chương trình viết cho mạch test này cũng tương tự như ứng dụng 3 nhưng được thêm
vào phần hiện thò LED ở PORTD. Ta sử dụng thuật toán bảng dữ liệu để hiển thò LED.
Chương trình cụ thể như sau:
;Chương trình 4.1.9
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &
_WRT_OFF & _LVP_OFF & _CPD_OFF
;
;Khai báo các hằng số
;
SW1 EQU 0
SW2 EQU 1
SW3 EQU 2
SW4 EQU 3

LED1 EQU 4
LED2 EQU 5
LED3 EQU 6
LED4 EQU 7
;
;Khai báo biến
;
count EQU 0x20 ; biến dùng cho quá trình dòch LED
count1 EQU 0x21 ; các biến dùng cho chương trình delay
counta EQU 0x22
countb EQU 0x23
;
;Chương trình
;
ORG 0x000
GOTO start
start ; vò trí bắt đầu chương trình chính
BCF STATUS,RP1
BCF STATUS,RP0 ; chọn BANK0
CLRF PORTB
CLRF PORTD
BSF STATUS,RP0 ; chọn BANK1
MOVLW b'00001111'
MOVWF TRISB
MOVLW 0x00
MOVWF TRISD
BCF STATUS,RP0 ; chọn BANK0
loop1
CLRF count ; reset biến count
CALL check_key ; gọi chương trình con check_key

loop2
MOVF count,W ; đưa gía trò biến count vào thanh ghi W
BTFSC PORTB,LED1 ; kiểm tra trạng thái bit LED1
CALL table1 ; gọi chương trình con “table1” nếu bit
; “LED1” mang giá trò bằng 1
BTFSC PORTB,LED2 ; tiếp tục kiểm tra bit LED2 nếu bit LED1 bằng 0
CALL table2 ; thao tác tương tự với các bit chỉ thò trạng thái các
; SW còn lại
BTFSC PORTB,LED3
CALL table3
BTFSC PORTB,LED4
CALL table4
MOVWF PORTD ; đưa giá trò từ thanh ghi W sau khi quay trở về từ
; bảng dữ liệu ra PORTD
CALL delay ; gọi chương trình con delay
INCF count,0 ; tăng giá trò biến count để kiểm tra
XORLW d'14' ; so sánh biến count với giá trò 14
BTFSC STATUS,Z ; kiểm tra cờ Z (Zero)
GOTO loop1 ; nhảy tới label “loop1” nếu Z bằng 1 (giá trò
; biến “count” bằng 14)
INCF count,1 ; tăng giá trò biến “count” nếu Z bằng 0 (giá trò
; biến “count” không bằng 14)
GOTO loop2 ; sau đó nhảy tới label “loop2”

table1 ; các bảng dữ liệu dùng cho phần dòch LED
ADDWF PCL,f
RETLW b'10000000'
RETLW b'01000000'
RETLW b'00100000'
RETLW b'00010000'

RETLW b'00001000'
RETLW b'00000100'
RETLW b'00000010'
RETLW b'00000001'
RETLW b'00000010'
RETLW b'00000100'
RETLW b'00001000'
RETLW b'00010000'
RETLW b'00100000'
RETLW b'01000000'

table2
ADDWF PCL,f
RETLW b'01111111'
RETLW b'10111111'
RETLW b'11011111'
RETLW b'11101111'
RETLW b'11110111'
RETLW b'11111011'
RETLW b'11111101'
RETLW b'11111110'
RETLW b'11111101'
RETLW b'11111011'
RETLW b'11110111'
RETLW b'11101111'
RETLW b'11011111'
RETLW b'10111111'

table3
ADDWF PCL,f

RETLW b'11000000'
RETLW b'01100000'
RETLW b'00110000'
RETLW b'00011000'
RETLW b'00001100'
RETLW b'00000110'
RETLW b'00000011'
RETLW b'00000011'
RETLW b'00000110'
RETLW b'00001100'
RETLW b'00011000'
RETLW b'00110000'
RETLW b'01100000'
RETLW b'11000000'

table4
ADDWF PCL,f
RETLW b'00111111'
RETLW b'10011111'
RETLW b'11001111'
RETLW b'11100111'
RETLW b'11110011'
RETLW b'11111001'
RETLW b'11111100'
RETLW b'11111100'
RETLW b'11111001'
RETLW b'11110011'
RETLW b'11100111'
RETLW b'11001111'
RETLW b'10011111'


check_key ; chöông trình con check_key kieåm tra traïng thaùi
BTFSS PORTB,SW1 ; các SW, sau đó bật LED tương ứng với SW đó
CALL switch1 ; sáng nếu SW đó được ấn. Trạng thái các LED
BTFSS PORTB,SW2 ; có tác dụng như các bit cờ hiệu khi xác đònh thao
CALL switch2 ; tác dòch LED tương ứng với SW được ấn
BTFSS PORTB,SW3
CALL switch3
BTFSS PORTB,SW4
CALL switch4
RETURN

switch1
CLRF PORTB
BSF PORTB,LED1
RETURN
switch2
CLRF PORTB
BSF PORTB,LED2
RETURN
switch3
CLRF PORTB
BSF PORTB,LED3
RETURN
switch4
CLRF PORTB
BSF PORTB,LED4
RETURN

delay ; chương trình delay một khoảng thời gian 250 ms

MOVLW d'250'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0

DECFSZ count1,1
GOTO d1
RETURN
END

Trong chương trình này ta lợi dụng các bit trạng thái của các LED để dùng như các cờ
hiệu để xác đònh thao tác dòch LED tương ứng với SW được nhấn trong vòng lặp “loop1” và
“loop2”. Các thuật toán như bảng dữ liệu, kiểm tra trạng thái công tắc,… đều đã được đề cập
đến ở các phần trước, vấn đề đặt ra trong chương trình này chỉ là sắp xếp và tổ chức hợp lí
thứ tự các thao tác và các thuật toán. Tuy nhiên nếu đọc kó chương trình trên ta sẽ phát hiện
một điểm bất hợp lí ở vò trí đặt lệnh “CALL check_key”. Nếu đặt ở vò trí như chương trình
trên, vi điều khiển sẽ chỉ kiểm tra các SW ngay tại thời điểm kết thúc quá trình dòch LED.
Như vậy muốn thay đổi thao tác quét LED ta phải ấn SW đúng ngay tại thời điểm đó, điều
này gây nhiều khó khăn và tạo sự bất hợp lí so với thực tế. Để khắc phục ta chỉ việc đặt lệnh
đó vào trong vòng lặp “loop2”, khi đó trạng thái các SW sẽ được cập nhật thường xuyên hơn
sau mỗi lần dòch LED mà không phải chờ cho đến khi kết thúc một quá trình dòch LED.


Tới giai đoạn này xem như ta kết thúc những thao tác đơn giản nhất khi sử dụng vi
điều khiển PIC16F877A. Trong phần này ta chỉ sử dụng duy nhất vi điều khiển PIC và các
PORT I/O để xây dựng các ứng dụng. Kể từ phần sau ta sẽ kết hợp vi điều khiển PIC với các
thiết bò ngoại vi khác để phát huy tối đa khả năng của vi điều khiển.

4.2 VI ĐIỀU KHIỂN PIC16F877A VÀ IC GHI DỊCH 74HC595

Mục đích sử dụng IC 74HC595 là nâng cao số lượng pin output của vi điều khiển.
Thay vì phải truy xuất trực tiếp một giá trò nào đó ra các PORT I/O, ta có thể truy xuất gián
tiếp thông qua IC 74HC595. Tuy nhiên việc trước tiên là phải tìm hiểu xem IC 74HC595 hoạt
động như thế nào và cách điều khiển nó ra sao. Hình sau là sơ đồ khối của IC:


Hình 4.4 Sơ đồ khối IC 74HC595

Thưc chất đây là IC ghi dòch với 8 bit ngõ ra Q
H
:Q
A
với chốt dữ liệu 8 bit. Dữ liệu chỉ
được đưa vào qua 1 pin SER và được điều khiển bởi các pin RCK (pin điều khiển chốt dữ
liệu), SCK (pin điều khiển việc dòch dữ liệu vào IC thông qua các xung clock), (pin tác
động mức thấp dùng để xóa dữ liệu) và pin Q’
H
(pin đưa dữ liệu nối tiếp ra ngoài, pin này
dùng để nối nhiều IC 74HC595 lại với nhau) và pin (pin cho phép ngõ ra). Ta có thể điều
khiển một IC 74HC595 hoặc nhiều IC ghép với nhau thông qua 4 pin RCK, SCK, SER và
. Điều này cho phép mở rông một cách vô hạn số lượng pin output cho vi điều khiển,
tất nhiên với một nhược điểm là thời gian truy xuất chậm do dữ liệu phải được dòch từng bit
vào IC thông qua từng cạnh dương tác động vào pin SCK trước khi đưa dữ liệu ra ngoài

thông qua các pin Q
H
:Q
A
. Sau đây là sơ đồ chân và bảng sự thật của IC 74HC595:


Hình 4.6 Sơ đồ chân và bảng sự thật của 74HC595

Hình sau thể hiện cách nối nhiều IC 74HC595 lại với nhau:
0
74HC5958
9
10
13
14
16
11
1215
1
2
3
4
5
6
7
GND
SDO
CLR
G

SDI
VCC
SRCLK
RCLKQA
QB
QC
QD
QE
QF
QG
QH
0
DATA OUT
74HC5958
9
10
13
14
16
11
1215
1
2
3
4
5
6
7
GND
SDO

CLR
G
SDI
VCC
SRCLK
RCLKQA
QB
QC
QD
QE
QF
QG
QH
HI
CLR
0
HI
RCK
DATA IN
SCK

Hình 4.7 Cách nối nhiều IC 74HC595
Như ta thấy trong hình trên, các pin SCK, RCK và được nối chung lại với nhau,
trong khi pin SDO của IC trước sẽ nối với pin SDI của IC sau. Tất cả các IC này sẽ được điều
khiển thông qua 4 pin SCK,RCK, và SDI, như vậy ta có thể tiết kiệm được một số
lượng đáng kể số lượng pin điều khiển của vi điều khiển.
Cách điều khiển IC được thể hiện thông qua bảng sự thật ở hình 4.6. Trước tiên đưa 1
bit dữ liệu vào pin SDI, tạo ra một cạnh dương ở pin SCK để dòch bit dữ liệu đó vào, qáu
trình này lặp đi lặp lại liên tục cho đến khi toàn bộ dữ liệu được dòch vào các IC 74HC595
(IC tiếp theo cùng sẽ dòch dữ liệu được đưa ra thông qua pin SDO của vi điều khiển trước).

Sau đó tạo một cạnh dương ở pin RCK để đưa dữ liệu từ chốt dữ liệu ra các pin output. Ứng
dụng sau giúp ta hiểu rõ hơn cách điều khiển các IC 74HC595.

Ứng dụng 4.5: IC 74HC595 và cách điều khiển.
Trong ứng dụng này ta sẽ đưa dữ một liệu 8 bit bất kì ra thông qua IC 47HC595. Dữ
liệu sẽ được kiểm tra thông qua các LED được gắn vào các pin output của IC. Các pin điều
khiển của 74HC595 được gắn vào các pin RB3:RB0 của PORTB. Cụ thể như sau:
Pin RB0: nối với pin SDI
Pin RB1: nối với pin SCK
Pin RB2: nối với pin
Pin RB3: nối với pin RCLK
Các thứ tự này không bắt buôc phải được tuân thủ một cách nghiêm ngặt, tùy theo
mạch phần cứng mà ta có sự điều chỉnh tương ứng trong phần mềm. Ngoài ra ta có thể sử
dụng bất cứ pin nào của PORT I/O nào để điều khiển IC này.
Mạch test cho ứng dụng này được thiết kế như sau:
0.33 K
HI
0.33 K
0
D2
D3
D8
HI
D5
0
0.33 K
D4
0.33 K
D7
0

4 MHz
HI
10 K
0.33 K
D6
0.33 K
0
0.33 K
SW5
D1
0.33 K
HI
U3
74HC595
8
9
10
13
14
16
11
12 15
1
2
3
4
5
6
7
GND

SDO
CLR
G
SDI
VCC
SRCLK
RCLK QA
QB
QC
QD
QE
QF
QG
QH
0
U1
PIC16F877A
31
12
1
13
11
32
2
3
4
5
6
7 33
34

35
36
37
38
39
40
15
16
17
18 23
24
25
26
19
20 21
22
27
28
29
30
8
9
10
14
GND
GND
MCLR/VPP
OSC1/CLK
VDD
VDD

RA0/AN0
RA1/AN1
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RA4/T0CLK/C1OUT
RA5/AN4/SS/C20UT
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
RC0/T1OSO/T1CLK
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1 RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7
RE0/RD/AN5
RE1/WR/AN6

RE2/CS/AN7
OSC2/CLKOUT

Hình 4.8 Mạch test vi điều khiển PIC16F877A và IC 74HC595.
Sau đây là chương trình viết cho ứng dụng này:

; Chương trình 4.2.1
;Chương trình test IC ghi dòch 74HC595
;
processor 16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &
_WRT_OFF & _LVP_OFF & _CPD_OFF
;
; Khai báo biến
;
sendreg EQU 0X20 ; chứa dữ liệu cần xuất ra IC 74HC595
count EQU 0X21 ; dùng để đếm số bit dữ liệu được gửi ra
;
;Đònh nghóa phần cứng
;
#define data PORTB,0
#define clock PORTB,1
#define clear PORTB,2
#define latch PORTB,3
;
; Chương trình chính
;
ORG 0x000
GOTO start

start ; chương trình chính
BCF STATUS,RP1
BCF STATUS,RP0 ; chọn BANK0
CLRF PORTB
BSF STATUS,RP0 ; chọn BANK1
MOVLW 0xF0 ; các pin RB3:RB0 là output
MOVWF TRISB ; các pin RB7:RB4 là input
BCF STATUS,RP0 ; chọn BANK0
MOVLW 0x04
MOVWF PORTB ; đưa pin lên mức logic cao
BCF clear ; reset dữ liệu trong IC 74HC595
NOP ; clear tác động cạnh xuống
BSF clear ; đưa pin trở về mức logic cao
MOVLW 0xCA ; dữ liệu cần đưa ra IC 74HC595

×