这是原理图
下载:
16X32点阵源码51.zip
(56.44 KB, 下载次数: 49)
单片机程序源码:
- #include <reg51.h>
- #include <intrins.h>
- #define DATAOUT P1 //P3 use as data, you can change
- #define SPEED 13
- void ymove(char dir,unsigned char *ptr,char speed);
- //void xmove(char dir,unsigned char *ptr,char n,char speed);
- void delay(unsigned int a);
- void display();
- void displaytime(char time);
- void init164();
- void kong(char dir, char speed);
- void fanzhuan(unsigned char *p);
- sbit ADATA= DATAOUT^1;//DS
- sbit ASCK= DATAOUT^2;//SCK
- sbit LATCH= DATAOUT^3;//LATCH
- sbit BDATA= DATAOUT^4;//RDATA
- sbit BCLK= DATAOUT^6;//CLK
- sbit K1 =P0^0;
- sbit K2 =P0^1;
- sbit K3 =P0^2;
- //OE接低电平
- //MR接高电平
- //CLR接高电平
- unsigned char idata buffer[64];
- unsigned char bigbuffer[194];
- unsigned char comm_len;
- unsigned char BSBUF=0;
- unsigned char iii; //全局当前显示第几个字
- void Delay10ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 18;
- j = 235;
- do
- {
- while (--j);
- } while (--i);
- }
- void UART_Init(void)//串口初始化函数
- {
- SCON=0X50; //串口方式1,允许接收
- TMOD|=0X20; //定时器1 定时方式2 T0 is mode 1\
- TH1=0xfd; //Baud:9600 fosc=11.0592MHz
- TL1=0xfd;
- TR1=1; //启动定时器
-
- ES = 1; //开串口中断
- EA = 1; //开总中断
- }
- void main(void)
- {
- unsigned char i;
- init164();
- UART_Init();
- for(i=0;i<194;i++)
- {
- bigbuffer[i]=0x00;
- }
- //fanzhuan(&bigbuffer[1]);
- //for(i=0;i<32;i++)
- // buffer[i+32]=buffer[i];
- while(1)
- {
- if(bigbuffer[0]==0x16)
- {
- for(iii=0;iii<bigbuffer[1];iii++)
- {
- ymove(1,&bigbuffer[2+iii*32],SPEED);
- }
- }
- else if(bigbuffer[0]==0x15)
- for(iii=0;iii<bigbuffer[1];iii++)
- {
- ymove(0,&bigbuffer[2+iii*32],SPEED);
- }
- else
- display();
- }
- }
- /************* 子函数 ******************/
- void delay(unsigned int a) //延时函数
- {
- while(a--);
- }
- void fanzhuan(unsigned char *p)
- {
- unsigned char i,j,k,temp,*w,temp1,temp2,temp3;
- w=p;
- for(i=0;i<8;i++) //左下角的8*8 翻转后位于左上角
- {
- temp=0x00;
- for(j=0;j<8;j++)
- {
- temp1= *(p+30-j*2) ;
- temp2=temp1<<i;
- temp3=temp2&0x80;
- temp3=temp3>>j;
- temp=temp|temp3;
-
- }
- buffer[i*2]=temp;
- }
- for(i=0;i<8;i++) //左上角的8*8 反转后位于右上角
- {
- temp=0x00;
- for(j=0;j<8;j++)
- {
- temp1= *(p+14-j*2);
- temp2=temp1<<i;
- temp3=temp2&0x80;
- temp3>>=j;
- temp|=temp3;
- }
- buffer[i*2+1]=temp;
- }
- for(i=0;i<8;i++) //右上角的8*8 反转后位于右下角
- {
- temp=0x00;
- for(j=0;j<8;j++)
- {
- temp1= *(p+15-j*2);
- temp2=temp1<<i;
- temp3=temp2&0x80;
- temp3>>=j;
- temp|=temp3;
- }
- buffer[i*2+17]=temp;
- }
- for(i=0;i<8;i++) //右下角的8*8 反转后位于左下角
- {
- temp=0x00;
- for(j=0;j<8;j++)
- {
- temp1= *(p+31-j*2);
- temp2=temp1<<i;
- temp3=temp2&0x80;
- temp3>>=j;
- temp|=temp3;
- }
- buffer[i*2+16]=temp;
- }
- }
- /*显示*/
- void display() //显示buffer里32*16的数据
- {
- unsigned char hang,ib,k,tmp;
- DATAOUT= 0x0;
- 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;
- }
- }
- for(ib=0;ib<2;ib++)
- {
- tmp = buffer[hang*2+ib+32];
- for(k=0;k<8;k++)
- {
- tmp <<=1;
- ASCK =0;
- ADATA =CY;
- ASCK =1;
- }
- }
- //DATAOUT|=0x14;
- 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();
- }
- }
- /*74ls164,74ls595的初始化*/
- void init164()
- {
-
- char i;
- BDATA=0;
- for(i=0;i<16;i++) //清空164
- {
- BCLK =0;
- BCLK =1;
- }
- for(i=0;i<32;i++) //清空595
- {
-
- ASCK =0;
- ADATA =0;
- ASCK =1;
- }
- }
- /*左右移动*/
- void ymove(char dir,unsigned char *ptr, char speed)
- { //dir=1左移动,dir=0为右移动
- char i=0, j=0, ib=0;
- unsigned int tmp=0, speedm=0;
- if(dir==0)
- {
- /**** 向右移 ****/
- ib=31;
- for(i=16;i>0;i--) //下移16行
- {
- for(j=61;j>-1;j--)
- buffer[j+2]=buffer[j]; //将上一行的内容复制到下一行
-
- if(ptr==0)
- { //移空时,buffer的首行用0移入
- buffer[0]=0;
- buffer[1]=0;
- }
- else
- { //否则,处理buffer的首行元素
- buffer[1]=ptr[ib];
- buffer[0]=ptr[ib-1];
- ib=ib-2;
- }
- speedm=speed;
- while(speedm--) //更新点阵
- display();
- }
- }
- /****** 向左移 *******/
- else
- {
- ib=0; //数组元素序号
- for(i=0;i<16;i++) //上移16行
- {
- for(j=0;j<62;j++) //将下一行的内容复制到上一行
- buffer[j]=buffer[j+2];
- if(ptr==0) //移入为空,buffer的末行用0移入
- {
- buffer[62]=0;
- buffer[63]=0;
- }
- else
- { //否则,处理buffer的末行元素
- buffer[62]=ptr[ib];
- buffer[63]=ptr[ib+1];
- ib=ib+2;
- }
- speedm=speed; //更新点阵
- while(speedm--)
- display();
- }
- }
- }
- void kong(char dir, char speed)
- { //dir=1左移动,dir=0为右移动
- char i=0, j=0, ib=0;
- unsigned int tmp=0, speedm=0;
- if(dir==0)
- {
- /**** 向左移 ****/
- ib=31;
- for(i=8;i>0;i--) //下移16行
- {
- for(j=61;j>-1;j--)
- buffer[j+2]=buffer[j]; //将上一行的内容复制到下一行
-
- buffer[0]=0;
- buffer[1]=0;
- speedm=speed;
- while(speedm--) //更新点阵
- display();
- }
- }
- /****** 向右移 *******/
- else
- {
- ib=0; //数组元素序号
- for(i=0;i<8;i++) //上移16行
- {
- for(j=0;j<62;j++) //将下一行的内容复制到上一行
- buffer[j]=buffer[j+2];
- buffer[62]=0;
- buffer[63]=0;
- ib=ib+2;
-
- speedm=speed; //更新点阵
- while(speedm--)
- display();
- }
- }
- }
- void uart_get_int(void) interrupt 4//串口中断接收函数
- {
- unsigned char i,j,k;
- RI=0;
- if(SBUF==0XEF&&BSBUF==0xFE) //启始帧
- {
- comm_len=0;
- return;
- }
- BSBUF=SBUF;
-
- bigbuffer[comm_len]=SBUF;
- comm_len++;
- if(comm_len==194) //所有数据接受完毕 串口发送数据 字模转换 主函数里面滚屏
- {
- comm_len=0;
- if(bigbuffer[0]==11)return;
- iii=bigbuffer[1]-1;
- for(i=0;i<194;i++)
- {
- SBUF= bigbuffer[i];
- while(!TI);
- TI=0;
- }
- for(j=0;j<6;j++)//6个汉字的字模转换
- {
- fanzhuan(&bigbuffer[2+j*32]);
- for(k=0;k<32;k++)
- {
- bigbuffer[2+j*32+k]=buffer[k];
- }
- }
- }
- }
- void saomiao()
- {
- if(K1==0)
- {
- Delay10ms();
- if(K1==0)
- {
-
- }
- }
- }
复制代码
|