笔记 第二周

第二周

入门(一)

基本格式
//头文件
#include <REGX52.H>

//main
void main()
{	
    while(1)
	{	
        
	}
}
自定义的延迟函数
void Delay(unsigned char xms)	//@12.000MHz
{	
    unsigned char i, j;
	while(xms--)
	{	
        i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
流水灯
void main()
{
	while(1)
	{
		//P1 = 0xAA; //12121212
		
		/*
		P1_2=0;//亮
		Delaylms(1000);
		P1_2=1;
		Delaylms(1000);
		*/
		
		ucLed =_crol_(ucLed,1);
		Delay1ms(1000);
		
	}

}

入门(二)

按键控制
//头文件
#include <REGX52.H>
#include <intrins.h>

//延迟函数
void Delay1ms(unsigned char xms)	//@12.000MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

//变量
unsigned char ucLed = 0xfe;

unsigned char Key_Val,Key_Down,Key_Up,Key_Old;

//按键
unsigned char Key_Read()
{
	unsigned char temp = 0;
	if(P3_4==0)temp=1;
	if(P3_5==0)temp=2;
	if(P3_6==0)temp=3;
	if(P3_7==0)temp=4;
	
	return temp;
}

//main
void main()
{
	while(1)
	{
		Key_Val = Key_Read();//读取键码值
		Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
		Key_Old = Key_Val;//扫描辅助变量(一直按着)
		
		if (Key_Down == 1)P1_0=0;
		if (Key_Up == 2)P1_0=1;
		
		if (Key_Old == 3)
			P1_1=0;
		else
			P1_1=1;
        
	}

}
流水控制
//头文件
#include <REGX52.H>
#include <intrins.h>

//延迟函数
void Delay1ms(unsigned char xms)	//@12.000MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

//变量
unsigned char ucLed = 0xfe;

unsigned char Key_Val,Key_Down,Key_Up,Key_Old;

bit System_Flag;

//按键
unsigned char Key_Read()
{
	unsigned char temp = 0;
	if(P3_4==0)temp=1;
	if(P3_5==0)temp=2;
	if(P3_6==0)temp=3;
	if(P3_7==0)temp=4;
	
	return temp;
}

//main
void main()
{
	while(1)
	{
		//P1 = 0xAA; //12121212
		
		/*
		P1_2=0;//亮
		Delay1ms(1000);
		P1_2=1;
		Delay1ms(1000);
		*/
		
		/*
		ucLed =_crol_(ucLed,1);
		Delay1ms(1000);
		*/
		
		Key_Val = Key_Read();//读取键码值
		Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
		Key_Old = Key_Val;//扫描辅助变量(一直按着)
		
		
		/*
		if (Key_Down == 1)P1_0=0;
		if (Key_Up == 2)P1_0=1;
		
		if (Key_Old == 3)//长按
			P1_1=0;//亮
		else
			P1_1=1;//暗
		*/
		if (System_Flag == 1)
			{
				ucLed =_crol_(ucLed,1);
				P1 = ucLed;
				Delay1ms(1000);
			}
			
		if (Key_Down == 1)System_Flag = 1;
		if (Key_Down == 2)System_Flag = 0;
		
	}

}
流水部分优化
switch (Key_Down)
			{
				case 1:
					System_Flag = 1;
					break;
				case 2;
					System_Flag = 0;
					break;
			}
led彩灯控制系统

彩灯运行模式:

模式1:Led1 – Led2 – Led3 – Led4 – Led5 – Led6 – Led7 – Led8

模式2:Led8 – Led7 – Led6 – Led5 – Led4 – Led3 – Led2 – Led1

模式3:Led1+Led8 – Led2+Led7 - Led3+Led5 – Led4+Led6

模式4:Led4+Led6 – Led3+Led5 – Led2+Led7 – Led1+Led8

按键功能定义:

S1:彩灯系统启动按键

S2:彩灯系统暂停按键

S3:显示模式调整按键(运行模式+1)(若模式4+1后返回到模式1)

S4:显示模式调整按键(运行模式-1)(若模式1-1后返回到模式4)

初始化状态:

上电时,默认为模式启动状态,固定流转时间500ms/次

#include <REGX52.H>
#include <intrins.h>

//变量

unsigned char Val,Down,Up,Old;
unsigned int Time = 500;

unsigned char Led = 0xfe;
unsigned char Mode = 1;

signed char i=0;

unsigned char mode_3_4[] = {0x7e,0xbd,0xdb,0xe7};

bit Flag = 1;//启动暂停

//按键读取函数
unsigned char Read()
	{
		unsigned char temp = 0;
		if(P3_4 == 0) temp = 1;
		if(P3_5 == 0) temp = 2;
		if(P3_6 == 0) temp = 3;
		if(P3_7 == 0) temp = 4;
		return temp;
	}

//延迟函数
void Delay(unsigned int xms)
	{
		unsigned char i,j;
		while (xms--)
			{
				i = 2;
				j = 239;
				do
				{
					while (--j);
				}
					while(--i);
			}
	}
	

//main

void main()
{
	while(1)
	{
		Val = Read();// 读取
		Down = Val & (Val ^ Old);
		Up = ~Val & (Val ^ Old);
		Old = Val;

		switch (Down)
			{	case 1 :
					Flag = 1;
					break;
				
				case 2 :
					Flag = 0;
					break;
				
				case 3 :
					if(Flag == 1)
					{
					Mode++;
					if (Mode > 4)Mode = 1;
					i=0;
					}
					if (Mode == 1 || Mode == 2) Led = 0xfe;
					break;
				
				case 4 :
					if(Flag == 1)
					{
					Mode--;
					if (Mode == 0)Mode = 4;
					i=0;
					}
					if (Mode == 1 || Mode == 2) Led = 0xfe;
					break;

			}
			
		if(Flag == 0) continue;
			
		switch (Mode)
		{
			case 1:
				P1 = Led;
				Delay(Time);
				Led = _crol_(Led,1);
			break;
			case 2:
				P1 = Led;
				Delay(Time);
				Led = _cror_(Led,1);
			break;
			case 3:
				Led= mode_3_4[i];
				Delay(Time);
				i++;
				if (i>=4) i=0;
				P1 = Led;
			break;
			case 4:
				Led= mode_3_4[i];
				Delay(Time);
				i--;
				if (i<0) i=3;
				P1 = Led;
			break;
		}
	}
}

入门(三)

断选

1是选中,0是不选中

小数点—>中间—>左上角开始逆时针转

位选

0是选中,1是不选中

unsigned char Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void Seg_Disp (unsigned char wela,dula)
{
	P0 = 0x00;
	P2_6 = 1;
	P2_6 = 0;
	
	P0 = Seg_Wela [wela];
	P2_7 = 1;
	P2_7 = 0;
	
	P0 = Seg_Dula [dula];
	P2_6 = 1;
	P2_6 = 0;
	
}	
定时器初始化
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	//AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
    
	ET0 = 1;
	EA = 1;
}

计时器
unsigned char Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

unsigned char Seg_Pos = 0;
unsigned char Seg_Buf[] = {1,2,3,4,5,6}; 

//定时器初始化函数
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	
	ET0 = 1;
	EA = 1;
}

//定时器0中断服务函数
void Timer0Server() interrupt 1
{	
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	
	if (++Seg_Pos == 6)Seg_Pos = 0;
	Seg_Disp (Seg_Pos,Seg_Buf[Seg_Pos]);
}

//数码管显示函数
void Seg_Disp (unsigned char wela,dula)
{
	P0 = 0x00;
	P2_6 = 1;
	P2_6 = 0;
	
	P0 = Seg_Wela [wela];
	P2_7 = 1;
	P2_7 = 0;
	
	P0 = Seg_Dula [dula];
	P2_6 = 1;
	P2_6 = 0;
	
}	

void main()
{
    Timer0_Init();
    
    Seg_Buf [0] = Time / 100 %10;
	Seg_Buf [1] = Time / 10 %10;
	Seg_Buf [2] = Time / 1 %10;
}