admin 发表于 2016-3-19 00:46
做工精美厉害啊,能分享一下 电路图和点阵的源代码吗?
原理图没有画LED,图中1~16接LED正极,a~p接负极。程序都是参考别人修改过来的。
- #include <reg51.h>
- #include <intrins.h>
- #define SPEED 13
- void xmove(char dir,unsigned char *ptr,char n,char speed);
- void delay(unsigned int a);
- void display();
- void displaytime(char time);
- void init164();
- sbit ADATA= P1^0;
- sbit ASCK= P1^1;
- sbit LATCH= P1^2;
- sbit BDATA= P1^3;
- sbit BCLK= P1^4;
- code unsigned char kai[32]={0x18,0x00,0x5A,0xF8,0x5A,0xF8,0x5A,0xD8,0x7E,0xD8,0x00,0xD8,0xFE,0xD8,0xFE,0xD8,
- 0x06,0xD8,0x7E,0xD8,0x60,0xD8,0x6E,0xD8,0x7D,0x9A,0x73,0x1E,0x02,0x0E,0x00,0x00}; /*-- 文字: 凯 --*/
- code unsigned char yu[32]={ 0x00,0x78,0x3F,0xF8,0x3F,0x80,0x01,0x80,0x1F,0xF8,0x19,0x98,0x1F,0xF8,0x01,0x80,
- 0x3F,0xFE,0x3F,0xFE,0x31,0x86,0x31,0xA6,0x37,0xF6,0x37,0x1E,0x30,0x0C,0x00,0x00}; /*-- 文字: 禹 --*/
-
- code unsigned char duan[32]={0x03,0x00,0x03,0x00,0x3F,0xF8,0x3F,0xF8,0x33,0x18,0x33,0x18,0x3F,0xF8,0x33,0x18,
- 0x33,0x18,0x3F,0xF8,0x3F,0xF8,0x33,0x06,0x03,0x06,0x03,0xFE,0x01,0xFC,0x00,0x00}; /*-- 文字: 电 --*/
- code unsigned char lu[32]={0x00,0xC0,0x7C,0xC0,0x7D,0xF8,0x6D,0x98,0x6F,0xD8,0x7C,0x70,0x18,0xF8,0x5B,0x9E,
- 0x5F,0x04,0x5D,0xF8,0x59,0x98,0x5D,0x98,0xFD,0xF8,0xE1,0xF8,0x01,0x98,0x00,0x00}; /*-- 文字: 路 --*/
- unsigned char idata buffer[32];
- void main(void)
- {
- unsigned char i;
- init164();
- while(1)
- {
- for(i=0;i<32;i++)
- buffer[i]=kai[i];
- displaytime(1);
- xmove(1,zhong,3,SPEED);
- displaytime(1);
- }
- }
- /************* 子函数 ******************/
- void delay(unsigned int a)
- {
- while(a--);
- }
- void display()
- {
- unsigned char hang,ib,k,tmp;
- P1= 0x00;
- BDATA = 1;
- for(hang=0;hang<16;hang++)
- {
- ASCK =0;
- LATCH=0;
- BCLK =0;
- for(ib=0;ib<2;ib++)
- {
- tmp = buffer[hang*2+ib];
- for(k=0;k<8;k++)
- {
- tmp <<=1;
- ASCK =0;
- ADATA =CY;
- ASCK =1;
- }
- }
- LATCH=1;
- BCLK=1;
- BDATA=0;
- }
- delay(64);
- ASCK =0;
- ASCK =1;
- }
- void displaytime(char time)
- {
- unsigned char i;
- while(time--)
- {
- i=130;
- while(i--)
- display();
- }
- }
- void init164() //初始化164所有脚置0
- {
- char i;
- BDATA=0;
- for(i=0;i<16;i++)
- {
- BCLK =0;
- BCLK =1;
- }
- }
- void xmove(char dir,unsigned char *ptr,char n,char speed) /* dir 方向 n是要移动的汉字个数 speed移动速度*/
- {
- unsigned char i=0, ib=0;
- unsigned int tmp=0, speedm=0;
- unsigned char buffer2[16]; //半个汉字的缓存
- n*=2; //左半字和右半字,所以要x2
- for(i=0;i<16;i++) //清零
- buffer2[i]=0;
- /**** 向左移动 ****/
- if(dir == 1)
- {
- for(n;n>0;n--)
- {
- if(ptr != 0)
- {
- tmp = n%2; //判断是左半字还是右半字
- for(i=0;i<16;i++)
- buffer2[i]=ptr[i*2+tmp];
-
- if(tmp) //tmp为1时,将地址指向下一个汉字
- ptr+=32;
- }
-
- for(tmp=8;tmp>0;tmp--) //要移动8列
- {
- ib=0;
- for(i=0;i<16;i++)
- { //要移16行,共16个字节
-
- buffer[ib] <<=1; //移第一个半字
- if(buffer[ib+1] & 0x80)
- buffer[ib]++;
- ib++;
-
- buffer[ib]<<=1; //移后半字
- if(buffer2[i] & 0x80)
- buffer[ib]++;
- ib++;
-
- buffer2[i]<<=1; //缓冲左半字向左移一位
- }
-
- speedm=speed; //更新点阵
- while(speedm--)
- display();
- }
- }
- }
- //--------------------------------------------------//
- else
- {
- /****** 向右移动 ******/
- for(n;n>0;n--)
- {
- if(ptr != 0)
- {
- tmp = (n+1) % 2 ; //判断左半字还是右半字
- for(i=0;i<16;i++)
- buffer2[i]=ptr[i*2+tmp];
-
- if(tmp == 0) //tmp为0时,将地址指向下一个汉字
- ptr+=32;
- }
-
- for(tmp=8;tmp>0;tmp--) //要移动8列
- {
- ib=0;
- for(i=0;i<16;i++)
- { //要移16行,共16个字节
-
- buffer[ib+1] >>= 1; //移右半字
- if(buffer[ib] & 0x01)
- buffer[ib+1] |=0x80 ;
-
- buffer[ib] >>= 1; //移左半字
- if(buffer2[i] & 0x01)
- buffer[ib] |= 0x80;
- ib+=2;
-
- buffer2[i] >>=1; //下个汉字的右半字向右移一位
- }
-
- speedm=speed;
- while(speedm--) //更新点阵
- display();
- }
-
- }
- }
- }
复制代码 |