刚刚简单了解
sbit是定义***一个引脚***
sfr 是定义***一个并行口***(如P2算一个并行口,有8个引脚)
#define是相当于换名之类的,(当然是自我理解,我不知道专业术语怎么说)就比如这串代码***P2=0X8f&(P2|0xe0);//打开y4锁存器***,如果你不想接下来都打这么长,那你可以***#define Y4 P2=0X8f&(P2|0xe0);***这样,接下来要用时可以写***Y4;***就好了。总之#define不能定义引脚和并行口。
#include <STC15F2K60S2.H>
sbit s7 = P3^0;//定义P30引脚,也可以直接使用P30
sbit s6 = P3^1;//定义P31引脚,也可以直接使用P31
/***************************************************/
void initsystem(unsigned char i)//初始化
{
switch(i)
{
case 4:
P2=0X8f&(P2|0xe0);//打开y4锁存器
break;
case 5:
P2=0xbf&(P2|0xe0);//打开y5锁存器
break;
case 6:
P2=0xdf&(P2|0xe0);//打开y6锁存器
break;
case 7:
P2=0xff&(P2|0xe0);//打开y7锁存器
break;
case 0:
P2=0x1f&(P2|0xe0);//关闭锁存器(y4,y5,y6,y7)
break;
}
}
/***********************************************/
void led_control(unsigned char n,unsigned char q)//控制灯(p0端,锁存器)
{
initsystem(q);
P0 = n;
}
/*******************************************/
void Delay (unsigned int t)//延时
{
while(t--);
while(t--);
}
/********************************************/
void LED_Running ()//跑马灯
{
unsigned char i;
for (i=0;i<3;i++)//灯全亮灭3次
{
led_control(0x00,4);
Delay (60000);
led_control(0xff,4);
Delay (60000);
}
for(i=1;i<8;i++)//灯依次亮
{
led_control(0xff<<i,4);
Delay(60000);
}
for(i=1;i<8;i++)//灯依次灭
{
led_control(~(0xff<<i),4);
Delay(60000);
}
}
/**********************************************/
void LED_1()//间隔闪灯
{
led_control(0xaa,4);
Delay (10000);
led_control(0x55,4);
Delay (10000);
}
/*********************************************************/
void key_alone()//按s7执行跑马灯,按s6执行间隔闪灯
{
if(s7==0)//或P30==0
Delay(60000);
if(s7==0)//或P30==0
{
LED_Running ();
}
if(s7==1)//或P30==1
{
led_control(0xff,4);
}
/**********************************************/
if(s6==0)//或P31==0
Delay(60000);
if(P31==0)//或P31==0
{
LED_1();
}
if(s6==1)//或P31==1
{
led_control(0xff,4);
}
}
/***************************************************/
void main()//主函数
{
led_control(0Xff,4);initsystem(0);//初始化
led_control(0x00,5);initsystem(0);//初始化
while(1)
{
key_alone();
}
}