笔记 第三周

第三周

入门(四)

.c,.h文件的部署

模板
//头文件声明
#include <REGX52.H>

#include "Key.h"
#include "Seg.h"

//变量声明
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned int Seg_Slow_Down;//数码管减速专用变量 500ms

unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量

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



//按键处理
void Key_Proc()
{
	if (Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序

	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val & (Key_Val ^ Key_Old);//读取下降沿
	Key_Old = Key_Val;//辅助扫描
	
	switch(Key_Down)
	{
	
	}
}

//信息处理函数
void Seg_Proc()
{
	if (Seg_Slow_Down)return;
	Seg_Slow_Down = 1;

	
}

//其他显示函数
void Led_Proc()
{
	
	
	
}

//定时器0初始化函数
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 (++Key_Slow_Down == 10)Key_Slow_Down = 0;
	if (++Seg_Slow_Down == 500)Seg_Slow_Down = 0;

	if (++Seg_Pos == 6)Seg_Pos = 0;
	Seg_Disp (Seg_Pos,Seg_Buf[Seg_Pos]);
}

//main
void main()
{
	Timer0_Init();
	
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
        
        
        
        
	}
}
#include <Key.h>

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;

}
#include <REGX52.H>

unsigned char Key_Read();


#include <Seg.h>

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;
}
#include <REGX52.H>

void Seg_Disp(unsigned char wela,dula);

第零讲 基于定时器的 倒计时 程序设计

程序设计
//头文件声明
#include <REGX52.H>

#include "Key.h"
#include "Seg.h"

//变量声明
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned int Seg_Slow_Down;//数码管减速专用变量 500ms

unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量

unsigned char Seg_Pos;
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};
/* ------------------------------------------------ */
unsigned char Seg_Mode;//数码管显示页面 0-显示 1-设置

unsigned int Timer_1000ms;//1000毫秒标志位
unsigned char Time_Count = 30;//系统计时变量

bit System_Flag;//系统标志位 0-暂停 1-开始

unsigned char Set_Dat[3] = {15,30,60};//设置参数储存数组
unsigned char Set_Dat_Index = 1;

unsigned int Timer_500ms;//500毫秒标志位
bit Seg_Flag;//数码管标志位

//按键处理
void Key_Proc()
{
	if (Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序

	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val & (Key_Val ^ Key_Old);//读取下降沿
	Key_Old = Key_Val;//辅助扫描
	
	switch(Key_Down)
	{
		case 1://启动
			if (Seg_Mode == 0)
				System_Flag = 1;
			break;
			
		case 3://切换
			if (Seg_Mode == 1)
				Time_Count = Set_Dat[Set_Dat_Index];
			Seg_Mode ^= 1;
			break;
			
		case 4://设置
			if(Seg_Mode == 1)
			{
				if(++Set_Dat_Index == 3)
					Set_Dat_Index = 0;
			}
			break;
		
		case 2://复位
			if(Seg_Mode == 0)
				{
					Time_Count = Set_Dat[Set_Dat_Index];
				}
			break;
	}
}

//信息处理函数
void Seg_Proc()
{
	if (Seg_Slow_Down)return;
	Seg_Slow_Down = 1;

	Seg_Buf[0] = Seg_Mode + 1;
	if (Seg_Mode == 0)//系统出于显示界面
	{
		Seg_Buf[4] = Time_Count / 10 % 10;
		Seg_Buf[5] = Time_Count / 1 % 10;
	}
	else//系统设置界面
	{
		if(Seg_Flag == 1)
		{
			Seg_Buf[4] = Set_Dat[Set_Dat_Index] / 10 % 10;
			Seg_Buf[5] = Set_Dat[Set_Dat_Index] / 1 % 10;
		}
		else
		{
			Seg_Buf[4] =10;
			Seg_Buf[5] =10;
		}
	}
}

//其他显示函数
void Led_Proc()
{
	if(Time_Count == 0)
	{
		P1 = 0x00;
		P2_3 = 0;
	}
	else
	{
		P1 = 0xff;
		P2_3 = 1;
	}
	
}

//定时器0初始化函数
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 (++Key_Slow_Down == 10)Key_Slow_Down = 0;
	if (++Seg_Slow_Down == 500)Seg_Slow_Down = 0;

	if (++Seg_Pos == 6)Seg_Pos = 0;
	Seg_Disp (Seg_Pos,Seg_Buf[Seg_Pos]);
/* ------------------------------------------------ */
	if(System_Flag == 1)
	{
		if (++Timer_1000ms == 1000)
		{
			Timer_1000ms = 0;
			Time_Count--;
			if(Time_Count == 255)
				{
					Time_Count = 0;
				}
		}
	}
	if (++Timer_500ms == 500)
	{
		Timer_500ms = 0;
		Seg_Flag ^= 1;
	}
}

