找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1206|回复: 1
打印 上一主题 下一主题
收起左侧

单片机键盘、数码块实验

[复制链接]
跳转到指定楼层
楼主
一、实验目的与要求

1、熟悉GPIO的使用方法,熟悉HAL固件库中GPIO库函数的使用方法

2、掌握矩阵键盘的扫描方法

3、掌握动态扫描数码块的方法

二、实验设备

SUN ESMC01实验仪(含STM32F407模块)一套、ARM仿真器一套、PC机一台

三、实验内容

1、编写程序:扫描键盘,如有按键,键号显示于数码管。

2、连接线路,验证实验,掌握数码管、矩阵键盘的扫描方法。

intcount0,count1,count2,a;

const uint8_tSegArray[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

void DIR(void);

uint8_t keyi(void);

  HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,4);//启动串口

while (1)

  {



int i;

for (i = 0; i < 8; i++)

RxBuffer[ i] = keyi();uint8_t keyi()
[ i]
{

uint8_t i,j;

GPIOA->ODR = (GPIOA->ODR & 0x00ff); //全"0"->扫描口



if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11)&& HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11))      //读键状态

a=0;

else

a=1;



while (1)

{

if (a == 0)     //调用判有无闭合键子程序

{

DIR();

continue;

}

i = 0xfe;

j = 0;

while(i != 0xff)

{

GPIOA->ODR = (GPIOA->ODR & 0x00ff)| (i << 8);   //键扫数据->KR_DIG_GPIO_Port PB15..8

if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) ==0)

{ //0行有键闭合

break;

}

else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)== 0)

{//1行有键闭合

j += 8;

break;

}

j++;//列计数器加1

i = ((i<<1) | 1);

}

if (i == 0xff) //完成一次扫描,没有键按下

continue;

do

{

DIR();

}while(a != 0); //判断释放否

return j; //键号

}

}





数码管

while(1)

{

  uint8_ti = 0xfe;

  uint8_t*pBuffer = RxBuffer;

  while(i!= 0xff)

  {

GPIOB->ODR |= 0xffff;

GPIOC->ODR |= 0xffff;

GPIOB->ODR = (GPIOB->ODR & 0xff00)| SegArray[*pBuffer++];

GPIOC->ODR = (GPIOC->ODR & 0xff00)| i ;

HAL_Delay(1);                 / /延迟1ms

    i =((i << 1) | 0x1);

}

}

DYM516%KG289`X[$(XHOI`L.png (39.95 KB, 下载次数: 32)

实验原理图

实验原理图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:923780 发表于 2021-5-19 12:35 | 只看该作者
请问这些while循环是每个函数单独的吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表