按键与显示实验

文章目录

  • 一、实验要求
  • 二、实验代码
  • 三.实验原理图


一、实验要求

用数码管的前两位显示一个十进制数,变化范围为00—59,开始时显示00,每按下K1键一次,数值加1;每按下K2键一次,数值减1;每按下K3键一次,数值归零。

二、实验代码

代码如下(示例):

/**    //动态数码数码管的显示
 *     //实验采用的8段共阳极数码管    CA是共阳管  CC为共阴
 *     
 * 
 * */

#include"REG51.H"
#include"intrins.h"
typedef unsigned int uint;
uint code SegCode[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08};
uint code BitCode[]={0XFE,0XFD};
int count;//定义一个有符号的为了我if里面的判断
	
void DelayMs(uint ms);
void display();

void main(void)
{ 
	
    while(1)
	{	 
	    if(P3==0XEF||P3==0XDF||P3==0XBF)
		{ 
			DelayMs(20);//消去抖动
	        if(P3==0XEF||P3==0XDF||P3==0XBF)//再次判断
			{	
				switch (P3)
				{
			
					case 0XEF:count++;break;//开关1  加数
					case 0XDF:count--;break;//开关2  减数
				    case 0XBF:count=0;break;//开关3  清0
					default://防止误会,得加上
						break;
				}
				while(P3==0XEF||P3==0XDF||P3==0XBF);//松手检测
				DelayMs(20);//消去松手抖动
                //		switch (P3) 刚开始我是放在这里,但是这里会出现一个问题,
			}   //      当松手之后,按键的值也会消失,Switch就不起作用了
		}
		if(count==60 || (count<0) )// 防止一开始就按减数的人,比如我 ....... 
			count=0;
		display();//显示段码
	}
	
}

void display()
{
     //proteus显示与日常可能有所差异,只能这样.取余本来应该是低位,结果现在只能是放到高位
	 P0=0XFE;//P0作为位码
	 P2=SegCode[count%10];//送高位
	 DelayMs(20);
	 P0=0XFD;	
	 P2=SegCode[count/10];//送低位
	 DelayMs(20);
}

void DelayMs(uint ms)
{
	uint i;
	while(ms--)
		for(i=0;i<113;i++);
	
}

三.实验原理图

按键与显示实验_第1张图片

你可能感兴趣的:(单片机,单片机,51单片机,c语言)