蓝桥杯单片机----学习三矩阵按键(STC15F2K60S2)

一、原理图

二、原理分析

        ROW1 -> ROW4分别接P3^0 -> P3^3,COL1接P4^2,COL2接P4^4,COL3和COL4分别接P3^5和P3^4,当按键两端同时置低电平时,按键导通。例如,当COL1和ROW1为0时,选择S7。

三、代码 

#include "key.h"
sbit R1 = P3^2;
sbit R2 = P3^3;
sbit C1 = P4^4;
sbit C2 = P4^2;
KEYStruct key;
KEYStruct* GetKeyStruct()
{
	return &key;
}
void Delay(unsigned int x)
{
	while(x--);
}
void Key_Scan()
{
	R1 = 0;
	R2 = 1;
	if(C1 == 0)		//S5
	{
		Delay(500);
		if(C1 == 0)
		{
			key.value = 5;
			while(C1 == 0)TaskDisplay();
		}
	}
	if(C2 == 0)		//S9
	{
		Delay(500);
		if(C2 == 0)
		{
			key.value = 9;
			while(C2 == 0)TaskDisplay();
		}
	}
}

void Init_Key()
{
	key.pFun = Key_Scan;
	key.state = 0;
	key.value = 255;
}

任务处理

#include "task.h"
unsigned char num=0;
void Sys_init()
{
	LED(0xff);
	BUZ(0x00);
	InitDsp();
	Init_Key();
}
void TaskKey()
{
	GetKeyStruct()->pFun();
	switch(GetKeyStruct()->value)
	{
		case 5:
			num++;
			GetKeyStruct()->value = 255;
		break;
		case 9:
			num--;
			GetKeyStruct()->value = 255;
		break;
	}
}
void TaskDisplay()
{
	DisplayStruct* seg = GetDisplayStruct();
	GetDisplayStruct() -> SegDisplay();
	seg->dot = 255;
	seg->buf[0] = 1;
	seg->buf[1] = 10;
	seg->buf[2] = 10;
	seg->buf[3] = 10;
	seg->buf[4] = 10;
	seg->buf[5] = 10;
	seg->buf[6] = num / 10 % 10;
	seg->buf[7] = num % 10;
	
}

主函数

#include "main.h"

void main()
{
	Sys_init();
	while(1)
	{
		TaskKey();
		TaskDisplay();
	}
}

tips:通过S5和S9来控制加减,数码管显示。若想判断长短按,可通过结构体中的状态变量结合定时器计数来判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值