/********************************************* 用AT89C2051做的8只LED显示摇摇棒 文章地址 http://www.66kv.cn/Article/ShowArticle.asp?ArticleID=77 **********************************************/ #include #define SEG 17 //每帧图片分成17列来显示 #define INTERVAL 20 //每幅图片在左右摇摆20次后换下一幅 typedef unsigned char uchar; typedef unsigned int uint; code char pattern[17][3]={ //3幅图片的字模 {0xff,0xff,0xff}, {0xff,0xff,0xff}, {0xff,0xff,0xff}, {0xff,0x9f,0xff}, {0xff,0x6f,0xf9}, {0xff,0x77,0x65}, {0xfe,0xbb,0x1e}, {0x7e,0xdd,0xfe}, {0x00,0xee,0xfe}, {0x7e,0xdd,0xfe}, {0xfe,0xbb,0x1e}, {0xff,0x77,0x65}, {0xff,0x6f,0xf9}, {0xff,0x9f,0xff}, {0xff,0xff,0xff}, {0xff,0xff,0xff}, {0xff,0xff,0xff}, }; uchar phase,th1,tl1,index,count; main() { EA=0; EX0=1; ET1=1; PX0=1; IT0=1; TMOD=0x11; index=0; EA=1; while(1) { } } void Int0_Handle(void) interrupt 0 using 2 { uint t0_time; TR0=0; TR1=0; TF1=0; t0_time=TH0<<8|TL0; TL0=0; TH0=0; TR0=1; t0_time=65535-t0_time/SEG; th1=t0_time/256; TH1=th1; tl1=t0_time % 256; TL1=tl1; if (count<3*INTERVAL){ //3幅图片循环 count++; } else{ count=0; } index=count/INTERVAL; if (th1!=0xff || tl1!=0xff){ //如果摆动特别慢,定时器溢出就不显示 phase=0; TR1=1; } else{ TR1=0; } } void Timer1(void) interrupt 3 using 3 { if (phase