【ct107d】独立键盘

独立键盘

独立键盘和矩阵键盘虽都是键盘,但程序完全不同
先说独立键盘:

1、独立按键的处理思路
一般情况下,独立按键有两个引脚,其中一个通过上拉电阻接到单片机的I/O端口,另外一端接地。也就是说,平时按键没有动作的时候,输出的是高电平,如果有按下动作发生,则输出的是低电平。那么,我们在程序设计的时候,只要扫描跟按键引脚相连的I/O端口,如果发现有低电平产生,则判定该按键处于按下状态。有些时候,电路或者外围有电磁干扰,也会使单片机的I/O端口产生低电平,这种干扰信号会让单片机误认为是按键动作。所以,在扫描按键的时候应该做去抖动处理,把干扰信号过滤掉,从而获得准确的按键状态信号。

在这里插入图片描述
原理图中若想操作独立键盘想让J5端子2 3 引脚短接,这样当有键按下之后低电平将会从io口送出,然后我们检测io口的电平是否为低电平来判断按键是否按下.

CT107D 开发版任务:
在这里插入图片描述
程序如下:

#include "reg52.h"  

sbit HC138_A = P2^5;        
sbit HC138_B = P2^6;        
sbit HC138_C = P2^7;        

sbit S7 = P3^0;        
sbit S6 = P3^1;        
sbit S5 = P3^2;        
sbit S4 = P3^3;        

unsigned char code SMG_NoDot[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

void Delay(unsigned char t)
{
        while(t--);
}

void Init74HC138(unsigned char n)
{
        switch(n)
        {
                case 4:
                        HC138_A = 0;
                        HC138_B = 0;
                        HC138_C = 1;
                        break;
                case 5:
                        HC138_A = 1;
                        HC138_B = 0;
                        HC138_C = 1;
                        break;
                case 6:
                        HC138_A = 0;
                        HC138_B = 1;
                        HC138_C = 1;
                        break;
                case 7:
                        HC138_A = 1;
                        HC138_B = 1;
                        HC138_C = 1;
                        break;
                case 8:
                        HC138_A = 0;
                        HC138_B = 0;
                        HC138_C = 0;
                        break;
        }
}

void ShowKeyNum(unsigned char value)
{
        Init74HC138(6);
        P0 = 0x01;
        Init74HC138(7);
        P0 = value;
}

void ScanKeys()
{
        if(S7 == 0)
        {
                Delay(200);
                if(S7 == 0)
                {
                        while(S7 == 0);
                        ShowKeyNum(SMG_NoDot[1]);
                }
        }
        if(S6 == 0)
        {
                Delay(200);
                if(S6 == 0)
                {
                        while(S6 == 0);
                        ShowKeyNum(SMG_NoDot[2]);
                }
        }
        if(S5 == 0)
        {
                Delay(200);
                if(S5 == 0)
                {
                        while(S5 == 0);
                        ShowKeyNum(SMG_NoDot[3]);
                }
        }
        if(S4 == 0)
        {
                Delay(200);
                if(S4 == 0)
                {
                        while(S4 == 0);
                        ShowKeyNum(SMG_NoDot[4]);
                }
        }
}
                          
{
        while(1)
        {
                ScanKeys();
        }
}

非常的简单 ,但在蓝桥杯中 独立键盘的应用是有很多的嵌套; 如让S5 S6 按键来实现功能的切换 当S5作用时S6不工作,反之S6工作S5不工作,即S5 S6 是功能选择 其他键在嵌套进来实现功能.
如题目:
在这里插入图片描述
在第一次程序的基础上 改动,

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar stat=0;

sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
sbit key=P3^6;

sbit D1=P0^0;
sbit D2=P0^1;
sbit D3=P0^2;
sbit D4=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
sbit D7=P0^6;
void HC_138(uchar n) //138译码器选择
{
	switch(n)
	{
		case(4):P2=(P2&0x1f)|0x80; break;
    	case(5):P2=(P2&0x1f)|0xa0; break;
    	case(6):P2=(P2&0x1f)|0xc0; break;
    	case(7):P2=(P2&0x1f)|0xe0; break;
	}
}
void delay(uint t)
{
	while(t--);
}
void init() //关闭蜂鸣器
{
	HC_138(5);
	P0=0X00;
}
void scankey() //键盘扫描
{
	if(S7==0)
	{
		delay(100);
		if(S7==0)
		{
			if(stat==0)
			{
				D1=0;
				stat=1;
			}
			else if(stat==1)
			{
				D1=1;
				stat=0;
			}
			
		}
	}
	if(S6==0)
	{
		delay(100);
		if(S6==0)
		{
			if(stat==0)
			{
				D2=0;
				stat=2;
			}
			else if(stat==2)
			{
				D2=1;
				stat=0;
			}
		}
	}
	if(S5==0)
	{
		delay(100);
		if(S5==0)
		{
			if(stat==1)
			{
				D4=0;
				while(S5==0)
				D4=1;
			}
			else if(stat==2)
			{
				D6=0;
				while(S5==0)
				D6=1;
			}	
		}
	}
	if(S4==0)
	{
		delay(100);
		if(S4==0)
		{
			if(stat==1)
			{
				D3=0;
				while(S4==0)
				D3=1;
			}
			else if(stat==2)
			{
				D5=0;
				while(S4==0)
				D5=1;
			}	
		}
	}

}
void main()
{
	key=0;
	init();
	HC_138(4);
	P0=0XFF;
	while(1)
	{
	scankey();
	}
}

这里设置一个变量stat 通过他的值来嵌套.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你我山巅自相逢y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值