- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DS_red=P3^0; //串行数据输入端,红色灯
- sbit DS_green=P3^1;
- sbit SHC=P3^2; //数据在上升沿进入移位寄存器
- sbit STC=P3^3; //上升沿时将数据输出到并行端口
- sbit OE_red=P3^4; //HC595是能段,必须设置!
- sbit OE_green=P3^5;
- sbit SW1=P3^6; //滚动减速
- sbit SW2=P3^7; //滚动加速
- uint count,speed; //滚动速度
- uchar p,next,k,high,low,yige;
- uchar code hang[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,
- 0x0c,0x0d,0x0e,0x0f}; //刷行,控制74154管脚输出
- uchar code hanzi[][32]={
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x04,0x00,0x04,0x00,0x0F,0xF0,0x0C,0x20,0x12,0x40,0x61,0x80,0x02,0x60,0x0D,0x1E,0x71,0x08,0x1F,0xFC,0x01,0x00,0x09,0x20,0x11,0x18,0x21,0x08,0x05,0x00,0x02,0x00},
- {0x05,0x00,0x45,0x00,0x29,0x00,0x13,0xFE,0x32,0x02,0x4C,0x02,0x89,0xF2,0x19,0x12,0x29,0x12,0x49,0x12,0x89,0xF2,0x09,0x02,0x08,0x02,0x08,0x04,0x50,0x14,0x20,0x08},
- {0x08,0x20,0x08,0x20,0x7F,0xFC,0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x40,0x0C,0x20,0x18,0x10,0x30,0x18,0x40,0x10},
- {0x01,0x00,0x00,0x80,0x3F,0xFE,0x28,0x04,0x46,0x88,0x04,0x80,0x08,0x80,0x06,0x80,0x04,0x80,0x7F,0xFE,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x18,0x60,0x10},
- {0x10,0x10,0x08,0x18,0x06,0x10,0x04,0x20,0x7F,0xFC,0x04,0x20,0x04,0x20,0x04,0x20,0x7F,0xFE,0x04,0x20,0x04,0x20,0x04,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x20,0x20},
- {0x00,0x04,0x7F,0xFE,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x60,0x05,0x30,0x09,0x18,0x11,0x0C,0x21,0x08,0x41,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00},
- {0x00,0x00,0x7E,0x3C,0x05,0xD0,0x09,0x50,0x11,0x50,0x15,0x50,0x19,0x50,0x31,0x50,0xD1,0x50,0x51,0x48,0x11,0x48,0x11,0x64,0x12,0x56,0x12,0xFA,0x54,0x50,0x20,0x00},
- {0x08,0x20,0x06,0x30,0x04,0x40,0x3F,0xF8,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x20,0x00,0x00,0x00},
- {0x10,0x00,0x10,0xFC,0x10,0x84,0xFE,0xFC,0x38,0x84,0x34,0xFC,0x54,0x84,0x50,0x84,0x90,0xFC,0x00,0x00,0x01,0x00,0x08,0x84,0x28,0x82,0x28,0x12,0x67,0xF0,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x04,0x00,0x04,0x00,0x0F,0xF0,0x0C,0x20,0x12,0x40,0x61,0x80,0x02,0x60,0x0D,0x1E,0x71,0x08,0x1F,0xFC,0x01,0x00,0x09,0x20,0x11,0x18,0x21,0x08,0x05,0x00,0x02,0x00},
- {0x05,0x00,0x45,0x00,0x29,0x00,0x13,0xFE,0x32,0x02,0x4C,0x02,0x89,0xF2,0x19,0x12,0x29,0x12,0x49,0x12,0x89,0xF2,0x09,0x02,0x08,0x02,0x08,0x04,0x50,0x14,0x20,0x08},
- {0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xFE,0x00,0xC0,0x01,0x40,0x01,0x40,0x02,0x40,0x04,0x40,0x08,0x40,0x10,0x40,0x60,0x40,0x00,0x40,0x01,0x40,0x00,0x80},
- {0x00,0x00,0x7E,0x3C,0x05,0xD0,0x09,0x50,0x11,0x50,0x15,0x50,0x19,0x50,0x31,0x50,0xD1,0x50,0x51,0x48,0x11,0x48,0x11,0x64,0x12,0x56,0x12,0xFA,0x54,0x50,0x20,0x00},
- {0x08,0x20,0x06,0x30,0x04,0x40,0x3F,0xF8,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
- };//刷列
- void delay(uint z)
- {
- while(z--);
- }
- void delay1(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //点阵显示位传送
- void SendByte(uchar date)//595数据传送
- {
- uchar p;
- for(p=0;p<8;p++)
- {
- SHC=0;
- DS_red=date&0x80;
- SHC=1;
- date=date<<1;
- }
- }
- void Send_move(uchar date,uchar f)
- {
- uchar i;
- DS_red=1;
- for(i=0;i<f;i++)
- {
- SHC=0;
- DS_red=date&0x80;
- SHC=1;
- date=date<<1;
- }
- }
- void SendBytefew(uchar temp1,uchar temp2,few)//将十六位数据传给595
- {
- uchar p;
- uint temp;
- temp=temp1;
- temp=(temp<<8)|temp2;
- for(p=0;p<few;p++)
- {
- SHC=0;
- DS_red=temp&0x8000;
- SHC=1;
- temp=temp<<1;
- }
- }
- void main()
- {
- TMOD=0x11;
- TH0=0xff;
- TL0=0x90;
- EA=1;
- ET0=1;
- TR0=1;
- OE_red=0;
- speed=100;
- next=0;
- while(1)
- {
- if(!SW1)
- {
- delay(20);
- if(!SW1)
- {
- if(speed<300)
- speed+=20;
- while(!SW1);
- delay(20);
- }
- }
- if(!SW2)
- {
- delay(20);
- if(!SW2)
- {
- if(speed>10)
- speed-=30;
- while(!SW2);
- delay(20);
- }
- }
- }
- }
- void timer0() interrupt 1
- {
- TH0=0xfa;
- TL0=0x90;
- count++;
- //先刷四个空格
- SendByte(hanzi[0+next][p]);
- SendByte(hanzi[0+next][p+1]);
- SendByte(hanzi[1+next][p]);
- SendByte(hanzi[1+next][p+1]);
- SendByte(hanzi[2+next][p]);
- SendByte(hanzi[2+next][p+1]);
- SendByte(hanzi[3+next][p]);
- SendByte(hanzi[3+next][p+1]);
- SendBytefew(hanzi[4+next][p],hanzi[4+next][p+1],yige);//刷文字
- OE_red=1;
- STC=0;
- STC=1;
- P2=hang[k];//行显示
- OE_red=0;//打开595使能端
- k++;
- p+=2;
- if(p==32)
- p=0;
- if(k==16)
- {
- k=0;
- if(count>=speed)
- {
- count=0;
- yige++;
- if(yige==16)
- {
- yige=0;
- next++;
- if(next==21)//注意next的值必须等于文字个数
- next=0;
- }
- }
- }
- }
复制代码 |