VXL_Thi HK_AY1213-S2_trang 1/9 
ĐHQG TPHCM–ĐH Bách Khoa 
Khoa Đ-ĐT–BM Điện Tử 
 
Điểm Đề thi HK 2 – NH:2012-2013 
Môn:
 Vi xử lý – Mã MH: 402030 
Ngày thi:
 29/05/2013 – Thời gian làm bài: 110 phút 
Đề có 8 trang (có 2 trang tóm tắt) và SV làm trực tiếp trên đề. 
Tổng số câu là 10, tổng số điểm là 11, và SV chỉ cần làm đạt 10. 
(SV KHÔNG được dùng tài liệu 
SV KHÔNG được dùng ĐTDĐ, PC, Laptop, iPad và PC Tablet) 
Chữ ký giám thị 
Họ và tên SV: __________________________ MSSV: ____________ Nhóm: ______ 
Bộ môn Điện Tử duyệt GV ra đề 
 
 
 
 
 
Hồ Trung Mỹ 
Chú ý: Xem phụ lục để biết các cách giải khác nếu có. 
Câu 1: (1 đ) Cho trước mạch giải mã địa chỉ của hệ thống dùng VXL 8051: 
 
a) (0.5 đ) Xác định vùng địa chỉ của các SRAM: 
 Vùng địa chỉ của SRAM thứ nhất (U1): 5800H – 5FFFH 
 Vùng địa chỉ của SRAM thứ hai (U2): 7000H – 77FFH 
 
b) (0.5đ) Viết các lệnh 8051 để chép 10 byte bắt đầu từ địa chỉ đầu của SRAM thứ nhất (U1) vào RAM 
nội của 8051 bắt đầu từ địa chỉ 30H: 
MOV DPTR,#5800H 
MOV R0,#30H 
MOV R1.#10 
Loop: 
MOVX A,@DPTR 
MOV @R0,A 
INC R0 
INC DPTR 
DJNZ R1,Loop 
SJMP $ 
Cách 2: dùng CJNE 
MOV DPTR,#5800H 
MOV R0,#30H 
Loop: 
MOVX A,@DPTR 
MOV @R0,A 
INC R0 
INC DPTR 
CJNE R0,#3AH,Loop 
SJMP $ 
VXL_Thi HK_AY1213-S2_trang 2/9 
Câu 2: (1.5 đ) Điền vào các chỗ trống trong các cột địa chỉ ROM chương trình, mã máy và các cách địa chỉ: 
Địa chỉ 
ROM (hex) 
Mã máy (hex) Lệnh 8051 
Cách định địa chỉ của toán hạng 
thứ nhất thứ hai  
ORG 0  
0000 D2 80 SETB P0.0  
0002 75 90 FF MOV 
P
1,#0FFH
Trực tiếp (byte) Tức thời 
0005 E5 90 LL: MOV A,P1 
0007 60 04 
J
Z Nxt 
0009 30 80 01 
J
NB P0.0,Nxt
Trực tiếp (bit) Tương đối 
000C F4 CPL A  
000D F5 A0 Nxt: MOV P2,A  
000F 80 F4 SJMP LL  
0011 END  
Câu 3: (1 đ) 
a) (0.5 đ) Viết chương trình con hợp ngữ 8051 có tên là MAX_XY để thực hiện hàm max(X,Y) (nếu X  Y 
thì kết quả X; nếu ngược lại, kết quả là Y) với X và Y là các số nguyên 8 bit không dấu, X là thanh ghi A, 
Y là số trong RAM nội có địa chỉ trong thanh ghi R0 và kết quả đặt trở lại vào A. Nếu chương trình con 
này có dùng các thanh ghi khác A và R0 thì phải bảo lưu giá trị của nó sau khi ra khỏi chương trình con. 
b) (0.5 đ) Viết đoạn chương trình hợp ngữ 8051 
dùng chương trình con MAX_XY để tìm cực đại của 16 số 
nguyên 8 bit không dấu ở trong RAM nội có địa chỉ đầu là 30H và kết quả được cất vào ô nhớ ở RAM 
nội có địa chỉ 40H. Đầu đoạn chương trình này ta phải gán trị SP để cho stack có thể cất dữ liệu vào stack 
từ địa chỉ 60H. 
Bài giải. 
a) b) 
Cách 2
: dùng CJNE 
MAX
_
XY: MOV SP,#5FH MOV SP,#5FH
PUSH B MOV R0,#30H MOV R0,#30H
MOV B,@R0 MOV R1,#16 MOV A,@R0
CJNE A,B,Nxt MOV A,@R0
L
oop: 
Nxt: JC LT Loop: ACALL MAX
_
XY
SJMP Fin ACALL MAX
_
XY INC R0 
LT: MOV A,B INC R0 CJNE R0,#40H,Loop 
Fin: POP B DJNZ R1,Loop MOV @R0,A 
RET MOV @R0,A SJMP $  
S
JMP $ 
Câu 4: (1 đ) Xét 1 mạch 8051 với các công tắc: SW1 được nối với P1.0, SW2 được nối với P1.1. SW3 
được nối với P1.2, SW4 được nối với P1.3 và P1.7 được nối với điện trở 300 nối tiếp LED nối lên +5V. 
Hãy viết chương trình hợp ngữ cho mạch này. Qui luật hoạt động của mạch như sau: 
P1.1 P1.0 Phép toán P1.1 P1.0 Phép toán Chú thích 
0 0 F = NOT(X) 1 0 F = X OR Y F = P1.7 
X = P1.2 và Y = P1.3 
0 1 F = X AND Y 1 1 F = X XOR Y 
Bài giải. 
ORG 0 MOV C,X SJMP Fin 
TT EQU 20H 
C
JNE A,#0,CP1
E
Q3: JNB Y, Fin
X EQU TT.2 CPL C CPL C 
Y EQU TT.3 
S
JMP Fin
F
in: MOV F,C 
F EQU P1.7 CP1: CJNE A,#1,CP2 SJMP Loop
MOV P1,#0FH ANL C,Y END 
Loop: MOV A,P1 
S
JMP Fin
MOV TT,A CP2: CJNE A,#2,EQ3 
ANL A,#03H 
O
RL C,
Y 
VXL_Thi HK_AY1213-S2_trang 3/9 
Câu 5: (1 đ) Giả sử trước khi thực thi chương trình này, nội dung của 1 số ô nhớ trong RAM nội: 
(30H) = 46H, (31H) = 85H, (32H) = 97H 
Lệnh 8051 Lần lặp 1 Lần lặp 2 Lần lặp 3 
MOV R0,#30H  
MOV R1,#3 
MOV R2,#0 
Loop: 
MO
V
 A,@R0 A 
