STM8“线反转式”扫描矩阵键盘

发布者:camuspyc最新更新时间:2021-09-02 来源: eefocus关键字:STM8 手机看文章 扫描二维码
随时随地手机看文章

线反转法接线图如下。其原理简单来说就是:


四个行引脚推挽输出低电平(置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 引用地址:STM8“线反转式”扫描矩阵键盘

上一篇:STM8例程大汇集(寄存器版)
下一篇:STM8控制LCD12864液晶屏实验

推荐阅读最新更新时间:2024-11-10 11:06

关于调试stm32和stm8(51单片机)的i2c和spi协议的之间的区别
在调试STM32的i2c和io口模拟spi协议时发现时序是很关键的。stm32在72M运行下可以实现i2c或者spi协议,但并不代表把相同的代码移植到51单片机上就会成功的跑起来,因为51单片机的速读最块8M,所以在时序上会产生很多大的区别。 经过测试,在stm32上的spi协议时钟线可达到20Khz,移植到51后,频率会降到 10hz。可是尽管把延时调小或者去掉还是无济于事,此时就要加几句把钟线置高置低的语句了 以便增大的速度,后来成功后,测试时钟线的确达到了10Khz左右。 先贴上部分代码 unsigned char ReadRawRC(unsigned char Address) { unsigned char
[单片机]
STM8四路PWM配置
void pwm_color_init(void) { // uint16 v; volatile uint8 c; /*datasheet 44,opt2 Port C5 alternate function = TIM2_CH1; port C6 alternate function = TIM1_CH1; port C7 alternate function = TIM1_CH2.*/ /* v = FLASH_ReadOptionByte(0x4803); c =(uint8)( v 8); if(0 == (0x01 & c)) { c |= 1; FLASH_Unlock(FLASH_MEMTYPE_DA
[单片机]
STM8电压表 原理图及源程序 IAR环境
刚刚用STM8S003做了个电压表,互相交流一下。用到了ADC采样及数码管显示。 STM8电压表单片机源程序: #include iostm8s003f3.h unsigned int ms_count; unsigned char adcflag; unsigned int ADCData; unsigned int tmpin; unsigned int ADCBuff ; /******************************************************************************* **函数名称:void GPIO_Init() **功能描述:GPIO- 功能引
[单片机]
<font color='red'>STM8</font>电压表 原理图及源程序 IAR环境
STM8 入门学习与实验(一)GPIO与UART
简介:这一章节将描述如何配置GPIO,以及如何配置UART STM8工程模版:http://download.csdn.net/detail/u012388993/9904051 这两则实验将使用到的基本的系统配置初始化函数 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);//配置UART1时钟 CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);配置时钟分频为1,则系统时钟频率为16Mhz/1 = 16Mhz CLK_HSICmd(ENABLE);//使能内部振荡器 实验一、点亮LED灯,灯正极接电源负极连接
[单片机]
<font color='red'>STM8</font> 入门学习与实验(一)GPIO与UART
STM8硬件I2C事件锁死
前言: 之前我使用STM8的硬件IIC通信卡死在判忙,专门写了一篇注意事项。这个周又使用,对之前的理解注意事项又有了更深刻的理解。 上一篇,IO口状态设置不对,会使IIC不能正常工作。本质上我也没想明白,这一次使用又使用,结果碰到了更难理解的问题,直接把STM8复位都不能恢复正常。倒是更加深了之前为什么IO设置不对会是硬件I2C不能正常工作的理解。 当把I2C 数据脚设置为输出低的时候,I2C总线会认为外部器件把总线占用了,所以不能正常使用。 来说说,最近碰到的IC复位都不能解决的问题,只能通过长时间断电,来解决。最后万能的网友提供了IO操作模拟一个结束信号,可以达到修复总线的效果。更进一步查,STM32也有这样的问题
[单片机]
【IAR EW STM8 1401】 破解方法
1、打开《电子学堂 工具箱》光盘,并参考光盘内视频,安装 IAR。安装完成后,打开软件会弹出如下界面,我们暂时不管他,进行第二步。 2、拷贝破解文件夹内的四个文件,到 安装目录下 stm8bin 下,并覆盖原安装文件。 3、回到软件界面,把 license 提示框去掉。。。 4、大功告成!! 最后推荐一下我的超小 STLINK V2 仿真器! 点击购买: http://item.taobao.com/item.htm?spm=a1z10.1.w137644-251734891.14.08t0dL&id=19254547006
[单片机]
【IAR EW <font color='red'>STM8</font> 1401】 破解方法
STM8 针对马达控制的六步PWM输出
当在一个通道上需要互补输出时,预装载位有OCiM、CCiE和CCiNE。在发生COM换相事件时,这些预装载位被传送到影子寄存器位。这样你就可以预先设置好下一步骤配置,并在同一个时刻同时修更改所有通道的配置。COM可以通过设置TIM1_EGR寄存器的COMG位由软件产生,或在TRGI上升沿由硬件产生。 图73显示当发生COM事件时,三种不同配置下OCx和OCxN输出。 (图73:STM8产生六步PWM,使用COM的例子(OSSR=1))
[单片机]
<font color='red'>STM8</font> 针对马达控制的六步PWM输出
手把手教你STM8单片机标准库移植
本节主要内容:完成Lora模块单片机STM8L101F3标准库的移植 STM8l101F3单片机属于是8位单片机,但和传统的51有很大的区别: 1.STM8的内核不一样: 51单片机的内核是传统的8051,STM8是ST独有的8位单片机内核。 2.STM8单片机内部的寄存器更多,资源更丰富,功能更强大,价格相比8051更贵一点。 3.ST公司提供了STM8单片机对应的标准库,程序开发一般基于标准库来开发,而传统的C51单片机直接基于寄存器开发。 对于开发而言,最重要的就是如何搭建单片机的开发环境。STM8单片机和STM32单片机的开发有点类似,都是基于标准库来开发的,这样可以让开发者更加的方便操作。 这篇内容为无际单片机编程lor
[单片机]
手把手教你<font color='red'>STM8</font>单片机标准库移植
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved