Bài 4-3: Lập trình LED sáng lần lượt

Bài 5:

Lập trình chương trình led sáng lần lượt

         Phần cứng: 8 led nối với Port 1, được định vị trí như sau: led 1 nối với P1.0, lần lượt cho đến led 8 (nối với P1.7). Biết led sáng khi tín hiệu xuất ở các chân Port 1 ở giá trị 1.   Viết chương trình để các led nối với Port 1  sáng lần lượt từng led từ led 1 đến led 8. Các quá trình trên được lặp lại không ngừng.

Minh hoạ:

  • mô phỏng led sáng lần lượt

 

          Cách 1: Cách này đơn giản là làm cho các led sáng bằng cách thiết đặt các giá trị thích hợp cho các bit của Port để làm led sáng theo từng trạng thái, cách này đơn giản nhưng cần viết dài và tốn dung lượng bộ nhớ Rom.

Chương trình

;***************************************
;*****///--- LED SANG LAN LUOT -CACH DON GIAN ---\\\\************
;**---------------------------------------
;**////___ led sang lan luot tu led 1 den led 8-P1______\\\\\\\\\\\\
;**///___ sang o muc 1 va tat o muc 0______________\\\\\\\\\\\\
;**////____ lap di lap lai khong gioi han_____\\\\\\\
;** \\\\\\\\\\\\-------  nap gia trị cho tung trang thai  --//////////
;*******************************

                     ORG        000H           ; khai bao dia chi de bat dau chuong trinh tren Rom

                     Mov        P1,#00000000B          ;===>>>> lam 8 led noi P1 tat
                     LCall      Delay                           ;===>>>>goi chuong trinh con Delay
Xuat:            Mov        P1,#00000001B          ;===>>>> lam led 1 sang
                     LCall      Delay
                     Mov        P1,#00000010B          ;===>>>> lam led 2 sang
                     LCall      Delay
                     Mov        P1,#00000100B          ;===>>>> lam led 3 sang
                     LCall      Delay
                     Mov        P1,#00001000B          ;===>>>> lam led 4 sang
                     LCall      Delay
                     Mov        P1,#00010000B          ;===>>>> lam led 5 sang
                     LCall      Delay
                     Mov        P1,#00100000B          ;===>>>> lam led 6 sang
                     LCall      Delay                       
                     Mov        P1,#01000000B          ;===>>>> lam led 7 sang
                     LCall      Delay                       
                     Mov        P1,#10000000B          ;===>>>> lam led 8 sang
                     LCall      Delay                       
                   Sjmp      Xuat                            ;===>>>> nhay ve thuc hien tu dau
  
;**>>>>>>>>>> delay <<<<<<<<<<<<
 
Delay:
                    Mov        R7,#0FFH           ;===>>>> gan R7=#0FFH, 1 chu ki may
Kt2:              Mov        R6,#0FFH           ;===>>>> gan R6=#0FFH, 1 chu ki may
Kt1:              Djnz       R6,Kt1                 ;===>>>> giam R6 xuong 1, R6 khac 0-> giam tiep
                    Djnz       R7,Kt2                 ;===>>>> giam R7 xuong 1, R6 khac 0-> ve Kt2
        Ret                                               ;===>>>> ket thuc chuong trinh con
;________________
                     End                                   ;===>>>> ket thuc chuong trinh

 

          Cách2:   Để led sáng lần lượt, cần làm cho tín hiệu xuất ra giá trị 1 một khoảng thời gian để có thể nhận biết được. Đầu tiên cho P1 tắt, sau đó làm cho bit A.0 lên 1, sử dụng lệnh xoay trái dữ liệu trên thanh Ram A, mỗi lần xoay giá trị 1 sẽ chuyển lần lượt qua A.1 - A.2 - A.3 -A.4 - A.5 -A.6 - A.7 - A.0, mỗi lần xoay xuất tín hiệu ra P1 sẽ thấy led sáng lần lượt từ led 1 đến led 8.

lưu đồ led sáng lần lượt    chương trình con delay

Chương trình:

;*************************************************
;**************/////--- LED SANG LAN LUOT  ---\\\\\****************
;**-------------------------------------
;**////___ led sang lan luot tu led 1 den led 8_____\\\\\\\\\
;**////___ sang o muc 1 va tat o muc 0__________\\\\\\\\\
;**/////____ lap di lap lai khong gioi han_________\\\\\\\\\
;**<<<<<<<<<<<<<<<<<<<----------------->>>>>>>>>>
;** \\\\\\\\\\\\-------  nap thanh Ram A=#00000001B------------//////////
;**\\\\\\\\\\\\\--------ket hop xoay phai thanh Ram A va xuat du lieu------////////
;***********************************
;***********************************

                     ORG        000H           ; khai bao dia chi de bat dau chuong trinh tren Rom

                     Mov        P1,#0            ;===>>>> lam 8 led noi P1 tat
                     LCall      Delay            ;===>>>>goi chuong trinh con Delay
                     Mov        A,#00000001B  ;===>>>> A co gia tri 00000001B
Xuat:
                     Mov        P1,A             ;===>>>> xuat du lieu A ra P1 dieu khien led
                     LCall      Delay            ;===>>>>goi chuong trinh con Delay
                     RL          A
      Sjmp      Xuat                             ;===>>>> nhay ve thuc hien tu dau
  
;**>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> delay <<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
Delay:
                     Mov        R7,#0FFH          
Kt2:               Mov        R6,#0FFH          
Kt1:               Djnz       R6,Kt1                
                     Djnz       R7,Kt2              
           Ret                                              
;__________________________
                     End                                   ;===>>>> ket thuc chuong trinh

Giải thích: ORG  000H  là lệnh chỉ dẫn: chương trình này được lưu vào ROM bắt đầu từ địa chỉ 000H. 
    Khi mới bắt đầu chương trình, Mov        P1,#0  làm tất cả các led đều tắt,
   LCall   Delay làm cho thời gian tắt đủ để mắt người nhận ra.
   Mov    A,#00000001B làm cho bit A.0 của thanh ghi A được set lên 1, các bit còn lại ở giá trị 0.

   Tiếp theo trong chương trình là nhãn Xuat: vị trí trở về, trên lưu đồ giải thuật là điểm mũi tên trở về.
   Mov      P1,A xuất tín hiệu ra P1, lúc này led 1 sáng lên.
   Tiếp theo là  lệnh gọi chương trình con LCall   Delay.
   Câu lệnh RL      A làm trạng thái các bit dịch sang trái 1 bit, trước đó chỉ có A.0 ở giá trị 1, sau câu lệnh A.1 mang giá trị 1, còn bit A.0 bây giờ mang giá trị 0 do bit A.7 có giá trị 0 chuyển sang.
   Sjmp      Xuat chương trình nhảy đến đoạn chương trình được đánh dấu bằng nhãn Xuat, nên nhớ rằng chương lệnh gọi Sjmp chỉ nhảy được đến vị trí cách lệnh gọi không quá 128 byte, nếu vượt qua giới hạn này chương trình dịch sẽ báo lỗi, khi đó cần thay Sjmp bằng Ljmp vì Ljmp có thể nhảy đến vị trí bất kì trên ROM.
     Lúc này chương trình bắt đầu từ nhãn Xuat:
                   Sau nhãn Xuat:  là câu lệnh Mov      P1,A tín hiệu được xuất ra P1, lúc này  P1.1 lên giá trị 1, led thứ hai sáng, các led còn lại không sáng. Câu lệnh RL      A làm trạng thái các bit dịch sang trái 1 bit: A.2 lên 1, các bit khác mang giá trị 0.
    Các quá trình trên được lặp lại liên tục (với câu lệnh  Sjmp      Xuat và nhãn Xuat: ). Kết quả cuối cùng như trên hình minh họa phía trên.

 

        Bài 6:

Lập trình vi điều khiển cho 32 LED sáng lần lượt

        Phần cứng: 32 led nối với Port 0,1,2,3, được định vị trí như sau: led 1 nối với P0.0, lần lượt cho đến led 32 (nối với P3.7). Biết led sáng khi tín hiệu xuất ở giá trị 1.Viết chương trình để các led nối với Port 0,1,2,3  sáng lần lượt từng led từ led 1 đến led 32. Các quá trình được lặp lại không giới hạn.

 