= 
4
6
H
 A 
= 
8
5
H
 A = 
9
7
H
JNB ACC.7,Next 
INC R2 
R
2 = 
0
0
H 
R
2 = 
0
1
H
 R2 = 
0
2
H 
Next: 
INC R0 
R
0 = 
3
1
H 
R
0 = 
3
2
H
 R0 = 
3
3
H
DJNZ R1,Loop 
MOV @R0,2 
SJMP $ 
a) (0.5 đ) Hãy điền vào các giá trị của A, R2, và R0 cứ sau thực thi lệnh cùng hàng trong bàng trên. 
Khi thực thi đến lệnh “SJMP $” thì nội dung của ô nhớ sau có trị số là: (33H) = 02H 
b) (0.5 đ) Ý nghĩa của đoạn chương trình trên là: 
 Đếm các số âm trong N số đầu tiên (N trong R1) của mảng có địa chỉ 
đầu trong RO và cất kết quả vào phần tử N+1  
Câu 6: (1 đ) Cho trước mạch sau với ngõ ra P0 của 8051 lái LED 7 đoạn loại CA:  
Mạch này hoạt động như sau: 
P1.0 = Count = khi có cạnh xuống thì giá trị hiển thị của LED được tăng thêm 1. 
Chuỗi số hiển thị ở LED 7 đoạn tương tự như bộ đếm lên khi có các cạnh xuống liên tục ở P1.0: 
0, 1, 2, 3, . . . , 9, 0, 1, 2, . . . 
a) (0.5 đ) Viết chương trình con 
BCD2LED7S hiển thị 1 ký số BCD trong thanh ghi A ra LED 7 đoạn. Nội 
dung của thanh ghi A không bị thay đổi sau khi gọi chương trình con này. 
b) (0.5 đ) Viết chương trình làm việc theo yêu cầu trên dùng thanh ghi A chứa số đếm và dùng chương trình 
con 
BCD2LED7S để hiển thị. 
Bài giải. 
a) ; đ
ị
n
h ngh
ĩ
a hi
ể
n
 th
