rendered paste body#include "8052.h"/*-----------------------------------------------------------------*\ * 禮拜二實驗三進階題 * * 主字元是 LOVE * * 一開始顯示 L 慢慢向右移動 * * 同時 O 慢慢出現 * * 等 O 到正中央時變成慢慢往上移動 * * 同時 V 慢慢出現 * * 等 V 到正中央時變成慢慢往左移動 * * 同時 E 慢慢出現 * * 等 E 到正中央時變成慢慢往下移動 * * 同時 L 慢慢出現 * * 回到第一個步驟 繼續周而復始 *\*-----------------------------------------------------------------*//*code char word [ ] = { 0xff , 0x00 , 0x00 , 0x00 , 0x00 , 0x41 , 0x41 , 0x7f , 0x41 , 0x41 , 0x00 , 0x00 , 0xff , 0x00 , 0x00 }; // 大字型*/code char love[]= { 0x00, 0x02, 0x02, 0x3e, 0x00, 0x00, 0x3e, 0x22, 0x3e, 0x00, 0x00, 0x3c, 0x02, 0x3c, 0x00, 0x00, 0x2a, 0x2a, 0x3e, 0x00 };code char serial [ ] ={ 0x01 , 0x02 , 0x04 , 0x08 , 0x10 };// display 是要顯示在點矩陣的字char display[] = {0x00, 0x02, 0x02, 0x3e, 0x00}; // L 的字型void delay (int t );void show ();int count = 0, act = 0;int now_display = 0;int mode = 0; // 四種模式 上下左右 show L(0) -> O(1) -> V(2) -> E(3)void main ( ) { int x , i = 4; while (1) { //for ( x = 0;x<i;x++) // show(x); show(); // s has no effect }}void show () { int x,y; for ( x=0;x<100;x++) for ( y=0;y<5;y++) { P3=serial[y]; P1 = display[y]^0xff; delay(100); count++; if (count == 400 && mode == 0) { // right count = 0; /* * 因為 5*7 點矩陣左右移動 5 個字就可以換到下一個字。 * 所以 act < 5 用於計算左右移動 * 左右移動的原理就是直接向左或向右傳遞字型檔 * eg. 一開始向右 就是 把 [1]->[0] [x] 表示第幾行字型檔, -> 表示丟過去 * [2]->[1], [3]->[2], [4]->[3] 最後再把 [4] 放進去最新要顯示的那行字型檔即可 */ if (act < 5) { act++; now_display++; // 0~5 display[0] = love[now_display]; display[1] = love[now_display+1]; display[2] = love[now_display+2]; display[3] = love[now_display+3]; display[4] = love[now_display+4]; } else { // act 清空以便下個字計算移動了幾次 act = 0; // 換向上 mode = 1; // 因為向上移動時表示已經移動到下一個字 // 而下一個字的最後一個字元是在自行檔的第 2*5 = 10 個位置 now_display=10; } } else if (count == 400 && mode == 1) { //up count = 0; /* * * 參考附件 png 圖檔說明 * 點矩陣上下移動要 7 個才可以換到下一個字 所以 act < 7 用於上下移動 */ if (act < 7) { act++; display[0] = display[0]<<1 | ((love[now_display]>>(7-act))&0x01); display[1] = display[1]<<1 | ((love[now_display+1]>>(7-act))&0x01); display[2] = display[2]<<1 | ((love[now_display+2]>>(7-act))&0x01); display[3] = display[3]<<1 | ((love[now_display+3]>>(7-act))&0x01); display[4] = display[4]<<1 | ((love[now_display+4]>>(7-act))&0x01); } else { act = 0; mode = 2; now_display = 20; } } else if (count == 400 && mode == 2) { // left count = 0; /* * * 原理跟向右相反 * */ if (act < 5) { act++; now_display--; display[4] = display[3]; display[3] = display[2]; display[2] = display[1]; display[1] = display[0]; display[0] = love[now_display]; } else { now_display = 0; act = 0; mode = 3; } } else if (count == 400 && mode == 3) { // down count = 0; /* * * 原理跟向上相反 參考圖檔 * */ if (act < 7) { act++; display[0] = display[0]>>1 | ((love[now_display]<<(7-act))&0x40); display[1] = display[1]>>1 | ((love[now_display+1]<<(7-act))&0x40); display[2] = display[2]>>1 | ((love[now_display+2]<<(7-act))&0x40); display[3] = display[3]>>1 | ((love[now_display+3]<<(7-act))&0x40); display[4] = display[4]>>1 | ((love[now_display+4]<<(7-act))&0x40); } else { act = 0; mode = 0; } } }}void delay(int t) { int x; for (x=0;x<t;x++) ;}