Mỗi bank có dunglượng 128 byte ,bao gồm các thanh ghi có chức năng đặc biệt SFR SpecialFunction Register nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chungGPR General Purpose R
Trang 1CHƯƠNG I : DẪN NHẬP
I Đặt vấn đề:
Ngày nay với sự phát triển của công nghiệp vi điện tử, kỹ thuật số các hệthống điều khiển dần được tự động hóa.Với các kỹ thuật tiên tiến như vi xử lý, vimạch số…được ứng dụng vào lĩnh vực điều khiển, thì các hệ thống điều khiển cơkhí thô sơ, với tốc độ xử lý chậm chạm ít chính xác được thay thế bằng các hệthống điều khiển tự động với các lệnh chương trình đã được thiết lập trước
Sau thời gian học tập ở trường, với sự chỉ dẫn tận tình của Thầy, Cô VàĐược sự đồng ý của khoa Điện Tử - Tin Học Trường Cao Đẳng Kỹ Thuật CaoThắng nhằm ứng dụng những kiến thức đã học vào thực tế qua đồ án tốt nghiệpcủa mình,nhóm chúng em quyết định thực hiện đề tài “ NGÔI NHÀ TỰ ĐỘNG”
II Giới hạn đề tài:
Với thời gian gần năm tuần thực hiện đề tài cũng như trình độ chuyên môn
có hạn, chúng em đã cố gắng hết sức để hoàn thành đồ án này nhưng chỉ giải quyếtđược những vấn đề sau:
Hệ thống cửa tự động, khóa cửa tự động
Đo nhiệt độ trong phòng hiển thị bằng LCD, điều khiển thiết bị vàcảnh báo
Tự động bật đèn ngoài sân khi trời tối
III Mục đích nghiên cứu :
Mục đích trước hết khi thực hiện đề tài này là để hoàn tất chương trình mônhọc để đủ điều kiện ra trường Cụ thể khi nghiên cứu đề tài là chúng em muốnphát huy những thành quả ứng dụng của vi điều khiển vào một mạch thực tế Nócòn là tập tài liệu tham khảo cho các bạn sinh viên khóa sau
Ngoài ra quá trình thực hiện đề tài là một cơ hội để chúng em tự kiểm tralại những kiến thức đã học ở trường Đồng thời phát huy tính sáng tạo, khả nănggiải quyết những vấn đề do nhu cầu đặt ra
IV Đối tượng nghiên cứu
- Các phương án điều khiển và xử lý dữ liệu cho hệ thống cửa tự động
-Tìm hiểu về vi xử lý PIC16F877A
- Tìm hiểu phương pháp lập trình CCS
- Tìm hiểu về cảm biến nhiệt độ LM35
Trang 2CHƯƠNG II
VI ĐIỀU KHIỂN PIC16F877A
• I : Giới Thiệu Chung Về Pic 16FXXX
• II : Vi Điều Khiển Pic 16F877A
2.1: Giới Thiệu Chung Về Pic 16FXXX
2.1.1 : Pic là gì ?
Pic là viết tắt của” Promgramable Intelligent Computer’’,có thể tạm dịch là “máy tính thông minh khả trình “ do hãng Genenral Instrument đặt tên cho vi điềukhiển đầu tiên của họ Pic 1650 được thiết kế để dùng làm các thiết bị ngoại vicho vi điều khiển CP1600 Vi điều khiển này sau đó được nghiên cứu phát triểnthêm và từ đó hình thành nên dòng vi điều khiển PIC ngày nay
2.1.2:Tại sao dùng Pic ?
Họ vi điều khiển này có thể tìm mua dễ dàng tại thị trường Việt Nam Giáthành không quá đắt Có đầy đủ tính năng của một vi điều khiển khi hoạt độngđộc lập Là một sự bổ xung rất tốt về kiến thức cũng như về ứng dụng cho họ viđiều khiển mang tính truyền thống họ vi điều khiển 8051.Số lượng người sử dụng
vi điều khiển Pic hiện nay tại Việt Nam cũng như trên thế giới khá rộng rãi.Điềunày tạo nhiều thuận lợi cho quá trình tìm hiểu và phát triển các ứng dụng như:sốlượng các tài liệu ,số lượng các ứng dụng mở đã được phát triển thành công ,dễdàng trao đổi, học tập ,dễ dàng tìm được sự chỉ dẫn khi gặp khó khăn, Sự hỗ trợnhà sản xuất về trình biên dịch ,các công cụ lập trình ,nạp chương trình từ đơngiản đến phức tạp, Các tính năng đa dạng của vi điều khiển Pic ,và các tính năngnày không ngừng được phát triển
2.1.3:Các dòng Pic và cách lựa chọn vi điều khiển Pic
Các ký hiệu của vi đìều khiển Pic:
Pic 12xxxx : độ dài lệnh 12 bit
Pic 16xxxx : độ dài lệnh 14 bit
Pic 18xxxx : độ dài lệnh 16 bit
C : Pic có bộ nhớ EPROM (chỉ có 16C84 là EEPROM)
F : Pic có bộ nhớ flash
LF : Pic có bộ nhớ flash hoạt động ở điện áp thấp
LV : tương tự như LF , đây là ký hiệu cũ
Bên cạnh đó một số vi điều khiển có ký hiệu là xxFxxx là EEPROM, nếu như
có thêm chữ A ở cuối là flash, (ví dụ như PIC 16F877 là EEPROM ,còn PIC16F877A là flash)
Trang 3Ở Việt Nam phổ biến nhất là các họ vi điều khiển PIC do hãng Microchip sảnxuất Cách lựa chọn một vi điều khiển Pic phù hợp : Trước hết cần chú ý đến sốchân của vi điều khiển phù hợp với ứng dụng Có nhiều vi điều khiển Pic với sốlượng chân khác nhau,thậm chí có vi điều khiển chỉ có 8 chân Ngoài ra còn có viđiều khiển 28 ,40,44, chân Cần chọn vi điều khiển Pic có bộ nhớ flash để có thểnạp xóa chương trình được nhiều lần Tiếp theo cần chú ý đến các khối chức năngđược tích hợp sẵn trong vi điều khiển , các chuẩn giao tiếp bên trong.Sau cùng cầnchú ý đến bộ nhớ chương trình mà vi điều khiển cho phép.
2.1.4: Ngôn ngữ lập trình cho Pic
Ngôn ngữ lập trình cho Pic rất đa dạng Ngôn ngữ lập trình cấp thấp cóMPLAB (được cung cấp miễn phí bởi nhà sản xuất Microchip ),các ngôn ngữ lậpcấp cao hơn bao gồm C, Basic, Pascal , Ngoài ra còn có một số ngôn ngữ lậptrình được phát triển dành riêng cho Pic như PicBasic, MkroBasic
2.1.5: Mạch nạp Pic
Đây cũng là một dòng sản phẩm rất đa dạng dành cho vi điều khiển Pic Có thể
sử dụng các mạch nạp được cung cấp bởi nhà sản xuất là hãng Microchip như:PICSTART plus, MPLAB ICD 2, MPLAB PM 3, PRO MATE II Có thể dùng cácsản phẩm này để nạp cho vi điều khiển khác thông qua chương trình MPLAB.Dòng sản phẩm chính thống này có ưu thế là nạp được cho tất cả các vi điềukhiển Pic ,tuy nhiên giá thành cao và thường gặp nhiều khó khăn trong quá trìnhmua sản phẩm
Trang 42.2: Vi Điều Khiển Pic 16F877A
2.2.1.Sơ đồ chân
Hình 2.1:vi điều khiển Pic 16F8774A/16F877A và các dạng chân
2 2.2 Một vài thông số về Pic 16F877A
Đây là vi điều khiển thuộc họ Pic16Fxxx với tập lệnh hơn 35 lệnh có độ dài
14 bit Mỗi lệnh đều được thực thi trong mỗi chu kỳ xung clock Tốc độ hoạt độngtối đa cho phép là 20 MHz với một chu kỳ lệnh là 200ns Bộ nhớ chương trình8Kx14 bit ,bộ nhớ dữ liệu 368 byte RAM và bộ nhớ dữ liệu EEPROM với dunglượng 256 byte Số port I/O là 5 với 33 pin I/O
Trang 5Các đặc tính ngoại vi bao gồm các khối chức năng sau:
- Timer 0: bộ đếm 8 bit với bộ chia tần số 8 bit
- Timer 1:bộ đếm 16 bit với bộ chia tần số ,có thể thực hiện chức năng đếm dựavào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep
- Timer 2:bộ đếm 8 bit với bộ chia tần số ,bộ postcaler
Hai bộ Capture/so sánh/điều chế độ rộng xung
Các chuẩn giao tiếp SSP (Synchronous Serial Port ) ,SPI và I2C
Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ
Cổng giao tiếp song song PSP (Paraller Slave Port ) với các chân điều khiển
RD ,WR, CS ở bên ngoài
Các đặc tính Analog:
- 8 kênh chuyển đổi ADC 10 bit
- Hai bộ so sánh
Bên cạnh đó là một vài đặc tính khác của vi điều khiển như :
- Bộ nhớ flash với khả năng ghi xóa được 100.000 lần
- Bộ nhớ EEPROM với khả năng ghi xóa được 1000.000 lần
- Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm
- Khả năng tự nạp chương trình với sự điều khiển của phần mềm
-Nạp được chương trình ngay trên mạch điện ICSP (In Circuit SerialProgramming) thông qua hai chân
- Watch Dog Timer với bộ dao động trong
- Chức năng bảo mật mã chương trình
- Chế độ Sleep
- Có thể hoạt động với nhiều dạng Oscillator khác nhau
Trang 62.2.3: Sơ đồ khối của Pic 16F877A
Trang 7Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Resetvector ).Khi có ngắt xảy ra ,bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h(Interrupt vector ) Bộ nhớ chương trình không bao gồm bộ nhớ stack và khôngđược địa chỉ hóa bởi bộ đếm chương trình.
Bộ nhớ dữ liệu
Bộ nhớ dữ liệu của Pic là bộ nhớ EEPROM được chia ra thành nhiều bank.Đối với Pic 16F877A bộ nhớ dữ liệu được chia ra làm 4 bank Mỗi bank có dunglượng 128 byte ,bao gồm các thanh ghi có chức năng đặc biệt SFR (SpecialFunction Register ) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chungGPR (General Purpose Register) nằm ở vùng địa chỉ còn lại trong bank Các thanhghi SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS ) sẽ được đặt ởtất cả các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làmgiảm bớt lệnh của chương trình
Sơ đồ cụ thể của bộ nhớ dữ liệu Pic 16F877A như sau :
Trang 8a\Thanh ghi chức năng đặt biệt SFR :
Đây là thanh ghi được sử dụng bởi CPU hoặc được dùng để thiết lập và điềukhiển các khối chức năng được tích hợp bên trong vi điều khiển Có thể phânthanh ghi SFR làm hai loại :Thanh ghi SFR liên quan đến các chức năng bên trong(CPU) và thanh ghi SFR dùng để thiết lập và điều khiển các khối chức năng bênngoài (ví dụ như ADC, PWM, )
Thanh ghi STATUS ( 03h,83h, 103h, 183h ):thanh ghi chứa kết quả thực hiệnphép toán của khối ALU , trạng thái reset và các bit chọn bank cần truy xuất trong
bộ nhớ dữ liệu
R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
Bit 7 Bit 0
Trang 9Thanh ghi OPTION –REG (81h,181h): thanh ghi cho phép đọc và ghi ,cho phépđiều khiển chức năng full-up của các chân trong PORT B ,xác lập các tham số vềxung tác động ,cạnh tác động của ngắt ngoại vi và timer 0.
PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE Bit 7 Bit
Thanh ghi PIR1(0Ch) :chứa cờ ngắt của các khối chức năng ngoại vi ,các ngắt nàyđược cho phép bởi các bit điều khiển chứa trong thanh ghi PIE1
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF Bit 7 Bit 0
Thanh ghi PIE2 (8Dh): chứa các bit điều khiển các ngắt của các khối chứcnăng CCP2,SSP bus, ngắt của bộ so sánh và ngắt ghi vào bộ nhớ EEPROM
U-0 R/W-X U-0 R/W-0 R/W-0 U-0 U-0 R/W-0
Bit 7 Bit 0
Thanh ghi PIR2 (0Dh):chứa các cờ ngắt của các khối chức năng ngoại vi ,các ngắtnày được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE2
U-0 R/W-X U-0 R/W-0 R/W-0 U-0 U-0 R/W-0
Bit 7 Bit 0
Trang 10Thanh ghi PCON (8Eh) :chứa các cờ hiệu cho biết trạng thái các chế độ resetcủa vi điều khiển
R/W-0 R/W-1 U-0 U-0 U-0 U-0 U-0 U-0
Bit 7 Bit 0
b)Thanh ghi m ục đích chung GPR
Các thanh ghi này có thể truy xuất trực tiếp hoặc gián tiếp thông qua các thanhghi FSR (File Select Register) Đây là các thanh ghi dữ liệu thông thường, người
sử dụng có thể tùy theo mục đích chương trình mà có thể dùng các thanh ghi này
để chứa các biến số, hằng số, kết quả hoặc các tham số của chương trình
Bộ nhớ Stack trong vi điều khiển PIC họ 16f87xA có khả năng chứa được 8 địachỉ và hoạt động theo cơ chế xoay vòng Nghĩa là giá trị cất vào trong bộ nhớStack lần thứ 9 sẽ ghi đè lên giá trị cất vào Stack lần đầu tiên và giá trị cất vào bộnhớ Stack lần thứ 10 sẽ ghi đè lên giá trị cất vào Stack lần thứ 2
Chú ý: Là không có cờ hiệu nào cho biết trạng thái Stack, do đó ta không biếtđược khi nào Stack bị tràn Bên cạnh đó tập lệnh của vi điều khiển dòng PIC cũngkhông có lệnh POP hay PUSH, các thao tác với bộ nhớ stack sẽ hoàn toàn điềukhiển bởi CPU
2.2.5: Các cổng xuất nhập của PIC 16F877A.
Các cổng xuất nhập ( I/O port) chính là phương tiện mà vi điều khiển dùng đểtương tác với thế giới bên ngoài Bên cạnh đó, vi điều khiển được tích hợp sẵn bêntrong các đặc tính giao tiếp ngoại vi nên bên cạnh chức năng là cổng xuất nhậpthông thường, một số chân xuất nhập còn có thêm chức năng khác để thể hiện sựtác động của các đặc tính ngoại vi nêu trên đối với thế giới bên ngoài
Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm Port A, Port B,Port C, Port D và Port E
PORT A:
Port A (RPA) bao gồm 6 I/0 pin Đây là các chân “ hai chiều “(bidirectionalpin) ,nghĩa là có thể xuất và nhập được Chức năng I/O này được điều khiển bởithanh ghi Tris A ( địa chỉ 85 h).Muốn xác lập chức năng của một chân Port A làinput,ta “set” bit điều khiển tương ứng với chân đó trong thanh ghi Tris A vàngược lại ,muốn xác lập chức năng của một chân trong Port A là ouput ,ta “clear”
Trang 11bit điều khiển tương ứng với chân đó trong thanh ghi Tris A Thao tác này hoàntoàn tương tự với các Port và các thanh ghi điều khiển tương ứng Tris (đối với Port
A là Tris A,đồi với Port B là Tris B ,đối với Port C là Tris C,đối với Port D là Tris
D và đối với Port E là Tris E ) Bên cạnh đó Port A còn là ngõ ra của bộ ADC,bộ
so sánh ,ngõ vào Analog ngõ vào xung clock của Timer 0 và ngõ vào của bộ giaotiếp MSSP (master synchronous serial Port )
Các thanh ghi SFR liên quan đến Port A bao gồm :
Port A(địa chỉ 05h):chứa giá trị các pin trong Port A
Tris A (địa chỉ 85h):điều khiển xuất nhập
CMCON(địa chỉ 9Ch):thanh ghi điều khiển bộ so sánh
CVRCON (địa chỉ 9Dh):thanh ghi điều khiển bộ so sánh điện áp
ADCON1 (địa chỉ 9Fh) :thanh ghi điều khiển bộ ADC
PORT B :
Port B (RP B) gồm 8 pin I/O Thanh ghi điều khiển xuất nhập tương ứng là Tris
B Bên cạnh đó một số chân của Port B Còn được sử dụng trong quá trình nạpchương trình cho vi điều khiển với các chế độ nạp khác nhau Port B còn liên quanđến ngắt ngoại vi và bộ Timer 0 Port B còn đươc tích hợp chức năng điện trở kéolên được điều khiển bởi chương trình
Các thanh ghi SFR liên quan đến Port B bao gồm :
Port B (địa chỉ 06h ,106h) :chứa giá trị các pin trong Port B
Tris B ( địa chỉ 86h, 186h):điều khiển xuất nhập
OPTION –REG (địa chỉ 81h,181h ):điều khiển ngắt ngoại vi và bộ timer 0
PORT C:
Port C (RPC) gồm 8 pin I/O ,thanh ghi điều khiển xuất nhập tương ứng là TrisC.Bên cạnh đó Port C còn chứa các chân chức năng của bộ so sánh ,bộ Timer 1,bộPWM và các chuẩn giao tiếp nối tiếp I2C,SPI,SSP,USART
Các thanh ghi điều khiển liên quan đến Port C:
Port C(địa chỉ 07h )P:chứa giá trị các pin trong Port C
Tris C (địa chỉ 87h):điều khiển xuất nhập
PORT D :
Port D (RPD) gồm 8 chân I/O ,thanh ghi điều khiển xuất nhập tương ứng là TrisD.Port D còn là cổng xuất dữ liệu của chuẩn giao tiếp PSP (Paraller Slave Port ) Các thanh ghi liên quan đến Port D bao gồm :
Thanh ghi Port D :chứa giá trị các pin trong Port D
Thanh ghi Tris D :điều khiển xuất nhập
PORT E :
Port E (RPE) gồm 3 chân I/O.Thanh ghi điều khiển xuất nhập tương ứng là TrisE.Các chân của Port E có ngõ vào analog Bên cạnh đó Port E còn là các chân điềukhiển của chuẩn giao tiếp PSP
Các thanh ghi liên quan đến Port E bao gồm :
Port E :chứa giá trị các chân trong Port E
TRIS E điều khiển xuất nhập PORT E và xác lập các thông số cho chuẩn giao tiếpPSP
Trang 12ADCON1 :thanh ghi điều khiển khối ADC.
2.2.6: Timer 0
Đây là 1 trong 3 bộ đếm hoặc bộ định thời của vi điều khiển PIC 16F877A.Timer 0 là bộ đếm 8 bit được kết nối với bộ chia tần số (prescaler)8 bit.Cấu trúccủa bộ Timer 0 cho phép ta lựa chọn xung clock tác động và cạnh tích cực củaxung clock Ngắt Timer 0 sẽ xuất hiện khi timer 0 bị tràn
Muốn Timer 0 hoạt động ở chế độ Timer ta clear bit TOSC(OPTION-REG
<5>),khi đó giá trị thanh ghi TMR0 sẽ tăng theo từng chu kỳ đồng hồ (tần số vàoTimer 0 bằng ¼ tần số oscillator).Khi giá trị thanh ghi TMR0 từ FFh trở về00h,ngắt Timer 0 sẽ xuất hiện Thanh ghi TMR 0 cho phép ghi và xóa được giúp ta
ấn định thời gian ngắt Timer 0 xuất hiện một cách linh động.Muốn Timer 0 hoạtđộng ở chế độ counter ta set bit TOSC (OPTION-REG<5>).Khi đó xung tác độnglên bộ đếm được lấy từ chân RA4/TOCK1.Bit TOSE (OPTION-REG<4>)chophép lựa chọn cạnh tác động vào bộ đếm Cạnh tác động sẽ là cạnh lên nếuTOSE=0 và cạnh tác động sẽ là cạnh xuống nếu TOSE = 1 Khi thanh ghi TMR0
bị tràn ,bit TMR0IF (INTCON<2>) sẽ được set Đây chính là cờ ngắt của Timer0.Cờ ngắt này phải được xóa bằng chương trình trước khi bộ đếm bắt đầu thựchiện lại quá trình đếm Ngắt Timer 0 không thể” đánh thức “vi điều khiển từ chế
Các thanh ghi điều khiển liên quan đến Timer 0 bao gồm :
TMR0 (địa chỉ 01h,101h):chứa giá trị đếm của Timer 0
INTCON(địa chỉ 0Bh,8Bh,10Bh,18Bh):cho phép ngắt hoạt động (GIE và PEIE).OPTION-REG (địa chỉ 81h,181h):điều khiển prescaler
2.2.7:Timer 1
Timer 1 là bộ định thời 16 bit ,giá trị của Timer 16 sẽ được lưu trong hai thanhghi (TMR1H:TMR1L).Cờ ngắt của Timer 1 là bit TMR1IF (PIR<0>) Bit điềukhiển của Timer 1 sẽ là TMR1IE(PIE<0>).Tương tự như Timer 0,Timer 1 cũng cóhai chế độ hoạt động :chế độ định thời (Timer) với xung kích là xung clock củaoscillator (tần số Timer bằng ¼ tần số của oscillator ) và chế độ đếm (counter) vớixung kích là xung phản ánh các sự kiện cần đếm lấy từ bên ngoài thông qua chânRC0/T1OSO/T1CKI (cạnh tác động là cạnh lên).Việc lựa chọn xung tác động(tương ứng với việc lựa chọn chế độ hoạt động là Timer hay counter) được điềukhiển bởi bit TMR1CS(T1CON<1>)
Các thanh ghi liên quan đến Timer 1 bao gồm:
INTCON(địa chỉ 0Bh,8Bh,10Bh,18Bh): cho phép ngắt hoạt động (GIE PEIE).PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer 1 (TMR1IF)
Trang 13PIE1 (địa chỉ 8Ch ): cho phép ngắt Timer 1 (TMR1IE).
TMR1R (địa chỉ 0Eh) : chứa giá trị 8 bit thấp của bộ đếm Timer 1
TMR1H (địa chỉ 0Eh): chứa giá trị 8 bit cao của bộ đếm Timer 1
T1CON (địa chỉ 10h ): xác lập các thông số cho Timer 1
2.2.8 :Timer 2
Timer 2 là bộ định thời 8 bit và được hỗ trợ hai bộ chia tần số prescaler vàpostcaler Thanh ghi chứa giá trị đếm của timer 2 là TMR2 Bit cho phép ngắtTimer 2 tác động là TMR2ON (T2CON<2>) Cờ ngắt của Timer 2 là bit TMR2IF(PIR1<1>) Xung ngõ vào (tần số bằng ¼ tần số oscillator) được đưa qua bộ chiatần số prescaler 4 bit (với các tỉ số chia tần số là 1:1;1:4;hoặc 1:16 và được điềukhiển bởi các bit T2CKPS0 (T2CON <1:0>)
Ngoài ra ngõ ra của timer 2 còn được kết nối với khối SSP ,do đó Timer 2 cònđóng vai trò tạo ra xung clock đồng bộ cho khối giao tiếp SSP
Các thanh ghi liên quan đến Timer 2 bao gồm :
INTCON(địa chỉ 0Bh ,8Bh,10Bh,18Bh ):cho phép toàn bộ các ngắt (GIE vàPEIE)
PIR1 (địa chỉ 0Ch ):chứa cờ ngắt Timer 2 (TMR2IF)
PIE1 (địa chỉ 8Ch ): chứa bit điều khiển Timer 2 (TMR2IE)
TMR2 (địa chỉ 11h): chứa giá trị đếm của Timer 2
T2CON (địa chỉ 12h):xác lập các thông số cho Timer 2
PR2 (địa chỉ 92h ):thanh ghi hổ trợ cho Timer 2
Timer 0 và Timer 2 là bộ đếm 8 bit (giá trị tối đa là FFh) ,trong khi Timer 1 là
bộ đếm 16 bit (giá trị đếm tối đa là FFFFh0 Timer 0 ,Timer 1 và Timer 2 đều có 2chế độ hoạt động là Timer và counter Xung clock có tần số bằng ¼ tần số củaossillator Xung tác động lên Timer 0 được hỗ trợ bởi prescaler và có thể đượcthiết lập ở nhiều chế độ khác nhau (tần số tác động ,cạnh tác động ) trong khi cácthông số của xung tác động lên Timer 1 là cố định Timer 2 được hổ trợ bởi hai bộchia tần số prescilator và postcaler độc lập,tuy nhiên cạnh tác động vẫn được cốđịnh là cạnh lên Timer 1 có quan hệ với khối CCP,trong khi Timer 2 được kết nốivới khối SSP
2.2.9: ADC
ADC (analog to digital converter ) là bộ chuyển đổi tín hiệu giữa hai dạngtương tự và số Pic 16f877A có 8 ngõ vào analog (RA4:RA0 và RE2: RE0) Hiệuđiện thế chuẩn VREF có thể được lựa chọn là VDD và VSS hay hiệu điện thế chuẩnđược xác lập trên hai chân RA2 va RA3 Kết quả chuyển đổi từ tín hiệu tương tựsang tín hiệu số là 10 bit số tương ứng và được lưu trong hai thanh ghiADRESH:ADRESL
Các thanh ghi liên quan đến bộ chuyển đổi ADC bao gồm :
INTCON (địa chỉ 0Bh,8Bh,10Bh,18Bh): cho phép các ngắt (các bit GIE,PEIE).PIR1(địa chỉ 0Ch): chứa cờ ngắt AD (ADIF)
PIE1( địa chỉ 8Ch): chứa bit điều khiển AD (ADIE)
Trang 14ADRESH (địa chỉ 1Eh):và ADRESL(địa chỉ 9Eh): các thanh ghi chứa kết quảchuyển đổi AD.
ADCON0(địa chỉ 1Fh)và ADCON1 (địa chỉ (9Fh) :xác lập các thông số cho bộchuyển đổi AD
Port A (địa chỉ 05h và Tris A (địa chỉ 85h): liên quan đến các ngõ vào analog ởPort A
Port E(địa chỉ 09h) và Tris E(địa chỉ 89h ): liên quan đến các ngõ vào analog ởPort E
2.2.10 : Giao tiếp nối tiếp
USART (Universal Synchronous Asynchronous Receiver Transmitter) là mộttrong hai chuẩn giao tiếp nối tiếp USART còn gọi là giao diện giao tiếp nối tiếpSCI (Serial Communication Interface ) Có thể sử dụng giao diện này cho các giaotiếp với các thiết bị ngoại vi ,với các vi điều khiển hay với máy tính Các dạng củagiao diện USART ngoại vi bao gồm:
Ở dạng bất đồng bộ,BRG còn được điều khiển bởi bit BRGH (TXSTA<2>) Ởdạng đồng bộ tác động của bit BRGH được bỏ qua.Tốc độ baud do BRG tạo rađược tính theo công thức sau:
Trong đó X là giá trị của thanh ghi RSBRG ( X là số nguyên và 0<X<255)
Các thanh ghi liên quan đến BRG bao gồm:
TXSTA (địa chỉ 98h):chọn chế độ bộ hay bất đồng bộ(bit SYNC) và chọn mức tốc
độ Baud bitBRGH)
RCSTA (địa chỉ 18h):cho phép họat động cổng nối tiếp (bit SPEN)
RSBRG (địa chỉ 99h): quyết định tốc độ Baud
-USART bất đồng bộ:ở chế độ truyền này USART hoạt động theo chuẩn NRZ(None-Return-to-Zero),nghĩa là các bit truyền đi sẽ bao gồm 1 bit Start , 8 hay 9bit dữ liệu (thông thường là 8 bit) và một bit stop.Bit LSB sẽ được truyền đi trước.Các khối truyền và nhận data độc lập với nhau sẽ dùng chung tần số tương ứng vớitốc độ baud cho quá trình dịch dữ liệu (tốc độ baud gấp 16 hay 64 lần tốc độ dịch
dữ liệu tùy theo giá trị của bit BRGH),và đảm bảo tính hiệu quả của dữ liệu thì haikhối truyền và nhận phải dùng chung một định dạng dữ liệu
Trang 15Các thanh ghi liên quan đến quá trình truyền dữ liệu bằng giao diện USART bấtđồng bộ:
Thanh ghi INTCON (địa chỉ 0Bh,8Bh,10Bh, 18Bh): cho phép tất cả các ngắt.Thanh ghi PIR1 (địa chỉ 0Ch):chứa cờ hiệu TXIF
Thanh ghi PIE1 (địa chỉ 8Ch) :chứa bit cho phép ngắt truyền TXIE
Thanh ghi RCSTA (địa chỉ 18Ch):chứa bit cho phép cổng truyền dữ liệu (hai pinRC6/TX/CK/ và RC7/RX/DT)
Thanh TXREG (địa chỉ 19h) : thanh ghi chứa dữ liệu cần truyền
Thanh ghi TXSTA (địa chỉ 98h): xác lập các thông số cho giao diện
Thanh ghi SPBRG (địa chỉ 99h): quyết định tốc độ Baud
-USART đồng bộ:
Giao diện USART đồng bộ được kích họat bằng cách set bit SYNC.Cổng giao tiếpnối tiếp vẫn là hai chân RC7/RX/DT/,RC6/TX/CK và được cho phép bằng cáchset bit SPEN.USART cho phép hai chế độ truyền nhận dữ liệu là Master mode vàSlave mode.Master mode được kích họat bằng cách set bit CSRC (TXSTA<7>),Slave mode được kích họat bằng cách clear bit CSRC.Điểm khác biệt duy nhất củahai chế độ này là Master mode sẽ lấy xung clock đồng bộ từ bộ tạo xung BaudBRG còn Slave mode lấy xung đồng bộ từ bên ngoài qua chân RC6/TX/CK.Điềunày cho phép Slave mode họat động ngay cả vi điều khiển đang ở chế độ Sleep.Các thanh ghi liên quan đến quá trình truyền dữ liệu bằng giao diện USART đồng
bộ Master mode:
Thanh ghi INTCON (địa chỉ 0Bh,8Bh,10Bh,18Bh):cho phép tất cả các ngắt Thanh ghi PIR1 (địa chỉ 0Ch):chứa cờ hịêu TXIF
Thanh ghi PIE1 (địa chỉ 8Ch): chứa bit cho phép ngắt truyền TXIE
Thanh ghi RCSTA (địa chỉ 18h):chứa bit cho phép cổng truyền dữ liệu (hai pinRC6/TX/CK và RC7/RX/DT)
Thanh ghi TXREG (địa chỉ 19h): thanh ghi chứa dữ liệu cần truyền
Thanh ghi TXSTA (địa chỉ 98h): xác lập các thông số cho giao diện
Thanh ghi SPBRG (địa chỉ 99h): quyềt định tốc độ Baud
2.2.11: Cổng giao tiếp song song PSP (parallel slave port)
Ngoài các cổng nối tiếp và các giao diện nối tiếp được trình bày ở phần trên ,viđiều khiển Pic 16f877a còn được hỗ trợ một cổng giao tiếp song song thông quaPort D và Port E, do cổng song song chỉ hoạt động ở chế độ Slave Mode nên viđiều khiển khi giao tiếp qua giao diện này sẽ chịu sự điều khiển của thiết bị bênngoài thông qua các pin và Port E, trong khi dữ liệu sẽ được đọc hoặc ghi theodạng bất đồng bộ thông qua 8 pin của Port D
-Các thanh ghi liên quan đến PSP bao gồm:
Thanh ghi Port D (địa chỉ 08h): chứa dữ liệu cần đọc hoặc ghi
Thanh ghi Port E (địa chỉ 09h): chứa giá trị các pin của Port E
Thanh ghi Tris E (địa chỉ 89h) : chứa các bit điều khiển Port E và PSP
Thanh ghi Pir 1 (địa chỉ 0Ch): chứa cờ ngắt PSPIF
Thanh ghi Pie 1 (địa chỉ 8CH): chứa bit cho phép ngắt PSP
Thanh ghi adcon 1(địa chỉ 9Fh): điều khiển khối ADC tại Port E
Trang 162.2.12:Các đặc tính của Oscillator
Pic 16f877a có khả năng sử dụng một trong 4 loại oscillator, đó là:
LP:(low power crysal)
XT:thạch anh bình thường
HS:(high-speed crystal)
RC:(resistor/capacitor) dao động do mạch RC tạo ra đối với các lọai oscillator LP,
HS, XT , Oscillator được gắn vào vi điều khiển thông qua các pin Osc /Clki vàOsc2/Clko,đối với các ứng dụng không cần các lọai oscillator tốc độ cao,ta có thể
sử dụng mạch dao động RC làm nguồn cung cấp xung họat động cho vi điềukhiển, tần số tạo ra phụ thuộc vào các giá trị điện áp, giá trị điện trở và tụ điện,bêncạnh đó có sự ảnh hưởng của các yếu tố như nhiệt độ, chất lượng của các linhkiện
Các linh kiện sử dụng cho mạch RC oscillator phải đảm bảo các giá trị sau:
3k<rext <100k
Cext >20pf
XIII:Các chế độ Reset
Có nhiều chế độ reset vi điều khiển , bao gồm:
Power-on Reset POR (Reset khi cấp nguồn họat động cho vi điều khiển)
Reset trong quá trình họat động
Từ chế độ sleep
WDT reset (reset do khối WDT tạo ra trong quá trình hoạt động)
WDT wake up từ chế độ sleep
Brown-oat reset (BOR)
-Power-on reset (POR):đây là xung reset do vi điều khiển tạo ra khi phát hịênnguồn cung cấp VDD.Khi họat động ở chế độ bình thường, vi điều khiển cần đượcđảm bảo các thông số về dòng điện, điện áp để hoạt động bình thường Nhưng nếucác tham số này không được đảm bảo, xung reset do POR tạo ra sẽ đưa vi điềukhiển về trạng thái reset và chỉ tiếp tục hoạt động khi nào các tham số trên đượcbảo đảm
-Power-up Timer (PWRT): đây là bộ định thời hoạt động dựa vào mạch RC bêntrong vi điều khiển.Khi PWRT được kích hoạt, vi điều khiển sẽ được đưa về trạngthái reset.PWRT sẽ tạo ra một khoảng thời gian delay (khoảng 72 ms) để VDD tăngđến giá trị thích hợp
-Oscillator Start-up Timer (OST):OST cung cấp một khoảng thời gian delay bằng
1024 chu kỳ xung của oscillator sau khi PWRT ngưng tác động (vi điều khiển đã
đủ điều kiện hoạt động) để ảm bảo sự ổn định của xung do oscillator tạo ra Tácđộng của OST còn xảy ra đối với POR reset khi vi điều khiển được đánh thức từchế độ sleep OST chỉ tác động đối với các loại oscillator là XT, HS và LP
-Brown-out reset (BOR):Nếu VDD hạ xuống thấp hơn giá trị VBOR (khoảng 4v) vàkéo dài trong khoảng thời gian lớn hơn TBOR (khoảng 100us),BOR được kích hoạt
và vi điều khiển được đưa về trạng thái BOR reset Nếu điện áp cung cấp cho viđiều khiển hạ xuống thấp hơnVBOR trong khoảng thời gian ngắn hơn TBOR, vi điềukhiển sẽ không được reset Khi điện áp cung cấp đủ cho vi điều khiển họat động,
Trang 17PWRT được kích hoạt để tạo ra một khoảng thời gian delay (khoảng 72 ms).Nếutrong khoảng thời gian này điện áp cung cấp cho vi điều khiển lại tiếp tục hạxuống dước mức điện áp VBOR,BOR reset sẽ lại được kích hoạt khi vi điều khiển
đủ điện áp hoạt động Một điểm cần chú ý là khi BOR reset được cho phép, PWRTcũng sẽ được bất chấp trạng thái của bit PWRT
-Tóm lại để vi điều khiển hoạt động được từ khi cấp nguồn cần trải qua các bướcsau:POR tác động PWRT (nếu được cho phép hoạt động) tạo ra khoảng thời giandelay TPWRT để ổn định nguồn cung cấp
OST (nếu được cho phép ) tạo ra khoảng thời gian delay bằng 1024 chu kỳ xungcủa oscillator để ổn định tần số của oscillator
Đến thời điểm này vi điều khiển mới bắt đầu hoạt động bình thường.Thanh ghiđiều khiển và chỉ thị trạng thái nguồn cung cấp cho vi điều khiển là thanh ghiPCON
2.2.13: Ngắt
PIC 16F877A có đến 15 nguồn tạo ra hoạt động ngắt được điều khiển bởi thanhghi INTCON (bit GIE) Bên cạnh đó mỗi ngắt còn có một bit điều khiển và cờngắt riêng.Các cờ ngắt vẫn được set bình thường khi thỏa mãn điều kiện ngắt xảy
ra bất chấp trạng thái của bit GIE , tuy nhiên hoạt động ngắt vẫn phụ thuộc vào bitGIE và các bit điều khiển khác Bit điều khiển ngắt RB0/INT và TMR0 nằm trongthanh ghi INTCON , thanh ghi này còn chứa bit cho phép các ngắt ngoại vi PEIE.Bit điều khiển các ngắt nằm trong thanh ghi PIE1 và PIE2.Cờ ngắt của các ngắtnằm trong thanh ghi PIR1 và PIR2
Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trìnhngắt được kết thúc bằng lệnh RETFIE Khi chương trình ngắt được thực thi, bitGIE tự động được xóa, địa chỉ lệnh tiếp theo của chương trình chính được cất vàotrong bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h LệnhRETFIE được dùng để thoát khỏi chương trình và quay trở về chương trình chính ,đồng thời bit GIE cũng sẽ được set để cho phép các ngắt hoạt động trở lại.Các cờhiệu được dùng để kiểm tra ngắt nào đang xảy ra và phải được xóa bằng chươngtrình trước khi cho phép ngắt tiếp tục hoạt động trở lại để ta có thể phát hiện đượcthời điểm tiếp theo mà ngắt xảy ra
Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đổi trạng tháicác pin của Port B (Port B Interrup on change), việc xác định ngắt này xảy ra cần
3 hoặc 4 chu kỳ lệnh tùy thuộc vào thời điểm xảy ra ngắt
Cần chú ý là trong quá trình thực thi ngắt, chỉ có giá trị của bộ đếm chương trìnhđược cất vào trong Stack , trong khi một số thanh ghi quan trọng sẽ không đượccất và có thể bị thay đổi giá trị trong quá trình thực thi chương trình ngắt Điều nàynên được xử lí bằng chương trình để tránh hiện tượng trên xảy ra
Trang 18CHƯƠNG III
TRÌNH BIÊN DỊCH PCWH 3.227 SỬ DỤNG NGÔN NGỮ LẬP TRÌNH C (CCSC):
3.1:Giới thiệu chung: Dưới đây là khung cửa sổ chính của chương trình
CCSC
Trình biên dịch PCWH sử dụng ngôn ngữ lập trình C còn gọi là chương trìnhCCSC, gồm: PCB, PCM, và PCH Phiên bản hiện dùng là 3.227 có nhiều hàm vàchức năng mới cập nhật, lập trình cho các họ PIC 12 bit, 14 bit, 16 bit
Việc cài đặt chương trình tạm thời không đề cập ở đây, có thể tham khảo dùngdung tin trên các diễn đàn như diendandientu.com hay picvietnam.com Giả sử quátrình cài đặt chương trình mặc định đã hoàn tất và không bị giới hạn sử dụng
Để bắt đầu chương trình, nhấp trái chuột lên biểu tượng Pcw bên cạnh để kích
hoạt Cửa sổ chương trình xuất hiện như trên
Trang 19
Vào File – New để tạo một chương trình mới Khi soạn thảo chương trình, nhớ chọn đúng loại PIC đang dùng bằng cách chọn ô có “Microchip 14 bit” ở góc trên bên phải màn hình Chọn “Microchip 12 bit” để viết chương trình cho PIC 12 bit,
“Microchip 14 bit” để viết chương trình cho PIC 14 bit (như PIC16F877A chẳng hạn) và “Microchip 18 bit” để viết chương trình cho PIC 18 bit (như dsPIC chẳng
hạn)
Dung tin viết chương trình xong, nhấn F9 hay biểu tượng Compile như hình trên
để biên dịch Chương trình sẽ dùng báo các tình trạng cho ta biết, như có lỗi nàosai về cú pháp khi viết chương trình không, hay có cảnh báo nào không, vàchương trình chiếm không gian bộ nhớ như thế nào,
Trang 20CCSC dùng ngôn ngữ C trực quan nên có nhiều thuận lợi hơn ngôn ngữASSEMBLER (Hợp ngữ) Tuy nhiên trong một số trường hợp, CCSC có thể sinh
mã chạy sai (tham khảo cải tiến trên web của CCS), hoặc sinh mã không theo ýmuốn (dù
không sai, ví dụ như, sinh nhiều mã lệnh không quan trọng khi thực thi hàmngắt) làm chậm tốc độ thực thi chương trình, có thể ảnh hưởng nhiều đến việc xử
lý đòi hỏi tốc độ cao như điều biến xung PWM,
Nhưng trong CCSC vẫn cho phối hợp ASSEMBLY cùng với C, nên chươngtrình sẽ rất uyển chuyển, kết hợp được sức mạnh của cả hai ngôn ngữ, dù việc phốihợp này có thể làm cho việc viết chương trình trở nên khó khăn hơn
CCSC cung cấp các công cụ tiện ích giám sát hoạt động của chương trình như:
• C/ASM List : Cho phép xem mã ASM của file biên dịch (View – C/ASM List), giúp ích cho việc quản lý mã, biết được mã sinh ra và chạy như thế nào, là
công cụ rất quan trọng giúp gỡ rối chương trình và nắm bắt được hoạt động của
Trang 21Menu Tools của chương trình, tuy nhiên nên cẩn thận khi sử dụng, một số công cụ
đòi hỏi nhiều kiến thức hơn về nó
3.2 Cách Viết một chương trình trong CCSC:
Cấu trúc chương trình trong CCSC có các phần chính tương tự lập trình C như
• Khai báo các chỉ thị tiện xử lý
• Khai báo các biến, mảng
• Khai báo các hàm, các thủ tục tự tạo (chương trình con)
• Chương trình chính
Cấu trúc chương trình
#include <16F877A.h> #device *=16 ADC=10
#use delay(clock=4000000) // Thạch anh dao động tần số cao 4 MHz
Ví dụ: #include <16F877A.h>
#include <C:\ABC\file.h>
#include <C:\ABC\file.c>
#DEVICE chip option
� Khai báo thiết bị sử dụng chip Là tên vi điều khiển PIC được sử dụng, không
cần dùng tham số này nếu đã khai báo tên chip ở
#include option *=x *=5 – dùng poiter 5 bit (cho tất cả các loại PIC)
*=8 – dùng pointer 8 bit (cho PIC 14 bit, PIC 18 bit)
Trang 22*=16 – dùng pointer 16 bit (cho PIC 14 bit, PIC 18 bit)
ADC=x Chỉ ra sử dụng ADC x bit (8,16,32,… bit tuỳ chip)
Khi dùng hàm read_adc() , chương trình sẽ trả về giá trị theo x bit
ICD=true Dùng để tạo mã tương thích debug phần cứng Microchip Khai báo
pointer 8 bit
*=8 chỉ sử dụng được tối đa 256 byte RAM cho tất cả biến của chương trình, trong
khi có tới 368 byte RAM, nên sử dụng không hết RAM Khai báo pointer 16 bit
*=16 sẽ sử dụng được hết số RAM của vi điều khiển PIC (216 = 1024 > 368) Chỉ nên dùng duy nhất một khai báo #DEVICE cho cả pointer và ADC Ví dụ:
#include <16F877A.h> #device *=16 ADC=10
#USE DELAY(CLOCK=SPEED) // Khai báo tần số hoạt động để phục vụ cho
việc tính toán delay trong chương trình
Speed Là giá trị OSC (tần số dao động) mà vi điều khiển 26ung, đơn vị tính bằng
Hz
Ví dụ: #use delay(clock=4000000) // Tần số dao động cho PIC là 4 MHz Ta có: 1
chu kỳ lệnh = 4 chu kỳ xung clock = 4*(1/4000000) = 1 us (micô giây) Nếu dùng
#use delay(clock=20000000) (20 MHz) thì mỗi chu kỳ lệnh là 0.2us Chỉ khi có
chỉ thị này thì chương trình mới dùng được các hàm delay như: daley_cycles(),delay_us(),delay_ms()
#FUSES option // Khai báo các yếu tố đặc trưng bảo vệ của thiết bị PIC sử dụng như : loại bộ dao động, có bảo vệ mã hay không, có WDT không,… option HS :
Dao động thạch anh tần số cao
NOPROTECT : Không bảo vệ mã NOWDT : Không có giám sát thời gian … Chi tiết 26ung có thể tra cứu trong HELP > Preprocessor cmds
#BYTE id=x // Dùng để gán tên biến id cho địa chỉ thanh ghi x, sau đó có thể gán hay kiểm tra địa chỉ thanh ghi x chỉ cần dùng biến id, không tốn dung bộ nhớ.
Id Tên gợi nhớ chức năng thanh ghi ở địa chỉ đó
Giá trị id theo giá trị thanh ghi và thay đổi do theo hoạt động của chương trình.
Không nên dùng id cho thanh ghi đa mục đích, vì CCSC có thể 26ung các thanhghi này bất kỳ lúc nào cho chương trình, nếu muốn dùng riêng phải khai báo
#locate
Ví dụ: #byte port_b=0x06 Tên biến tự đặt, có thể đặt là cong_b, port_b hay bất
kỳ tên gợi nhớ nào Khi đặt các tên biến trùng nhau cho việc định nghĩa thì khibiên dịch chương trình, CCSC sẽ cảnh báo 0x06 là địa chỉ thanh ghi Port B củaPIC16F877A Nếu muốn gán giá trị nào đó, ví dụ 120 cho Port B, chỉ cần dung:
port_b=120;
Trang 23#BIT id=x.y Tạo 1 biến đặt ở vị trí y của byte
x id : Tên biến
x : Biến số có độ dài *8 bit (8, 16, 32 bit tùy chip) hay hằng số địa chỉ của thanh ghi Y : Vị trí bit y trong thanh ghi x Khai báo này tiện lợi cho việc kiểm tra hay gán giá trị cho bit của thanh ghi Không tốn bộ nhớ, do id chỉ là địa chỉ danh định đại diện cho bit chỉ định ở biến x, thay đổi giá trị id (0 hay 1) sẽ thay đổi giá trị bit
y, tương ứng thay đổi giá trị x
Ví dụ 1: #bit co_timer0=0xb.2 Bit cờ ngắt timer 0 ở địa chỉ bit 2 của 0xb
(16F877A)
Nếu gán co_timer0=0; thì sẽ xóa cờ ngắt timer 0
Ví dụ 2:
int8 a=20; // a=00010100b
#bit b=a.4 // địa chỉ bit 4 của a Nếu gán b=0; thì bit 4 của a=0 // a= 00000100b= 4 Lưu ý không được dùng hàm if(0xa.4) … trực tiếp, mà phải gán qua biến như trên mới dùng được, như là if(b) …
Ví dụ 3: #byte cong_b=0x06; // địa chỉ Port B
#bit b0=cong_b.1 // b0 – bit 0 c ủa Port B
#bit b1=cong_b.1 // b1 – bit 1 c ủa Port B
#LOCATE id=x // Làm việc như
#byte nhưng có dùng chức năng bảo vệ không cho CCSC sử dụng địa chỉ đó vàomục đích khác
Ví dụ 1:
#locate t=0x020 // địa chỉ thanh ghi đa mục đích Hay int8 t;
#locate t=0x020 Sử dụng #locate để gán biến cho 1 dãy địa chỉ kề nhau (cặp thanh
ghi) sẽ tiện lợi hơn thay vì dùng 2 byte với #byte
Ví dụ 2: Thanh ghi CCP1 có giá trị là một cặp thanh ghi 0x15 (byte thấp) v à 0x16
(byte cao)
Để gán giá trị cho CCP1 : int16 ccp1; #locate ccp1=0x15
Khi gán giá trị cho ccp1, chương trình sẽ tự động gán vào cả 2 thanh ghi
Ví dụ: ccp1=1133; // ccp1 = 0000 0100 0110 1101 b Thanh ghi 0x15 sẽ có giá trị
byte thấp là 0110 1101 Thanh ghi 0x16 sẽ có giá trị byte cao là 0000 0100
#DEFINE id text // Dùng định nghĩa giá trị cho biến id là một chuỗi hay số text :
Trang 24#DEFINE id(x,y )
text � Dùng định nghĩa giá trị cho biến
id là một chuỗi hay số, kết hợp gán biến nội
Ví dụ: int a=1; // a = 0000 0001 b
#define b(x) (x<<2) // b(x) = x<<2 – Dịch sang trái 2 bit a= b(a); // Tương tự như lệnh a=a<<2; lúc đó a=4 = 0000 0100 b
#ASM và #ENDASM // Cho phép đặt một đoạn mã ASM ở giữa 2 chỉ thị này,
riêng chỉ thị này chỉ đặt trong 1 cấu trúc của hàm hay chương trình con, không đặtchung ở khu vực khai báo chỉ thị tiền xử lý CCSC định nghĩa sẵn 1 biến 8 bit_RETURN_ để gán giá trị trả về cho hàm từ đoạn mã ASSEMBLY
Ví dụ: int ctr_a(int n) { int c;
HELP > Preprocessor cmds của chương trình.
Tương tự cũng có thể tra cứu dùng nhiều dung tin bổ ích khác trong HELP này
Cụ thể xem hình dưới đây và chọn các dung tin hướng dẫn phù hợp
• Khai báo các biến, mảng Cách khai báo các biến và mảng tương tự lập trình
ngôn ngữ C đã học
Cấu trúc chung là: <kiểu dữ liệu> <biến/mảng>
Ví dụ: Khai báo biến số: signed int8 a; // số a là 8 bit dấu (bit 7 là bit dấu) có giá
trị từ –128 đến +127
int8 b; // số b là 8 bit không dấu, có giá trị từ 0 đến +255
Trang 25int16 a,b,c; Khai báo hằng số: (phải có tham số CONST nằm giữa kiểu dữ liệu
và tên hằng)
int8 const a=23; // a là một hằng số có giá trị là 23 Khai báo mảng :
int16 a[125]; Phải có tham số CONST giữa kiểu dữ liệu và tên mảng nếu là mảng
hằng số
int8 const a[5]={1,2,3,4,5}; // a có 5 phần tử, chỉ số mảng bắt đầu từ a[0]=1 Một
mảng hằng số có kích thước tối đa tùy thuộc loại chip vi điều khiển Đối với PIC
14 bit (16F877A) thì chỉ được khai báo 1 mảng hằng số có kích thước tối đa là 256byte Các khai báo mảng vượt quá có số phần tử vượt quá giới hạn đều không hợp
lệ, khi đó chương trình sẽ dung báo lỗi
Ví dụ: int8 const a[256]={ }; // hợp lệ : 256 (phần tử) x 1 (byte) = 256 (byte) int16 const b[128]={ }; // hợp lệ : 128 (phần tử) x 2 (byte) = 256 (byte)
int16 const c[256]={ }; // không hợp lệ : 256 x 2 = 512 (byte) > 256 byte Nếu
đánh không đủ số phần tử vào trong ngoặc kép như đã khai báo, các phần tử cònlại sẽ mặc định có giá trị là 0
Truy xuất giá trị vượt quá chỉ số mảng khai báo sẽ làm chương trình chạy vô tận.Khai báo 1 biến mảng với kích thước tùy thuộc khai báo con trỏ (pointer) trong
#device và loại vi điều khiển
Đối với PIC 14 bit (16F877A), nếu khai báo pointer 8 bit (#device *=8) thìkhông gian bộ nhớ chỉ có 256 byte cho tất cả các biến chương trình bất chấp PICđang dung có hơn 256 byte RAM; và biến mảng có kích thước tối đa tùy thuộc độphân mảnh bộ nhớ, với PIC16F877A có 368 byte RAM, thường thì kích thướckhông quá 60 byte, có khi dưới 40 byte, nếu khai báo lớn hơn sẽ gặp lỗi không đủ
bộ nhớ (Not enough RAM for all variable) trong khi thực sự PIC còn rất nhiềuRAM Nếu khai báo 16F877A với pointer 16 bit (#device *=16), không gian bộnhớ sẽ là đầy đủ (trừ đi ít RAM do CCSC chiếm làm biến tạm),dung đầy đủ bộnhớ 368 byte RAM, nhưng kích thước mảng cũng không quá 60 byte
Ví dụ: int16 a[125]; // biến mảng a 126 phần tử (0–125), kích thước 252 byte
16, 32 bit bất kỳ bit – vị trí bit được xóa về 0 (clear) hay đặt lên 1 (set) Bit 0 – 7
(đối với biến 8 bit) bit 0 – 15 (đối với biến 16 bit) bit 0 – 31 (đối với biến 32 bit)Hàm không trả về trị
Ví dụ: int x; x=11; // x=1011b
bit_clear(x.1);// giá trị x thay đổi thành x=1001b sau khi xóa bit 1 của biến x bit_test(var,bit)
Trang 26Dùng kiểm tra vị trí bit trong biến var Hàm trả về giá trị 0/1 là giá trị bit đó trong biến var
Ví dụ: Giả sử có biến x 12 bit đếm từ 0 lên và muốn kiểm tra xem có lớn hơn
4096 (212) không, thì hàm
if(x>=4096) … mất khoảng 5 us
Trong 1 vòng l ặp, việc kiểm tra thường xuyên như vậy sẽ làm mất thời gian đáng
kể Để tối ưu, chỉ cần dùng if(bit_test(x,12)) … chỉ mất khoảng 0.4 us đối với thạch anh dao động 20 MHz Kiểm tra đếm lên tới những giá trị đặc biệt (như 2i),
dung hàm này rất tiện lợi
• Các toán tử thường dung: +, -, *, /, ++, , +=, -=, *=, /=, ==, &, &=, |, |=, !=,
>, <, >=, <=, >>, <<, <<= >>= dịch phải, dịch trái, Ví dụ: int x=1; // x =
0000 0001 b int y=4; x<<1; // lúc này x = 0000 0010b x<<=y; // x=x<<y; tức là x<<4, lúc này x = 0010 0000 b
Các kiểu dữ liệu, khai báo biến, hằng, mảng, các hàm xử lý bit khác và các toán tử, … có thể tra cứu trong HELP của chương trình: HELP > Operators, Data types, …
• Các hàm xử lý xuất nhập I/O output_low() output_high() output_X() output_bit() input_X() input() … output_low(pin) output_high(pin) Dùng thiết lập mức 0 (low, 0V), mức 1 (high, 5V) cho chân IC Pin : chỉ vị trí chân của Port Hàm này sẽ đặt pin làm ngõ ra một cách tự động, thực ra là nhiều thao tác gộp lại
(xem cụ thể trong mã ASM) Hàm này dài từ 2 đến 4 chu kỳ máy Nếu dung để
xuất xung, có thể khai báo tiền xử lý #use fast_io (sử dụng truy xuất nhanh I/O), sau đó phải tự set_tris_X(value) để định hướng xuất nhập, rồi mới dung hàm
output như trên
output_bit(pin,value) Hàm này cũng xuất giá trị 0/1 cũng như 2 hàm trên.
Pin : tên chân
value : giá trị 0/1 Thường dung nó khi giá trị tuỳ thuộc giá trị biến 1 bit nào đó,
hay muốn xuất đảo của giá trị ngõ ra trước đó
Ví dụ: int1 x; // mặc định x=0
main()
{
while(true)
Trang 27Hàm này xuất 1 giá trị 8 bit ra Port Tất cả chân của Port đó đều là ngõ ra
X : tên port có trên chip
Value : là giá trị 1 byte
Ví dụ: output_b(212); // xuất giá trị 11010100 ra Port B
input_X() Hàm này trả về giá trị 8 bit là giá trị đang hiện hữu của Port đó X : tên
port có trên chip
Value : là giá trị 1 byte
X : tên Port ({A,B,C,D,E})
value : là giá trị toàn Port, được ghi theo mã hexa 0x , mã nhị phân (ví dụ 00000101), hoặc thập phân (như 255 – tức là 0xff)
Nếu chỉ ghi 1 giá trị duy nhất như 1 hay 0, tất cả các chân trên Port đó đều có cùnggiá trị là 1 hay 0 Với
bit 1 – input,
bit 0 – output
Chỉ dung khi khai báo truy cập nhanh I/O ở tiền xử lý (#use fast_io), vì lúc đó
CCSC không tự động thiết lập hoạt động định hướng Port, mà để mặc định
Ví dụ: set_tris_B(0xf0); // RB7-RB4 của Port B là ngõ vào, RB3-RB0 là ngõ ra Set_tris_B(240); // RB7-RB4 của Port B là ngõ vào, RB3-RB0 là ngõ ra
Set_tris_B(1); // Tất cả các chân của Port B đều là ngõ vào (input) Các hàm tác động bit, Port khác có thể tham khảo thêm trong HELP của chương trình
• Các hàm DELAY Đề sử dụng các hàm delay, cần khai báo tiền xử lý ở đầu
chương trình
Ví dụ: #use delay(clock=4000000) // tần số dao động cho PIC là 4MHz Hàm
delay không sử dụng bất kỳ timer nào Chúng thực ra là một nhóm lệnh ASM đểkhi thực thi từ đầu tới cuối thì xong khoảng thời gian được quy định delay Tùythời gian delay yêu cầu dài ngắn mà CCSC sinh mã phù hợp, có khi là vài lệnhNOP cho thời gian rất nhỏ, hay 1 vòng lặp NOP, hoặc gọi tới 1 hàm phức tạp trongtrường hợp delay dài Các lệnh đó không ảnh hưởng tới chương trình về mặt dữliệu và giá trị các biến, chỉ là duy trì một trạng thái đủ lâu để đáp ứng thời gian
Trang 28delay được yêu cầu Nếu trong thời gian delay lại xảy ra ngắt thì thời gian thực thingắt không tính vào thời gian delay, xong ngắt nó quay về chạy tiêp các dòng mãcho tới khi xong hàm delay Do đó thời gian delay sẽ không đúng nếu có ngắt xảy
ra trong lúc delay
Có 3 hàm phục vụ do CCSC thiết lập delay_cycles(count) count – hằng số có
giá trị 0 – 255, là số chu kỳ lệnh , Hàm dùng delay 1số chu kỳ lệnh cho trước.Hàm không trả về trị
Delay_us(time) time – là biến số thì có giá trị 0 – 255, là hằng số thì có giá trị 0 –
65535 Hàm cho phép delay theo đơn vị us Hàm không trả về trị
Delay_ms(time) time – là biến số thì có giá trị 0 – 255, là hằng số thì có giá trị 0 –
65535
Hàm cho phép delay theo đơn vị ms (mili giây) Hàm không trả về trị
Ví dụ: int a=215; delay_us(a); // delay 215 us
delay_us(4356); // delay 4356 us = 4.356 ms
delay_ms(2500); // delay 2500 ms = 2.5 s (gi ây)
• Xử lý ADC – biến đổi Analog – Digital PIC có nhiều chân phục vụ xử lý ADC
với nhiều cách khác nhau Đểdung ADC, phải khai báo tiền xử lý #device và chobiết dung ADC bao nhiêu bit (tuỳ chip) Cần lưu ý là 1 vi điều khiển hỗ trợ ADC
10 bit thì giá trị gán vào luôn là 10 bit, nhưng chia cho 4 còn 8 bit Do đó 1 biếntrở cấp cho ngõ vào ADC 10 bit sẽ rất nhạy hơn so với ADC 8 bit (vì 2 bit cuối cóthay đổi cũng không ảnh hưởng giá trị 8 bit cao thấp và do đó kết quả 8 bit ADC ítthay đổi) Nếu chương trình có chế độ kiểm tra tính toán hay dung ngắt ADC thì
nó sẽ chạy hoài luôn Dùng ADC 8 bit sẽ hạn chế điều này Do đó CCSC cung cấpchọn lựa ADC 8 bit hay 10 bit tuỳ mục đích sử dụng
Cấu hình bộ ADC Thông dụng nhất khi dung ADC là sử dụng 1 biến trở,
điều chỉnh bởi 1 nút vặn, qua đó tuh được 1 điện áp nhỏ hơn điện áp tham chiếu(Vref – áp tối đa) đưa vào chân bộ biến đổi ADC, kết quả cho 1 giá trị số ADC 8bit (0 – 255) hay 10 bit (0 – 1023) Thường thì Vref lấy bằng Vdd (5V)
Các hàm phục vụ ADC #DEVICE ADC=x // x – 8 hay 10 bit – khai báo chỉ thị tiền xử lý setup_adc(mode)
Dùng để xác định cách thức hoạt động của bộ biến đổi ADC Hàm không trả về trị
Tham số mode tuỳ thuộc tập tin tiêu đề *.h có tên tương ứng chip vi điều khiển sử
dụng quy định, nằm trong thư mục #Devices của CCSC được khai báo ở #include
Để biết có bao nhiêu tham số có thể đọc trong file 16F877A.h, tìm tới chỗ các
định nghĩa cho chức năng ADC dung cho chip đó tương ứng với hàm này Vào
HELP > Index, tìm mục setup_adc(mode) để tham khảo 32ung Mode
ADC_OFF Tắt hoạt động ADC (tiết kiệm điện, dành chân cho hoạt động khác) ADC_CLOCK_INTERNAL Thời gian lấy mẫu bằng xung clock của PIC (mất 2
– 6 us) thường chung cho các chip
Trang 29ADC_CLOCK_DIV_Thời gian lấy mẫu bằng ½ xung clock (mất 0.4 us trên
số tham số có 2 tên khác nhau (nhưng cùng chức năng do định nghĩa cùng địa chỉ)
Sau đây là các giá trị cho value, chỉ dung 1 trong các giá trị: ALL_ANALOG
Dùng tất cả các chân sau làm Analog: A0,A1,A2,A3,A5,E0,E1,E2 (Vref = Vdd)
NO_ANALOGS Không dung chân Analog, các chân đó sẽ là chân I/O
AN0_AN1_AN3 hay RA0_RA1_RA3 Chỉ A0,A1,A3 là Analog, và điện thế so sánh là điện thế nguồn Vref = VddAN0_AN1_VSS_VREF hay RA0_RA1_VSS_VREF A0, A1 là Analog, và A3 là điện thế so sánh Vref = A3 ANALOG_AN3_REF hay ANALOG_RA3_REF Tất cả các chân Analog, và A3
là điện thế so sánh Vref = A3 AN0 Chỉ có AN0 là Analog và điện thế so sánh là điện thế nguồn Vref = Vdd
Tham khảo dung HELP > Index của chương trình, mục setup_adc_ports Set_adc_channel(channel)
Chọn chân đọc vào giá trị Analog bằng lệnh read_adc( )
Giá trị channel tuỳ thuộc số chân chức năng ADC mỗi chip 16F77A có channel
có giá trị từ 0 – 7 tương ứng các chân {RA0,RA1,RA2,RA3,RA5,RE0,RE1,RE2}Hàm không trả về trị Nên delay 10 us sau hàm này rồi mới dùng hàm read_adc( )
để đảm bảo kết quả đúng
Hàm chỉ hoạt động với tín hiệu biến đổi A/D phần cứng trên chip
Read_adc(mode)
Dùng đọc giá trị ADC từ thanh ghi hay cặp thanh ghi chứa kết quả biến đổi
ADC Hàm này sẽ hỏi vòng cờ cho đến khi cờ này báo đã hoàn thành biến đổi
ADC (sẽ mất vài us) Nếu giá trị ADC là 8 bit như khai báo trong tiền chỉ thị
#DEVICE , giá trị trả về của hàm là 8 bit, ngược lại là 16 bit nếu khai báo #device ADC=10 (sử dụng ADC 10 bit trở lên) Khi dung hàm này, nó sẽ lấy ADC từ chânđược chọn trong hàm set_ADC_channe () trước đó
Trang 30Nghĩa l à mỗi lần đ ọc chỉ 1 kênh (PIC16F877A chỉ có 1 bộ ADC), muốn đổi sangđọc chân nào thì dùng hàm
set_ADC_channel() lấy chân đó Nếu không có đổi chân, dung hàm read_adc()bao nhiêu l ần cũng được
Các mode có thể có hoặc không:
ADC_START_AND_READ : giá trị mặc định
ADC_START_ONLY : bắt đầu chuyển đổi và trả về trị
ADC_READ_ONLY : đọc kết quả chuyển đổi lần cuối
Các phương thức nâng cao khác như: Truyền dung với PC qua cổng RS232 – Xử
lý chuỗi, Giao tiếp SPI, I2C và Parallel, Mô-đun CCP, … có thể tham khảo từHELP hoặc hỏi người có kinh nghiệm, vì gồm nhiều phần phức tạp hơn, mà tronggiới hạn trình bày cho phép nên xin tạm gác ở đây
Trang 313.3 :Chương trình nạp Vi điều khiển PIC qua cổng LPT WinPic800 3.56:
Giới thiệu chung:
Chương nạp vi điều khiển PIC qua cổng LPT WinPIC800 phiên bản hiện dung là
Để nạp được vào PIC, dĩ nhiên cần đến một mạch nạp Chương trình chỉ làm cácnhiệm vụ dung quan đến việc nạp, xóa chương trình của PIC, dung qua mạchnạp Có thể tìm mạch nạp trên thị trường hoặc dung hệ các diễn đàn chuyên ngành
để tìm nó Việc cài đặt chương trình tạm thời không đề cập ở đây Để bắt đầu
chương trình, nhấp trái chuột lên biểu tượng WinPIC800
bên cạnh để kích hoạt Cửa sổ chương trình xuất hiện như trên.
Vào File – Open để mở chương trình mới Trước tiên phải cài đặt nhận dạng phần
cứng cho chương trình như sau,
Trang 32vào Menu Settings > Hardware để thiết lập.
Cửa sổ thiết lập phần cứng xuất hiện
Nếu không thấy các dung số để thiết lập thì nhấn vào vị trí số 1 đã chỉ Nhấn vào
vị trí số 2 đã chỉ để thay đổi các dung số Các dung số phải được cài đặt chính xác,
vì tác động đến PIC dung qua các tín hiệu điện nên có thể làm hỏng PIC trong một
số trường hợp như: khai Use Vpp2 mà PIC không hỗ trợ, PIC sẽ bị sốc điện.Trường hợp nhẹ thì chỉ không dung lạc được với PIC như khai báo sai cổng giaotiếp LPT hay COM hay USB, ở đây chương trình giao tiếp qua cổng LPT
Trang 33Thiết lập chính xác như hình trên, sau đó nhấn Apply edits xác nhận những thay
đổi Bật nguồn cho mạch nạp, kết nối mạch nạp (đã gắn cố định chip vi điều khiểnPIC) với máy tính qua cổng LPT
• Kiểm tra kết nối (Detect PIC)
Nhấn vào Icon Dò tìm PIC như trên màn hình hướng dẫn Nếu kết nối tốt, màn
hình sẽ xuất hiện như sau là kết nối thành công vi điều khiển được dung làPIC16F877A
Trang 34Khi nhấn Detect PIC, rất tiện lợi, WinPIC800 sẽ tự động chọn Loại PIC sử dụng
mà nó dò tìm được mà không cần phải chọn trước Kết nối thành công, đã sẵndung nạp chương trình (tập tin *.hex) cho PIC được rồi Để nạp chương trình,nhấn vào
Nạp code hex cho PIC (Program All) như hình trên Quá trình nạp được thể hiện
như sau:
dung WinPIC800 nạp xong 100%, nó sẽ tự động xác nhận lại (Verify) Nếu
OK thì chương trình đã được nạp tốt vào PIC Đến đây đã có thể quan sát được tácđộng của PIC lên các thiết bị thực tế dung qua các mạch giao tiếp port của PIC vớithiết bị đó Nếu chương trình nạp không có vấn đề về lỗi thiết kế (phù hợp PIC sửdụng), nhưng khi nap có vấn đề, có thể do nhiều yếu tố như: do nhiễu, kết nốikhông chắc chắn, nguồn điện chưa bật cho mạch nạp, PIC không được cố định tốttrên mạch nạp, xung đột do khai báo sai cổng giao tiếp, Kiểm tra lại các dungtin trên để điều chỉnh ngay, sau khi điều chỉnh, nhớ cập nhật lại tập tin chươngtrình cần nạp (vì đôi khi WinPIC800 tự động trả về mặc định là chưa có chươngtrình để nạp,
ví dụ như khi Detect PIC nhưng không dò được PIC) Đối với nhiễu (thường gặp),
hoặc do kết nối không chắc chắn, cách khắc phục là rút cáp kết nối ra, sau đó gắnlại, tốt hơn hết là rút cả cáp kết nối và cáp nguồn ra, rồi gắn lại, cập nhật lạichương trình, nạp lại chương trình cho PIC Đôi khi phải làm vài lần như vậy Các
Trang 35phương pháp chống nhiễu cho mạch điện hay hạn chế ảnh hưởng của nhiễu, có thểtham khảo dung trong các sách về các vấn để nhiễu điện, hoặc hỏi người có kinhnghiệm Đến đây đã có thể viết chương trình cơ bản cho vi điều khiểnPIC16F877A, biên dịch bằng CCSC và nạp bằng WinPIC800 cho PIC16F877Arồi Việc tiếp theo là cố gắng tìm hiểu nghiên cứu các ứng dụng điều khiển đa dạngtrong thực tế để thi hành, vừa giúp nắm vững hơn về PIC, vừa thể hiện được sứcmạnh và tính linh hoạt trong những ứng dụng đa dạng của vi điều khiểnPIC16F877A Mà cụ thể trong đề tài này sẽ nghiên cứu điều khiển các mô-đunLCD, nhất là LCd đồ họa để hiển thị dung tin một cách sinh động đa dạng, trựcquan, đáp ứng nhiều nhu cầu trong việc hiển thị của các hệ thống từ công nghiệpcho đến dân dụng
Trang 36CHƯƠNG IV
MÔ-ĐUN MÀN HÌNH TINH THỂ LỎNG LCD
(LIQUID CRYSTAL DISPLAY)
4.1Giới thiệu chung:
Màn hình LCD có rất đa dạng và được ứng dụng trong nhiều lĩnh vực khác nhau từ
công nghiệp cho đến dân dụng
Các LCD cấp thấp đơn sắc (có màu xám, xanh lá vàng, xanh dương, ), trung vàcao cấp thì có các loại màn hình LCD theo các chuẩn VGA, với độ phân giải điểmảnh cũng như độ phân giải màu cao, ngoài ra còn có nhiều loại LCD được ứngdụng làm các màn hình cảm ứng rất hay
Các loại LCD đơn sắc có thể tìm hiểu để úng dụng nghiên cứu dưới đây đượcthiết kế dưới dạng các mô-đun Các mô-đun gồm phần màn hình LCD, chip điềukhiển quy định các tập lệnh tác động lên LCD (mã lệnh dưới dạng các tín hiệu bit quacác chân điều khiển và chân dữ liệu của LCD), quy định quá trình khởi động LCDhoặc thiết lậpdung kết các vùng màn hình LCD khác nhau, Việc còn lại vẫn đòi hỏicần có một mạch điều khiển ngoài dung vi xử lý để lập trình hiển thị và giao tiếp củaLCD với các phần cứng khác (như đọc tín hiệu từ bàn phím, ma trận phím, ADC, tínhtoán, rồi hiển thị lên LCD, hoặc giao tiếp máy tính hiển thị lên LCD,
• LCD 7 đoạn, LCD nền xám dung, được thiết kế từng khu vực riêng, thườngđược dùng trong các máy tính (Calculator), các đồng hồ đeo tay, treo tường, Chúng hiển thị theo các khu vực segment đã được thiết lập trước, hoặc hiển thị nhưLED 7 đoạn với 7 segment mỗi khu vực Thường không có mô-đun
• LCD hiển thị ký tự theo dòng hay đồ họa ký tự, chúng hiển thị bằng cách chiamàn hình ra làm nhiều ô, thể hiện được các ký tự chỉ đọc (ROM character – lưu trongDDRAM) hoặc các biểu tượng (thiết kế trong CGRAM) trên mỗi ô; độ phân giải củatừng ô tùy kích thước do nhà thiết kế quy định Riêng LCD đồ họa ký tự thì có khácđôi chút, như kích thước màn hình lớn hơn, các ô liền nhau như là ma trận điểm toànmàn hình, các ký tự thường có 2 bảng mã ASCII và 1 bảng mã chữ riêng (có kíchthước ô lớn hơn, như tiếng Hoa, tiếng Nhật, ); ngoài dung được mở rộng để hiển thị
đồ họa (chế độ mở rộng – thiết kế hiển thị qua GDRAM)
• LCD đồ họa điểm ảnh (ma trận điểm toàn màn hình) thì hoàn toàn không cóbảng mã nào trong bộ nhớ, cũng không có tập lệnh cụ thể để thao tác cho các mụcđích truy cập mà hình LCD, nhưng có quy định các mã cơ bản để thiết lập các trạngthái tín hiệu cho các điểm ảnh, và có quy định quá trình khởi động cho LCD – đây làđiều quan trọng đầu tiên khi điều khiển LCD Từ những điều đó, mà lập ra các tổ hợplệnh hay chương trình để kích hoạt các điểm ảnh tương ứng nhằm hiển thị đúng như
Trang 37mong muốn của chương trình Ngoài ra mỗi mô-đun LCD còn có các chân để chỉnh
tín hiệu độ dung màn hình (CONTRAST), đôi khi có dung đèn nền (Back Light)tùy
theo sự thiết lập của nhà thiết kế
Hình 4.1 Một số loại LCD tiêu biểu.
4.2 Mô-đun LCD hiển thị ký tự theo dòng LMB162ABC
của mỗi đoạn trong thanh địa chỉ bộ nhớ DDRAM [(*) – do tự hiểu] 1/5 (bias) độ
thiên lệch – xử lý từng hàng một trên tổng số 4 hàng tối đa cho phép trong chip quyđịnh (+1 hàng là để quay về vị trị đầu sau khi cuộn dọc) (trên thị trường có loại tối đa
là 4 hàng – số cột tùy loại chip có thể là 16, 20, 40) [(*) – do tự hiểu] * Kích thước:
80.0 x 36.0 x 15.8 MAX; chế độ 16 ô cột x 2 hàng
Trang 38B) Sơ đồ khối :
Bảng 4.3 Chức năng của các chân LCD LMB162ABC
Trang 39Điện áp tín hiệu ngõ vào: Vin: 0V ~ Vdd (V) [V ss =0V]
Nhiệt độ khi hoạt động: Thđ: -20 →70OC Nhiệt độ khi lưu trữ : Tlt: -30→ 80OC
C) Đặc trưng về điện
Điện thế hoạt động: V dd = 5V [Min=4.7V ~ Max=5.3V]
Điện thế ngõ vào mức cao: V IH =2.2V→+V cc :RS, R/W, E, DB0-DB7
Điện thế ngõ vào mức thấp: V IL =V ss ~ 0.5V :RS,R/W, E, DB0-DB7 Điện thế ngõ ra mức cao: V OH =0.7V dd ~ V dd :RS,R/W, E, DB0-DB7
Điện thế ngõ ra mức thấp: V OL =V ss ~0.5V :RS, R/W, E, DB0-DB7 Dòng hoạt động: I dd = 1.3Ma [Max=3Ma]
Điện áp duy trì đèn nền 4.9V, dòng duy trì đèn nền tối đa 150 mA
Các dung số khác có thể tham khảo dung ở datasheet LMB162ABC
Chỉnh độ tương phản của LCD bằng cách dung một biến trở VR 5K hay 10K cũngđược, nối lên nguồn dương +5V, và chỉnh cho đến khi có độ dung vừa phải
1b) Tập Lệnh
Để điều khiển mô-đun LCD một cách chính xác và hiển thị bình thường, hãy dùngnhững thiết lập cơ bản sau: (Xem trong Bảng mô tả bên dưới)
N=1, chế độ hiển thị được cả 2 dòng
F=0, Font chữ 5x8 chấm điểm ở mỗi ô cột
D=1, bật hiển thị Những thiết lập này sẽ tác động đến mô-đun LCD khikhởi động
Khi cấp nguồn Vdd và Vss , mô-đun LCD sẽ tự động chạy reset trong50ms Dùng lệnh reset, mô-đun LCD sẽ có trạng thái sau:
N=0, chế độ hiển thị chỉ 1 dòng
DL=1, chế độ giao tiếp 8 bit
F=0, Font chữ 5x8 chấm điểm ở mỗi ô cột
Trang 40Reset có thể không tạo thiết lập cơ bản
N=1, F=0, D=1
Trong mô-đun này có 2 khu vực nhớ chính để hiển thị là:
• CGRAM – Bộ nhớ RAM để thiết kế ký tự (Character Generator RAM) o Kiểu ký
tự 5x8 chấm (ngang 5, cao 8) Được truy xuất qua DB4 – DB0, còn DB7 – DB5 không
dung O Mã ký tự do người dung định nghĩa Có 8 địa chỉ 00h – 07h, để định nghĩa
các mã ký tự, tức có thể tạo được 8 ký tự (font 5x8 chấm điểm)
• DDRAM – Bộ nhớ hiển thị dữ liệu (Display Data RAM) o Kiểu ký tự 5x8 chấm
(ngang 5, cao 8) Các ký tự ROM (bộ nhớ chỉ đọc) (mã 10h – FFh) được viết vàoDDRAM để hiển thị, các ký tự do người dung định nghĩa trong CGRAM 00h – 07hcũng được sử dụng Tương ứng, việc gọi mã ký tự 08h – 0Fh cũng sẽ gọi ra các ký tự
do người dung định nghĩa Tức là bộ nhớ DDRAM sẽ quản lý tất cả nội dung dữ liệu
để hiển thị, dù đó là ký tự có sẵn trong ROM hay do người dung thiết kế trongCGRAM
Hình 4.4 Bản đồ địa chỉ CRRAM