Minh hoạ:

mô phỏng 32 led sáng lần lượt

     Cách 1:  Cách này cũng như cách 1 trong bài 5, làm cho các led sáng bằng cách thiết đặt các giá trị thích hợp cho các Port để làm led sáng theo từng trạng thái, cách này đơn giản nhưng cần viết dài và tốn dung lượng bộ nhớ Rom.

;************************************
;**************/////--- 32 LED SANG LAN LUOT- CACH DON GIAN  ---\\\\\\**************
;**----------------------------------------
;**////////////////___ led sang lan luot tu led 1 den led 32____\\\\\\\\
;**///////////////___ sang o muc 1 va tat o muc 0___________\\\\\\\\
;**//////////////____ lap di lap lai khong gioi han___________\\\\\\\
;**<<<<<<<<<<<<<<<<<<<--------------------->>>>>>>>>>
;** \\\\\\\-------   nap gia trị cho tung trang thai  ---------/////////
;*********************

                     ORG        000H           ; khai bao dia chi de bat dau chuong trinh tren Rom

                     Mov        P0,#0           ;===>>>> |||
                     Mov        P1,#0           ;===>>>> |||     cac led deu tat
                     Mov        P2,#0           ;===>>>> |||
                     Mov        P3,#0           ;===>>>> |||
                     LCall      Delay           ;===>>>>goi chuong trinh con Delay
Xuat:                  ;**>>>>>>>>>>>>>>>>>>> lam led P0 sang <<<<<<<<<<<<<<<<<<<<<<<<<<
                     Mov        P0,#00000001B          ;===>>>> lam led 1 sang
                     LCall      Delay                           ;===>>>>goi chuong trinh con Delay
                     Mov        P0,#00000010B          ;===>>>> lam led 2 sang
                     LCall      Delay 
                     Mov        P0,#00000100B          ;===>>>> lam led 3 sang
                     LCall      Delay
                     Mov        P0,#00001000B          ;===>>>> lam led 4 sang
                     LCall      Delay
                     Mov        P0,#00010000B          ;===>>>> lam led 5 sang
                     LCall      Delay
                     Mov        P0,#00100000B          ;===>>>> lam led 6 sang
                     LCall      Delay                       
                     Mov        P0,#01000000B          ;===>>>> lam led 7 sang
                     LCall      Delay                       
                     Mov        P0,#10000000B          ;===>>>> lam led 8 sang
                     LCall      Delay
;**>>>>>>>>>>>>>>>>>lam led P1 sang <<<<<<<<<<<<<<<<<<<
                     Mov        P0,#00000000B          ;===>>>> lam P0 tat            
                     Mov        P1,#00000001B          ;===>>>> lam led 1 sang
                     LCall      Delay
                     Mov        P1,#00000010B          ;===>>>> lam led 2 sang
                     LCall      Delay
                     Mov        P1,#00000100B          ;===>>>> lam led 3 sang
                     LCall      Delay
                     Mov        P1,#00001000B          ;===>>>> lam led 4 sang
                     LCall      Delay
                     Mov        P1,#00010000B          ;===>>>> lam led 5 sang
                     LCall      Delay
                     Mov        P1,#00100000B          ;===>>>> lam led 6 sang
                     LCall      Delay                       
                     Mov        P1,#01000000B          ;===>>>> lam led 7 sang
                     LCall      Delay                       
                     Mov        P1,#10000000B          ;===>>>> lam led 8 sang
                     LCall      Delay
;**>>>>>>>>>>>>>>>>>> lam led P2 sang <<<<<<<<<<<<<<<<<<
                     Mov        P1,#00000000B          ;===>>>> lam P1 tat  
                     Mov        P2,#00000001B          ;===>>>> lam led 1 sang
                     LCall      Delay
                     Mov        P2,#00000010B          ;===>>>> lam led 2 sang
                     LCall      Delay
                     Mov        P2,#00000100B          ;===>>>> lam led 3 sang
                     LCall      Delay
                     Mov        P2,#00001000B          ;===>>>> lam led 4 sang
                     LCall      Delay
                     Mov        P2,#00010000B          ;===>>>> lam led 5 sang
                     LCall      Delay
                     Mov        P2,#00100000B          ;===>>>> lam led 6 sang
                     LCall      Delay                       
                     Mov        P2,#01000000B          ;===>>>> lam led 7 sang
                     LCall      Delay                       
                     Mov        P2,#10000000B          ;===>>>> lam led 8 sang
                     LCall      Delay
