16*32 RGB點陣時鐘、頻譜使用說明
一、 控制卡 4 個獨立按鍵使用說明:
1、按鍵 S1:進入調時模式以及切換年、月、日、星期、時間、亮度自動與手動切換以及補償時間加減等項目的調整切換
2、按鍵 S2:進入調時模式時此按鍵功能為“加” 、不在調時模式時此按鍵功能為“亮度控制” ,在頻譜模式時此按鍵功能為“頂點顏色切換”
3、按鍵 S3:進入調時模式時此按鍵功能為“減” 、不在調時模式時此按鍵功能為“時鐘顏色切換, ”在頻譜模式時此按鍵功能為“柱條顏色切換”
4、按鍵 S4:在調時模式時“退出時間調整” ,其他模式“頻譜與時間模式切換”
注意:當時鐘顯示顏色或者頻譜顯示顏色為全紅色時,進入自動切換顏色的模式
二、遙控器使用介紹:
遙控只有 4 個按鍵可用,等同于獨立按鍵的功能。
0.jpg (24.2 KB, 下載次數: 44)
下載附件
2018-1-12 19:38 上傳
電路原理圖:
0.jpg (54.36 KB, 下載次數: 47)
下載附件
2018-1-12 19:39 上傳
/*********************************** ***************************
-0XC0--0XC1- 顯示模式
-0XC2--0XC3- 速度
-0XC4--0XC5- 亮度
-0XC6--0XC7 用于鬧鐘總開關
每個鬧鐘占用DS1302的三個RAM,從第5個RAM開始使用。
-0XC8--0XC9-亮度自動控制
-0XCA--0XCB-綜合模式記憶
-0XCC--0XCD-邊框記憶
每三個RAM中的第一個為當前鬧鐘的開關,
第二個為設置的小時值,第三個為設置的分鐘值。
-0XCE--0XCF--0XD0--0XD1--0XD2--0XD3- 1
-0XD4--0XD5--0XD6--0XD7--0XD8--0XD9- 2
-0XDA--0XDB--0XDC--0XDD--0XDE--0XDF- 3
-0XE0--0XE1--0XE2--0XE3--0XE4--0XE5- 4
-0XE6--0XE7--0XE8--0XE9--0XEA--0XEB- 5
-0XEC--0XED- 整點報時
-0XEE--0XEF- 字體(控制)
-0XF0--0XF1- 顏色
-0XF2--0XF3- 濕度修整開關(是加還是減)
-0XF4--0XF5- 濕度修整數值 0-----20%
-0XF6--0XF7- 溫度修整開關(是加還是減)
-0XF8--0XF9- 溫度修整數值 0-----20度
-0XFA--0XFB- 是否校時的標記*如果是1就校時,0不校時
-0XFC--0XFD- 寫入校時的時間量0-----20秒
-0XFE--0XFF- 多字節命令
------宏定義區--------------------------------------------------------------*/
單片機源程序如下:
- /***********************************************************
- 控制卡 P0=j
- 如果有配套控制卡,下載此程序即可顯示
- 16*32 RGB點陣屏 多功能時鐘
- 功能說明:上電顯示 時:分 20S切換一次流動顯示 年月日星期 信息
- ***************************P0=j********************************/
- /*
- 16X32 RGB點陣屏管腳定義
- GND A ABCD是行掃描信號
- GND B
- GND C
- OE D OE是屏的使能端 低有效
- G R R G B 顏色數據信號
- B NC
- GND STR 鎖存信號
- GND SCK 時鐘信號
- */
- /*接口說明*/
- //A B C D 是138行掃描信號
- // SHCP 是595的移位信號
- // STCP 是595的鎖存信號
- // OE 是屏的使能端 可以控制亮度
- // R 是紅色信號線
- // G 是綠色信號線
- // B 是藍色信號線
- //P0=j
- #include<task.h>
- sbit SCK=P2^7;//時鐘
- sbit STR=P4^1;//上升沿輸出 /*如果用的是普通單片機 沒有P4.1口 請改為其他口*/
- sbit SDA_R=P2^4;//紅數據
- sbit SDA_G=P2^5;//綠數據
- sbit SDA_B=P2^3;//藍數據
- sbit OE=P0^4;//輸出使能
- sbit IA=P4^0;//行控制線A /*如果用的是普通單片機 沒有P4.0口 請改為其他口*/
- sbit IB=P2^0;//行控制線B
- sbit IC=P2^1;//行控制線C
- sbit ID=P2^2;//行控制線D
- void SDA_RS(uchar i) { SDA_R = (bit)i; }
- void SDA_GS(uchar i) { SDA_G = (bit)i; }
- void SDA_BS(uchar i) { SDA_B = (bit)i; }
- void SDA_RGS(uchar i) { SDA_R = (bit)i;SDA_G = (bit)i; }
- void SDA_GBS(uchar i) { SDA_G = (bit)i; SDA_B = (bit)i;}
- void SDA_BRS(uchar i) { SDA_R = (bit)i;SDA_B = (bit)i; }
- void SDA_BGRS(uchar i) { SDA_R = (bit)i; SDA_G = (bit)i;SDA_B = (bit)i;}
- void (*SDA_RGB)(uchar);
- typedef struct bb
- {
- void (*proc)(uchar);
- }_ol_;
- _ol_ olSet[7] =
- {
- SDA_RS,
- SDA_GS,
- SDA_BS,
- SDA_RGS,
- SDA_GBS,
- SDA_BRS,
- SDA_BGRS,
-
- };//P0=j
- #define scan0 {IA=0;IB=0;IC=0;ID=0;}
- #define scan1 {IA=1;IB=0;IC=0;ID=0;}
- #define scan2 {IA=0;IB=1;IC=0;ID=0;}
- #define scan3 {IA=1;IB=1;IC=0;ID=0;}
- #define scan4 {IA=0;IB=0;IC=1;ID=0;}
- #define scan5 {IA=1;IB=0;IC=1;ID=0;}
- #define scan6 {IA=0;IB=1;IC=1;ID=0;}
- #define scan7 {IA=1;IB=1;IC=1;ID=0;}
- #define scan8 {IA=0;IB=0;IC=0;ID=1;}
- #define scan9 {IA=1;IB=0;IC=0;ID=1;}
- #define scan10 {IA=0;IB=1;IC=0;ID=1;}
- #define scan11 {IA=1;IB=1;IC=0;ID=1;}
- #define scan12 {IA=0;IB=0;IC=1;ID=1;}
- #define scan13 {IA=1;IB=0;IC=1;ID=1;}
- #define scan14 {IA=0;IB=1;IC=1;ID=1;}
- #define scan15 {IA=1;IB=1;IC=1;ID=1;}
- #define NL 12 //空格地址
- void rxd_data(); // 發送移動數據
- void rxd_data(void); //串行發送數據
- uint time_count=0; //計數
- uchar reg;
- uchar line;
- uchar Mode=0;
- uchar Count=0;
- uchar SPEED;
- void Displaying();
- void timebuff();
- uchar e=0;
- uchar Light=1;
- uchar color;
- bit Auto_bit=0;
- uchar xdata Buffnum=4;
- void SECOND_liudonshu(void) ;
- void Adjust_display(void);
- void sendRXbyte(unsigned char wdata,unsigned char c,unsigned char n);
- uchar BUFF[20]; //緩存
- uchar code week_data[] ={24,40,42,44,46,48,50,24}; //日一二三四五六日
- /***************滾動顯示格式數組***********P0=j************************/
- uchar xdata A[60]= //顯示格式
- { NL,NL,NL,NL,NL,NL,NL,NL, //開頭8個空格 0-7
- 14,15,16,17,18,19, //今天是8,9,10,11,12,13
- 2,0,00,00, //年數據14,15,16,17
- 20,21, //“年”18,19
- 0,0, //月數據 No.20,21
- 22,23, //“月”22,23
- 0,0, //日數據 No.24,25
- 24,25, //“日”26,27
- NL, //空格28
- 26,27,28,29, //“星期”29,30,31,32
- 00,00, //星期幾 No.33,34
- NL, //空格35
- };
- uchar code zimo[];
- uchar zimuo=0;
- uchar offset;
- bit half_sec_flag=0;
- void in_data(void); //調整數據
- //void delay(uchar time);
- void delay(uchar time) //10us
- {
- unsigned char a,b,c;
- for(c=time;c>0;c--)
- {
- for(b=30;b>0;b--)
- for(a=3;a>0;a--);
- }
- }
- /*****不影響其他端口的掃描******P0=j*******************/
- void scan(unsigned char Value)
- {switch(Value)
- {case 0: scan0;break;
- case 1: scan1;break;
- case 2: scan2;break;
- case 3: scan3;break;
- case 4: scan4;break;
- case 5: scan5;break;
- case 6: scan6;break;
- case 7: scan7;break;
- case 8: scan8;break;
- case 9: scan9;break;
- case 10:scan10;break;
- case 11:scan11;break;
- case 12:scan12;break;
- case 13:scan13;break;
- case 14:scan14;break;
- case 15:scan15;break;
- }
- }
- /**************************************/
- void Timer0Interrupt(void) interrupt 1 //定時器中斷
- {
- uint read_time;
- TH0 = 0x0F6;
- TL0 = 0x3C;
- if(++read_time>200)
- {
- read_time=0;
- read_clockS(); //讀時鐘數據
- //KEY_scan();
- }
- if(Mode!=2)
- time_count++;
- if(time_count%600==0)
- half_sec_flag=~half_sec_flag;
- if(time_count>42000)//發送一次數據
- {
- time_count=0;
- Mode=1;
-
- }
- if(Mode==1)
- {
- line++; //下一行
- if(line>15) //共16行
- {
- line=0; //重新移動
- SPEED++;
- if(SPEED>5)
- {
- SPEED=1;
- offset++;
- }
-
- }
-
- //in_data();//調整移動數據
- //if(Mode==0)
- //
- Displaying();//移動顯示模式
- //else if(Mode==2)
- // Adjust_display();//調時模式
- scan(line); //打開行掃描
- STR=0;//鎖存
- OE=0;
- delay(Light*2); //控制亮度
- OE=1;
- STR=1;
- }
- if(Mode==0)
- {
- line++; //下一行
- if(line>15) //共16行
- {
- line=0; //重新移動
- }
- rxd_data();//顯示時間模式
- scan(line); //打開行掃描
- STR=1;//鎖存
- STR=0;
- OE=0;
- delay(Light*2); //控制亮度
- OE=1;
- }
- }
- void PCA() interrupt 7 //PCA定時器 26ms
- {
-
- if( CCF0 )
- {
-
- CCAP0L = CCAP0L+0x50;
- CCAP0H = CCAP0H+0xc3; //20ms定時
- CCF0 = 0;
- time_count++;
- if(time_count>6)//
- {
- time_count=0;
- Count++;
- // SendByte(Count);
- if(Count>50)
- {
- Count=0;
- reg++;//依次變色
- if(reg>7)
- {
- reg=0;
- }
- }
- }
- }
- if(CF)
- {
- CF=0;
-
- }
- }
- /***************************P0=j*****************/
- void Adjust_display(void)
- {
-
- if(e==1)
- {
- sendRXbyte(hanzi[0][line],0,8); //年
- sendRXbyte(hanzi[1][line],0,8);
- sendRXbyte(EC_8X16[yy/10][line],1,8);
- sendRXbyte(EC_8X16[yy%10][line],1,8);
-
- // sendRXbyte(hanzi[0][line+8],0,8); //年
- // sendRXbyte(hanzi[1][line+8],0,8);
- // sendRXbyte(EC_8X16[yy/10][line+8],1,8);
- // sendRXbyte(EC_8X16[yy%10][line+8],1,8);
- }
- else if(e==2)
- {
- sendRXbyte(hanzi[2][line],1,8); //月
- sendRXbyte(hanzi[3][line],1,8);
- sendRXbyte(EC_8X16[mo/10][line],0,8);
- sendRXbyte(EC_8X16[mo%10][line],0,8);
-
- // sendRXbyte(hanzi[2][line+8],1,8); //月
- // sendRXbyte(hanzi[3][line+8],1,8);
- // sendRXbyte(EC_8X16[mo/10][line+8],0,8);
- // sendRXbyte(EC_8X16[mo%10][line+8],0,8);
- }
- else if(e==3)
- {
- sendRXbyte(hanzi[4][line],1,8); //日
- sendRXbyte(hanzi[5][line],1,8);
- sendRXbyte(EC_8X16[dd/10][line],2,8);
- sendRXbyte(EC_8X16[dd%10][line],2,8);
- //
- // sendRXbyte(hanzi[4][line+8],1,8); //日
- // sendRXbyte(hanzi[5][line+8],1,8);
- // sendRXbyte(EC_8X16[dd/10][line+8],2,8);
- // sendRXbyte(EC_8X16[dd%10][line+8],2,8);
- }
- else if(e==4)
- {
- sendRXbyte(hanzi[6][line],0,8); //周
- sendRXbyte(hanzi[7][line],0,8);
- sendRXbyte(EC_8X16[week/10][line],2,8);
- sendRXbyte(EC_8X16[week%10][line],2,8);
-
- // sendRXbyte(hanzi[6][line+8],0,8); //周
- // sendRXbyte(hanzi[7][line+8],0,8);
- // sendRXbyte(EC_8X16[week/10][line+8],2,8);
- // sendRXbyte(EC_8X16[week%10][line+8],2,8);
- }
- else if(e==5)
- {
- sendRXbyte(hanzi[8][line],1,8);//時
- sendRXbyte(hanzi[9][line],1,8);
- sendRXbyte(EC_8X16[hh/10][line],0,8);
- sendRXbyte(EC_8X16[hh%10][line],0,8);
- //
- // sendRXbyte(hanzi[8][line+8],1,8);//時
- // sendRXbyte(hanzi[9][line+8],1,8);
- // sendRXbyte(EC_8X16[hh/10][line+8],0,8);
- // sendRXbyte(EC_8X16[hh%10][line+8],0,8);
- }
- else if(e==6)
- {
- sendRXbyte(hanzi[10][line],0,8);//分
- sendRXbyte(hanzi[11][line],0,8);
- sendRXbyte(EC_8X16[mm/10][line],2,8);
- sendRXbyte(EC_8X16[mm%10][line],2,8);
-
- // sendRXbyte(hanzi[10][line+8],0,8);//分
- // sendRXbyte(hanzi[11][line+8],0,8);
- // sendRXbyte(EC_8X16[mm/10][line+8],2,8);
- // sendRXbyte(EC_8X16[mm%10][line+8],2,8);
- }
- else if(e==7)
- {
- sendRXbyte(hanzi[12][line],1,8);//秒
- sendRXbyte(hanzi[13][line],1,8);
- sendRXbyte(EC_8X16[ss/10][line],2,8);
- sendRXbyte(EC_8X16[ss%10][line],2,8);
- //
- // sendRXbyte(hanzi[12][line+8],1,8);//秒
- // sendRXbyte(hanzi[13][line+8],1,8);
- // sendRXbyte(EC_8X16[ss/10][line+8],2,8);
- // sendRXbyte(EC_8X16[ss%10][line+8],2,8);
- }
- else if((e==8)||(e==9))
- {
- if(read_clock(10,TimeCH_OCHARGE) == 1) //時間補償加/減顯示
- {
- sendRXbyte(hanzi[14][line],1,8);//加
- sendRXbyte(hanzi[15][line],1,8);
- sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)/10][line],2,8);
- sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)%10][line],2,8);
- //
- // sendRXbyte(hanzi[14][line+8],1,8);//加
- // sendRXbyte(hanzi[15][line+8],1,8);
- // sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)/10][line+8],2,8);
- // sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)%10][line+8],2,8);
- }
- else if(read_clock(10,TimeCH_OCHARGE) == 0)
- {
- sendRXbyte(hanzi[16][line],1,8);//減
- sendRXbyte(hanzi[17][line],1,8);
- sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)/10][line],0,8);
- sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)%10][line],0,8);
-
- // sendRXbyte(hanzi[16][line+8],1,8);//減
- // sendRXbyte(hanzi[17][line+8],1,8);
- // sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)/10][line+8],0,8);
- // sendRXbyte(EC_8X16[read_clock(10,TimeCH_NumTime)%10][line+8],0,8);
- }
- }
- /*************************************************/
- }
- /**************************P0=j****************/
- void SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- /*************************************************************/
- void show_menu(void)
- {
- for(line=0;line<16;line++)
- {
- //for(Mspeed=0;Mspeed<1;Mspeed++)
- //{
- Adjust_display();//調時模式
- scan(line); //打開行掃描
- STR=1;//鎖存
- STR=0;
- OE=0;
- delay(5);
- OE=1;
- //}
- }
-
- }
- /******************************P0=j**********************/
- /*主函數*/
- void main()
- {
- //uchar Mspeed=0;
- SCON = 0x50;
- BRT= 0xf8; //0xfb: 30MHz,12T,SMOD=0,9600bps
- AUXR |= 0x11; // 使用獨立波特率發生器
- TMOD=0x01; //定時器0 16位定時定時器1方式2
- TH0 = 0x0F6;
- TL0 = 0x3C;
- OE=0;
- TR0=1; //開定時器計數
- ET0=1; //開定時器中斷
- EA=1; //開中斷
- DS1302_Initial();
- SendByte(0x55);
- Light=11;//亮度
- // color=0;//顯示顏色
- while(1)
- {
- KEY_scan(); //掃描按鍵
- TimeCHck(); //時間補償
- if(ADJ==1)
- {
- ADJ=0xFF;
- Mode=2;
- //TR0=0;
- //DS1302_TimeStop(1); //只有調時間時,時鐘停
- e++;
- if(e>9)
- e=1;
- }
- if(Mode==2) //如果是調時模式
- {
- if(ADJ==2)
- {
- //ADJ=0xFF;
- // SendByte(2);
- //EA=0;
- Set_time(e); //調整
- // EA=1;
-
- }
- if(ADJ==3)
- {
- // ADJ=0XFF;
- //SendByte(3);
- //EA=0;
- Set_time(e); //調整
- //EA=1;
-
- }
- if(ADJ==4)
- {
- Mode=0;
-
- e=0;
- ADJ=0XFF;
- // SendByte(4);
- TR0=1;
- //DS1302_TimeStop(0); //只有調時間時,時鐘停
- }
- show_menu();
- }
-
- }
- }
- /***********************************P0=j**********************************************************
- 函數名:Pwritekong();
- 調 用:
- 參 數:無
- 返回值:無
- 結 果:送空數據
- 備 注:
- /**********************************************************************************************/
- void writekong() //送空數據
- {
- SDA_R=SDA_G=SDA_B=0;
- SCK=0;
- SCK=1;
- }
- /*********************************************************************************************
- 函數名:writemao();
- 調 用:
- 參 數:無
- 返回值:無
- 結 果:送紅數據
- 備 注:
- /**********************************************************************************************/
- void writemao(uchar dat) //送中間秒閃爍數據
- {
- uchar i;
- SDA_R=SDA_G=SDA_B=0;
- for(i=0;i<2;i++)
- {
- dat=dat<<1;
- SDA_B=CY;
- SCK=0;
- SCK=1;
- }
- }
- /*********************************************************************************************
- 函數名: 任意位數任意顏色74HC595程序
- 調 用:writeda(uchar dat,uchar n,uchar clour)
- 參 數:無
- 返回值:無
- 結 果:
- 備 注:
- /**********************************************************************************************/
- void writeda(uchar dat,uchar n,uchar clour) { //送數據
- uchar i;
- SDA_R= SDA_G= SDA_B=0;
- for(i=0;i<n;i++) {
- switch(n) {
- case 3:
- if(clour==0){SDA_R=dat&0x10;}
- if(clour==1){SDA_G=dat&0x10;}
- if(clour==2)SDA_B=dat&0x10;break;
- case 4:
- if(clour==0){SDA_R=dat&0x20;}
- if(clour==1){SDA_G=dat&0x20;}
- if(clour==2)SDA_B=dat&0x20;break;
- case 5:
- if(clour==0){SDA_R=dat&0x20;}
- if(clour==1){SDA_G=dat&0x20;}
- if(clour==2)SDA_B=dat&0x20;break;
- case 6:
- if(clour==0){SDA_R=dat&0x40;}
- if(clour==1){SDA_G=dat&0x40;}
- if(clour==2)SDA_B=dat&0x40;break;
- case 8:
- if(clour==0){SDA_R=dat&0x80;}
- if(clour==1){SDA_G=dat&0x80;}
- if(clour==2)SDA_B=dat&0x80;break;
- }
- dat=dat<<1;
- SCK=0;
- SCK=1;
- }}
- /***********************發送數據****************************/
- void rxd_data(void) //串行發送數據
- {
- // read_clockS(); //讀時鐘數據
- uchar Hourcolor,miaocolor,mincolor;
- switch (color)
- {
- case 0:
- Hourcolor=0;
- miaocolor=1;
- mincolor=1;
- break;
- case 1:
- Hourcolor=1;
- miaocolor=1;
- mincolor=0;
- break;
- case 2:
- Hourcolor=1;
- miaocolor=0;
- mincolor=2;
- break;
- case 3:
- Hourcolor=1;
- miaocolor=2;
- mincolor=0;
- break;
- /**************4為自動切換顏色模式*****P0=j***************/
- case 4:
- Hourcolor=0;
- miaocolor=0;
- mincolor=0;
- break;
- default:
- break;
- }
- if(line<8)
- {
- OE=1;
- writekong();
- writeda(table[hh/10*8+line],6,Hourcolor);
- writekong();
- writeda(table[hh%10*8+line],6,Hourcolor);
- writekong();
- if(half_sec_flag)
- writemao(table[80+line]);
- else
- writemao(0x00);
- writekong();
- writeda(table[mm/10*8+line],6,mincolor);
- writekong();
- writeda(table[mm%10*8+line],6,mincolor);
- writekong();
- }
- /***************************P0=j********************************/
- else
- {
- writekong();
- writeda(table1[hh/10*8+line-8],6,Hourcolor);
- writekong();
- writeda(table1[hh%10*8+line-8],6,Hourcolor);
- writekong();
-
- if(half_sec_flag)
- writemao(table[80+line-8]);
- else
- writemao(0x00);
- writekong();
-
- writeda(table1[mm/10*8+line-8],6,mincolor);
- writekong();
- writeda(table1[mm%10*8+line-8],6,mincolor);
- writekong();
- }
- }
- /*;*************************P0=j******************************************************
- ;程序名稱:sendRXbyte(uchar wdata,uchar c,uchar n)
- ;功能:選擇將要送入首地址的值.
- ;輸入:R2. sendRXbyte(hanzi[hour/10][i],3,8)橙色數據8位
- ;輸出:無. sendRXbyte(hanzi[hour/10][i],2,8)紅色數據8位
- ;影響:無. sendRXbyte(hanzi[hour/10][i],1,8)綠色數據8位
- ;修改日期:2010.05.15----b 字模數據,c顏色,n 發送位數(0-8)
- ;*********************************************************************************/
- void sendRXbyte(unsigned char wdata,unsigned char c,unsigned char n)
- { unsigned char i;
- SDA_R=SDA_G=SDA_B=0;
- for(i=0; i<n; i++) //字符位數8位
- { switch(c)
- {
- /*-------------------------------------------------紅-------*/
- case 0:SDA_R=(bit)(wdata&0x80);break;
- /*---------------------------------------------------綠-----*/
- case 1:SDA_G=(bit)(wdata&0x80);break;
- /*----------------------------------------------------黃----*/
- case 2:SDA_B=(bit)(wdata&0x80);break;
- /*--------------------------------------------------------*/
- default:break;
- }
- SCK=0; //時鐘拉高,產生上升沿
- SCK=1; //時鐘拉低
- wdata <<=1; //左移一位
- }
- }
- /*********************************************************************************************
- 函數名:Displaying()
- 調 用:
- 結 果:
- /**********************************************************************************************/
- void Displaying() {//送顯示數據
- time_count=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (6.58 KB, 下載次數: 37)
下載附件
2018-1-12 19:40 上傳
所有資料51hei提供下載:
16X32 RGB 點陣.zip
(1.53 MB, 下載次數: 114)
2018-1-12 11:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|