LED模块
Led 在蓝桥杯的板子里 led是P0 然后P0是很多硬件的入口 如果我们重复给P0口重新赋值的话,就会造成混论 影响其他的功能 所以写了一个Led底层 只给一次 如果不改变它的变量 就不给p值
Led模块
#include <Led.h>
void Led_Disp(unsigned char addr,enable)
{
static unsigned char temp = 0x00;//静态工作变量 每次值进来不会被刷新
static unsigned char temp_Old = 0xff;//temp和teemp_old不一样才能对P1赋值
if(enable)//是否开启
temp |= 0x01 << addr;//0000 0001 (不变 亮)
else
temp &= ~(0x01 << addr); //0000 0001 1111 1110(不变 灭)
if(temp != temp_Old)//如果前一次和后一次的值一样 那就不对P1赋值
{
P1 = ~temp;//取反 1-亮 0-灭 好理解 刚开始0000 0000
temp_Old = temp;
}
main函数变量声明
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//给0熄灭
unsigned char Led_Pos=0;//索引值
在中断中不断刷新调用
if(++Led_Pos == 8) Led_Pos = 0;//Led显示专用
Led_Disp(Led_Pos,ucLed[Led_Pos]);
在Led_Proc()中实现Led的功能 ucLed[ ?] =?
/* 其他显示函数 */
void Led_Proc()
{
if(Voltage < Voltage_Set)
{
if(Sys_Tick>=5000)
ucLed[0]=1;
else
ucLed[0]=0;
}
else
ucLed[0]=0;
ucLed[1] = Count%2;//奇数取余2为1 偶数取余2为0
ucLed[2] = Error_Key/3;//大于3整除为1 小于为0
}
KEY模块
二、按键 【S1-S10:0-9】 键盘输入
//输入数据 定义了一个数组存放输入数据 对应有索引值
unsigned char Seg_Input[4]={11,11,11,11};//输入电压数据 默认为杠
unsigned char Seg_Input_Index=0;//输入电压数据指针
unsigned int Error_Key;//错误按键 每次按键有效就=0 错误就++(连续错误)
unsigned char Seg_Mode=0;//0-电压采集界面 1-数据显示界面 2-参数设置界面 3-计数统计界面
//按键 【S1-S10:0-9】 键盘输入
if(Key_Down>=1 && Key_Down<=10)
{
if(Seg_Mode==0 && Seg_Input_Index<4)
{
Seg_Input[Seg_Input_Index] = Key_Down-1;
Seg_Input_Index++;
Error_Key=0;
}
else
Error_Key++;
}
else
Error_Key++;
三、四舍五入
把输入数组里一个一个的变量变为整体的值 让这个整体的值+5实现“五入”,/最高位的1000.0实现“舍” 定义一个浮点型float变量存储该数
一般要判断一下Vol的值是否符合
float Voltage=0.0;//输入电压 数码管只是单个的数字 保存进系统是要浮点型
unsigned char Seg_Input[4]={11,11,11,11};//输入电压数据 默认为杠
Voltage = ((Seg_Input[0]*1000+Seg_Input[1]*100+Seg_Input[2]*10+Seg_Input[3])+5)/1000.0;
if(Voltage>0.01)//最小值为0.01
四、输入数据
题目:
输入电压是前面按键完成的,S11是保存,所以要看前面是否已经按了四个值
电压采集按键,按下 S11 后进入电压采集界面,可重新采集一次电压值
在电压采集界面按下 S11 后保存当前输入电压值,并返回电压显示界面(若输入数据不符合规范性,则清空数据重新输入
输入的值符合就跳入下一个界面 不符合就索引值清零 输入数组清零复位(用for循环)
switch(Key_Down)
{
case 11:
Error_Key=0;
if(Seg_Mode==0)//在电压采集界面按下
{
/*【输入数据】是否符合规范性*/
if(Seg_Input_Index >= 4)//一定要四位 你按超过四位也成 但是按小于四位就打回重开
{
/*四舍五入*//*输入 保存到实际值中*/
Voltage = ((Seg_Input[0]*1000+Seg_Input[1]*100+Seg_Input[2]*10+Seg_Input[3])+5)/1000.0;
if(Voltage>0.01)//最小值为0.01
Seg_Mode=1;
else
{
Seg_Mode=0;
/*复位*/
Seg_Input_Index=0;
for(i=0;i<4;i++)
Seg_Input[i] = 11;
}
}
else
{
Seg_Mode=0;
/*复位*/
Seg_Input_Index=0;
for(i=0;i<4;i++)
Seg_Input[i] = 11;
}
}
else//不在 电压采集界面
{
Seg_Mode=0;
/*复位*/
Seg_Input_Index=0;
for(i=0;i<4;i++)
Seg_Input[i] = 11;
}
break;
五、保存+三个界面循环切换
case 12://界面切换按键 数据显示-参数设置-计数统计
if(Seg_Mode!=0)//处于非电压采集界面
{
if(Seg_Mode==2)//处于参数设置界面 只有这个采用保存 然后后面就移动++
Voltage_Param=Voltage_Set;//保存
if(++Seg_Mode == 4)//三个模式循环切换
Seg_Mode=1;
Error_Key=0;
}
else Error_Key++;
break;
SEG模块
一、看图说话 函数
bit VdVp=0;//实际电压(VAIN3)大于电压设置参数(Vp)标志位
unsigned int Count;//计数值
float Voltage=0.0;//输入电压 数码管只是单个的数字 保存进系统是要浮点型
float Voltage_Set=3.0;//输入电压 设置值
float Voltage_Param = 3.0;//实际电压数据显示
/*实际电压(VAIN3)大于电压设置参数(Vp)计数值加一*/
if(Voltage > Voltage_Set)
VdVp=1;
else if(VdVp==1)
{
VdVp=0;
Count++;
}
else if也包含了Voltage <Voltage_Set的情况
二、小数点 的亮灭
数码管模块
记得Seg.h里也要改!!point!!
定义小数点数组
unsigned char Seg_Point[6] = {0,0,0,0,0,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]);
把点亮的小数点熄灭 把熄灭的小数点点亮 Seg_Point【小数点点在哪个位】= 亮1灭0
10/10=1 (<10)/10=0 为十位数 小数点向后一位 个位数小数点不移动
三、 浮点型float的数码管显示
四、高位熄灭
有高位熄灭前面要定义unsigned char j=0;
五、显示输入数据
一个数组显示另一个数组 定义一个unsigned char i=0;
中断
一、当***超过5s时就****
在中断服务函数里 定义一个系统时钟 注意Sys 是 unsigned int
在其他函数里判断Sys超过5s就执行相应操作