当前位置:首页 > 单片机 > 单片机
[导读]使用芯片STM8S003所用端口:PD2~PD6, PA1~PA3其中,PD3~PD6为输出,PA1~PA3 / PD2为输入(默认上拉)/* PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1 */程序如下:/*添

使用芯片STM8S003

所用端口:PD2~PD6, PA1~PA3

其中,PD3~PD6为输出,PA1~PA3 / PD2为输入(默认上拉)

/*
PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1
*/

程序如下:


/*添加包含芯片的头文件*/

#include

volatileunsignedcharCF[4];//按键触发标志(表示4列,每一列同一行的

//值是一样的但列标不一样来区分不同列的键)

volatileunsignedcharCont[4];

unsignedcharKeyVal;//键值

//unsignedcharKeyOut[4]={0xef,0xdf,0xbf,0x7f};//4X4按输出端控制

//unsignedcharKeyOut[4]={0x7f,0xbf,0xdf,0xef};

unsignedcharKeyOut[4]={0x3f,0x5f,0x6f,0x77};//两个端口组合4x4端口输出控制

unsignedcharPortCom;//两个端口组合的端口

unsignedcharcIn0,cIn1,cIn2,cIn3;

/*******************************************************************************

**函数名称:voiddelay(unsignedintms)Name:voiddelay(unsignedintms)

**功能描述:大概延时

**入口参数:unsignedintms输入大概延时数值

**输出:无

*******************************************************************************/

voiddelay(unsignedintms)

{

unsignedintx,y;

for(x=ms;x>0;x--)

for(y=1000;y>0;y--);

}

/*

**描述:新型4X4按键扫描程序放在1ms-10ms中断内使用(十分稳定不需要再写消抖程序)

**备注:按键弹起时keyVal=0单键按下keyVal有16个值,你自己程序可以针对不同值

**进行不同程序操作keyVal单键值分别为

**0x01,0x02,0x04,0x08,

**0x11,0x12,0x14,0x18,

**0x21,0x22,0x24,0x28,

**0x31,0x32,0x34,0x38,

*/

voidKey_Head()

{

unsignedcharReadData[4];

staticunsignedchari;

/*

PortComBIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0

PD6PD5PD4PD3PD2PA3PA2PA1

*/

cIn0=0;

cIn1=0;

cIn2=0;

cIn3=0;

if(++i>=4)i=0;

//PortCom=KeyOut[i]|0x0f;//忽略低4位

//输出扫描

PD_ODR=KeyOut[i];

//输入侦测

cIn0=PA_IDR_bit.IDR1;

cIn1=PA_IDR_bit.IDR2;

cIn2=PA_IDR_bit.IDR3;

cIn3=PD_IDR_bit.IDR2;

PortCom=(cIn3<<3)|(cIn2<<2)|(cIn1<<1)|cIn0;

ReadData[i]=(PortCom|0xf0)^0xff;//忽略高4位取反

CF[i]=ReadData[i]&(ReadData[i]^Cont[i]);

Cont[i]=ReadData[i];

//输出键值

switch(CF[i])//第i列

{

case0x08:KeyVal=((i<<4)+8);break;

case0x04:KeyVal=((i<<4)+4);break;

case0x02:KeyVal=((i<<4)+2);break;

case0x01:KeyVal=((i<<4)+1);break;

default:KeyVal=0;break;

}

delay(30);

}

/*******************************************************************************

**函数名称:voidALL_LED_Init()Name:voidALL_LED_Init()

**功能描述:初始化LED灯的IO口设为输出

**入口参数:无

**输出:无

*******************************************************************************/

voidALL_LED_Init()

