1.模块编程
(1)按键——b站西风(加上定时器初始化)
按键主要问题是按键如何消抖:因而就需要延时,看江科大所示需要引入Delay函数,但后面要计时的话用定时器模块来解决,因而我并不想引入Delay函数,我就看西风定义几个按键消抖,延时的参数来解决如:
Key库函数的建立:
#include <REGX52.h>
void Key_r(unsigned int num)//读取按键键码值
{
P1_7 = 0;P1_6 = 1;P1_5 = 1;P1_4 = 1;
if(P1_3 == 0) temp = 1;
if(P1_2 == 0) temp = 2;
if(P1_1 == 0) temp = 3;
if(P1_0 == 0) temp = 4;
P1_7 = 1;P1_6 = 0;P1_5 = 1;P1_4 = 1;
if(P1_3 == 0) temp = 5;
if(P1_2 == 0) temp = 6;
if(P1_1 == 0) temp = 7;
if(P1_0 == 0) temp = 8;
P1_7 = 1;P1_6 = 1;P1_5 = 0;P1_4 = 1;
if(P1_3 == 0) temp = 9;
if(P1_2 == 0) temp = 10;
if(P1_1 == 0) temp = 11;
if(P1_0 == 0) temp = 12;
P1_7 = 1;P1_6 = 1;P1_5 = 1;P1_4 = 0;
if(P1_3 == 0) temp = 13;
if(P1_2 == 0) temp = 14;
if(P1_1 == 0) temp = 15;
if(P1_0 == 0) temp = 16;
return temp;
}
Key初始化函数建立:
#include <REGX52.h>
#include "Key_r.h"
unsigned char Key_slow;//按键延时
unsigned char Key_val,Key_old,Key_down;//按键消抖变量定义
//按键初始化
void Key_i()
{
if(Key_slow)retuen;
Key_slow=1;
Key_val=Key_r();//按键延时用定时器
Key_old=Key_val;//按键下降沿啥的
Key_down=Key_val&(Key_val^Key_old);
switch(Key_down)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
}
//定时器初始化
void Timer0_i()
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器0中断打开
EA = 1; //总中断打开
}
//定时器服务
void Timer0_server()
{
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
if(Key_slow==10)Key_slow=0;
}
//主函数
void main()
{
Timer0_i();
while(1)
{
Key_i();
}
}
(2)数码管显示——51江科大(基于译码器)
基于51数码管基础通过段选确定那个亮再位选亮数字代码如下:
#include <REGX52.h>
unsigned char Seg_slow;//数码管的延时
unsigned char Seg_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x6d,0x77,0x40};//所要显示的数字
void Seg_i(unsigned char Seg_l,Seg_c)//第一个是哪一个亮第二个是显示什么
{
switch(Seg_l)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=Seg_data[Seg_c];
}
注:
1.个人觉得人数码管这个方法不通用需要译码器
2.这里思路最重要而代码是基于芯片端口来改动