//main
void main()
{
	Timer0_Init();
	
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

第零讲 基于定时器的 时钟 程序设计

时钟部分
if (++Timer_1000ms == 1000)
	{
		Timer_1000ms = 0;
		Clock[2]++;
		if (Clock[2] == 60)
		{
			Clock[2] = 0;
			Clock[1]++;
			if (Clock[1] == 60)
			{
				Clock[1] = 0;
				Clock[0]++;
				if (Clock[0] == 24)
				{
					Clock[0] = 0;
				}
			}
		}
	}
程序设计
//头文件声明
#include <REGX52.H>

#include "Key.h"
#include "Seg.h"

//变量声明
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned int Seg_Slow_Down;//数码管减速专用变量 500ms

unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量

unsigned char Seg_Pos;
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};
/* ----------------------------------------------------------- */
unsigned char SMode = 0;//数码管模选择 0-时钟显示 1-时钟设置界面 2-闹钟设置界面

unsigned char Clock[3] = {23,59,59};

unsigned int Timer_1000ms;

unsigned char Seg_point[6] = {0,1,0,1,0,1};//小数点
unsigned char Clock_Set[3];
unsigned char Clock_Set_Index;//0-小时 1-分钟 2-喵

unsigned int Timer_500ms;
bit Seg_Flag;

unsigned char Alarm[] = {0,0,0};
unsigned char Alarm_Set[3];
bit Alarm_Flag = 1;

unsigned char Led;
bit Alarm_Enableed_Flag;

