嘿嘿,自我感覺不錯(cuò)。就是這個(gè)用手搖晃的東西有點(diǎn)累。
補(bǔ)充下,這個(gè)慣性開關(guān) 就是把單片機(jī)的兩個(gè)引腳引出來,然后在負(fù)極上接上一根彈性導(dǎo)線,搖動(dòng)的時(shí)候這個(gè)彈性導(dǎo)線會(huì)向兩邊擺動(dòng)而觸動(dòng)到兩個(gè)引腳(為了增加慣性,我得彈性導(dǎo)線很長,并且在頂端彎了幾個(gè)圈增加慣性)。為了防止擺動(dòng)出來,我在兩個(gè)引腳上加了一段帶皮導(dǎo)線,這樣就能隨便亂晃,不至于導(dǎo)線出來
| 正面,上面一排是發(fā)光二極管。右下角的是慣性開關(guān)
關(guān)燈后的效果(視頻截圖,相機(jī)拍不到)
STC12C5a60S2單片機(jī)
原理圖,上面少了外震蕩電路和上電復(fù)位電路。其實(shí)這個(gè)單片機(jī)在寫入程序后可設(shè)置為內(nèi)部晶振,然后晶振和復(fù)位 ...
源程序:
- #include //單片機(jī)頭文件
- #define DY_DELAY 5 //設(shè)置每一個(gè)點(diǎn)顯示的時(shí)間長度(1~20)
- sbit KEY1 = P1 ^ 2; //搖動(dòng)慣性開關(guān)
- sbit KEY2 = P1 ^ 3;
- sbit LED1 = P0 ^ 3; //LED燈定義,低電平時(shí)亮(自上到下)
- sbit LED2 = P0 ^ 4;
- sbit LED3 = P0 ^ 5;
- sbit LED4 = P0 ^ 6;
- sbit LED5 = P0 ^ 7;
- sbit LED6 = P4 ^ 6;
- sbit LED7 = P4 ^ 5;
- sbit LED8 = P4 ^ 4;
- sbit LED9 = P2 ^ 7;
- sbit LED10 = P2 ^ 6;
- sbit LED11 = P2 ^ 5;
- sbit LED12 = P2 ^ 4;
- sbit LED13 = P2 ^ 3;
- sbit LED14 = P2 ^ 2;
- sbit LED15 = P2 ^ 1;
- sbit LED16 = P2 ^ 0;
- /*********************************************************************************************/
- unsigned char code logo[] = { // (取碼:從上到下從左到右,縱向8位下高位)
- //"老",
- 0x40,0x40,0x40,0x20,0x48,0x10,0x48,0x08,
- 0x48,0x04,0x48,0x7E,0x7F,0x91,0xC8,0x90,
- 0x4C,0x88,0x68,0x88,0x50,0x84,0x48,0x86,
- 0x4C,0x80,0x60,0xE0,0x40,0x00,0x00,0x00,
- //"婆",
- 0x00,0x04,0x84,0x04,0xC9,0x87,0x22,0x84,
- 0x06,0x4D,0x80,0x54,0x7E,0x26,0x12,0x24,
- 0x32,0x26,0x52,0x55,0x9F,0x4C,0x52,0x85,
- 0x32,0x06,0x0A,0x06,0x06,0x04,0x00,0x00,
- //"我",
- 0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84,
- 0xFE,0x7F,0x23,0x02,0x22,0x21,0x20,0x10,
- 0xFF,0x09,0x20,0x06,0x22,0x1A,0xAC,0x61,
- 0x20,0x80,0x30,0xE0,0x20,0x00,0x00,0x00,
- //"愛",
- 0x40,0x00,0xB0,0x00,0x92,0x40,0x96,0x30,
- 0x9A,0x8C,0x92,0x83,0xF2,0x46,0x9E,0x2A,
- 0x92,0x12,0x91,0x2A,0x99,0x26,0x95,0x42,
- 0x91,0xC0,0x50,0x40,0x30,0x00,0x00,0x00,
- //"你",
- 0x40,0x00,0x20,0x00,0xF8,0xFF,0x07,0x00,
- 0x40,0x00,0x20,0x08,0x18,0x04,0x0F,0x43,
- 0x08,0x80,0xC8,0x7F,0x08,0x00,0x08,0x01,
- 0x28,0x06,0x18,0x0C,0x00,0x00,0x00,0x00
- }
- void delay (unsigned int a){ // 用于點(diǎn)掃描的延時(shí)
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 1; i++);
- }
- }
- void DELAY_MS (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- void DISPLAY_OFF (void){
- delay(DY_DELAY);//顯示停留
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- void DISPLAY_PIN (unsigned char d,unsigned char e){ //第1列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){LED1 = 0;}DISPLAY_OFF();
- i = d & 0x02;
- if(i == 0x02){LED2 = 0;}DISPLAY_OFF();
- i = d & 0x04;
- if(i == 0x04){LED3 = 0;}DISPLAY_OFF();
- i = d & 0x08;
- if(i == 0x08){LED4 = 0;}DISPLAY_OFF();
- i = d & 0x10;
- if(i == 0x10){LED5 = 0;}DISPLAY_OFF();
- i = d & 0x20;
- if(i == 0x20){LED6 = 0;}DISPLAY_OFF();
- i = d & 0x40;
- if(i == 0x40){LED7 = 0;}DISPLAY_OFF();
- i = d & 0x80;
- if(i == 0x80){LED8 = 0;}DISPLAY_OFF();
- i = e & 0x01;
- if(i == 0x01){LED9 = 0;}DISPLAY_OFF();
- i = e & 0x02;
- if(i == 0x02){LED10 = 0;}DISPLAY_OFF();
- i = e & 0x04;
- if(i == 0x04){LED11 = 0;}DISPLAY_OFF();
- i = e & 0x08;
- if(i == 0x08){LED12 = 0;}DISPLAY_OFF();
- i = e & 0x10;
- if(i == 0x10){LED13 = 0;}DISPLAY_OFF();
- i = e & 0x20;
- if(i == 0x20){LED14 = 0;}DISPLAY_OFF();
- i = e & 0x40;
- if(i == 0x40){LED15 = 0;}DISPLAY_OFF();
- i = e & 0x80;
- if(i == 0x80){LED16 = 0;}DISPLAY_OFF();
- }
- void init (void){
- P4SW = 0xff; //啟動(dòng)P4接口
- P0M0 = 0xff; //接口設(shè)置為強(qiáng)推
- P2M0 = 0xff;
- P4M0 = 0xff;
- P1 = 0xff; //初始IO接口狀態(tài)
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- void main (void)
- {
- unsigned char a,c;
- init();//初始程序
- while(1)
- {
-
-
- if(KEY2 == 0)
- {
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<80;a++)
- { //這里的“80”是這個(gè)字幕需要掃描的列數(shù),修改字幕時(shí)必須修改此參數(shù)。
- DISPLAY_PIN (logo[c],logo[c+1]); //“LOGO”是第一個(gè)字幕的數(shù)據(jù)表名
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0)
- {
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 158;
- for(a=1;a<80;a++)
- {
- DISPLAY_PIN (logo[c],logo[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- }
- }
復(fù)制代碼 |