Bài tập Vi xử lý

Ví dụ 1: Đặt P3.0 hoặc P3.1 xuống mức “0” sẽ làm mất kết nối giữa bo với máy tính *************************************************** ORG 00H ;Reset LJMP MAIN ORG 0003H ;INT0 RETI ;do nothing ORG 0013H ;Timer 0 RETI ;do nothing ORG 0013H ;INT1 RETI ;do nothing ORG 001BH ;Timer 1 RETI ;do nothing ORG 0023H ;serial port JNB SCON.0,SerialIntExit SerialIntExit: RETI ;do nothing **************************************************** ORG 40H ;start of program MAIN: MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH SJMP $ END

doc51 trang | Chia sẻ: oanhnt | Lượt xem: 1600 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài tập Vi xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
BÀI 2: VÀO / RA (Input / Output) Ví dụ 1: Đặt P3.0 hoặc P3.1 xuống mức “0” sẽ làm mất kết nối giữa bo với máy tính *************************************************** ORG 00H ;Reset LJMP MAIN ORG 0003H ;INT0 RETI ;do nothing ORG 0013H ;Timer 0 RETI ;do nothing ORG 0013H ;INT1 RETI ;do nothing ORG 001BH ;Timer 1 RETI ;do nothing ORG 0023H ;serial port JNB SCON.0,SerialIntExit SerialIntExit: RETI ;do nothing **************************************************** ORG 40H ;start of program MAIN: MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH SJMP $ END Câu hỏi 1: Khi đặt các swicth ở vị trí ON thì mức logic ngõ ra tương ứng sẽ là cao (High) hay thấp (Low)? Trả lời: Khi đặt các swicth ở vị trí ON thì mức logic ngõ ra tương ứng sẽ là LOW Câu hỏi 2: Tác dụng của những dòng lệnh trước phần chương trình chính (MAIN) là để làm gì? Trả lời: Dùng để kích hoat ngắt cho các port Câu hỏi 3: Viết chương trình để bật sáng lần lượt, sau đó tắt lần lượt các đèn led ở Port 2, Port 3 Trả lời: Cách 1: (thủ công: viết lệnh cho từng led) ************************ ORG 00H ;Reset LJMP MAIN ORG 03H ;INTO RETI ;do nothing ORG 0BH ;Timer0 RETI ;do nothing ORG 13H ;INT1 RETI ;do nothing ORG 1BH ;Timer 1 RETI ;do nothing ORG 23H ;Serial port JNB SCON.0,SeriallntExit SeriallntExit: RETI ;do nothing ************************************* ORG 60H ;start of program MAIN: MOV P2,#0H MOV P3,#0H LCALL DELAY_10S ;wait for a second SETB P2.0 ;red led:off LCALL DELAY_10S ;wait for a second SETB P2.1 ;red led:off LCALL DELAY_10S ;wait for a second SETB P2.2 ;red led:off LCALL DELAY_10S ;wait for a second SETB P2.3 ;red led:off LCALL DELAY_10S ;wait for a second SETB P2.4 ;red led:off LCALL DELAY_10S ;wait for a second SETB P2.5 ;red led:off LCALL DELAY_10S ;wait for a second SETB P2.6 ;yellow led:off LCALL DELAY_10S ;wait for a second SETB P2.7 ;green led:off LCALL DELAY_10S ;wait for a second LCALL DELAY_10S ;wait for a second CLR P2.0 ;red led:off LCALL DELAY_10S ;wait for a second CLR P2.1 ;red led:off LCALL DELAY_10S ;wait for a second CLR P2.2 ;red led:off LCALL DELAY_10S ;wait for a second CLR P2.3 ;red led:off LCALL DELAY_10S ;wait for a second CLR P2.4 ;red led:off LCALL DELAY_10S ;wait for a second CLR P2.5 ;red led:off LCALL DELAY_10S ;wait for a second CLR P2.6 ;yellow led:off LCALL DELAY_10S ;wait for a second CLR P2.7 ;green led:off LCALL DELAY_10S ;wait for a second SJMP MAIN DELAY_10S: MOV R1,#10 ACALL DELAY RET DELAY: LOOP1_1: MOV R2,#100 LOOP1_2: MOV R3,#100 LOOP1_3: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R3,LOOP1_3 DJNZ R2,LOOP1_2 DJNZ R1,LOOP1_1 RET END Cách 2: ( sử dụng dịch phải_RR) ************************ ORG 00H ;Reset LJMP MAIN ORG 03H ;INTO RETI ;do nothing ORG 0BH ;Timer0 RETI ;do nothing ORG 13H ;INT1 RETI ;do nothing ORG 1BH ;Timer 1 RETI ;do nothing ORG 23H ;Serial port JNB SCON.0,SeriallntExit SeriallntExit: RETI ;do nothing ************************************* ORG 60H ;start of program MAIN: MOV A,#0000 0010 B LOOP: RR A MOVE P3, A ACALL DELAY_1S ;wait for a second SJMP LOOP DELAY_1S: MOV R1,#30 ACALL DELAY RET DELAY: LOOP1_1: MOV R2,#100 LOOP1_2: MOV R3,#100 LOOP1_3: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R3,LOOP1_3 DJNZ R2,LOOP1_2 DJNZ R1,LOOP1_1 RET END Câu hỏi 4: Thay đổi chương trình để xuất dữ liệu của P1 lần lượt là 0x0FH, 0x1FH, 0x2FH, ….0xFFH. Thống kê lại kết quả vào bảng sau và rút ra kết luận STT DỮ LIỆU YÊU CẦU XUẤT RA P1 TRẠNG THÁI MSB CỦA P1 TƯƠNG ỨNG ĐÁP ỨNG ĐÚNG? ( CÓ / KHÔNG) BIT 1 BIT2 BIT3 BIT4 1 0x0FH L L L L 2 0x1FH H L L L 3 0x2FH L H L L 4 0x3FH H H L L 5 0x4FH L L H L 6 0x5FH H L H L 7 0x6FH L H H L 8 0x7FH H H H L 9 0x8FH L L L H 10 0x9FH H L L H 11 0xAFH L H L H 12 0xBFH H H L H 13 0xCFH L L H H 14 0xDFH H L H H 15 0xEFH L H H H 16 0xFFH H H H H  BÀI 3: ĐÈN GIAO THÔNG Bài tập 1: Ban đầu bật từng LED sáng tắt mà không có tác động của các công tắc. Viết chương trình để: Bật sáng LED đỏ chỉ trong một khoảng thời gian ngắn và sau đó tắt đi. Bật sáng LED xanh chỉ trong một khoảng thời gian ngắn và sau đó tắt đi Bật sáng LED vàng chỉ trong một khoảng thời gian ngắn và sau đó tắt đi Nhấp nháy LED đỏ Nhấp nháy cả 3 LED Chương trình mẫu: ******************************** ORG 0000H ;Reset LJMP MAIN ORG 0003H ;INT0 RETI ;do nothing ORG 000BH ;Timer 0 RETI ;do nothing ORG 0013H ;INT1 RETI ;do nothing ORG 001BH ;Timer 1 RETI ;do nothing ORG 0023H ;Serial port JNB SCON.SerialIntExit SerialIntExit: RETI ;do nothing *********************************** ORG 60H ;start of program MAIN: CLR P1.3 ;red led: on LCALL DELAY_10S ;wait for a second SETB P1.3 ;red led: off CLR P1.0 ;green led: on LCALL DELAY_10S ;wait for a second SETB P1.0 ;green led: off CLR P1.1 ;yellow led: on LCALL DELAY_10S ;wait for a second SETB P1.1 ;yellow led: off MOV R0,#5 ;set times you want to repeat LCALL NHAY_LED_DO ;run a sub program MOV R0,#5 ;set times you want to repeat LCALL NHAY_BA_LED ;run a sub program ACALL MAIN ;enable if you want repeat SJMP $ ;finish program and do nothing NHAY_LED_DO: CLR P1.3 LCALL DELAY_1S SETB P1.3 LCALL DEALY_1S DJNZ R0,NHAY_LED_DO RET NHAY_BA_LED: MOV P1,#11110100B LCALL DELAY_1S MOV P1,#11111111b LCALL DELAY_1S DJNZ R0,NHAY_BA_LED RET DELAY_10S: MOV R1,#10 ACALL DELAY RET DELAY: LOOP1_1: MOV R2,#100 LOOP1_2: MOV R3,#100 LOOP1_3: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R3,LOOP1_3 DJNZ R2,LOOP1_2 DJNZ R1,LOOP1_1 RET END Sơ đồ giải thuật chương trình : Đặt thời gian nhấp nháy LED đỏ Khởi động chương trình Clear P1.3 : bật LED đỏ Gọi hàm con DELAY_1S Set P1.3 : tắt LED đỏ Clear P1.0 : bật LED xanh Gọi hàm con DELAY_1S Set P1.0 : tắt LED xanh Clear P1.1 : bật LED vàng Gọi hàm con DELAY_1S Set P1.1 : tắt LED vàng Gọi hàm con NHAY_LED_DO Đặt thời gian nhấp nháy 3 LED Gọi hàm con NHAY_3_LED Kết thúc Bài tập 2: Bây giờ bạn có thể điều khiển nhiều hơn một ngõ ra. Bước tiếp theo là đọc một ngõ vào. Khi công tắc không tích cực, đường tương ứng ỡ mức cao, và LED sẽ sáng. Khicông tắc được tích cực, nhấp nháy một LED. Viết chương trình để: Bật sáng LED đỏ nếu công tắc 1 không tích cực. Bật sáng LED xanh nếu công tắc 2 không tích cực Nhấp nháy LED đỏ chừng nào mà công tắc 1 còn tích cực, bật LED đỏ khi công tắc 1 không tích cực. Nhấp nháy LED vàng chừng nào mà công tắc 2 còn tích cực, bật LED vàng khi công tắc 2 không tích cực. Chương trình mẫu: ***************************** ORG 0000H ;reset LJMP MAIN ORG 0030H ;INT0 RETI ;do nothing ORG 000BH ;timer 0 RETI ;do nothing ORG 0013H ;INT1 RETI ;do nothing ORG 001BH ;timer 1 RETI ;do nothing ORG 0023H ;serial port JNB SCON.0,SerialIntExit SerialIntExit: RETI ;do nothing ******************************* ORG 60H MAIN: CLR P1.3 CLR P1.1 JNB P3.2,FLASH_RED TT: JNB P3.3,FLASH_YELLOW SJMP MAIN FLASH_RED: SETB P1.3 LCALL DELAY_1S CLR P1.3 LCALL DELAY_1S SJMP TT FLASH_YELLOW: SETB P1.1 LCALL DELAY_1S CLR P1.1 LCALL DELAY_1S SJMP MAIN DELAY_1S: MOV R1,#10 LOOP1_1: MOV R2,#100 LOOP1_2: MOV R3,#100 LOOP1_3: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R3,LOOP1_3 DJNZ R2,LOOP1_2 DJNZ R1,LOOP1_1 RET END Sơ đồ giải thuật chương trình : Không tich cưc =0 Tích cực=1 Không tich cưc =0 Tích cực=1 Khởi động chương trình Clear P1.3 : bật LED đỏ Clear P1.1 : bật LED vàng P3.2 = 0? Gọi hàm con NHAY_LED_DO Gọi hàm con NHAY_LED_DO Gọi hàm con NHAY_LED_VANG P3.3 = 0? Bài tập 3: Viết chương trình cho bộ điều khiển đèn giao thông theo các yêu cầu sau: Công tắc 1 Công tắc 2 LED đỏ LED vàng LED xanh Hở Hở OFF OFF ON Hở Đóng ON ON OFF Đóng Hở OFF OFF ON Đóng Đóng OFF OFF OFF Xây dựng chương trình và nạp vào kit thí nghiệm. Theo dõi chương trình và quan sát các LED khi cho chạy từng bước mỗi một câu lệnh. Đóng / mở sw1 và 2 để thay đổi trang thái LED để chắc rằng chương trình đúng trường hợp. Chương trình mẫu: ***************************************************** ORG 0000H ;reset LJMP MAIN ORG 0030H ;INT0 RETI ;do nothing ORG 000BH ;timer 0 RETI ;do nothing ORG 0013H ;INT1 RETI ;do nothing ORG 001BH ;timer 1 RETI ;do nothing ORG 0023H ;serial port JNB SCON.0,SerialIntExit SerialIntExit: RETI ;do nothing ***************************************************** ORG 60H ;start of program MAIN: MOV A,P3 CJNE A,#11110111B,TT0 ;SW1:0FF AND SW2:ON MOV P1,#11110101B ;RED AND YELLOW TT0: CJNE A,#11111011B,TT1 ;SW1:0N AND SW2:OFF MOV P1,#11111110B ;GREEN TT1: CJNE A,#11110011B,TT2 ;SW1:ON AND SW2:ON MOV P1,#11111111B ;ALL LED OFF TT2: CJNE A,#11111111B,MAIN ;ALL SWITCHS OFF MOV P1,#11111110B ;GREEN SJMP MAIN END Sơ đồ giải thuật chương trình : SĐ SĐ Đ Đ SĐ Khởi động chương trình Ghi (P3) vào A A=11110111B A=11110011B Ghi 11110111B vào P1 (sw1:ON, sw2:ON) Ghi 11110111B vào P1 (sw1:ON,sw2:OFF) A=11111111B Ghi 11111111B vào P1 (sw1:OFF,sw2:OFF) Đ Kết thúc Câu hỏi 2: Có thể viết lại chương trình câu 2 theo dạng câu 3 được không? Hãy viết lại để kiểm chứng? ************************** ORG 00H LJMP MAIN ORG 03H RETI ORG 0BH RETI ORG 13H RETI ORG 1BH RETI ORG 23H JNB SCON.0,SeriallntExit SeriallntExit: RETI ****************************** ORG 60H MAIN: MOV A,P3 CJNE A,#11111111B,TT0 MOV P1,#11110101B TT0: CJNE A,#11111011B,TT1 SETB P1.3 LCALL DELAY_1S CLR P1.3 LCALL DELAY_1S SJMP TT1 TT1: CJNE A,#11110111B,MAIN SETB P1.1 LCALL DELAY_1S CLR P1.1 LCALL DELAY_1S SJMP MAIN DELAY_1S: MOV R1,#10 ACALL DELAY RET DELAY: LOOP1_1: MOV R2,#10 LOOP1_2: MOV R3,#100 LOOP1_3: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R3,LOOP1_3 DJNZ R2,LOOP1_2 DJNZ R1,LOOP1_1 RET SJMP MAIN END Kết luận:BÀI 4: BIẾN ĐỔI A/D TRÊN BOARD TB-1 Bài tập : Viết một chương trình Assembler sử dụng bộ biến đổi A/D ở chế độ single-ended với biến trở nối vào kênh 0 ( tức chân 3) trên chip A/D thông qua khối đầu cuối ( terminal block) trên bo TB-1. Thay đổi điện áp vào tương tự và hiển thị giá trị của nó. Nối biến trở vào kênh 0 , sau đó hiển thị đồng thời ca hai giá trị đó ra P0, P2. Thay đổi các giá trị điện áp vào tương tự và quan sát các kết quả. Chương trình mẫu: ***************DEFINITION********** ADCCS BIT P3.7 ADCCLK BIT P1.6 ADCDIN BIT P1.4 ADCDOUT EQU P1 ****************INTERRUPT HANDLERS******** ORG 00H ;reset LJMP MAIN ORG 03H ;INTO RETI ;do nothing ORG 0BH ;timer 0 RETI ;do nothing ORG 13H ;INT1 RETI ;do nothing ORG 1BH ;timer 1 RETI ;do nothing ORG 23H ;serial port RETI ;do nothing ********************************** ORG 4BH ;data & subrountines ****************************************** MAIN: MOV B,#0 ;select channel_0 ACALL CONVERT MOV P2,A ;send channel_0 to port_2 ******************************* MOV B,#1 ;select channel_1 ACALL CONVERT MOV P0,A ;send channel_1 to port_0 *************************************** SJMP MAIN CONVERT: *************RESET ADC ************************* SETB ADCCS CLR ADCCLK SETB ADCDIN ************ START CONVERSION ********** CLR ADCCS ACALL DELAY ************ START BIT ******** SETB ADCDIN ACALL CLOCK ************** SGL/DIF BIT ************ SETB ADCDIN ACALL CLOCK ACALL ODD_SIGH ACALL SELECT ACALL READ_ADC RET ************** ODD/SIGH BIT ************ ODD_SIGH: JNB B.0,ELSE SETB ADCDIN AJMP CLOCK ELSE: CLR ADCDIN QUIT: ACALL CLOCK RET ****************** SELECT BIT ********** SELECT: JNB B.1,ELSE1 SETB ADCDIN AJMP QUIT1 ELSE1: CLR ADCDIN QUIT1: ACALL CLOCK RET ************** READ_ADC**************** READ_ADC: SETB ADCDIN MOV R0,#8 MOV A,#0 ACALL CLOCK LOOP3: MOV R7,ADCDOUT CJNE R7,#0AFH,ELSE2 CLR C RLC A ACALL CLOCK DJNZ R0,LOOP3 AJMP EXIT1 ELSE2: SETB C RLC A ACALL CLOCK DJNZ R0,LOOP3 EXIT1: RET **************************************** CLOCK: SETB ADCCLK CLR ADCCLK RET ************************************* DELAY: MOV R0,#1 LOOP0: MOV R1,#100 LOOP1: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R1,LOOP1 DJNZ R0,LOOP0 RET END Sơ đồ giải thuật chương trình : Khởi động chương trình Ghi 0 vào B (chọn kênh 0) Kết thúc Gọi hàm con CONVERT Ghi 1 vào B (chọn kênh 1) Ghi A vào P2 (gửi kênh 0 ra P2) Gọi hàm con CONVERT Ghi A vào P0 (gửi kênh 1 ra P0) Câu hỏi 2: Điện áp ngõ vào là bao nhiêu để ADC đọc giá trị 0x0FFH? Trả lời: điện áp ngõ ra đo được là 2,5V Câu hỏi 4: Tại sao khi tăng giá trị điện áp ngõ vào kênh 0 thì giá trị ADC của kênh 1 có xu hướng tăng theo? Trả lời: kênh 1 chưa được nối mass nên sẽ chịu ảnh hưởng của nhiễu. Câu hỏi 5: Sửa lại chương trình để đọc ADC kênh 2, 3 thay cho kênh 0, 1 như lúc đầu. Chạy thử chương trình và thay đổi điện áp ngõ vào kênh 0. Tại sao giá trị điện áp của kênh 0 cũng chịu ảnh hưởng đến kết quả đọc ADC của kênh 2 và 3. ***************DEFINITION********** ADCCS BIT P3.7 ADCCLK BIT P1.6 ADCDIN BIT P1.4 ADCDOUT EQU P1 ****************INTERRUPT HANDLERS******** ORG 00H ;reset LJMP MAIN ORG 03H ;INTO RETI ;do nothing ORG 0BH ;timer 0 RETI ;do nothing ORG 13H ;INT1 RETI ;do nothing ORG 1BH ;timer 1 RETI ;do nothing ORG 23H ;serial port RETI ;do nothing ********************************** ORG 4BH ;data & subrountines ****************************************** MAIN: MOV B,#2 ;select channel_0 ACALL CONVERT MOV P2,A ;send channel_0 to port_2 ******************************* MOV B,#3 ;select channel_1 ACALL CONVERT MOV P0,A ;send channel_1 to port_0 *************************************** SJMP MAIN CONVERT: *************RESET ADC ************************* SETB ADCCS CLR ADCCLK SETB ADCDIN ************ START CONVERSION ********** CLR ADCCS ACALL DELAY ************ START BIT ******** SETB ADCDIN ACALL CLOCK ************** SGL/DIF BIT ************ SETB ADCDIN ACALL CLOCK ACALL ODD_SIGH ACALL SELECT ACALL READ_ADC RET ************** ODD/SIGH BIT ************ ODD_SIGH: JNB B.0,ELSE SETB ADCDIN AJMP CLOCK ELSE: CLR ADCDIN QUIT: ACALL CLOCK RET ****************** SELECT BIT ********** SELECT: JNB B.1,ELSE1 SETB ADCDIN AJMP QUIT1 ELSE1: CLR ADCDIN QUIT1: ACALL CLOCK RET ************** READ_ADC**************** READ_ADC: SETB ADCDIN MOV R0,#8 MOV A,#0 ACALL CLOCK LOOP3: MOV R7,ADCDOUT CJNE R7,#0AFH,ELSE2 CLR C RLC A ACALL CLOCK DJNZ R0,LOOP3 AJMP EXIT1 ELSE2: SETB C RLC A ACALL CLOCK DJNZ R0,LOOP3 EXIT1: RET **************************************** CLOCK: SETB ADCCLK CLR ADCCLK RET ************************************* DELAY: MOV R0,#1 LOOP0: MOV R1,#100 LOOP1: NOP NOP NOP NOP NOP NOP NOP NOP DJNZ R1,LOOP1 DJNZ R0,LOOP0 RET END Kết luận: BÀI 5: HOẠT ĐỘNG ĐỊNH THỜI VÀ HOẠT ĐỘNG NGẮT Bài tập : Viết chương trình đèn giao thông thực tế có sử dụng timer và ngắt ngoài theo yêu cầu sau: Khi không có ngắt, điều khiển đèn sáng luân phiên: xanh – đỏ (0,5s), đỏ - vàng (0,5s), vàng – xanh (0,5s), và lặp lại….giống như đèn giao thông. Khi có ngắt ngoài, điều khiển chớp tắt cả ba đèn cùng lúc cho đến khi có tác động ngắt ngoài lần nữa thì trở lại chương trình đèn giao thông. Chương trình mẫu: **************************************** ;timer0 should gennerate interrupts 0.001 seconds ;timer0 overflow time is calculated as follows: ;0.01 seconds=(timer count value)*(1/22118400Hz)*12 ;because our clock speed is 22.184MHz and timer is advanced by one count every ;12 clock cycles.Therefore,the timer count value is calculated as 18432 .Timer ;starts from its reload value and counts upwards until it overflows at 65536 ;timer reload value is calculated as: ;timer reload value=65536-timer count value ;timer reload value=65536-18432=47104 t10ms equ 47104 ;period of blinking/running(*0.01sek.) period equ 50 ;pins,assigned to LEDs led1 equ P1.3 led2 equ P1.1 led3 equ P1.0 ;switch 1 connected to INT0 pin sw1 equ P3.2 ;TCON bits: TF1 equ TCON.7 TR1 equ TCON.6 TF0 equ TCON.5 TR0 equ TCON.4 IE1 equ TCON.3 IT1 equ TCON.2 IE0 equ TCON.2 IT0 equ TCON.0 ;IE bits EA equ IE.7 ET2 equ IE.5 ES equ IE.4 ET1 equ IE.3 EX1 equ IE.2 ET0 equ IE.1 EX0 equ IE.0 ;8051 stack stack equ $60 ;counts 0-20(*0.025) to generate 0.5 seconds counter1 equ $30 ;timer of INT0 disable counter2 equ $31 ;LEDs status LEDs equ $32 DisableINT0 bit $20.0 ;run/blinking together mode bit $20.1 odd_tact bit $20.2 ;jump to main body of the program ajmp prog ;INT0 interrupt org 3 ajmp int0_sr ;TIMER0 interrupt org 0bh ajmp t0_int ;INT1 interrupt( not used) org 13h reti ;TIMER1 interrupt( not used) org 1bh reti ;UART( serial port)interrupt( not used) org 23h reti ************* Main program******************** ;set stack pointer prog: mov SP,#stack ;TIMER0-16 bit timer mode1 mov a,TMOD anl a,#11110000b orl a,#00000001b mov TMOD,a ;Run TIMER0 setb TR0 ;INT0 low level activated clr IT0 ;Enable both TIMER0 and INT0 mov IE,#00000011b ;TIMER0-high priority mov IP,#00000010B mov counter1,#period mov LEDs,#00000001b ;Global interrupts enable setb EA m001: ;Set idle mode,loop forever until interrupted mov a,pcon orl a,#10000000b mov pcon,a sjmp m001 ****************TIMER0 interrupt service routine************** t0_int: push psw push acc ;clear interrupt flag clr TF0 ;Load TIMER0 for next 0.01 sek mov TL0,#t10ms mov TH0,#=t10ms ;suppress swich contacts bouncing: ;INT0 will remain disabled till SW1 will ;relised and 0.1 sek more jnb sw1,ti01 ;if INT0 is temporary disabled count time ;and exit i.s.r. jnb DisableINT0,ti01 djnz counter2,ti01 ;re-enable INT0 clr DisableINT0 setb ex0 ;Drive LEDs ;count 0.01 sek.intervals and exits i.s.r. ti01: djnz counter1,ti02 ;reload counter mov counter1,#period ;mode=1-all LEDs are blinking ;mode=0-LEDs are running jb mode,ti03 ;rotate LEDs 1 position left mov a,LEDs mov c,acc.2 rlc a mov LEDs,a ;drive LED pins ti05: mov c,acc.0 mov led1,c mov c,acc.1 mov led2,c mov c,acc.2 mov led3,c sjmp ti02 ;LEDs are blinking ti03: cpl odd_tact jb odd_tact,ti04 ;at even tacts will turn LEDs OFF mov a,#0 sjmp ti05 ;at odd tacts will turn them ON ti04: mov a,#00000111b sjmp i05 ti02: pop acc pop psw reti ************** External interrupt0 service rountine********* int0_sr: ;clear interrupt flag clr ie0 ; to prevent multiple interrupts due to the bouncing of ;switch contacts, disable it for 0.1 seconds clr ex0 ;load counter for 0.1 seconds mov counter2,#10 setb disableINT0 ;change mode from blinking to shift or vice versa cpl mode mov LEDs,#00000001b reti BÀI 6: BÀN PHÍM MA TRẬN 4X4 Bài tập : Xác định sơ đồ chân và cách bố trí ma trận của bàn phím sử dụng chức năng đo điện trở của máy đo vạn năng. Viết một chương trình Assembler để hiện thị lên màn hình giá tri của phím được nhấn trên bàn phím. Chương trình mẫu: ;***********DIFINITIONS********** ;-------------R0,R7 REGISTERS------------ ;R0- ;R1- ;R2- ;R3- ;R4-key index ;R5-row counter ;R6-counter for delay ;R7-counter for delay ;-------------LOWER BANK RAM------------------ FLAGS EQU 20H ;REGISTER OF EVENTS MAX_ROW EQU 4 ;KEYPAD DEFINITIONS COL1 BIT P2.4 COL2 BIT P2.5 COL3 BIT P2.6 COL4 BIT P2.7 ON_FLAG BIT FLAGS.0 ;=1if any pressed key was found TI BIT SCON.1 TR1 BIT TCON.6 CR EQU 0DH