第三周
入门(四)
.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();
}
}