ị
b)
BCD2LED7S: 
O
RG 1
0
0H
C
ount EQU P1.0
PUSH ACC 
LED7S: ; hgfedcba MOV P1,#01H 
MOV DPTR,#LED7S 
DB 11000000B; 
0
 CLR A 
MOVC A,@A+DPTR 
DB 11111001B; 
1
 Loop: 
MOV P0,A 
DB 10100100B; 
2
 ACALL BCD2LED7S 
POP ACC 
DB 10110000B; 
3
 JNB Count,$; đợi =1 
RET 
DB 10011001B; 
4
 JB Count,$; đợi =0  
DB 10010010B; 5 INC A  
DB 10000010B; 6 CJNE A,#10,Loop  
DB 11111000B; 7 CLR A  
DB 10000000B; 8 SJMP Loop  
DB 10010000B; 9 
VXL_Thi HK_AY1213-S2_trang 4/9 
Câu 7: (1.5 đ) Xét 8051 với XTAL = 12 MHz và cho trước chương trình con Delay sau: 
Chương trình con Delay Số MC 
Delay: MOV R1,#250 1 
L1: MOV R0,#250 1 
L2: NOP 1 
NOP 1 
DJNZ R0, L2 2 
DJNZ R1, L1 2 
R
ET 2 
a) (0.5 đ) Hãy ghi số chu kỳ máy (MC) cho mỗi lệnh trong bảng trên và từ đó suy ra thời gian trễ của 
chương trình con này. Nếu muốn làm trễ 150 ms thì ta phải nạp cho R1 giá trị là bao nhiêu? 
b) (0.5 đ) Hãy viết lại chương trình con làm trễ 150 ms dùng Timer 0 (không dùng ngắt Timer). 
c) (0.5 đ) Hãy viết lại chương trình con làm trễ 150 ms dùng ngắt Timer 0. 
Bài giải. 
a) 1 MC = 12/(12MHz) = 1 s 
Thời gian trễ T được tính như sau: 
T = 1 + (1 + (1 + 1 + 2) x 250 + 2) x 250 + 2 MC = 250753 s  250 ms 
Để c
ó T = 150 ms thì phải nạp giá trị cho R1 là 150. 
b) CT con làm trễ 150 ms hỏi vòng cờ TF0: c) CT con làm trễ 150 ms dùng ngắt Timer 0: 
Delay
_
150ms: 
D
elay
_
150ms:
MOV TMOD,#1 MOV TMOD,#1 
MOV R2,#3 MOV R2,#4 
Loop: 
C
LR F0
MOV TL0,#LOW(–50000) 
SETB EA 
SETB ET0 
 MOV TH0,#LOW(–50000)
S
ETB TF0 
SETB TR0 
J
NB F0,$ 
JNB TF0 
R
ET
CLR TR0 
DJNZ R2,Loop 
T
0
_
ISR:
RET 
D
JNZ R2,Skip  
C
LR TR0  
S
ETB F0 
C
LR ET0  
R
ET
I 
S
kip: CLR TR0 
 MOV TL0,#LOW(–50000)
 MOV TH0,#LOW(–50000) 
S
ETB TR0 
 R
ET
I  
C
hú ý:
t
ạ
i
 đ
ị
a
 ch
ỉ
 0BH có  
