2.3.1: Giới thiệu 74HC595
Hình 2.19: Cấu tạo của 74HC595
Ở đây 74HC595 là IC gồm 16 chân và chúng có những chức năng sau:
• Chân 8 và 16 lần lượt là GND và VCC có chức năng cấp nguồn cho IC
• Chân 1; 2; 3; 4; 5; 6; 7; 15 là các chân là đầu ra dữ liệu song song.
• Chân 9 là chân ra dữ liệu kết nối.
• Chân 10 là chân Reset tích cực mức thấp. Khi Reset đang ở mức 0 thì các dữ liệu của IC sẽ được Reset lại về mức 0 theo.
• Chân 14 là chân nhận dữ liệu kết nối bên ngồi.
• Chân 13 có tác dụng xuất dữ liệu tích cực mức thấp. Khi đang hoạt động chân này sẽ nối với GND.
• Chân 11 là chân cho phép nhận xung dữ liệu ghi dịch vào chân 14.
2.3.2: Giới thiệu transistor TIP41CHình 2.20: TIP41C Hình 2.20: TIP41C Điện áp cực đại: UC = 100V Dòng cực đại: 6A Hệ số khuếch đại: 15 ~ 75 Nhiệt độ làm việc: -65oC ~ 150oC
Transistor TIP41C là một transistor lưỡng cực – BJT, TIP41C gồm 3 lớp bán dẫn loại P và loại N ghép lại với nhau tạo thành transistor phân cực ngược NPN.
Thứ tự chân của transistor từ trái qua phải là B C E. TIP41C là transistor cơng suất có hệ số khuếch đại trong khoảng từ 15 đến 75, công suất lên đến 65W.
Hình 2.21: IC74HC245
Chức năng của IC này là đệm dữ liệu 2 chiều, thường ứng dụng trong các mạch sử dụng led như quét led matrix, led 7, hoặc đệm dữ liệu trên bus với các mạch sử dụng nhiều linh kiện mắc song song.
Đây là ic số loại 20 chân . chức năng từng chân như sau:
Chân 1: DIR chân chọn hướng dữ liệu : nếu DIR=1 thì input A và output B và ngược lại với DIR=0;
Chân 2=>chân 9 : A0=>A7 data in/output phụ thuộc vào chân DIR Chân 10: GND
Chân 11 =>18: B7=>B0 data in/output phụ thuộc vào chân DIR
Chân 19 : OE chân cho phép tích cực ở mức 0 .nếu 0E=0 thì ic xuất dữ liệu ngược lại OE=1, cấm
2.4: Giới thiệu khối led 3D cube 2.4.1: Giới thiệu 2.4.1: Giới thiệu
Led 3D dạng 8x8x8 được xây dựng lên từ 512 led, xếp thành 8 tầng. Mỗi tầng bao gồm 64 con led. Ở đây các chân anode của 64 led của 1 tầng sẽ được mắc chung vào nhau và gắn chung 8 kathode của 8 led để tạo thành cột. Để hiển thị led thông qua việc quét led theo hang theo cột. Mỗi 1 led trên mạch cube sẽ được coi là điểm ảnh. Xác định điểm ảnh dựa trên trạng thái dữ liệu được đưa ra ở vi điều khiển 89S52.
Dựa trên ngun tắc qt hình, ta có thể thực hiện quá trình hiển thị
khối cube bằng cách quét theo cột.
Để 1 led trên khối mạch hoạt động thì ban đầu nối chân anode chung các tầng với điện thế cao. Lúc đó 64 chân anode của 64 led trong 1 tầng sẽ gắn vào điểm điện thế cao. Rồi sau đó nối chân cathode của led mà ta muốn sáng với điểm điện thế thấp. Như vậy mỗi một led chỉ một trạng thái được xác định. Nhưng sau đó muốn xác định led tiếp theo thì led trước sẽ tắt dần. Vì vậy để hiển thị tồn bộ hình ảnh trên khối led 3D, ta có thể qt khối 3D nhiều lần cùng với tốc độ quét lớn. Mắt người có thể nhận biết được 24 hình/giây nên tốc độ quét phải rất lớn để không nhận ra sự thay đổi nhỏ của đèn led và sẽ nhìn thấy tồn bộ hình ảnh cần hiển thị.
2.4.2: Nguyên lý hoạt động
Việc cấp điện cho các tầng thực hiện bởi 8 transistor PNP. Ở đây 8 chân I/O của vi điều khiển sẽ điều khiển 5 transistor này. Còn việc điện thế thấp sẽ được cung cấp thông qua 64 chân I/O của vi điều khiển. Do khơng có transistor để nhận dịng nên lúc tính tốn điện trở hạn dòng cho led cần lưu ý nhận dịng của I/O. Một lúc nào đó mỗi chân này phải nhận dòng từ 8 led của 1 cột. Trong trường hợp ta muốn cho sáng đồng thời một số led rời rạc trên khối led 3D, hay để hiển thị một ký tự nào đó, ở trường hợp hiển thị tĩnh ta
muốn sáng. Tuy nhiên khi đó một số led ta không mong muốn cũng sẽ sáng, miễn là nó nằm tại vị trí gặp nhau của các cột và hàng mà ta cấp nguồn. Vì vậy trong điều khiển led 3D ta không thể sử dụng phương pháp hiển thị tĩnh mà phải sử dụng phương pháp quét (hiển thị động), có nghĩa là ta phải tiến hành cấp tín hiệu điều khiển theo dạng xung quét trên các hàng và cột cần hiện thị. Để cho mắt nhìn thấy các led khơng bị nháy, thì tần số quét nhỏ nhất cho mỗi chu kỳ là khoảng 20HZ (50ms). Trong lập trình điểu khiển led 3D bằng vi xử lý ta cũng phải sử dụng phương pháp quét như vậy. Khối led 3D số chân ra là 16, trong đó 8 chân ra dùng để điều khiển hang và 8 chân điều khiển cột.
CHƯƠNG 3
NỘI DUNG THIẾT KẾ MẠCH 3.1: Sơ đồ thiết kế
Mạch gồm các thành phần chính: IC89S52, TIP41C, khối cube 8x8x8, IC ghi dịch 74HC595
Hình 3.2: Sơ đồ khối vi điều khiển 89S52
Ở đây vi điều khiển 89S52 làm nhiệm vụ chuyển đổi dữ liệu từ song song sang nối tiếp của khối led.
3.1.2: Khối ghi dịch
Hình 3.3: Sơ đồ khối ghi dịch
Mạch này sử dụng các IC 74HC595 có chức năng ghi dịch 8bit kết hợp chốt dữ liệu , đầu vào nối tiếp đầu ra song song. Ngồi ra cịn để tiết kiệm số chân vi điều khiển tối đa.
1. Khi đưa 1 bit dữ liệu vào chân 14 của 74HC595 cần có một xung từ thấp đến cao trên chân 11. Khi đó bit dữ liệu này được ghi trong thanh ghi dịch.
2. Khi đủ 8 bit và có 1 xung từ thấp lên cao trên chân 12 thì 8 bit dữ liệu sẽ được chốt vào thanh ghi chứa. Đồng thời 8 bit dữ liệu vẫn còn trong thanh ghi dịch.
3. Khi dữ liệu đã ở trong thanh ghi chứa mà chân 13 đang ở mức thấp thì dữ liệu sẽ được đẩy vào vùng đệm 3 trạng thái và dữ liệu xuất hiện ở đầu ra song song.
4. Chân 10 được dùng để xóa thanh ghi dịch, nếu chân 10 ở mức thấp thì thạn ghi dịch sẽ bị xóa.
5. Khi trong thanh ghi dịch đã đủ 8 bit mà chứa thêm bit thứ 9 thì bit đầu tiên bị đẩy ra đầu ra và bit thứ 9 sẽ nhảy vào thanh ghi dịch.
3.1.3: Khối nguồn
Hình 3.4: Sơ đồ khối nguồn
Hình 3.5: Sơ đồ mạch in Mạch hồn thành thực tế
Hình 3.7: khung led 3D dạng 8x8x8
Khi xây dựng khối led 8x8x8 ta có thể phát triển lên thành 10x10x10 hay 16x16x16 hoặc có thể phát triển lớn thành NxNxN với nhiều loại vi điều khiển khác nhau. Đồng thời tạo nên các hiệu ứng đẹp nhấp nháy theo nhạc cho phép tạo ảnh động trong led.
Với khối led 8x8x8 ta có thể xây dựng mạch theo 2 phương pháp khác ngoài phương pháp sử dụng IC ghi dịch 74HC595. Thứ nhất là tận dụng chân vi điều khiển 89S52 (có sẵn 32 chân), trong đó có 64 chân điều khiển cột và 8 chân điều khiển lớp nhưng phương pháp này có nhược điểm là tốn chân In/Out của vi điều khiển, không thực hiện được các công việc khác nếu cần. Thứ hai là phương pháp quét 3 bít kết hợp transistor làm khóa điện tử, phương pháp này dễ qt nhưng code lập trình lớn, khơng thích hợp với vi điều khiển 89S52 có bộ nhớ thấp (8kB), ta có thể mở rộng phương pháp này với các họ vi điều khiển khác có bộ nhớ lớn và phổ biến hiện nay như PIC, AVR…
Trong thời gian thực hiện và làm thực tập là những khoảng thời gian
giúp em học hỏi nhiều kinh nghiệm cũng như bài học quý giá. Do kiến thức bản thân cịn nhiều hạn chế khơng tránh khỏi nhiều thiếu sót, em mong nhận được ý kiến nhận xét của thầy cô và bạn bè giúp em hoàn thiện và phát triển đề tài hơn.
Cuối cùng em xin chúc thầy cô sức khỏe ,vui vẻ gặp nhiều thành công trong sự nghiệp của mình.
Tài liệu tham khảo :
Bài giảng Vi xử lý-Vi điều khiển, Trường đại học Kỹ Thuật Công Nghiệp. Bài giảng Kỹ thuật Vi xử lý, Học viện bưu chính viễn thơng.
Giáo trình Vi xử lý-Vi điều khiển, Trường đại học sao đỏ- Bộ cơng thương. Giáo trình Vi điều khiển, Trường đại học cơng nghiệp.
PHỤ LỤC 1 CODE LẬP TRÌNH #include<REGX52.h> #include<stdlib.h> #include<string.h> unsigned char i, j, k, y, z, t, n, m[8]={0,0,0,0,0,0,0,0}; sbit SDI = P1^1; sbit CLK = P1^0; sbit STR = P1^2;
void delay(unsigned int t) {while(t--);} void nhap(unsigned char m)
{ unsigned char a, Q; Q = m; for(a=0;a<8;a++){SDI=(Q&0x80)?1:0;CLK=1;CLK=0;Q<<=1;} } void kh() {m[0]=m[1]=m[2]=m[3]=m[4]=m[5]=m[6]=m[7]=0;} void n_x() {
char a;
for(a=0; a<8; a++) nhap(m[7-a]); P2=0; STR=0; STR=1; kh(); }
void xuat() {STR=0; STR=1;} void all(unsigned char b) {
char a;
for(a=0; a<8; a++) { m[a]=b; nhap(m[a]);} STR=0; STR=1;
}
unsigned char H(unsigned char j) {
if(j==0) return 1; else return 2*H(j-1); } void song_td(char c) { code char z[16] [15]={0,0,1,1,2,3,5,6,6,7,7,7,6,6,5,0,0,0,1,1,2,3,4,5,6,7,7,7,6,6,1,0,0,0,0,1,2,3, 4,5,6,7,7,7,7,
2,1,1,0,0,0,1,2,3,4,5,6,6,7,7,3,2,1,1,0,0,0,1,1,2,3,5,6,6,7,5,4,3,2,1,0,0,0,1,1,2,3 ,4,5,6, 6,5,4,3,2,1,0,0,0,0,1,2,3,4,5,7,6,5,4,3,2,1,1,0,0,0,1,2,3,4,7,7,6,6,5,3,2,1,1,0,0,0 ,1,1,2, 7,7,7,6,6,5,4,3,2,1,0,0,0,1,1,6,7,7,7,7,6,5,4,3,2,1,0,0,0,0,5,6,6,7,7,7,6,5,4,3,2,1 ,1,0,0, 4,5,6,6,7,7,7,6,6,5,3,2,1,1,0,2,3,4,5,6,7,7,7,6,6,5,4,3,2,1,1,2,3,4,5,6,7,7,7,7,6,5 ,4,3,2, 0,1,2,3,4,5,6,6,7,7,7,6,5,4,3}; n=t=0; while(1){
for(i=0; i<2; i++){ for(y=0; y<15; y++){
if(y<8) for(k=0; k<=y; k++) { if(c==2) m[k]=H(y-k); else m[7- k]=H(y-k);}
else for(k=y-7; k<=7; k++){ if(c==2) m[k]=H(y-k); else m[7- k]=H(y-k);}
n_x(); P2=H(z[t][y]); }
} t++;
if(t==16){ n++; if(n==10) break; t=0;} } } void song_t(char c) { char a=5; code char z[16] [8]={0,0,1,3,4,6,7,7,0,0,0,1,3,4,6,7,1,0,0,1,2,3,5,6,2,1,0,0,1,2,3,5, 3,2,1,0,0,1,2,3,5,3,2,1,0,0,1,2,6,5,3,2,1,0,0,1,7,6,4,3,1,0,0,0, 7,7,6,4,3,1,0,0,7,7,7,6,4,3,1,0,6,7,7,6,5,4,2,1,5,6,7,7,6,5,4,2, 4,5,6,7,7,6,5,3,2,4,5,6,7,7,6,5,1,2,4,5,6,7,7,6,0,1,3,4,6,7,7,7}; if(c==2) a=6; n=t=0; while(1){
for(i=0; i<a; i++){ for(y=0; y<8; y++){
if(c==2) m[y]=0xff; else for(k=0; k<8; k++) m[k]=H(y); n_x(); P2=H(z[t][y]);
} t++;
if(t==16){ n++; if(n==10) break; t=0; } } } void ss(char l) { switch(l){ case 0: m[3]=m[4]=24; n_x(); break; case 1: m[2]=m[5]=36; n_x(); break; case 2: m[2]=m[5]=24; m[3]=m[4]=36; n_x(); break; case 3: m[1]=m[6]=66; n_x(); break; case 4: m[1]=m[6]=36; m[2]=m[5]=66; n_x(); break; case 5: m[1]=m[6]=24; m[3]=m[4]=66; n_x(); break; case 6: m[0]=m[7]=129; n_x(); break; case 7: m[0]=m[7]=66; m[1]=m[6]=129; n_x(); break; case 8: m[0]=m[7]=36; m[2]=m[5]=129; n_x(); break; case 9: m[0]=m[7]=24; m[3]=m[4]=129; n_x(); break; }
} void song() { code char z[16] [10]={1,5,3,7,7,6,4,6,7,7,0,3,2,7,6,5,6,7,7,7,0,2,1,6,4,3,7,7,7,6,1,1,0,5,3,2,7,7, 6,5, 1,0,0,4,2,1,7,6,4,4,3,0,1,2,1,0,6,5,3,2,4,0,1,1,0,0,5,3,2,1,5,1,3,0,0,0,4,2,1,0, 6,2,4,0,0,1,3,1,0,0,7,4,5,0,1,2,1,0,0,0,7,5,6,1,3,4,0,0,0,1,6,6,7,2,4,5,0,0,1,2, 6,7,7,3,5,6,0,1,3,3,4,7,6,5,6,7,1,2,4,5,3,7,6,6,7,7,2,4,5,6,2,6,4,7,7,7,3,5,6,7}; t=n=0; kh(); while(1){ for(j=0; j<5; j++){ for(y=0; y<10; y++){ ss(y); P2=H(z[t][y]); }
}
}
void L(char x) {
if (x==0) P2_0=1; else if (x==1) P2_1=1; else if (x==2) P2_2=1; else if (x==3) P2_3=1; else if (x==4) P2_4=1; else if (x==5) P2_5=1; else if (x==6) P2_6=1; else if (x==7) P2_7=1;
}
void Lt(char x) {
if (x==0) P2_0=0; else if (x==1) P2_1=0; else if (x==2) P2_2=0; else if (x==3) P2_3=0; else if (x==4) P2_4=0; else if (x==5) P2_5=0; else if (x==6) P2_6=0; else if (x==7) P2_7=0; } void xep() { char b,c; n=6; all(0xff); while(n--){ P2=0; for(b=8; b>0; b--){
for(c=0; c<b; c++){ if(c==0) {L(c); delay(3000);} else {L(c); Lt(c-1); delay(3000);} } } P2=0xff; delay(10000); for(b=7; b>=0; b--){ for(c=b; c<8; c++){ if(c==7) {Lt(c); delay(3000);} else {L(c+1); Lt(c); delay(3000);} } } P2=0; delay(10000); for(b=0; b<8; b++){ for(c=7; c>=b; c--){ if(c==7) {L(c); delay(3000);} else {L(c); Lt(c+1); delay(3000);} } } P2=0xff; delay(10000);
for(c=b; c>=0; c--){ if(c==0) {Lt(c); delay(3000);} else {Lt(c); L(c-1); delay(3000);} } } delay(10000); } } void ba_mat() { char ln; y=10; while(y--){ for(z=0; z<3; z++){ for(t=0; t<8; t++){ if ((t==0)||(t==7)) ln=6; else ln=2; for(k=0; k<ln; k++){
for(j=0; j<8; j++) if(z==0) { m[j]=1; m[t]=0xff;} else if(z==1) {m[j]=H(t); m[7]=0xff;} else {m[j]=128; m[7]=0xff;}
} }}
for(z=0; z<3; z++){ for(t=0; t<8; t++){
if ((t==0)||(t==7)) ln=6; else ln=2; for(k=0; k<ln; k++){
for(j=0; j<8; j++) {if(z==0) { m[j]=128; m[7-t]=0xff;} else if(z==1) {m[j]=H(7-t); m[0]=0xff;} else {m[j]=1; m[0]=0xff;}}
n_x(); P2=0xff; delay(500); P2=0; all(0xff); if(z==2) P2=H(7-t); else P2=128; delay(500); } }} } } void codan() { y=12; while(y--){ all(0); P2=0xff; for(z=0; z<2; z++){ for(i=0; i<8; i++){
delay(4000); else delay(2000); }}
for(z=0; z<2; z++){ for(i=0; i<8; i++){
kh(); if(z==0) m[i]=0xff; else m[7-i]=0xff;
for(n=0; n<8; n++) nhap(m[7-n]); xuat(); if((i==0)||(i==7)) delay(4000); else delay(2000);
}}
P2=0; all(0xff); for(z=0; z<2; z++)
for(i=0; i<8; i++){
if(z==0) P2=H(i); else P2=H(7-i); if((i==0)||(i==7)) delay(4000); else delay(2000);
} } }
void loc(unsigned char a) {
switch(a){
case 1: m[0]=48; m[7]=12; n_x(); break; case 2: m[0]=32; m[1]=64; m[6]=2; m[7]=4; n_x(); break; case 3: m[1]=64; m[2]=128; m[5]=1; m[6]=2; n_x(); break; case 4: m[2]=m[3]=128; m[4]=m[5]=1; n_x(); break; case 5: m[3]=m[4]=129; n_x(); break; case 6: m[2]=m[3]=1; m[4]=m[5]=128; n_x(); break; case 7: m[1]=2; m[2]=1; m[5]=128; m[6]=64; n_x(); break; case 8: m[0]=4; m[1]=2; m[6]=64; m[7]=32; n_x(); break; case 9: m[0]=12; m[7]=48; n_x(); break; } }
void mang(unsigned char a) {
switch(a){
case 0: for(z=0; z<8; z++) m[z]=H(7-z); n_x(); break;
case 1: m[0]=m[7]=0; m[1]=128; m[2]=96; m[3]=16; m[4]=8; m[5]=6; m[6]=1; n_x(); break; case 2: m[0]=m[1]=m[6]=m[7]=0; m[2]=192; m[3]=48; m[4]=12; m[5]=3; n_x(); break; case 3: m[0]=m[1]=m[6]=m[7]=m[2]=m[5]=0; m[3]=240; m[4]=15; n_x(); break;
n_x(); break;
case 5: m[0]=m[1]=m[6]=m[7]=0; m[2]=3; m[3]=12; m[4]=48; m[5]=192; n_x(); break;
case 6: m[0]=m[7]=0; m[1]=1; m[2]=6; m[3]=8; m[4]=16; m[5]=96; m[6]=128; n_x(); break;
case 7: for(z=0; z<8; z++) m[z]=H(z); n_x(); break;
case 8: m[0]=2; m[1]=m[2]=4; m[3]=8; m[4]=m[5]=16; m[6]=32; m[7]=64; n_x(); break; case 9: m[0]=m[1]=4; m[2]=m[3]=8; m[4]=m[5]=16; m[6]=m[7]=32; n_x(); break; case 10: m[0]=m[1]=m[2]=m[3]=8; m[4]=m[5]=m[6]=m[7]=16; n_x(); break; case 11: m[0]=m[1]=m[2]=m[3]=16; m[4]=m[5]=m[6]=m[7]=8; n_x(); break; case 12: m[0]=m[1]=32; m[2]=m[3]=16; m[4]=m[5]=8; m[6]=m[7]=4; n_x(); break; case 13: m[0]=64; m[1]=m[2]=32; m[3]=16; m[4]=m[5]=8; m[6]=4; m[7]=2; n_x(); break; } } void mang_q()
for(i=0; i<10; i++){ for(j=0; j<14; j++){ mang(j); P2=0xff; delay(2000); } } }
void loc_xoay(unsigned char c) {
unsigned char l[21], a=5; if(c==14) a=3;
for(i=0; i<c; i++) { if(i<7)l[i]=l[i+c]=i; else l[i]=i;} n=j=0;
while(1){
for(t=0; t<a; t++){ for(i=0; i<8; i++){
if(c==10) loc(l[i+j]); else mang(l[i+j]); L(i); }
} j++;
if(j==c) {n++; if(n==10) break; j=0;} }
/*void tt(unsigned char t) { if((t>=0)||(t<23)){
if(t<8) m[7-t]=m[7-t]+128; else if (t<15) m[0]=m[0]+H(14-t); else if(t<22) m[t-14]=m[t-14]+1;
} }*/
void tt(unsigned char t) { if((t>=0)||(t<15)){
if(t<8) m[0]=m[0]+H(7-t); else if(t<15) m[t-7]=+1; }
}
/*void chu_cc(unsigned char e, char a) {
switch(a){
case 1: case 7: for(z=1; z<5; z++) tt(e-z); break; case 2: case 6: tt(e); tt(e-1); tt(e-4); tt(e-5); break;
case 3: case 4: case 5: tt(e); tt(e-1); break; }
}
void chu_u(unsigned char e, char a) {
switch(a){
case 1: for(z=1; z<6; z++) tt(e-z); break;
case 2: case 3: case 4: case 5: tt(e); tt(e-1); tt(e-4); tt(e-5); break; }
}
void d_cach(unsigned char e, char a)
{ switch(a){ case 0: tt(e); tt(e-1); tt(e-2); break; }} */
void chu_h(unsigned char e, char a) {
switch(a) {
case 6: case 7: tt(e); tt(e-1); }
}
void chu_p(unsigned char e, char a) {
switch(a){
case 0: case 1: tt(e); tt(e-1); break;
case 2: case 5: for(z=0; z<5; z++) tt(e-z) ; break;
case 3: case 4: for(z=0; z<6; z++) if((z!=2)&&(z!=3)) tt(e-z) ; break; }
}
void chu_a(unsigned char e, char a) {
switch(a){
case 1: case 3: for(z=1; z<6; z++) tt(e-z); break; case 2: tt(e); tt(e-1); tt(e-4); tt(e-5); break;
case 4: tt(e-4); tt(e-5); break;
case 5: for(z=0; z<5; z++) tt(e-z); break; }
}
void chu_i(unsigned char e, char a) {
switch(a){
case 1: case 2: case 3: case 5: case 7: tt(e-1); tt(e-2); break; case 4: tt(e); tt(e-1); tt(e-2); break;
} }
void chu_y(unsigned char e, char a) {
switch(a){
case 0: for(z=0; z<5; z++) tt(e-z); break; case 1: tt(e-4); tt(e-5); break;
} }
void chu_b(unsigned char e, char a) {
switch(a) {
case 2: case 3: case 4: tt(e); tt(e-1); tt(e-4); tt(e-5); break; case 1: case 5: for(z=0; z<5; z++) tt(e-z); break;
case 6: case 7: tt(e); tt(e-1); }
}
void chu_d(unsigned char e, char a) {
switch(a){
case 1: tt(e-4); tt(e-5); break;
case 2: case 5: for(z=1; z<6; z++) tt(e-z); break; case 3: case 4: tt(e); tt(e-1); tt(e-4); tt(e-5); break;
case 6: case 7: tt(e-4); tt(e-5); break; }
}
void chu_t(unsigned char e, char a) {
switch(a){
case 1: tt(e-2); tt(e-3); break;
case 2: case 3: case 5: tt(e-1); tt(e-2); break; case 4: for(z=0; z<4; z++) tt(e-z); break; }
}
void chu_r(unsigned char e, char a) {
switch(a){
case 5: tt(e); tt(e-1); tt(e-3); tt(e-4); break;
case 4: tt(e); tt(e-1); tt(e-2); tt(e-4); tt(e-5); break; case 1: case 2: case 3: tt(e); tt(e-1); break;
void chu_hh(unsigned char e, char a) {
switch(a){
case 0: case 1: case 2: case 5: case 6: case 7: tt(e); tt(e-1); tt(e-4); tt(e- 5); break;
case 3: case 4: tt(e); tt(e-1); tt(e-4); tt(e-5); tt(e-2); tt(e-3); break; }
}
void heart(unsigned char e, char a) {
switch(a){
case 1: tt(e-3); break;
case 2: tt(e-2); tt(e-4); break; case 3: tt(e-1); tt(e-5); break;
case 4: tt(e); tt(e-2); tt(e-5); tt(e-6); break; case 5: for(z=0; z<7; z++) tt(e-z); break; case 6: tt(e-1); tt(e-2); tt(e-4); tt(e-5); break;
}
/*
void chu_c(unsigned char e, char a) {
switch(a){
case 1: case 5: for(z=1; z<5; z++) tt(e-z); break; case 2: case 4: tt(e); tt(e-1); tt(e-4); tt(e-5); break; case 3: tt(e); tt(e-1); break;
} }
void chu_mm(unsigned char e, char a) {
switch(a){
case 1: case 2: case 3: case 7: tt(e); tt(e-1); tt(e-5); tt(e-6); break; case 4: for(z=0; z<7; z++) if((z!=2)&&(z!=4)) tt(e-z); break; case 5: for(z=0; z<7; z++) tt(e-z); break;
case 6: for(z=0; z<7; z++) if(z!=3) tt(e-z); break; }
{
switch(a){
case 5: for(z=0; z<5; z++) tt(e-z); break;
case 1: case 2: case 3: case 4: tt(e); tt(e-1); tt(e-4); tt(e-5); break; }
}
void chu_g(unsigned char e, char a) {
switch(a){
case 0: for(z=0; z<5; z++) tt(e-z); break; case 1: tt(e-4); tt(e-5); break;
case 2: case 5: for(z=1; z<6; z++) tt(e-z); break; case 3: case 4: tt(e); tt(e-1); tt(e-4); tt(e-5); break; }
}
void chu_nn(unsigned char e, char a) {
switch(a){
case 2: case 3: for(z=0; z<7; z++) if((z!=2)&&(z!=3)) tt(e-z); break; case 4: for(z=0; z<7; z++) if((z!=2)&&(z!=4)) tt(e-z); break;
case 5: case 6: for(z=0; z<7; z++) if((z!=3)&&(z!=4)) tt(e-z); break; }
} */ /*
void chu_m(unsigned char e, char a) {
switch(a){
case 1: case 2: tt(e); tt(e-1); tt(e-5); tt(e-6); break;
case 3: for(z=0; z<7; z++) if((z!=2)&&(z!=4)) tt(e-z); break; case 4: for(z=0; z<7; z++) tt(e-z); break;
case 5: for(z=0; z<6; z++) if(z!=3) tt(e-z); break; }
}
void chu_o(unsigned char e, char a) {
switch(a){
case 1: case 5: for(z=1; z<5; z++) tt(e-z); break;
}
void so_2(unsigned char e, char a) {
switch(a){
case 1: for(z=0; z<6; z++) tt(e-z); break;
case 2: case 5: case 6: tt(e); tt(e-1); tt(e-4); tt(e-5); break; case 3: tt(e-2); tt(e-3); break;
case 4: tt(e-3); tt(e-4); break;
case 7: for(z=1; z<5; z++) tt(e-z); break; }
}
void so_0(unsigned char e, char a) {
switch(a){
case 1: case 7: for(z=1; z<5; z++) tt(e-z); break; case 2: case 6: tt(e); tt(e-1); tt(e-4); tt(e-5) ; break; case 3: for(z=0; z<6; z++) if(z!=3) tt(e-z); break; case 4: for(z=0; z<6; z++) tt(e-z); break;
case 5: for(z=0; z<6; z++) if(z!=2) tt(e-z); break; }
}
void so_1(unsigned char e, char a) {
switch(a){
case 1: for(z=0; z<4; z++) tt(e-z); break;
case 2: case 3: case 4: case 6: case 7: tt(e-1); tt(e-2); break; case 5: for(z=0; z<3; z++) tt(e-z); break;
} }
void so_4(unsigned char e, char a) {
switch(a){
case 1: case 7: tt(e-3); tt(e-4); break; case 2: for(z=0; z<6; z++) tt(e-z); break;
case 3: case 4: for(z=0; z<5; z++) if(z!=2) tt(e-z); break; case 5: for(z=1; z<5; z++) if(z!=2) tt(e-z); break;
case 6: for(z=2; z<5; z++) tt(e-z); break; }
void chu_xx(unsigned char e, char a) {
switch(a){
case 1: case 2: case 6: case 7: tt(e); tt(e-1); tt(e-4); tt(e-5); break;