TÀI LIỆU HƯỚNG DẪN SỬ DỤNG PHẦN MỀM KEIL_C51 TRONG LẬP TRÌNH VI ĐIỀU KHIỂN - Các bước cài đặt và thiết lập cho phần mềm - Hướng dẫn lập trình và mô phỏng một số chương trình Điều xung,
Trang 1TÀI LIỆU HƯỚNG DẪN SỬ DỤNG PHẦN MỀM
KEIL_C51 TRONG LẬP TRÌNH VI ĐIỀU KHIỂN
- Các bước cài đặt và thiết lập cho phần mềm
- Hướng dẫn lập trình và mô phỏng một số chương trình (Điều xung, Watchdog Timer, Sử dụng các Macro)
- Hướng dẫn lập trình truyền thông nối tiếp (UART, SPI)
- Hướng dẫn lập trình giao tiếp ngoại vi (VĐK - máy tính)
- Cách thiết lập các chế độ Timer, Counter
- Giới thiệu một số lệnh căn bản
Trang 2LỜI NÓI ĐẦU
Hiện nay Vi Điều Khiển đã rất phổ biến ở nước ta từ những sản phẩm đơn
giản như máy nấu nước,nấu cơm tự động… đến những sản phẩm đắt tiền như máy giặt, máy điều hòa… Nói chung hầu như tất cả những sản phẩm nào có chức năng giao tiếp với người dùng đều cần một bộ vi điều khiển Nhưng chỉ khác một điều là nó được nhà sản xuất lập trình một lần và tung ra hàng loạt và hầu như chúng ta không có khả năng thay đổi chương trình cho chúng
Tuy nhiên khi đã nắm bắt được khả năng lập trình cho VĐK ta có thể làm rất nhiều việc chẳng hạn làm ra những sản phẩm có khả năng giao tiếp người dùng như đồng hồ hiển thị bằng LCD có chức năng nhập thời điểm báo chuông, bảng quang báo bằng Led ma trận, các dây chuyền tự động…….và gần gũi thiết thực nhất là lập trình cho ROBO (đó là một số sản phẩm mà chúng tôi câu lạc bộ E_CLUP đã thực hiện thành công)
Để lập trình VĐK thì điều đầu tiên là cần một phần mềm lập trình do đó
trong bài viết này tôi sẽ giới thiệu với các bạn phần mềm Keil_C51 Đây là phần mềm lập trình cho phép bạn sử dụng cả 2 ngôn ngữ Asm và ngôn ngữ C Kết
hợp với phần giới thiệu tôi sẽ trình bày một số bài lập trình cơ bản đã được viết hoàn chỉnh và hệ thống Khi viết bằng ngôn ngữ ASM các bạn sẽ dễ dàng nắm bắt được cấu trúc bên trong VĐK cách thực thi từng lệnh nên thích hợp với người mới học, sau khi đã có kinh nghiệm lập trình bạn sẽ dễ dàng chuyển qua ngôn ngữ C Để tiện cho người mới học theo dõi tôi đã trình bày dưới dạng ngôn ngữ ASM và tôi đang hoàn thiện bài hướng dẫn khác bằng ngôn ngữ C
Vì bản thân tôi cũng mới bắt đầu làm quen với VĐK vài năm và các bài lập trình chủ yếu được viết trên kinh nghiệm thực tế của tôi nên có thể còn nhiều sai sót mong được sự góp ý của các bạn để bài viết có thể hoàn thiện hơn Chúc các bạn thành công!!!
Biên Hòa 15/03/2008
Lê Tiến Lộc
Trang 3I CÀI ĐẶT PHẦN MỀM KEIL C51:
- Nếu bạn là người yêu thích công việc lập trình Vi Điều Khiển và bạn đang sử dụng những phần
mềm như Pinacal, Crimson…… và bạn gặp những rắc rối như đối với Pinacal thì bạn không thể lập
trình quá 2KB nếu bạn không đăng ký mua bản quyền, Crimson hơi khó xài với những người mới học lập trình và không hỗ trợ những tính năng mô phỏng Ở đây tôi sẽ giới thiệu với bạn một phần mềm
với đầy đủ tính năng và có vẻ dễ dàng sử dụng hơn Với Phần mềm Keil uVision3 bạn có thể xem mô
phỏng dạng tín hiệu ra ở từng chân của Vi Điều Khiển với một màn hình tương tự Oscilloscope Dễ dàng và thuận tiện cho việc lập trình hơn với những thư viện khai báo có sẵn trong chương trình
Bạn có thể tải File Setup trên mạng hoặc liên hệ với chúng tôi để được cung cấp miễn phí Sau khi có file Setup bạn nhấp double vào biểu tượng cài đặt như sau để bắt đầu quá trình cài đặt
Keil C51 v8.05.exe
Sau khi nhấp chuột cửa sổ sau xuất hiện :
- Nhấn Next để tiếp tục việc cài đặt
- Sau khi nhấn next xuất hiện hộp thoại sau:
- Đánh dấu chọn vào ô check box và chọn next
Nhấp vào đây để cài đặt
Check here to agree
Trang 5- Sau khi cài đặt xong nhấn Finish để kết thúc quá trình cài đặt
• Chưa hết, để có thể sử dụng phần mềm này bạn cần phải CRAK nó Coppy folder Keil trong thư mục CRACK và Paste nó lên thư mục mà bạn đã chọn khi cài Sẽ xuất hiện một
hộp thoại yêu cầu bạn có muốn replace không? Chọn Yes để thay thế Chú ý là trong quá
trình Crack bạn nên đóng tất cả cửa sổ chương trình lại
- Mở thư mục Keil vừa thay thế ra chọn file TOOLS
• Đến đây bạn đã hoàn tất quá trình cài đặt!!! Congratulation!!!!
I THIẾT LẬP PHẦN MỀM:
Tiếp theo, mời bạn làm quen với giao diện của chương trình:
- Khởi động chương trình bằng cách : nhấp double vào biểu tượng trên Desktop hoặc vào Start -> Program -> chọn biểu tượng của chương trình
Giao diện chính của chương trình như sau:
Coppy file này trong mục CRACK và Paste nó vào thư mục cài đặt !!!Thay thế file Keil trong mục vừa cài bằng file này
Biểu tượng của chương trình
Chọn đúng đường dẫn cho file rồi chọn save Trong file cài thường đường dẫn được chọn mặc định là ổ D Nhưng ta thường cài ở ổ C nên phải thay đường đẫn cho chính xác
Trang 6Bây giờ việc đầu tiên bạn phải làm là tạo 1 Project mới để làm việc
- Trên thanh menu vào Project -> New Project
- Hộp thoại sau xuất hiện:
Cửa sổ soạn thảo
Cửa sổ quản lý
Cửa sổ báo lỗi
Nút dịch sang file Hex và kiểm lỗi
Trang 7Nhấn Save hộp thoại sau xuất hiện:
- Sau khi chọn Chip nhấn OK, xuất hiện tiếp hộp thoại sau
Chọn Yes để đồng ý chuyển những mã code chuẩn 8051 vào Project của bạn Lúc này bạn có thể thấy trên cửa sổ chương trình là tên Project mà bạn đặt
- Sau đó, bạn vào menu Project -> Options for Target ‘Target 1’
Đặt tên Project vào đây!!!
Chọn Chip mà bạn định dùng
VD: 89C51RD2XX
Trang 8Hộp thoại sau xuất hiện:
- Chọn OK
Sau khi thiết lập xong vào thẻ A51:
Chọn thẻ Output
Nhấn dấu chọn vào đây để tạo file HEX
Đặt tên cho file HEX ở đây
Bạn có thể chọn đường dẫn cho file HEX ở đây
Trang 9- Nếu không tắt dấu chọn có nghĩa là bạn đồng ý định nghĩa chức năng thanh ghi đặc biệt theo chuẩn 8051 và không cần khai báo thư viện ở đầu chương trình, tuy nhiên khi chương trình được viết cho các IC có chức năng đặc biệt thì bạn cần khai báo tên thư viện ở đầu bài lập trình và tắt dấu chọn ở thẻ này
- Chọn OK
- Vậy là bạn đã hoàn tất việc thiết lập phần mềm, có thể bạn thấy hơi phức tạp nhưng công việc này bạn chỉ phải thiết lập một lần duy nhất
II VIẾT MỘT CHƯƠNG TRÌNH VÀ CHẠY MÔ PHỎNG: (hiển thị dưới dạng tín hiệu)
1 Mô phỏng tín hiệu Digital và cách sử dụng Watchdog timer:
- Bây giờ tôi sẽ hướng dẫn bạn viết một chương trình chi tiết từ A->Z Giả sử ta có một đề bài là:
Viết một chương trình chớp tắt đèn Standby vì đây là một bài tập nhỏ chỉ cần một vài câu lệnh
nên tôi sẽ thêm vào phần Watchdog Timer để giới thiệu cùng bạn
- Sau khi mở cửa sổ soạn thảo bạn viết đoạn code sau vào:
để bắt đầu viết code bạn nhấp phải chuột chọn insert ‘#include <REG51F.H>’ đây là thư viện giúp bạn không phải khai báo các thanh ghi chức năng đặc biệt
#include <REG51F.H> ;ADD THƯ VIỆN VÀO
START BIT P0.0 ;KHAI BÁO NÚT NHẤN
STAND_BY BIT P1.0 ;KHAI BÁO ĐÈN LÀ CHÂN P1.0
WMCON EQU 0A6H ;KHAI BÁO WATCHĐOG TIMER
Tắt dấu chọn
ở đây!
Trang 10MAIN:
MOV TMOD,#00010001B ;KHAI BÁO SỬ DỤNG TIMER 0 VÀ 1
MOV IE,#10001010B ;KHAI BÁO SỬ DỤNG NGẮT TRONG TIMER 0 VÀ 1
MOV TH0,#HIGH(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE CAO TIMER 0
MOV TL0,#LOW(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE THẤP TIMER 0
MOV TH1,#HIGH(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE CAO TIMER 1
MOV TL1,#LOW(-1000) ;NẠP GIÁ TRỊ BAN ĐẦU CHO BYTE THẤP TIMER 1
MOV P0,#0FFH ;ĐƯA CÁC CHÂN CỦA PORT 0 LÊN MỨC 1
MOV R0,#10 ;GIÁ TRỊ TRÌ HOÃN PHỤC VỤ NGẮT T0
SETB TR1 ;KHỞI ĐỘNG TIMER 1
LOOP:
JB START ,N2 ;KIỂM TRA NÚT NHẤN START
JB START,N2
MOV P1,#00H ;ĐƯA CÁC CHÂN CỦA PORT 1 XUỐNG MỨC 0
N2:
JB STOP,LOOP
CLR TR1
SJMP LOOP ;QUAY LẠI ĐỂ BẮT ĐẦU VIỆC QUÉT PHÍM
NGAT_T0: ;TRÌNH PHỤC VỤ NGẮT T0
CPL STAND_BY ;đảo bit sau 0,01s
MOV R0,#10 ;nạp lại giá trị đếm
EXIT_T0:
RETI ;kết thúcngắt quay về chương trình chính
NGAT_T1:
CLR TR1
MOV TH1,#HIGH(-1000)
MOV TL1,#LOW(-1000)
MOV WMCON,#01EH ;DAT GIA TRI DEM
EXIT_T1:
SETB TR1
RETI
Trang 11DELAY: ;CHƯƠNG TRÌNH CON DELAY
- Bây giờ ta quay lại việc mô phỏng với KEIL, sau khi gõ đoạn code như trên vào màn hình
soạn thảo bạn chọn file Save as, hộp thoại sau xuất hiện và bạn nhớ đặt tên file với đuôi là asm (Ví dụ: Standby.asm) Khi lưu thành công bạn sẽ thấy các đoạn code có màu sắc phân
biệt giữa các nhãn, lệnh và đối tượng rất dễ nhìn Theo tôi bạn nên save file.asm trước khi viết code vì chương trình sẽ rõ ràng hơn
- Chạy mô phỏng
B1: Click here
B2: Click here
B3: Click here để hiển thị màn hình mô phỏng
B4: Click here để thấy các Ports và timers
B5: : Click here để hiển thị hộp thoại sau
Trang 12- Ta có thể xem trạng thái các thanh ghi bằng cách vào View -> Watch & call stack window, cửa sổ ở góc phải màn hình hiện ra, chọn thẻ Watch, nhấn F2 để nhập thanh ghi cần xem
- Tiếp theo bạn cũng nhấn nút STOP pin P0.1 để thử xem Watchdog timer có chạy không!
Nhấp vào đây
Chọn chân cần mô phỏng ->Enter
Sau khi chọn nhấn Close
Có thể chọn màu ở đây
Chọn pin P0.0 vì khi lập trình bạn khai báo Start là pin P0.0, để bắt đầu chạy, lưu ý là sau khi chọn phải nhã dấu chọn vì trong chương trình bạn có phần chờ nhã phím!!!
Trang 13- Như vậy là các bạn đã biết cách sử dụng Watchdog timer, tạo đèn Standby, chạy mô phỏng với chương trình Keil
- Tiếp theo ta thử qua khái niệm điều xung và mô phỏng tín hiệu analog
2 Mô phỏng tín hiệu Analog và cách thiết lập chế độ điều xung:
- Giả sử ta có đề bài: Tạo tín hiệu hình Sin trên chân P1.0 (lưu ý IC của bạn phải hỗ trợ chức năng này) Hay làm cho một đèn Led sáng dần và tắt dần Vì bài này cũng tương đối ngắn nên
ta cùng kết hợp với cách sử dụng Timer 2
- Trong cửa sổ Code bạn nhập đoạn code như sau:
MOV CMOD,#0 ;Chế độ 6 chu kì xung nhịp = 1_PER_2 chu kì máy
;Cho phép PCA (programing counter array) hoạt động
MOV CCAPM1,#01000010B ; P1.4 PCA hoạt động chế độ PWM 8 bits
MOV T2MOD,#00000001B ;Khai báo T2MOD,T2CON
MOV R2,#100 ;giá trị trì hoãn phục vụ timer 2
SETB TR2 ;Khởi động timer 2
Tín hiệu trở nên phẳng và cửa sổ báo watchdog timer đã xảy ra!!!
B1: Click here Để dừng mô phỏng
B2: Click here Để đóng cửa sổ mô phỏng
Trang 14SETB CR ;Set bit CR cho phép điều xung
MOV R1,#0 ;tạo giá trị ban đầu cho R0 (ở đây ta sử dụng như 1 biến)
NGAT_TIMER2: ;Trình phục vụ ngắt T2
Trang 15- Vì điều xung (PWM): có nghĩa là điều chế độ rộng xung, nên ở ví dụ trên tùy theo giá trị trong biến XUNG (CCAP1H biến này được tôi dùng ngắt timer cho thay đổi từ 0 -> 255) sẽ cho ra độ rộng xung trên chân P1.4 thay đổi liên tục Đây là một ví dụ cơ bản về điều xung để một đèn sáng dần lên và tắt dần xuống
3 Các Macro và cách thiết lập:
REPT count ;count là giá trị số lần lặp (giá trị max là 975 lần)
Macro body ;thân macro là nơi chứa lệnh cần lặp
Endm ;lệnh kết thúc 1 macro
Code mẫu như sau:
;*************************************************************
IRP parm-name,<parm-list>;TẠO MACRO VỚI TÊN ĐẠI DIỆN
Macro body ;thân macro là nơi chứa lệnh cần tác động đến parm-list
Endm ;lệnh kết thúc 1 macro
Code mẫu như sau:
IRP RENAME,<P2.0,P2.1,P2.2> ;TAO MACRO VOI NAME THAY THE
Nếu chọn State bạn sẽ thấy giữa
0 và 1 còn có dãy t/h khác Chỉ điều xung mới có Hình dưới là Standby ta thấy nó chuyển trực
tiếp từ 0 lên 1
Trang 16CLR RENAME ;xoùa caùc bit trong daâu < >
;*************************************************************
IRPC parm-name,<parm-string> ;táo macro thay chuoêi kyù töï ñeơ taùc ñoông töøng kyù töï Macro body ;thađn macro laø nôi chöùa leônh caăn taùc ñoông ñeân töøng kyù töï trong chuoêi
Endm ;leônh keât thuùc 1 macro
Code maêu nhö sau:
4 Lieđn keât file:
- Ñoâi vôùi moôt soâ chöông trình lôùn bao goăm nhieău chöông trình con, ta coù theơ duøng tính naíng lieđn keât file ñeơ tieôn theo doõi vaø söõa ñoơi, thay theâ caùc chöông trình con
- Ñeơ lieđn keât file, tređn ñaău chöông trình chính ta khai baùo ñöôøng daên ñeân file chöùa chöông trình con
Ví dú: Trong chöông trình chính coù duøng ñeân chöông trình con ñaịt tái ñöôøng daên D\data\tienloc\count_line.asm thì trong chöông trình chính khai baùo nhö sau:
#include <D\data\tienloc\count_line.asm>
III NGAĨT TRUYEĂN THOĐNG NOÂI TIEÂP GIAO TIEÂP NGOÁI VI:
1 Duøng chuaơn truyeăn baât ñoâi xöùng UART 8bit:
- Bađy giôø tođi seõ trình baøy veă caùch söû dúng ngaĩt truyeăn thođng noâi tieâp Trong Vi Ñieău Khieơn coù chöùc naíng ngaĩt truyeăn thođng noâi tieâp ñeơ truyeăn vaø nhaôn döõ lieôu Chađn TXD(P3.1 phaùt) vaø
chađn RXD(P3.0 thu) Thanh ghi ñieău khieơn ngaĩt noâi tieâp laø SCON vaø thanh ghi ñeôm döõ lieôu laø SBUF Ñòa chư veùctor ngaĩt laø 023H, bit cho pheùp ngaĩt laø ES bit 4 trong thanh ghi IE
Thanh ghi SCON coù 8 bit:
+ Scon.0(RI) ñòa chư 98H côø ngaĩt thu ñöôïc set khi keât thuùc vieôc thu 1 kyù töï
+ Scon.1(TI) ñòa chư 99H côø ngaĩt phaùt ñöôïc set khi keât thuùc vieôc phaùt 1 kyù töï
+ Scon.2(Rb8) ñòa chư 9AH bit thu 8 Bit thöù 9 ñöôïc nhaôn ôû cheâ ñoô 9bit
+ Scon.3(Tb8) ñòa chư 9BH bit thu 8 Bit thöù 9 ñöôïc phaùt
+ Scon.4(REN) ñòa chư 9CH bit cho pheùp thu, phại ñöôïc set=1 ñeơ nhaôn kyù töï
+ Scon.5(SM0) ñòa chư 9DH bit chón cheẫ ñoô
+ Scon.6(SM1) ñòa chư 9EH bit chón cheẫ ñoô
+ Scon.7(SM2) ñòa chư 9FH bit chón cheẫ ñoô
Giạ söû ta coù moôt yeđu caău giao tieâp döõ lieôu giöõa 2 VÑK Moôt con master laøm nhieôm vú phaùt döõ lieôu vaø moôt con slaver laøm nhieôm vú nhaôn döõ lieôu töø con chụ vaø ñöa döõ lieôu ñoù ra port2
Baøi code maêu cho con Master nhö sau:
#include <REG51.H>
DATAEXAMBLE EQU 30H
Trang 17
ORG 0000H ;dia chi vector reset
MAIN:
MOV SCON,#01010010B ;sm0/sm1= 0/1 uart 8bit thay doi t/lap boi bo dinh thoi; bit
;4(REN)=1 bit cho phep thu, bit0(RI) = 0 san sang nhan du ;lieu; bit1(TI)=1 san sang phat du
;lieu
MOV TMOD,#00100000B ;bit5=1 bit4=0 che do 8bit tu dong nap lai cua timer1
MOV TH1,#-3 ;tao toc do baud (voi thach anh 12Mh gia tri Th1= -3 ;thi toc do baud là ;9600)
MOV DATAEXAMBLE,#01010101B ;dua mot byte du lieu de chuan bi truyen
LOOP:
SERIAL:
MOV A,DATAEXAMBLE ;dua byte du lieu vao thanh ghi A
JNB TI,$ ;co TI duoc set ngay sau khi phat xong 1 ky tu
MOV SBUF,A ;dua gia tri thanh ghi A vao thanh ghi SBUF
NGAT_SERIAL: ;Trình phục vụ ngắt port nối tiếp
JNB RI,$ ;co RI duoc set ngay sau khi nhan xong 1 ky tu
MOV A,SBUF ;Đưa dữ liệu nhận được vào thanh ghi A
END
Trang 18- Ngoài ra còn các chuẩn truyền UART 9bit để giao tiếp giữa 1 con master và nhiều con Slave
2 Dùng chuẩn truyền đối xứng SPI: ( Serial Peripheral Interface)
- Chuẩn SPI giao tiếp qua MOSI, MISO, SCK, SS
+ MOSI : Master Out Slave In (con chủ truyền qua con tớ) (P1.5)
+ MISO : Master In Slave Out (con tớ truyền qua con chủ) (P1.6)
+ SCK : Shift Clock (xung để dịch dữ liệu sang) (P1.7)
- Chuẩn này có 2 chế độ Nomal mode và Enhanced mode
+ Nomal mode: Không có bộ đệm ghi
+ Enhanced mode: Có bộ đệm ghi dùng để truyền liên tiếp nhiều byte
- Chuẩn này có các thanh ghi chức năng sau:
SPCR (0d5h) SPI Control Register: là thanh ghi điều khiển chế độ SPI
SPIE (Bit7) : bit cho phép ngắt SPI (kết hợp với bit ES trong thanh ghi IE cả hai bit này lên mức 1 thì ngắt SPI được cho phép xảy ra)
SPE (Bit6) : bit cho phép định nghĩa chân giao tiếp SPI (MOSI, MISO, SCK, SS ) DORD (Bit5) : bit cho phép chọn chế độ truyền DORD=1 truyền LSB trước;DORD=0 truyền MSB trước
MSTR (Bit4) : MSTR=1 chọn chế độ Master;MSTR=0 chọn chế độ Slave
CPOL (Bit3) : CPOL=0 chân SCK ở mức thấp khi không truyền dữ liệu; CPOL=1 chân SCK ở mức cao khi không truyền dữ liệu
CPHA (Bit2) : Clock Phase Bit này kết hợp với CPOL để điều khiển xung clock và mối quan hệ truyền nhận giữa con chủ và tớ
SPR0 (Bit1) : Điều khiển tốc độ xung SCK
SPR1 (Bit0) : Điều khiển tốc độ xung SCK
SPSR (0AAH) SPI Statute Register: là thanh ghi trạng thái SPI
SPIF (Bit7) : Cờ ngắt SPI khi truyền xong dữ liệu cờ ngắt SPIF được set lên mức 1, và một ngắt được xảy ra nếu SPIE và ES ở mức 1 Cờ này được xóa bằng cách đọc thanh ghi trạng thái SPSR và sau đó tác động đọc hoặc ghi lên thanh ghi dữ liệu SPDR
WCOL (Bit6) : Khi ở chế độ nomal ENH = 0, Bit này bằng 1 trong suốt quá trình ghi dữ liệu Nó được xóa bằng cách tác động như SPIF Khi ở chế độ Enhanced mode bit này = 1 khi bộ đệm ghi Tx đầy
LDEN (Bit5) : Bit cho phép load dữ liệu khi ở chế độ Enhanced
DISSO (Bit1) := 1 Không cho phép con tớ xuất dữ liệu; = 0 được nhận dữ liệu
ENH (Bit0) := 0 Nomal mode(không có bộ đệm ghi); = 1 Enhanced mode (chế độ có bộ đệm ghi, dùng để truyền nhiều byte nối tiếp)
SPDR (86H) SPI Data Register: là thanh ghi dữ liệu SPI
- Gồm 8 bit từ SPD0 đến SPD7 Chứa các dữ liệu gửi hay nhận
Bài code mẫu cho con Master như sau: dùng chế độ nomal
;TRONG MAIN GUI DU LIEU ;TRONG NGAT DOC DU LIEU VA XOA CO NGAT
#include <AT89s53.inc>
data_example EQU 30H
Trang 19mov spsr,#10000000b ;bit 1 la dissco =0 dc nhan; bit 0 la chon c/d ENH(1) or normal(0)
MOV data_example,#01010101b ; /* data example */
mov SPCR, #10010101B
;********* Setb SPE cho phep DN chan SPI ***********
mov a,SPCR ;lenh orl or tung bit voi nhau 0 or x = x ; 1 or x = 1 muon set len 1 thi or
;bit can set voi 1 cac bit con lai or voi 0 kq o bi ah
orl a,#01000000b ;SETB SPE, cho pheo dinh nghia chan SPI bit thu 6
of thanh ghi spcr
;************ xoa co truyen spif(7) va wcol(6) ***************
mov a,SPSR ;muon xoa 1 bit ta anl bit do voi 0 cac bit
con lai and voi 1 ko bi ah
anl a,#00111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen
mov a,SPSR ;muon xoa 1 bit ta anl bit do voi 0 cac bit
con lai and voi 1 ko bi ah
anl a,#00111111b ;CLR SPIF xoa co truyen, bit 7 of thanh ghi spsr
; /* clear software transfert flag */ xoa co truyen
;*******Doc du lieu nhan duoc**********************