O
RG 
0
BH  
L
JMP 
T
0
_
ISR  
Câu 8: (1 đ) 
Xét 1 hệ thống gồm 2 vi xử lý 8051 M1 và M2 được kết nối theo kiểu modem rỗng (null modem) để 
truyền nối tiếp với nhau. M1 có nhiệm vụ đọc liên tục 1 số BCD nén có 2 ký số từ cổng P1 (giả sử ngõ vào ở 
P1 luôn được cung cấp số BCD nén 2 ký số hợp lệ) và gửi nối tiếp số này đến M2, M2 có nhiệm vụ nhận nối 
tiếp liên tục số này và tính tổng bình phương của mỗi k
ý số BCD và xuất ra P2. Thí dụ như nếu ở ngõ vào P1 
của M1 có giá trị 25H (biểu diễn BCD nén của số 25) thì ngõ ra P2 của M2 ta sẽ thấy số 29 (vì 2
2
 + 5
2
 = 4 + 
25 = 29).Cả 2 VXL đều sử dụng cổng nối tiếp có tốc độ baud là 9600 và XTAL = 11.059 MHz. Chú ý ta 
không dùng ngắt nối tiếp mà chỉ hỏi vòng RI và TI. 
VXL_Thi HK_AY1213-S2_trang 5/9 
Thi VXL_AY1213 – Họ và tên SV: __________________________ MSSV: ____________ Nhóm: ____ 
Bài giải. 
Chương trình 8051 ở M1 Chương trình 8051 ở M2 
Các chương trình con gửi/nhận1 
byte nối tiếp và tra bảng tính A
2 
ORG 0 ORG 0 SP_TRANSMIT: 
; Khởi động Timer 1 để ; Khởi động Timer 1 để
JNB TI, $ 
; có tốc độ baud 9600 ; có tốc độ baud 9600
CLR TI 
MOV TMOD,#20H MOV TMOD,#20H
MOV SBUF, A
MOV TH1,#–3 MOV TH1,#–3
RET 
SETB TR1 SETB TR1
; Đặt cấu hình chỉ phát ; Đặt cấu hình chỉ thu
Chú ý: 
MOV SCON,#01000010B MOV SCON,#01010000B
Nếu ban đầu cho TI=0
MOV P1,#0FFH L2:
thì CTC này là:
L1: ACALL SP_RECEIVE
MOV SBUF, A 
MOV A,P1 MOV B, A
JNB TI, $
ACALL SP_TRANSMIT ANL A,#0FH
CLR TI 
SJMP L1 ACALL A_SQUARE
RET 
 MOV R1,A 
 MOV A, B SP_RECEIVE: 
 SWAP A
JNB RI, $
 ANL A,#0FH
CLR RI 
 ACALL A_SQUARE
MOV A, SBUF 
ADD A,R1
RET  
MOV P2,A 
 SJMP L2  
A_SQUARE: 
 MOV DPTR,#TBL
 MOVC A,@A+DPTR
 RET 
 TBL: DB 0, 1, 4, 9, 16
 DB 25,36,49,64,81 
Câu 9: (1 đ) 
Viết chương trình hợp ngữ 8051 (XTAL=12MHz) để tạo xung vuông (có T
ON
 = T
OFF
) ở ngõ ra P1.5 như sau: 
 Sau khi reset thì ngõ ra P1.5 có xung xuông với chu kỳ T = 50 ms. 
 Nếu có cạnh xuống ở chân ngắt ngoài 0 (/INT0) thì từ đó ngõ ra P1.5 có xung với chu kỳ T = 50 ms. 
 Nếu có cạnh xuống ở chân ngắt ngoài 1 (/INT1) thì từ đó ngõ ra P1.5 có xung với chu kỳ T = 100 ms. 
Giả sử các xung kích cạnh xuống ở các ngõ /INT0 và /INT1 không bao giờ xảy ra đồng thời. 
Bài giải. 
ORG 0 Loop: JB F0,Load_1 
LJMP Main Load_0: MOV TH0,#HIGH(–25000) 
EX0_ISR: CLR F0 MOV TL0,#LOW(–25000) 
RETI SJMP Continue 
ORG 0013H Load_1: MOV TH0,#HIGH(–50000) 
EX1_ISR: SETB F0 MOV TL0,#LOW(–50000) 
RETI Continue: 
Main: SETB TR0 
SETB P3.2 ; /INT0 JNB TF0,$ 
SETB P3.3 ; /INT1 CLR TR0 
MOV TMOD,#1 CLR TF0 
MOV IE,#85H CPL P1.5 
SETB IT0 SJMP Loop 
SETB IT1 END   
VXL_Thi HK_AY1213-S2_trang 6/9 
Câu 10: (1 đ) 
Viết chương trình hợp ngữ hoặc C (chỉ chọn một)
 cho 8051 để làm sáng các LED đơn được nối với cổng P1 
