#include <reg52.h>
sbit SHCP0=P1^0; // 74HC595移位寄存器时钟输入
sbit SDI0=P1^1; // 74HC595串行数据输入
sbit STCP0=P1^2; // 74HC595存储寄存器时钟输入
sbit SHCP1=P1^3;
sbit SDI1=P1^4;
sbit STCP1=P1^5;
sbit E21=P1^6;
sbit E22=P1^7;
sbit led = P0^0;
unsigned char flash;
int x;
unsigned char i;
unsigned int m,n;
unsigned char cnt=0;
unsigned char code table[]={
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, //空屏
0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,
0xF0,0x7F,0xF8,0x3F,0xFC,0x1F,0xFC,0x0F,0xF8,0x07,0xF0,0x03,0xE0,0x01,0x00,0x00, //爱心
0x40,0x00,0x20,0x00,0x10,0x00,0xF8,0x0B,0x04,0x08,0x03,0x08,0x80,0x08,0x40,0xFE,
0x3E,0x08,0x30,0x08,0x48,0x08,0x44,0x08,0xF2,0x0B,0x40,0x00,0x20,0x00,0x00,0x00, //华
0x00,0x00,0x08,0x08,0x10,0x04,0x20,0x02,0x40,0x01,0xFE,0x7F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x0F,0x80,0x10,0x40,0x20,0x20,0x40,0x10,0x40,0x08,0x20, //北
0x00,0x00,0x00,0x00,0x02,0x08,0x04,0x04,0x08,0x22,0x10,0x21,0xA0,0x40,0xFF,0xFF,
0xFE,0x7F,0x40,0x01,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x00,0x00,0x00,0x00, //水
0x00,0x00,0x80,0x62,0x40,0x12,0x20,0x0A,0xF0,0xFF,0x08,0x0A,0x06,0x12,0x00,0x62,
0x00,0x00,0xC0,0x07,0x00,0x10,0x00,0x20,0xFC,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, //利
0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,
0xF0,0x7F,0xF8,0x3F,0xFC,0x1F,0xFC,0x0F,0xF8,0x07,0xF0,0x03,0xE0,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, //空屏
};
/***************************************************************
** 函数名称: send_595(unsigned char data)
** 功能描述: 595数据发送子程序,给595发一字节数据
** 输 入: data 要发送到74HC595的数据
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***************************************************************/
void send_595(unsigned char dat){
unsigned char i;
STCP0=0;
for(i=8; i>0; i--)//判断位八次
{
if(dat & 0x80) SDI0=1;//是1 DS发送1
SHCP0 = 0; //送入移位寄存器,不送入并口
SHCP0 = 1;
SDI0 = 0;//清零
dat=dat<<1;//移位
}
STCP0=1;
}
void send1_595(unsigned char dat){
unsigned char i;
STCP1=0;
for(i=8; i>0; i--)//判断位八次
{
if(dat & 0x80) SDI1=1;//是1 DS发送1
SHCP1 = 0; //送入移位寄存器,不送入并口
SHCP1 = 1;
SDI1 = 0;//清零
dat=dat<<1;//移位
}
STCP1=1;
}
void delay(int ms){
int ss=120;
for(;ms>0;ms--)
for(;ss>0;ss--) ;
}
//静态显示
void staticDisplay(){
for (cnt=0; cnt<16; cnt++){
if (cnt<8)
{
E22=0;
E21=1;
P2=cnt&0x07;
}
else
{
E21=0;
E22=1;
P2=(cnt&0x07)<<3;
}
send_595(table[32+(2*cnt)]); ////显示高位
send1_595(table[32+(2*cnt+1)]); ///显示低位
delay(50);
}
}
//闪烁显示
void shineDisplay(){
while(1){
delay(8000);
P2=0xff;
for(x=0;x<8;x++){
staticDisplay();
}
}
}
//位移显示
void moveDisplay(){
int i;
int num=sizeof(table);
while(1){
for(i=0;i<num;i++){
for (cnt=0; cnt<16; cnt++){
if (cnt<8){
E22=0;
E21=1;
P2=cnt&0x07;
}else{
E21=0;
E22=1;
P2=(cnt&0x07)<<3;
}
send_595(table[2*(cnt+i)]); ////显示高位
send1_595(table[2*(cnt+i)+1]); ///显示低位
delay(50);
}
delay(200);
}
}
}
void select(/*unsigned char flash*/){
flash++;
//if(flash==1){
// moveDisplay();
// }else if(flash==2){
// shineDisplay();
// }else if(flash==3){
// staticDisplay();
// flash=0;
// }
switch(flash){
case 1:shineDisplay();break;
case 2:moveDisplay(); break;
default:staticDisplay();break;
}
}
void int1() interrupt 2{
if(flash==3){flash=0;}
select();
}
int main(void){
EA=1;
EX1=1;
IT1=1;
P2=0xff;
flash=0;
while(1){staticDisplay();}
}
---贴吧极速版 For UWP