admin 發表于 2016-3-19 00:46
做工精美厲害啊,能分享一下 電路圖和點陣的源代碼嗎?
原理圖沒有畫LED,圖中1~16接LED正極,a~p接負極。程序都是參考別人修改過來的。
Screenshot_2016-03-19-12-55-22.png (117.33 KB, 下載次數: 180)
下載附件
2016-3-19 17:19 上傳
- #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();
- }
-
- }
- }
- }
復制代碼 |