(hình tròn đen tương ứng LED sáng và ngõ ra của 8051 ở mức 0 làm LED sáng). Nếu ngõ vào P0.0 = 0 thì 
sáng theo qui luật ở mẫu 1 (TD: trước hết tất cả các LED tắt trong 150 ms, kế tiếp chỉ có các LED ở P1.3 và 
P1.4 sáng trong 150 ms, , cuối cùng chỉ có các LED ở P1.7 và P1.0 sáng trong 150 ms, và lặp lại) , và nếu 
ngõ vào P0.0 = 1 thì sáng theo qui luật ở mẫu 2. 
Các LED ở P1.7 . . . P1.0 Thời điểm (ms) 
  
  
  
  
  
  
  
 . . . 
 Các LED ở P1.7 . . . P1.0 Thời điểm (ms) 
  
  
  
  
  
  
  
. . . 
Mẫu 1 Mẫu 2 
Giả sử cho trước chương trình con Delay_150ms (làm trễ 150 ms). 
Bài giải. 
Chương trình hợp ngữ Chương trình C (Keil C) 
 ORG 0 
SETB P0.0 
 MOV DPTR,#STATE_TBL 
 MOV R0,#0 ; PTR cho mẩu 1 
 MOV R1,#0 ; PTR cho mẩu 2 
; R0 và R1 chỉ trạng thái mấy 
Loop: 
JB P0.0, Pattern_2 
Pattern_1: 
 MOV A,R0 
 MOVC A,@A+DPTR 
 MOV P1,A 
ACALL Delay_150ms 
 INC R0 
 CJNE R0,#6,Loop 
 MOV R0,#0 
 SJMP LOOP 
Pattern_2: 
 MOV A,R1 
ADD A,#6 
 MOVC A,@A+DPTR 
 MOV P1,A 
ACALL Delay_150ms 
 INC R1 
 CJNE R1,#6,Loop 
 MOV R1,#0 
 SJMP LOOP 
STATE_TBL: 
DB 0FFH,0E7H,0C3H,99H,3CH,7EH 
DB 0FFH,7EH,3CH,99H,0C3H,0E7H 
 END  
#include <reg51.h> 
#define STATES 6 
sbit control = P0^0; 
void Delay_150ms(); 
// cho trước CTC làm trễ 150 ms  
void main() 
{ 
char pattern[2][STATES]= 
{{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E}, 
 {0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}};
char index[2]={–1,–1}; 
char select; 
char i;  
control = 1; // Input pin  
while(1) 
{ 
select =(control != 1)? 0:1; 
index[select]=(index[select]+1)%STATES;
P1 = pattern[select][index[select]]; 
Delay_150ms(); 
} // End of while 
} // End of Main  
Kết thúc bài thi HK 
150
0
300
450
600
750
900
150
0
300
450
600
750
900
VXL_Thi HK_AY1213-S2_trang 7/9 
Phụ lục 
Câu 4: 
Cách 2
: dùng JMP @A+DPTR 
ORG 0 
TT EQU 20H 
X EQU TT.2 
Y EQU TT.3 
F EQU P1.7 
MOV P1,#0FH 
MOV DPTR,#JMP_TABLE 
Loop: MOV A,P1 
MOV TT,A 
MOV C,X 
ANL A,#03H 
RL A 
JMP @A+DPTR 
JMP_TABLE: 
 AJMP Case0 
 AJMP Case1 
 AJMP Case2 
 AJMP Case3 
C
ase0:
CPL C 
SJMP Fin 
Case1: 
ANL C,Y 
SJMP Fin 
Case2: 
ORL C,Y 
SJMP Fin 
Case3: 
JNB Y, Fin 
CPL C 
Fin: 
MOV F,C 
SJMP Loop 
END     
Cách 3:
 kiểm tra từng bit vào dùng JB và JNB 
ORG 0 
TT EQU 20H 
B0 EQU TT.0 ; chứa P1.0 
B1 EQU TT.1 ; chứa P1.1 
X EQU TT.2 
Y EQU TT.3 
F EQU P1.7 
MOV P1,#0FH 
MOV DPTR,#JMP_TABLE 
Loop: 
MOV A,P1 
MOV TT,A 
MOV C,X 
JB B1,Case_1_B0 
Case_0_B0: ; P1.1 = 0 
JNB B0,Case0 
SJMP Case1 
Case_1_B0: ; P1.1 = 1 
JNB B0,Case2 
SJMP Case3  
Case0: 
CPL C 
SJMP Fin 
Case1: 
ANL C,Y 
SJMP Fin 
Case2: 
ORL C,Y 
SJMP Fin 
Case3: 
JNB Y, Fin 
CPL C 
Fin: 
MOV F,C 
SJMP Loop 
END   
VXL_Thi HK_AY1213-S2_trang 8/9 
Câu 10: Chương trình hợp ngữ 
Cách 2:
 dùng 2 bảng 