{

//LED1Init

//PD_DDR_bit.DDR2=1;//设置端口PD->2的输入输出方向寄存器为输出方向

//PD_CR1_bit.C12=1;//设置PD2为推挽输出

//PD_CR2_bit.C22=1;//设置PD2的输出最大速度为10MHZ

//LED2Init

PC_DDR_bit.DDR7=1;//设置端口PC->7的输入输出方向寄存器为输出方向

PC_CR1_bit.C17=1;//设置PC7为推挽输出

PC_CR2_bit.C27=1;//设置PC7的输出最大速度为10MHZ

//LED3Init

PC_DDR_bit.DDR6=1;//设置端口PC->6的输入输出方向寄存器为输出方向

PC_CR1_bit.C16=1;//设置PC6为推挽输出

PC_CR2_bit.C26=1;//设置PC6的输出最大速度为10MHZ

//LED4Init

PC_DDR_bit.DDR3=1;//设置端口PC->3的输入输出方向寄存器为输出方向

PC_CR1_bit.C13=1;//设置PC3为推挽输出

PC_CR2_bit.C23=1;//设置PC3的输出最大速度为10MHZ

}

/*******************************************************************************

**函数名称:ALLKeyInit()

**功能描述:配置Key1,Key2,Key3输入按键

**入口参数:无

**输出:无

*******************************************************************************/

voidALLKeyInit()

{

//PA1_Init

PA_DDR_bit.DDR1=0;//GPA->PIN3设置为输入模式

PA_CR1_bit.C11=1;//GPA->PIN3带上拉电阻输入

PA_CR2_bit.C21=0;//GPA->PIN3禁止外部中断

//PA2_Init

PA_DDR_bit.DDR2=0;//GPA->PIN3设置为输入模式

PA_CR1_bit.C12=1;//GPA->PIN3带上拉电阻输入

PA_CR2_bit.C22=0;//GPA->PIN3禁止外部中断

//PA3_Init

PA_DDR_bit.DDR3=0;//GPA->PIN3设置为输入模式

PA_CR1_bit.C13=1;//GPA->PIN3带上拉电阻输入

PA_CR2_bit.C23=0;//GPA->PIN3禁止外部中断

//PD2_Init

PD_DDR_bit.DDR2=0;//GPD->PIN3设置为输入模式

PD_CR1_bit.C12=1;//GPD->PIN3带上拉电阻输入

PD_CR2_bit.C22=0;//GPD->PIN3禁止外部中断

//PD3_Init

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式系统、自动化设备、智能家居等领域中,键盘作为一种基本的输入设备,被广泛应用于数据的输入和命令的发送。其中,矩阵式键盘因其占用资源少、价格低廉等优点在电子产品中得到广泛应用。本文将详细介绍矩阵式键盘的工作原理,并给...

关键字: 矩阵式键盘 扫描程序

在嵌入式系统开发中,经常通过键盘来实现人机交互。本文介绍了一种直接利用ARM的I/O口扩展矩阵键盘的方法。同时以TQ2440开发板为例,对硬件电路连接和相应的linux驱动设计方法都作了详细说明。

关键字: ARM 矩阵键盘 linux驱动

有的单片机应用需要使用的按键数量比较多,比如:密码锁,这时如果按照之前的设计,一个GPIO控制一个按键的话,有点浪费单片机资源,这时候我们常常需要使用矩阵键盘。

关键字: 矩阵键盘

矩阵键盘的使用在单品机的学习当中十分广泛,可是对于许多新手,包括本人有时也是搞不明白,昨天晚上和今天早上的思考和同行们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。

关键字: 矩阵键盘 编程方法 读取键值

基于TX-1C开发板,电路连接图如下

关键字: 检测及使用 矩阵键盘

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。矩阵键盘...

关键字: 单片机 矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

关键字: 单片机 矩阵键盘 扫描识别

/**************************文件所用资源1.端口:P22.调用delay_ms函数**************************/#include #include #define key...

关键字: 4*4 c51程序 矩阵键盘

1.代码:#include typedef unsigned char u8;typedef unsigned int u16;sbit seg_sel = P1^4;sbit bit_sel = P1^5;#defin...

关键字: 矩阵键盘 解码程序

采用反转法判断按键坐标,即行号与列号获得按键码。 写完后发现Proteus一个问题:直接使用这样的if(P10xf0!=0xf0)语句时,调不出来,当用了一个中间变量过渡时,就调出来了,害我花了一个上午的时间,现在...

关键字: 4x4 单片机 扫描程序 矩阵键盘
关闭
关闭