;**>>>>>>>>>>>>>>>lam led P1 sang <<<<<<<<<<<<<<<<<<<
                     Mov        P2,#00000000B          ;===>>>> lam P2 tat             
                     Mov        P3,#00000001B          ;===>>>> lam led 1 sang
                     LCall      Delay
                     Mov        P3,#00000010B          ;===>>>> lam led 2 sang
                     LCall      Delay
                     Mov        P3,#00000100B          ;===>>>> lam led 3 sang
                     LCall      Delay
                     Mov        P3,#00001000B          ;===>>>> lam led 4 sang
                     LCall      Delay
                     Mov        P3,#00010000B          ;===>>>> lam led 5 sang
                     LCall      Delay
                     Mov        P3,#00100000B          ;===>>>> lam led 6 sang
                     LCall      Delay                       
                     Mov        P3,#01000000B          ;===>>>> lam led 7 sang
                     LCall      Delay                       
                     Mov        P3,#10000000B          ;===>>>> lam led 8 sang
                     LCall      Delay
                     Mov        P3,#00000000B          ;===>>>> lam led P3 tat        
;***-------------------
      Ljmp      Xuat                                           ;  ===>>>> nhay ve thuc hien tu dau

  
;**>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> delay <<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
Delay:
                    Mov        R7,#0FFH           ;===>>>> gan R7=#0FFH, 1 chu ki may
Kt2:              Mov        R6,#0FFH           ;===>>>> gan R6=#0FFH, 1 chu ki may
Kt1:              Djnz       R6,Kt1                 ;===>>>> giam R6 xuong 1, R6 khac 0-> giam tiep
                    Djnz       R7,Kt2                 ;===>>>> giam R7 xuong 1, R6 khac 0-> ve Kt2
         Ret                                                ;===>>>> ket thuc chuong trinh con
;_____________________
                     End                                   ;===>>>> ket thuc chuong trinh

     Câu lệnh cuối quay trở về đầu phải dùng Ljmp      Xuat  chứ không sử dụng Sjmp vì khoảng cách từ vị trí chương trình bắt đầu đến câu lệnh gọi trở về lớn 128byte.

 

     Cách 2:  Kết hợp các lệnh xoay và di chuyển dữ liệu để chương trình viết ngắn gọn hơn.

    Phân tích: Tại mỗi thời điểm chỉ có 1 led sáng, do đó có thể sử dụng lệnh xoay trái trạng thái các bit của các Port, với một bit nào đó được đặt lên 1, xoay bit này lần lượt qua P0,P1,P2,P3 sẽ đạt kết quả. Vấn đề đặt ra là làm sao để xoay 32 bit của P0,P1,P2,P3 trong khi đó chỉ có thanh ghi A thực hiện được lệnh xoay. Không thể thực hiện xoay 32 bit của 4 Port bằng một lệnh duy nhất mà phải  trải qua nhiều bước.
   Để xoay trạng thái các bit trong một ô nhớ bất kì của vi điều khiển, đầu tiên chuyển giá trị của ô nhớ đó lên thanh ghi A, rồi dùng lệnh xoay thanh ghi A, sau đó chuyển kết quả về lại ô nhớ cần xoay,kết quả ô nhớ đã được xoay. Bây giờ có thể qui ước cụm từ "xoay ô nhớ" thay cho các bước vừa nêu.
   Để xoay 32 bit (trong bài này là P0,P1,P2,P3), trước hết xoay trái ô nhớ đầu tiên (P0) cùng với cờ C (giá trị đầu tiên của cờ C được được đặt trước tùy từng trường hợp cụ thể hoặc do chương trình thực hiện), sau khi xoay ô nhớ đầu tiên với cờ C, các trạng thái của các bit trong ô nhớ đó chuyển qua một bit, giá trị của cờ C chuyển vào bit 0, bit 7 của ô nhớ đó chuyển vào cờ nhớ C.  Xoay ô nhớ thứ hai với cờ nhớ C, giá trị của C trước đó chuyển vào bit 0 của ô nhớ thứ hai (mà giá trị này trước đó là của bit 7 ô nhớ thứ nhất), giá trị của bit 7 trong ô nhớ thứ hai chuyển vào cờ nhớ C.  Tiếp tục xoay ô nhớ thứ 3 và thứ 4 với cờ nhớ C. Kết quả cuối cùng trạng thái của 32 bit được dịch sang trái 1 bit, bit 0 của ô nhớ đầu tiên là giá trị của C trước đó và giá trị của cờ nhớ C hiện tại là của bit 7 của ô nhớ thứ 4 chuyển sang.

    Giải thuật:

