16*32 RGB点阵时钟、频谱使用说明
一、 控制卡 4 个独立按键使用说明:
1、按键 S1:进入调时模式以及切换年、月、日、星期、时间、亮度自动与手动切换以及补偿时间加减等项目的调整切换
2、按键 S2:进入调时模式时此按键功能为“加” 、不在调时模式时此按键功能为“亮度控制” ,在频谱模式时此按键功能为“顶点颜色切换”
3、按键 S3:进入调时模式时此按键功能为“减” 、不在调时模式时此按键功能为“时钟颜色切换, ”在频谱模式时此按键功能为“柱条颜色切换”
4、按键 S4:在调时模式时“退出时间调整” ,其他模式“频谱与时间模式切换”
注意:当时钟显示颜色或者频谱显示颜色为全红色时,进入自动切换颜色的模式
二、遥控器使用介绍:
遥控只有 4 个按键可用,等同于独立按键的功能。
电路原理图:
/*********************************** ***************************
-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黑下载附件…………
复制代码
所有资料51hei提供下载:
16X32 RGB 点阵.zip
(1.53 MB, 下载次数: 114)
|