📄 key2.c
字号:
/*********************************************************************************************/
/*公司名称:四川大学制造学院*/
/*模 块 名:键盘调试程序*/
/*创 建 人:陈朝泽,任德均 日期:2008年8月21日*/
/*功能描述:*/
/*其他说明:1、当操作P4-P7口时,请别忘了用SFRPAGE寄存器设置为F页。
2、行线为输入,列线为输出。逐列输出低电平,检测输入口电平情况。
只要P2口高4位不全为1,则该列有键按下。
3、横线输入P2经过74LS14N反相后进入MCU,端口为高,则MCU处低;
列线输出端P7从MCU出来后经过74LS14N和ULN2003两次反相,端口处电平状态与MCU处一致。*/
/*********************************************************************************************/
#include "C8051F120.h"
#define uchar unsigned char
//#include <intrins.h> //added
#define KEYP_H P2 //定义 P2口(高4位)为4×6矩阵键盘的行线输入(通过上拉电阻接+24V)
#define KEYP_L P7 //定义 P7口(低6位)为4×6矩阵键盘的列线输出
sbit led1=P5^0; //测试用
sbit led2=P5^1;
sbit led3=P5^2;
sbit led4=P5^3;
sbit led5=P5^4;
sbit led6=P5^5;
sbit led7=P5^6;
sbit led8=P5^7;
uchar key;
void Reset_Sources_Init()
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
void Port_IO_Init()
{
SFRPAGE = CONFIG_PAGE;
P3MDOUT = 0xFF;
P4MDOUT = 0xFF;
P5MDOUT = 0xFF;
P6MDOUT = 0xFF;
P7MDOUT = 0xFF;
XBR0 = 0x04;
XBR2 = 0x44;
}
void Oscillator_Init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 5ms for initialization
while ((OSCXCN & 0x80) == 0);
CLKSEL = 0x01;
}
void Init_Device(void)
{
Reset_Sources_Init();
Port_IO_Init();
Oscillator_Init();
}
void delay(long t)
{
for(;t>=0;t--);
}
uchar keyscan(void)
{
uchar scancode,tmpcode,mcode;
P7 = 0x00; //P7口发全0列扫描码
delay(300);
mcode = P2;
if((mcode&0xF0) != 0x00) //若有键按下
{
delay(3000);
mcode = P2; //延时去抖动
if((mcode&0xF0) != 0x00) //延时后再判断一次
{
scancode = 0xFE;
while (scancode != 0xFF) //逐列扫描
{
P7 = scancode; //输出列扫描码11111110,将之取反,高位为按键所在列
delay(300);
mcode = P2;
if(((mcode&0xF0) != 0x00)) //本列有键按下
{
//P5 = 0x00; //测试用
tmpcode = mcode&0xF0; //检测哪行的电平被拉低,为1的那1行有键按下
/*
while (1) //松手检测
{
mcode = P2;
if((mcode&0xF0) == 0x00)
break;
}
*/
if(scancode==0xDF&&tmpcode==0x10)
return 0x31;
else
return ((~scancode) + tmpcode); //返回特征值
}
else
{
scancode = (scancode<<1)|0x01; //向高位移动
}
}
}
}
return 0;
}
void main()
{
Init_Device();
while(1)
{
key = keyscan();
switch(key)
{
case 0x11:
led7 = 0;
break;
case 0x21:
led8 = 0;
break;
case 0x41:
led3 = 0;
break;
case 0x81:
led4 = 0;
break;
default:
led7 = 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -