#include unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01};unsigned char i;void delay(void){unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void){while(1){if(table[i]!=0x01){P0=table[i];i++;delay();}else{i=0;}}} ********************************************************************/ *在用表格进行程序设计的时候,要用以下的指令来完成 *(1).利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。 *(2).利用MOVC A,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。 *因此,只要把控制码建成一个表,而利用MOVC A,@A+DPTR做取码的操作,*就可方便地处理一些复杂的控制动作.*/ORG 0000HLJMP STARTORG 0100HSTART:MOV DPTR,#TABLE ;取DPTR的地址,即表格的起始地址LOOP: CLR A;对A清零MOVC A,@A+DPTR ;查表CJNE A,#01H,LOOP1;判断是否到了表格的结尾处,当A等于01时程序往下执行,否则跳到 LOOP1 LJMP START ;跳到程序的开头循环执行LOOP1: MOV P0,A;把取得的表格数据送到P0LCALL DELAY ;延时INC DPTR;DPTR加一,即把DPTR指向下一个表格单元LJMP LOOPDELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;以下为流水灯的花样表格,每个数据对应一个时刻下的LED的状态;TABLE的数据最后会被编译器安排到单片机的FLASH程序存储区里,CPU运行时只能读取,不能修改。TABLE: DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 00H, 0FFH,00H, 0FFHDB 01HEND