ORG 0 
SETB P0.0 
 MOV R0,#0 ;Pointer cho mẩu 1 
 MOV R1,#0 ;Pointer cho mẩu 2 
; R0 và R1 chỉ trạng thái mấy 
Loop: JB P0.0, Pattern_2 
Pattern_1: 
MOV A,R0 
MOV DPTR,#STATE_TBL1 
 MOVC A,@A+DPTR 
 MOV P1,A 
ACALL Delay_150ms 
 INC R0 
 CJNE R0,#6,Loop 
 MOV R0,#0 
 SJMP LOOP 
Pattern_2: 
MOV A,R1 
 MOV DPTR,#STATE_TBL2 
 MOVC A,@A+DPTR 
 MOV P1,A 
ACALL Delay_150ms 
 INC R1 
 CJNE R1,#6,Loop 
 MOV R1,#0 
 SJMP LOOP 
STATE_TBL1: DB 0FFH,0E7H,0C3H,99H,3CH,7EH 
STATE_TBL2: DB 0FFH,7EH,3CH,99H,0C3H,0E7H 
 END  
Cách 3:
 xuất hết mẫu rồi mới kiểm tra P0.0 
ORG 0 
SETB P0.0 
 MOV R0,#0 ;Pointer cho mẩu 1 hoặc 2 
Loop: JB P0.0, Pattern_2 
Pattern_1: 
MOV A,R0 
 MOV DPTR,#STATE_TBL1 
 MOVC A,@A+DPTR 
 MOV P1,A 
ACALL Delay_150ms 
 INC R0 
 CJNE R0,#6,Pattern_1 
 MOV R0,#0 
 SJMP LOOP 
Pattern_2: 
MOV A,R0 
 MOV DPTR,#STATE_TBL2 
 MOVC A,@A+DPTR 
 MOV P1,A 
ACALL Delay_150ms 
 INC R0 
 CJNE R0,#6,Pattern_2 
 MOV R0,#0 
 SJMP LOOP 
STATE_TBL1: DB 0FFH,0E7H,0C3H,99H,3CH,7EH 
STATE_TBL2: DB 0FFH,7EH,3CH,99H,0C3H,0E7H 
 END
VXL_Thi HK_AY1213-S2_trang 9/9 
Câu 10: Chương trình C (Keil C) 
Cách 2: dùng 2 bảng 
#include <reg51.h> 
#define STATES 6 
sbit control = P0^0; 
void Delay_150ms(); // cho trước CTC làm trễ 150 ms  
void main() 
{ 
char pattern_1[STATES]= {{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E}}; 
char pattern_2[STATES]= {{0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}}; 
char index_1, index_2; char select;  
control = 1; // Input pin 
index_1 =0; index_2 = 0; 
while(1) 
{ 
 select =(control != 1)? 0:1; 
 if (select == 0) 
 { 
 P1 = pattern_1[index_1]; 
 index_1 = (index_1 + 1)%STATES; 
 } 
 else 
 { 
P1 = pattern_2[index_2]; 
 index_2 = (index_2 + 1)%STATES; 
 } 
 Delay_150ms(); 
} // End of while 
} // End of Main 
Cách 3
: xuất hết mẫu rồi mới kiểm tra P0.0 
#include <reg51.h> 
#define STATES 6 
sbit control = P0^0; 
void Delay_150ms(); // cho trước CTC làm trễ 150 ms  
void main() 
{ 
char pattern_1[STATES]= {{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E}}; 
char pattern_2[STATES]= {{0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}}; 
char index_1, index_2, select, i; 
control = 1; // Input pin 
index_1 =0; index_2 = 0; 
while(1) 
{ 
 select =(control != 1)? 0:1; 
 if (select == 0) 
 { 
 for (i = 0; i < STATES; i++) 
 { 
 P1 = pattern_1[index_1]; 
 index_1 = (index_1 + 1)%STATES; 
 Delay_150ms(); 
 } 
 } 
 else 
 { 
 for (i = 0; i < STATES; i++) 
 { 
 P1 = pattern_2[index_2]; 
 index_2 = (index_2 + 1)%STATES; 
 } 
 } 
} // End of while 
} // End of Main