1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include<reg52.h> #include<intrins.h> //intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令\_nop\_();字符循环移位指令\_crol\_等时使用 //OE 第13脚 输出有效(低电平) //MR 第10脚 主复位(低电平) typedef unsigned char uchar; typedef unsigned int uint; /\*\*\*\*\*\*\*\*\*\*管脚说明\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ #define P P1 //define 不用加; sbit SER = P3^4; //p3.4串行数据输入 DS sbit SCK = P3^6; //串行输入时钟,上升沿有效 SHCP 第11脚 数据输入时钟线 sbit RCK = P3^5; //串行寄存器时钟,上升沿有效 STCP 第12脚 输出存储器锁存时钟线 /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ /\*\*\*\*\*\*\*\*\*\*函数声明\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void SendTo595(uchar byteData); /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ /\*\*\*\*\*\*\*\*\*\*全局参数声明\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ char shu=0xFE; /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void delay(unsigned int n)//延时函数 { unsigned int i=0,j=0; for(i=0;i<n;i++) for(j=0;j<123;j++); } void hang()//行扫描 { P=shu; shu=\_crol\_(shu,1); } char code a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E, 0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00, 0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; void main() { int i,b=0; while(1) { int num=12; while(num--) { for(i=0;i<8;i++) { hang(); //先位选再段选 SendTo595(a[i+b]); delay(2); } //P=0xFF; //SendTo595(0x00); } b++; if(b>=24)b=0; //P=0xFF; } } //发送一个字节数据给595再并行输出 void SendTo595(uchar Data) { int j=0; for(j;j<8;j++) { SCK = 0; SER=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0 Data=\_crol\_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么\_crol\_(1) 为10101010 SCK = 1; //上升沿让串行输入时钟变成高电平 并延时两个时钟周期 \_nop\_(); \_nop\_(); } /\*位移寄存器完毕,转移到存储寄存器\*/ RCK = 0; RCK = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期 \_nop\_(); RCK = 0; }
|