//按键处理
void Key_Proc()
{
	if (Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序

	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val & (Key_Val ^ Key_Old);//读取下降沿
	Key_Old = Key_Val;//辅助扫描
	
	if(Key_Down  != 0)
		Alarm_Enableed_Flag = 0;
	
	switch(Key_Down)
	{
		case 1:
			Clock_Set_Index = 0;
			Clock_Set[0] = Clock[0];
			Clock_Set[1] = Clock[1];
			Clock_Set[2] = Clock[2];
			SMode = 1;
			break;
		
		case 2://闹钟
			Clock_Set_Index = 0;
			Alarm_Set[0] = Alarm[0];
			Alarm_Set[1] = Alarm[1];
			Alarm_Set[2] = Alarm[2];
			SMode = 2;
			break;

		case 3:
			if (SMode == 1)
			{
			if (++Clock_Set_Index ==3)
				Clock_Set_Index = 0;
			}
			break;

		case 4:
			Alarm_Flag ^= 1;
			break;
		case 5:
		if(SMode == 1)
		{			
		Clock_Set[Clock_Set_Index]++;
		if ((Clock_Set[Clock_Set_Index]) == (Clock_Set_Index == 0 ?24:60))
			Clock_Set[Clock_Set_Index] = 0;
		}
		if(SMode == 2)
		{			
		Alarm_Set[Clock_Set_Index]++;
		if ((Alarm_Set[Clock_Set_Index]) == (Clock_Set_Index == 0 ?24:60))
			Alarm_Set[Clock_Set_Index] = 0;
		}
			break;
		
		case 6:
			if(SMode == 1)
			{
			Clock_Set[Clock_Set_Index]--;
		if (Clock_Set[Clock_Set_Index] == 255)
			Clock_Set[Clock_Set_Index] = Clock_Set_Index == 0 ?23:59;
			}
			if(SMode == 2)
			{
			Alarm_Set[Clock_Set_Index]--;
		if (Alarm_Set[Clock_Set_Index] == 255)
			Alarm_Set[Clock_Set_Index] = Clock_Set_Index == 0 ?23:59;
			}
			break;
		
		case 7://确认
			if(SMode == 1)
			{
			Clock[0] = Clock_Set[0];
			Clock[1] = Clock_Set[1];
			Clock[2] = Clock_Set[2];
			}
			if(SMode == 1)
			{
			Clock[0] = Alarm_Set[0];
			Clock[1] = Alarm_Set[1];
			Clock[2] = Alarm_Set[2];
			}
			SMode = 0;
			
			break;
		
		case 8://取消
			SMode = 0;
			break;
	
	}
}

//信息处理函数
void Seg_Proc()
{
	unsigned char i;//用于for循环
	
	if (Seg_Slow_Down)return;
	Seg_Slow_Down = 1;
	
	switch(SMode)
	{
		case 0:
			/*
			Seg_Buf[0] = Clock[0] / 10 % 10;
			Seg_Buf[1] = Clock[0] / 1 % 10;
			Seg_Buf[2] = Clock[1] / 10 % 10;
			Seg_Buf[3] = Clock[1] / 1 % 10;
			Seg_Buf[4] = Clock[2] / 10 % 10;		
			Seg_Buf[5] = Clock[2] / 1 % 10;
			*/
			
			for (i = 0; i <= 2 ; i++)
				{
					Seg_Buf[0+2*i] = Clock[i] / 10 % 10;
					Seg_Buf[1+2*i] = Clock[i] / 1 % 10;
				}
		
			break;
		case 1:
			for (i = 0; i <= 2 ; i++)
				{
					Seg_Buf[0+2*i] = Clock_Set[i] / 10 % 10;
					Seg_Buf[1+2*i] = Clock_Set[i] / 1 % 10;
					
					//Seg_Flag ^= 1;
					Seg_Buf[0+2*Clock_Set_Index] = Seg_Flag ?Clock_Set[Clock_Set_Index] / 10 % 10:10;
					Seg_Buf[1+2*Clock_Set_Index] = Seg_Flag ?Clock_Set[Clock_Set_Index] / 1 % 10:10;
				}
		case 2:
			for (i = 0; i <= 2 ; i++)
				{
					Seg_Buf[0+2*i] = Alarm_Set[i] / 10 % 10;
					Seg_Buf[1+2*i] = Alarm_Set[i] / 1 % 10;
					
					Seg_Buf[0+2*Clock_Set_Index] = Seg_Flag ?Alarm_Set[Clock_Set_Index] / 10 % 10:10;
					Seg_Buf[1+2*Clock_Set_Index] = Seg_Flag ?Alarm_Set[Clock_Set_Index] / 1 % 10:10;
				}
		
			break;

	}
}

//其他显示函数
void Led_Proc()
{
	if(Alarm_Flag == 1)
		{
			if ( Clock[0] == Alarm[0] && Clock[1] == Alarm[1] && Clock[2] == Alarm[2])
				Alarm_Enableed_Flag = 1;
			if (Alarm_Enableed_Flag == 1)
			{
				P2_3 = 0;
				P1 = Led;
			}
			else
			{
			P2_3 = 1;
			P1 = 0xff;
			}
		}
		else
		{
			P2_3 = 1;
			P1 = 0xff;
		}
}

//定时器0初始化函数
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 (++Key_Slow_Down == 10)Key_Slow_Down = 0;
	if (++Seg_Slow_Down == 500)Seg_Slow_Down = 0;

	if (++Seg_Pos == 6)Seg_Pos = 0;
	Seg_Disp (Seg_Pos,Seg_Buf[Seg_Pos],Seg_point[Seg_Pos]);
	if (++Timer_1000ms == 1000)
	{
		Timer_1000ms = 0;
		Clock[2]++;
		if (Clock[2] == 60)
		{
			Clock[2] = 0;
			Clock[1]++;
			if (Clock[1] == 60)
			{
				Clock[1] = 0;
				Clock[0]++;
				if (Clock[0] == 24)
				{
					Clock[0] = 0;
				}
			}
		}
	}
	if(++Timer_500ms == 500)
	{
		Timer_500ms = 0;
		Seg_Flag ^= 1;
		if(Clock[0] >= 12)
					Led ^= 0xf0;
		else
			Led ^= 0xf0;
	}
}

//main
void main()
{
	Timer0_Init();
	
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();    
	}
}