lưu đồ giải thuật led sáng lần lượt phương án 2    Chương trình ocn delay

Chương trình:

;********************************************
;**************/////--- 32 LED SANG LAN LUOT  ---\\\\\\ **********
;**------------------------------------------------------
;**////__ led sang lan luot tu led 1 den led 32______\\\\\
;**////__ sang o muc 1 va tat o muc 0_______\\\\\\\
;**////__ lap di lap lai khong gioi han_______\\\\\\\
;**<<<<<<<<<<<<<<<<<<<--------------->>>>>>>>>
;** \\\\\\\\\\\\-------  su dung lenh xoay phai voi co C-----xoay 32 bit voi C---------------------////////////////
;**************************************

                     ORG        000H           ; khai bao dia chi de bat dau chuong trinh tren Rom

                     Mov        P0,#0           ;===>>>> ||| tat tat ca ca led
                     Mov        P1,#0           ;===>>>> |||  
                     Mov        P2,#0           ;===>>>> |||
                     Mov        P3,#0           ;===>>>> |||
                     SetB       C                  ;===>>>> lam co C len 1
Xoay32bit:
                     Mov        A,P0            ;||||||||||
                     RLC        A                 ;||||||||||===>>>> xoay trai P0 voi co nho C
                     Mov        P0,A            ;||||||||||
                     Mov        A,P1          ;@@@@
                     RLC        A               ;@@@@ ===>>>> xoay trai P1 voi co nho C
                     Mov        P1,A          ;@@@@
                     Mov        A,P2            ;#####
                     RLC        A                 ;##### ===>>>> xoay trai P2 voi co nho C
                     Mov        P2,A            ;#####
                     Mov        A,P3           ;!!!!!!!!!!!
                     RLC        A                ;!!!!!!!!!!!===>>>> xoay trai P3 voi co nho C
                     Mov        P3,A           ;!!!!!!!!!!! 
                     LCall      Delay            ;===>>>>goi chuong trinh con Delay
      Sjmp      Xoay32bit                           ;===>>>> nhay ve thuc hien tu dau
  
;**>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Delay <<<<<<<<<<<<<<<<<<<<<<<<<<<<
Delay:
                     Mov        R7,#0FFH   
Kt2:               Mov        R6,#0FFH       
Kt1:               Djnz       R6,Kt1        
                     Djnz       R7,Kt2 
          Ret                         ;&&&&& ket thu chuong trinh con Delay
;_____________
                     End                                    ;===>>>> ket thuc chuong trinh

 

            Bài 7: Bài tập tự giải

         Bổ sung vào chương trình ở bài 5 và bài 6 để chương trình có thêm quá trình led di chuyển theo chiều ngược lại.

         Bài 8:  Bài tập tự giải

         Phần cứng: 8 led nối với Port 2, được định vị trí như sau: led 1 nối với P2.0, lần lượt cho đến led 8 (nối với P2.7). Biết led sáng khi tín hiệu xuất ở các chân Port 1 ở giá trị 1.   Viết chương trình để các led nối với Port 1  sáng theo kiểu tăng nhị phân. Các quá trình trên được lặp lại không giới hạn.