【正文】
的原因,將輸出電流。需注意的是:如果加密位 LB1被編程,復(fù)位時(shí)內(nèi)部會鎖存EA 端狀態(tài)。時(shí)鐘可以由內(nèi)部方式產(chǎn)生或外部方式產(chǎn)生。 復(fù)位電路的基本功能是:系統(tǒng)上電時(shí)提供復(fù)位信號,直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號。最先由 8 個(gè) LED 組成一條,然后把 8 條 LED 組合成一個(gè) LED 點(diǎn)陣,最后把 8 個(gè)點(diǎn)陣組合為一個(gè)立方體,實(shí)現(xiàn)每一層共陽極接入到 P3 口。 acall anjian //檢測按鍵 djnz r4,loop33 //沒有 8 次循環(huán) ret //返回 yudian: mov dptr,table1 //保存束移表格 mov a,r1 //將 r1 值作為指針給 a movc a,a+dptr //查表 mov p2,a //結(jié)果送入 p2 口 acall suo //調(diào)用鎖存程序 ret //返 回 suo: mov dptr,table1 //保存第一類鎖存表格 mov a,r2 //將 r2 作為指針給 a movc a,a+dptr //查表 mov p1,a //結(jié)果送 p1 口 mov p1,00H //鎖存 ret //返回 suo2: mov dptr,table3 //保存第二類鎖存地址 mov a,r2 //將 r2 作為指針給 a movc a,a+dptr //查表 mov p1,a //結(jié)果送 p1 口 mov p1,00H //鎖存 ret //返回 bo1: mov dptr,table2 //保存橫向波紋表格 22 mov a,r1 //將 r1 作為指針給 a movc a,a+dptr //查表 mov p2,a //結(jié)果送 p2 口 ret //返回 bo2: mov dptr,table3 //保存縱向波紋表格 mov a,r1 //將 r1 作為指針給 a movc a,a+dptr //查表 mov p2,a //結(jié)果送 p2 口 ret //返回 table1: db 3fH,1fH,0fH,07H,03H,01H table2: db 1fH,0fH,07H,03H,01H,00H table3: db 5fH,2fH,17H,0bH,05H,02H //結(jié)束程序 an: lcall guanbi //調(diào)用關(guān)閉程序 jmp an //無限循環(huán) //關(guān)閉所有輸出 guanbi: mov p2,0ffH //關(guān)閉 p2 口 mov p1,0ffH //同步輸出 mov p1,00H //鎖存 mov p3,0ffH //關(guān)閉 p3 口 ret //返回 /* //按鍵檢測 子程序 anjian: mov p0,0ffH //p0 口復(fù)位 mov a,p0 //取 p0 口值 cjne a,0ffH,loop1 //判斷是否有按鍵按下有按鍵按下跳轉(zhuǎn) ret //無按鍵返回 23 loop1: lcall yanshi //調(diào)用延時(shí)去抖動 mov a,p0 //取 p0 口值 cjne a,0ffH,loop2 //判斷是否有按鍵按下有按鍵按下跳轉(zhuǎn) jmp loop1 //沒檢測到循環(huán) loop2: jnb ,kaishi // 按下跳轉(zhuǎn) jnb ,jieshu // 按下跳轉(zhuǎn) jnb ,zdjx // 按下跳轉(zhuǎn) jnb ,jian // 按下跳轉(zhuǎn) jmp jixu //誤讀跳轉(zhuǎn)繼續(xù) jian: ljmp jiancha //跳轉(zhuǎn)檢查程序 jmp jian //循環(huán) kaishi: ljmp cengyi //跳轉(zhuǎn)層移程序 jmp kaishi //循環(huán) jieshu: ljmp an //跳轉(zhuǎn)結(jié)束程序 jmp jieshu //循環(huán) zdjx: cjne r4,1,ting1 //判斷 口為第幾次按下 第一次跳轉(zhuǎn)暫停程序( r4 為 1)第二次執(zhí)行繼續(xù)指令 mov r4,00H //將 r4 復(fù)位 jmp jixu //跳轉(zhuǎn)繼續(xù)指令 ting1: mov r4,1 //將 r4 置 1 ting2: acall anjian //檢測按鍵 jmp ting2 //無按鍵按下停止 jixu: mov b,3 mov a,r0 //取程序序號程序 mul ab //因?yàn)槊看伍L條轉(zhuǎn)為 3 字節(jié) 所以每次乘 3 mov dptr,jjmp //保存跳轉(zhuǎn) 表格 jmp a+dptr //按表格轉(zhuǎn)移 jjmp: ljmp loop11 ljmp loop21 ljmp loop31 24 //按鍵去抖動延時(shí)子程序 yanshi: mov r6,120 dly: mov r7,248 djnz r7,$ djnz r6,dly ret */ // 延時(shí)子程序 delay: mov r5,20 dly1: mov r6,100 dly2: mov r7,100 djnz r7,$ djnz r6,dly2 djnz r5,dly1 ret // 延時(shí)程序 delay1: mov r5,8 dly3: mov r6,100 dly4: mov r7,100 djnz r7,$ djnz r6,dly4 djnz r5,dly3 ret end //程序結(jié)束 主程序 include include include include include 25 include include xdata unsigned char cube[CUBE_SIZE][CUBE_SIZE]=0。j8。 UART_Send(cData)。 z++){ _nop_()。amp。amp。 } else { clrvoxel(x,y,z)。 } // Sets all voxels along a Z/Y plane at a given point // on axis X void setplane_x (int x) { int i。amp。 zCUBE_SIZE) { 29 for (x=0。amp。 if (y=0 amp。 yCUBE_SIZE) { for (z=0。 break。 int y。 for (x=0。 } //Draw a box with all walls drawn and all voxels inside set void box_filled(int x1, int y1, int z1, int x2, int y2, int z2) { int iy。 argorder(z1, z2, amp。 32 } } } // Darw a hollow box with side walls. void box_walls(int x1, int y1, int z1, int x2, int y2, int z2) { int iy。 argorder(z1, z2, amp。 } else { cube[ix][iy] |= ((0x01 z1) | (0x01 z2))。y2)。 // Lines along Y axis for (iy=y1。ix++) { setvoxel(ix,y1,z1)。 // We always want to draw the line from x=0 to x=7. // If x1 is bigget than x2, we need to flip all the values. if (x1x2) { int tmp。 z2 = z1。 } else { xz = (float)(z2z1)/(float)(x2x1)。 // copy the current cube into a buffer. } // Shift the entire contents of the cube along an axis // This is great for effects where you want to draw something // on one side of the cube and have it flow towards the other // side. Like rain flowing down the Z axiz. void shift (char axis, int direction) { int i, x ,y。 x CUBE_SIZE。 altervoxel(x,ii,y,state)。 y CUBE_SIZE。 z == 0) || (x == 0 amp。 z == 0) || (x == 0 amp。 z == 0) || (x == 7 amp。 z == 0) || (x == 7 amp。 if (lol == 2) dz = 0。amp。 if (z == 7 amp。 clrvoxel(x,y,z)。 } snake[0][0] = x。i8。 y = rand()%8。 loop++。 } for (i=0。 i++) { positions[i] = 4。 getvoxel(x,y,z) == 0x00)) { altervoxel(x,y,z,state)。 } else { fill(0xff)。 } delay_ms(delay)。 snake[i][1] = snake[i1][1]。 if (drawmode == 0x01) // show one voxel at time { setvoxel(x,y,z)。amp。 dy == 1) dy = 1。 if (lol == 0) dx = 0。 y == 7 amp。 y == 0 amp。 y == 7 amp。 y == 0 amp。 x CUBE_SIZE。 altervoxel(x,y,ii,state)。 } else { ii = (7i)。 setvoxel(x,y,z)。 } if (z1z2) { 34 xz = (float)(z1z2)/(float)(x2x1)。 y1 = tmp。 // how many voxels do we move on the y axis for each step on the x axis unsigned char x,y,z。 } // Lines along X axis for (ix=x1。 cube[x2][y1] = byteline(z1,z2)。 argorder(y1, y2, amp。iy=y2。y1, amp。iy=y2。y1, amp。s drawn in it. // byteline(2,5) gives 0b00111100 char byteline (int start, int end) { return ((0xffstart) amp。 } } } void tmpfill (unsigned char pattern) { int x。 break。 break。 if (y=0 amp。= ~(1 z)。 int y。 if (z=0 amp。 } } // Clears voxels in the same manner as above void clrplane_x (int x) { int i。 } *ox1 = ix1。 } } else { return 0。amp。= ~(1 z)。 y++){ for (