历史上的今天
今天是:2024年09月02日(星期一)
2021年09月02日 | STM8“线反转式”扫描矩阵键盘
2021-09-02 来源:eefocus
线反转法接线图如下。其原理简单来说就是:
四个行引脚推挽输出低电平(置0), 四个列引脚上拉输入,
如果有按键按下,会连通行与列,导致某个列引脚电压被拉低,故输出寄存器不再是0X0F,而是0X0E,0X0D,0X0B,0X07,
这样就判断出了那一列被按下。
此时反转输入输出,用同样的方法监测那一行被按下。
最后返回键值。



//------------------------------header------------------------------------------
#include "iostm8s208mb.h"
//------------------------------common datatype---------------------------------
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
//------------------------------macros------------------------------------------
#define LCDRS PF_ODR_ODR0
#define LCDRW PF_ODR_ODR3
#define LCDEN PF_ODR_ODR4
#define LCDDATA PB_ODR
#define KeyPortIn PC_IDR
#define KeyPortOut PC_ODR
//------------------------------function declare--------------------------------
void GPIO_init(void);
void delay(u16 count);
void LCD_init(void);
void LCD_write(u8 data,u8 cmd_flag);
void LCD_display(void);
void LCD_lr_DIS(u8 line,u8 row,u8 z);
u8 KEY_scan(void);
//------------------------------------------------------------------------------
u8 line1[]="==4*4 Keyboard==";
u8 line2[]="[Keynum]: ";
u8 table3[]={'0','1','2','3','4','5','6','7','8','9'};
//------------------------------main--------------------------------------------
void main( void )
{
GPIO_init();
LCD_init();
LCD_display();
u8 keydown;
while (1)
{
keydown=KEY_scan();
if(keydown!=0XFF)
{
LCD_lr_DIS(2,12,table3[keydown/10]);
LCD_lr_DIS(2,13,table3[keydown%10]);
delay(300);
}
LCD_lr_DIS(2,12,'N');
LCD_lr_DIS(2,13,'o');
}
}
//------------------------------functions---------------------------------------
void GPIO_init(void)
{
PF_DDR=0XFF;
PF_CR1=0XFF;
PF_CR2=0X00;
PF_ODR=0X00;
PB_DDR=0XFF;
PB_CR1=0XFF;
PB_CR2=0X00;
PB_ODR=0X00;
PC_DDR=0XF0;
PC_CR1=0XFF;
PC_CR2=0X0F;
}
void delay(u16 count)
{
u8 i,j;
while (count--)
{
for(i=0;i<50;i++)
for(j=0;j<50;j++);
}
}
void LCD_init(void)
{
LCD_write(0X38,0);
LCD_write(0X0E,0);
LCD_write(0X06,0);
LCD_write(0X01,0);
}
void LCD_write(u8 data,u8 cmd_flag)
{
LCDRS=cmd_flag;
LCDRW=0;
LCDEN=1;
delay(1);
LCDDATA=data;
LCDEN=0;
delay(1);
}
void LCD_display(void)
{
LCD_write(0X80,0);
for (u8 i = 0; i < 16; i++)
{
LCD_write(line1[i],1);
}
LCD_write(0XC0,0);
for (u8 i = 0; i < 16; i++)
{
LCD_write(line2[i],1);
}
}
void LCD_lr_DIS(u8 line,u8 row,u8 z)
{
switch (line)
{
case 1:
LCD_write(0X80+row,0);
LCD_write(z,1);
break;
case 2:
LCD_write(0XC0+row,0);
LCD_write(z,1);
break;
default:
break;
}
}
u8 KEY_scan(void)
{
PC_DDR=0XF0;
PC_CR1=0XFF;
PC_CR2=0X00;
KeyPortOut=0X0F;
u8 keypress=0XFF;
if(KeyPortIn != 0X0F)
{
delay(10);
switch (KeyPortIn)
{
case 0X0E:keypress=0;break;
case 0X0D:keypress=1;break;
case 0X0B:keypress=2;break;
case 0X07:keypress=3;break;
default:keypress=0XFF;break;
};
PC_DDR=0X0F;
PC_CR1=0XFF;
PC_CR2=0X00;
KeyPortOut=0XF0;
if(KeyPortIn!=0XF0)
{
delay(10);
switch (KeyPortIn)
{
case 0XE0:keypress +=0;break;
case 0XD0:keypress +=4;break;
case 0XB0:keypress +=8;break;
case 0X70:keypress +=12;break;
default:keypress=0XFF;break;
};
while(KeyPortIn!=0XF0);//按键松手检测
}
}
return keypress;
}
上一篇:STM8例程大汇集(寄存器版)
史海拾趣
|
第一章:嵌入式 WEB服务器的移植及注意点 第二章:HTML中表单的使用 第三章:XML技术及Java Script技术在网页中的使用 第四章:CGI介绍及表单提交方式 第五章:简单的 LED 测试 第六章:A/D测量及在网页中的显示 第七章: 基于 ZC301摄 ...… 查看全部问答> |
|
单片机应用技术选编(1) 第一章 单片机系统综合应用技术 1 1.1 且使用 8098单片机的几点体会 2 1.2 单片机的冷启动与热启动 3 1.3 大容量动态存储器在单片机系统中的应用11 1.4 MCS-51单片机系统中动态 RAM的刷新技巧14 1.5 MCS-51单片机系 ...… 查看全部问答> |
|
剖解LM3S8962(一) : ADC 软硬件研究-DATASHEET 学习 该Stellaris® ADC模块的转换分辨率为10-位,并支持4个输入通道,以及一个内部温度传感器。 ADC模块含有一个可编程的序列发生器,它可在无需控制器干涉的情况下对多个模拟输入源进行采样。每个采样序列均对完全可配置的输入源、触发事件、中断的 ...… 查看全部问答> |
|
本帖最后由 huo_hu 于 2015-8-10 08:49 编辑 风摆,锂电池+风扇+陀螺仪完整系统放在摆台上 1.保持角度 2.画横线画竖线 3.画三角 4.写汉字哈哈 感觉有难度靠谱… 查看全部问答> |
|
废话说在前面:错过了ti的优惠活动,没忍住入手了个launchxl-f28379d,前天到手了,今天手痒抽时间点个灯 先上两张开箱照 板子从mou泽上面买的,但是从国外寄到手上也花了好多时间。 开始点灯之前,首先推荐ti的一个文档给大家,方便上手, ...… 查看全部问答> |
|
求一份MSP430F1232的工程模板,我自己建的模板怎么都用不了 求一份MSP430F1232的工程模板,我自己建的模板怎么都用不了 就是想要份模板,个位叔叔阿姨,哥哥姐姐,弟弟妹妹,帮帮我好不好 我已近郁闷两天了...... … 查看全部问答> |




