|
本帖最后由 nius 于 2015-4-10 04:10 編輯
這是一款由單片機TC89C52RD為控制核必的2408點陣時鐘電子制作點陣的驅動是用單片機直驅,圖中是用STC89C52單片機,直驅三個8*8的共陽點陣屏,亮度還基本可以,白天看都很清楚!驅動能力不是很好,有條件的話用STC12C5A60S,驅動能力已經比較好,屏的亮度會比較高。白天看都很清楚!P0口需要接上1K的上拉電阻,P1-P3口分別接三個8*8屏的陰極,用去了單片機的全部32個I/O口。為了能調時間,P2口的P2.0-P2.6接屏的1-7列,P2.7口接一個按扭作于調時間,調整方法: 長按一次是進入調時狀態,短按是加1,長按二次是調分,短按是加1,長按3次回復正常狀態! 感興趣的愛好者可以動手實踐一下,體驗一下電子制作點陣時鐘的樂趣。



- //單片機點陣電子鐘C語言程序
- //MCU:STC89C52RD 晶振頻率:12MHZ
- #include <reg52.H>
- #include<stdio.h>
- #define uchar unsigned char //宏定義
- #define uint unsigned int
- sbit KEY=P2^7; //時調整鍵
- uchar keymode; //鍵狀態
- uchar keydate; //鍵值,
- uint keycount; //鍵延時值
- unsigned char c=0; //時分調整位置變量,0不調,1時調時,2時調分
- bit D7,D6; //鍵值有效,長按標志,
- bit SHAN; //閃爍標志位
- uchar second,minute,hour; //定義秒、分、時寄存器
- //以下字模與ASCII對應是,只要將 'A'-0x20就可以得到A的字模了
- //高8*5寬 ASCII碼
- //采用"字模提取軟件V2.2"
- //提取方式:縱向取模,字節倒序
- uchar code ASCII86[10][5]=
- {
- {0x3E,0x41,0x49,0x41,0x3E},//0
- {0x00,0x42,0x7F,0x40,0x00},//1
- {0x72,0x49,0x49,0x49,0x46},//2
- {0x21,0x41,0x49,0x4D,0x32},//3
- {0x18,0x14,0x12,0x7F,0x10},//4
- {0x27,0x45,0x45,0x45,0x38},//5
- {0x3C,0x4A,0x49,0x49,0x31},//6
- {0x41,0x21,0x11,0x09,0x07},//7
- {0x36,0x49,0x49,0x49,0x36},//8
- {0x46,0x49,0x49,0x29,0x16},//9
- };
- uchar code seg[24][3]=
- {
- {0xfe,0xff,0xff},
- {0xfd,0xff,0xff},
- {0xfb,0xff,0xff},
- {0xf7,0xff,0xff},
- {0xef,0xff,0xff},
- {0xdf,0xff,0xff},
- {0xbf,0xff,0xff},
- {0x7f,0xff,0xff},
- {0xff,0xfe,0xff},
- {0xff,0xfd,0xff},
- {0xff,0xfb,0xff},
- {0xff,0xf7,0xff},
- {0xff,0xef,0xff},
- {0xff,0xdf,0xff},
- {0xff,0xbf,0xff},
- {0xff,0x7f,0xff},
- {0xff,0xff,0xfe},
- {0xff,0xff,0xfd},
- {0xff,0xff,0xfb},
- {0xff,0xff,0xf7},
- {0xff,0xff,0xef},
- {0xff,0xff,0xdf},
- {0xff,0xff,0xbf},
- {0xff,0xff,0x7f}
- }; //P1,P3,P2掃描列選碼
- uchar disbuf[]={0,0,0,0,0,0};//定義緩沖數組區
- void delay(uchar t); //延時函數
- void init(); //初始化函數
- void display(); //顯示函數
- void main()
- {
- init(); //調用初始化函數
- P0=0xff; P1=0x00; P3=0x00; P2=0x00;
- for(c=0;c<10;c++) delay(255);
- P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全亮3秒.
- P0=0x00; P1=0x00; P3=0x00; P2=0x00;
- for(c=0;c<10;c++) delay(255);
- P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全滅3秒.
- P0=0xff; P1=0x00; P3=0x00; P2=0x00;
- for(c=0;c<10;c++) delay(255);
- P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全亮3秒.
- P0=0x00; P1=0x00; P3=0x00; P2=0x00;
- for(c=0;c<10;c++) delay(255);
- P1=0xff; P3=0xff; P2=0xff; //測試點陣屏全滅3秒.
- c=0;
- while(1) //主程序循環
- {
- switch(keymode) //鍵盤處理程序
- {
- case 0x00:
- if(KEY==0) { keymode=1; keycount=2;}
- break;
- case 0x01:
- if(keycount==0)
- { if(KEY==0)
- { keymode=2; keydate=1;D7=0;} else {keymode=0; break;}
- }
- else
- {
- keycount--;
- break;}
- case 0x02:
- if(KEY==1)
- { keymode=0; D7=1; break;}
- else
- {keymode=3; keycount=50; break; }
- case 0x03:
- if(KEY==1)
- { keymode=0; D7=1; break;}
- else
- if(keycount==0)
- { keymode=4; D6=1; break; }
- else
- { keycount--; break;}
- case 0x04:
- if(KEY==1)
- {keymode=0; D7=1; break;}
- else
- break;
-
- default: break;
- }
- //以下的鍵值調時間處理
- if(D7==1)
- {
- if(D6==0) {
- if(c==1) hour++;
- if(hour==24) hour=0;
- if(c==2) minute++;
- if(minute==60) minute=0;
- D7=0; }
- else
- {c++; if(c>2) c=0; D6=0; D7=0;}
- }
-
-
- disbuf[0]=(second);
- disbuf[1]=(second/10);
- disbuf[2]=(minute);
- disbuf[3]=(minute/10);
- disbuf[4]=(hour);
- disbuf[5]=(hour/10);
- display(); //調用顯示函數
-
- }
- }
- void init()
- {
- TMOD=1;TH0=0X3C;TL0=0XB0; //定時器0模式1,50毫秒
- ET0=1;TR0=1;EA=1; //開定時器0中斷、啟動定時器0、開總中斷
- }
- void display( )
- {
- unsigned char i,j=0; //j為列位置變量
-
-
- for(i=0;i<5;i++) //時十位
- {
- if(disbuf[5]==0) P0=0x00; //時十分為0時不顯示
- else P0=ASCII86[disbuf[5]];
- P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
- delay(1);
- P1=0xff; P3=0xff; P2=0xff;
- j++;
- }
- j++; //隔一列
-
- for(i=0;i<5;i++) //時個位
- {
- if(c==1&&SHAN)P0=0x00;
- else P0=ASCII86[disbuf[4]]; //調時狀態時個位閃爍
- P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
- delay(1);
- P1=0xff; P3=0xff; P2=0xff;
- j++;
- }
- if(!SHAN) {P0=0x81;} else P0=0x00; //秒閃
-
- P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
- delay(1);
- P1=0xff; P3=0xff; P2=0xff;
- j++;
- for(i=0;i<5;i++) //分十位
- {
- P0=ASCII86[disbuf[3]];
- P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
- delay(1);
- P1=0xff; P3=0xff; P2=0xff;
- j++;
- }
- j++;
- for(i=0;i<5;i++) //分個位
- {
- if(c==2&&SHAN)P0=0x00;
- else P0=ASCII86[disbuf[2]]; //調分狀態時分閃爍
- P1=seg[j][0]; P3=seg[j][1]; P2=seg[j][2];
- delay(1);
- P1=0xff; P3=0xff; P2=0xff;
- j++;
- }
-
- }
- void delay(uchar t)
- {
- uchar i; //定義變量
- for(;t>0;t--) //如果t大于0,t減1(外層循環)
- for(i=124;i>0;i--); //i等于124,如果i大于0,i減1
- }
- void timer0() interrupt 1 //定時器0(中斷1)
- {
- uchar tim1,tim2; //定義臨時變量
- TL0=TL0+0XB0;TH0=0X3C; //重裝定時器初值
- tim1++; //每中斷一次tim1加1
- if(tim1==10) //中斷10(0.5秒)
- {
- SHAN=!SHAN; //閃爍標志取反
- tim1=0;tim2++; //tim1清零,tim2加1
- if(tim2==2) //到了1秒
- {
- tim2=0;second++; //tim2清零,秒加1
- if(second>=60) //如果秒到60
- {
- second=0;minute++; //秒變0,分加1
- if(minute>=60) //如果分到60
- {
- minute=0;hour++; //分變0,時加1
- if(hour>=24) hour=0; //如果時到24,時變0
- }
- }
- }
- }
- }
復制代碼
|
|