单片机向串口发送键盘指令,串口助手在同一个指令上一直不停的跑 代码如下 哪位大神帮帮忙

#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar key_scan(); uchar key;
void SendOneByte(unsigned char c)

{

SBUF = c;
while(TI==0);

TI = 0;

}
void delay(uint k) //延时程序

{

uint i,j;

for(i=k;i>0;i--)

for(j=110;j>0;j--);

}

void main() //主程序

{ uchar b;

TMOD = 0x20; //定时器T1的工作方式2,8位数据自动重装

SCON = 0x50; //串行口的方式1,8位异步收发,波特率可变。

TH1 = 0xfd; // 装定时器1初值.

TL1 = 0xfd;

PCON = 0x00;

EA = 1; //开总中断

ES = 1; //串行口中断源允许

TR1 = 1; //开定时器1

while(1) //循环开始

{

    b=key_scan();       
    switch(b)
    {
    case 1: SendOneByte('1');  break;
    case 2: SendOneByte('2');  break;
    case 3: SendOneByte('3');  break;
    case 4: SendOneByte('4');  break;
    case 5: SendOneByte('5');  break;
    case 6: SendOneByte('6');  break;
    case 7: SendOneByte('7');  break;
    case 8: SendOneByte('8');  break;
    case 9: SendOneByte('9');  break;
    case 0: SendOneByte('0');  break;
    case 11:SendOneByte('U');  break;
    case 12:SendOneByte('Y');  break;
    case 13:SendOneByte('N');  break;
    case 14:SendOneByte('L');  break;
    case 15:SendOneByte('D');  break;
    case 16:SendOneByte('R');  break;
   default :break;  
    }

}

}

uchar key_scan()
{
uchar cord_h,cord_l,x;//行列值
P1=0xf0; //行线输出全为0
cord_h=P1&0xf0; //读入列线值
if(cord_h!=0xf0) //先检测有无按键按下
{
delay(80); //去抖
if(cord_h!=0xf0)
{
cord_h=P1&0xf0; //读入列线值

P1=cord_h|0x0f; //输出当前列线值
cord_l=P1&0x0f; //读入行线值
x=cord_h+cord_l;//键盘最后组合码值
switch ( x )

{
case 0xee: key=1; break;
case 0xde: key=2; break;
case 0xbe: key=3; break;
case 0x7e: key=4; break;
case 0xed: key=5; break;
case 0xdd: key=6; break;
case 0xbd: key=7; break;
case 0x7d: key=8; break;
case 0xeb: key=9; break;
case 0xdb: key=0; break;
case 0xbb: key=11; break;
case 0x7b: key=12; break;
case 0xe7: key=13; break;
case 0xd7: key=14; break;
case 0xb7: key=15; break;
case 0x77: key=16; break;
}

}
}

return key;

}

0

5个回答

我觉你的这个问题的原因是:b的值在上一次按键按下后就是一个固定的值了,比如你按下0xee之后,在按下第二个键之前,b的值就一直都是1,
所以while循环里会一直发送1.所以你需要在没有按键按下的时候,让keyscan()返回一个while的switch中没有的值,也就是执行default。

switch ( x )

{
case 0xee: key=1; break;
case 0xde: key=2; break;
case 0xbe: key=3; break;
case 0x7e: key=4; break;
case 0xed: key=5; break;
case 0xdd: key=6; break;
case 0xbd: key=7; break;
case 0x7d: key=8; break;
case 0xeb: key=9; break;
case 0xdb: key=0; break;
case 0xbb: key=11; break;
case 0x7b: key=12; break;
case 0xe7: key=13; break;
case 0xd7: key=14; break;
case 0xb7: key=15; break;
case 0x77: key=16; break;
}

在这个switch中加一个default:key=0;break;

switch ( x )

{
case 0xee: key=1; break;
case 0xde: key=2; break;
case 0xbe: key=3; break;
case 0x7e: key=4; break;
case 0xed: key=5; break;
case 0xdd: key=6; break;
case 0xbd: key=7; break;
case 0x7d: key=8; break;
case 0xeb: key=9; break;
case 0xdb: key=0; break;
case 0xbb: key=11; break;
case 0x7b: key=12; break;
case 0xe7: key=13; break;
case 0xd7: key=14; break;
case 0xb7: key=15; break;
case 0x77: key=16; break;
default:key=0;break;
}

1

你想要实现的是不是当检测到按键值时 只通过串口发送一次而不是连续发送吗?
思路为: 在串口发送函数前 判定本次按键值是否和上次检测的按键值相同, 如不同则表示有按键按下,发送键盘指令。相同无按键按下,不发送

在main函数外 定义1全局变量

prekeystate = 0; 上次检测按键状态
nowkeystate = 0; 本次检测全局变量

while(1) //循环开始
{
nowkeystate =key_scan(); //读取本次按键值

  if( nowkeystate != prekeystate )    //判定键值是否发生变化
    {
            switch(nowkeystate)                         //变化后 发送变化后的键值  只发送一次
            {   
            ……
            }

            prekeystate  =   nowkeystate;      //更新前次按键值    确保只发送一次 

    }


    希望可以帮助你
1
thinkflykasite
thinkflykasite 回复thinkflykasite: 说到扫描起码要让按键阵列扫描起来,网上应该有许多例子,这里不多说。不知道你外围电路,自己去检查一下哦,入门的问题。
大约一年之前 回复
thinkflykasite
thinkflykasite 回复u013045220: 这个可以归为阵列按键扫描问题,键值其实是一个触发值。所以键值应该在按下的边缘或者弹起的边缘来触发更新,这些变化应该以空键为判断常态。处理好这一点就不存在同键按下不冒键值或者按下一次弹出多次啦。
大约一年之前 回复
u013045220
君子筱宁 感谢您的帮助
大约一年之前 回复
u013045220
君子筱宁 相同问题 两次按下相同的键 只响应一次 需要按下其他键才能回到原先的键 这样解决的话影响了数值的输入,例如11,这样的话应该怎么解决呢?
大约一年之前 回复
HK_JY
灬Change 如果两次按下的键是同一个键呢,嘿嘿嘿
大约一年之前 回复
0

你的key定义成局部变量就可以了,我觉得不需要定义成全局变量。

0

每次按键按下后把b清零就可以了

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
串口发送指令
VC++,我是拿别人的改的,就是向串口发送指令,来实现功能的,得有下位机配合
串口发送命令改变
可以通过串口发送不同的指令改变数码管和灯的亮灭可以让蜂鸣器响
51单片机单串口同时实现AT指令和调试信息输出
很多外部模块是使用串口的方式与单片机通信的,但有的单片机只有一个串口,且不能硬件仿真,比如我使用的STC90C516,如果将唯一的串口给了外部模块,就不能打印调试信息了。 不过如果是使用AT指令只这样的模块,比如蓝牙SPP,WiFi模块,是使用AT指令的方式通信的 我们可以保留单片机串口与PC的连接,串口同时与模块连接,这样单片机的发送信息同时被模块和PC收到了。 模块只对AT指令有反应,对其他格式不正确的指令无反应,
通过串口发送命令
嵌入式系统或传感器网络的很多应用和测试都需要通过PC机与嵌入式设备或传感器节点进行通信。其中,最常用的接口就是RS-232串口和USB接口(并口)。鉴于USB接口的复杂性以及不需要很大的数据传输量,现模块中使用了串口进行通讯。 其中SUN的CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。RS-232-C(又称EIA RS-232-C,以下简...
java如何给单片机串口发送一个16进制的命令
public static byte[] hex2byte(String hex) { String digital = "0123456789ABCDEF"; String hex1 = hex.replace(" ", ""); char[] hex2char = hex1.toCharArray();
串口通信(串口助手发送指令控制单片机执行相应操作)
串口通信 (1)刚下载完程序,流水灯 (2)通过串口助手发送“ab01”,数码管显示温度,显示完当前温度后,将温度打印到串口助手上 (3)串口助手发送“ab02”,,蜂鸣器响 (4)执行完后都会回复最初的流水灯
ESP8266上电时串口打印乱码原因和发送AT指令串口返回信息含义
因为esp8266模块上电时,默认打印波特率为74880. 其固件中通信与串口默认为115200. 所以如果把串口设置为74880,之后再上电模块打印的信息就不会有乱码了,但AT指令默认通信波特率是115200.如果在使用AT通信时,在调到115200.     可参考乐鑫提供的esp8266开发手册: https://www.espressif.com/sites/defau...
Arduino 串口发送指令程序
宁夏大学创新训练基地(宁夏大学电子科技协会与机器人协会的实验场地),是一个极为锻炼人能力的地方。从社团成员到作为社团主席的我,经历过做项目的考验和敲程序的洗礼,从中或多或少有一定的知识积累。其中,自己掌握的语言有C语言、C sharp、C++;熟悉各种常用软件:Arduino IDE、SolidWorks、RDworks、Proteus、VS2017等;接触过各种控制器和传感器,并...
向串口发送数据,并获得返回值
java读取串口,以十六进制数据发送,获得时虽然工具上显示的也是十六进制,但其实是经过转化的,至于在转化之前是什么样子的,之前我还真不知道。但是这次,呵呵,不一样咯,搞定了,用代码读取时返回的是整型的,然后将这个整型转化为十六进制显示就可以啦。哈哈~~
通过串口使用AT指令发送短消息(上)
Q 用串口连接GSM手机发送和接收短消息,在应用程序中如何编程实现? Q 我们打算开发一个基于GSM短消息方式的GPS系统,如何利用SMS进行数据通信? A 首先,我们要对由ESTI制订的SMS规范有所了解。与我们讨论的短消息收发有关的规范主要包括GSM 03.38、GSM 03.40和GSM 07.05。前二者着重描述SMS的技术实现(含编码方式),后者则规定了SMS的DTE-DCE
Linux下的串口助手(可以调AT指令)
Linux下的串口助手,自己写的类通用信不好就改为使用的第三方类.可以发AT指令.代码注释也比较多. 1:串口打开格式一般为8N1(8位数据位,无校验位,1位的停止位)无流控制; 2:如果想让数据以16进制显示,请勾选HEX; 3:如果勾选上《回车》功能,那么每次接收到数据就在后面加个回车符; 4:如果想定时发送数据那么请勾选《定时发送》,并输入时间时间; 5:《AT》勾选上后,可以用于发送AT指令,先发送一个AT看是否返回"OK"; 6:在调AT指令时,可以在每次发送的字符后加个其他值,比如说发短信时要在结尾处加Ctrl+Z,那么我们就要选择插入checkBox,然后在框中输入0x1A,然后点发送. 7:对于不同的串口结点名请自己在comment.h头文件里更改; 8:确保本程序对串口结点有读写权根,不然打开串口失败; 9:如有问题请发Email;
串口通信,键盘输入指令控制LED闪亮
RS232 串口通信 通过键盘输入LED1_0/1/2 控制LED的亮,灭,翻转 如果错误,会提示重新输入。
【java】简单的发送一段数据到串口
可以跟着一起操作。 1 下载串口的jar和dll 附上一波说明 打开 http://fizzed.com/oss/rxtx-for-java 下载RXTX模块 然后解压 里面有这些文件 2 给项目添加外部jar(有eclipse和intellij两种IDE操作方式说明) 2.1 假设你用eclipse 2.2 使用intellij ...
通过串口给ESP8266发送AT指令连接wifi的注意事项
在ESP8266的说明文档中,连接wifi的指令为   AT+CWJAP=, 实际上ssid与pwd(wifi密码)必须是使用字符串输入,需要使用双引号。 例如: wifi的ssid=TP-Link ,  pwd=12345678 ,那么输入AT指令  AT+CWJAP=TP-Link ,12345678     或者     AT+CWJAP=TP-Link >,    都返回错误ERR
51单片机给串口调试助手发送随机数,指定命令停止或继续(下位机)
一、功能介绍 1.1连接串口调试助手,对其发送随机数据,串口助手发送0x00指令,单片机停止发送数据,发送0x01指令,单片机继续发送数据。 二、开发步骤 2.1 初始化定时器,中断 TMOD=0x20; //定时器T1方式2 TH1=0xf4; //设置串行口波特率为2400 bps TL1=0xf4; TR1=1; //启动波特率...
自定义串口数据协议发送hex文件
hex文件格式:Intel HEX is a file format that conveys binary information in ASCII text form. It is commonly used for programming microcontrollers, EPROMs, and other types of programmable logic devices. In a...
串口向PC及发送字符程序
用串口向PC机发送字符,并在串口助手上显示
ESP8266 AT指令设置及51单片机的控制
ESP8266 AT指令设置及51单片机的控制 (献给正在学习路上的兄弟姐妹们)         对于ESP8266模块好多刚接触的朋友们第一感觉就是价格的确很便宜,然而初次接触它时你也许会对它束手无策,因为关于怎样使用它,官方给出的资料很凌乱,我刚接触时就无从下手。(说明一点本人也是小白)        好了废话少说,咱们言归正传。ESP8266这个模块有一个 32bit MCU,
在串口调试助手上使用AT命名控制GPRS模块发送短信
今天想在串口调试助手上用GPRS模块发送短信结果弄了一下午,想着其中有一些细节比较容易被忽略,所以把自己弄好的写了出来供大家可以参考一下。 一、GPRS简介 GSM模块,是将GSM射频芯片、基带处理芯片、存储器、功放器件等集成在一块线路板上,具有独立的操作系统、GSM射频处理、基带处理并提供标准接口的功能模块。GSM模块根据其提供的数据传输速率又可以分为GPRS模块、EDGE模块和纯短信模块。...
ESP8266学习笔记1注意事项:电路连接及串口显示乱码
.ai-thinker硬件手册:http://wiki.ai-thinker.com/_media/esp8266/a000um00a3.pdf 注意事项:1、关于外设:集成了高速的GPIO和外设接口,可能会产生严重的开关噪声。如果应用对于功耗和EMI特性要求较高,建议在数字IO线上串联10~1--欧姆的电阻。这样可以在开关电源时抑制过冲,并使信号变得平稳。串联电阻也能在一定程度上防止静电释放(...
esp8266AT指令详解+(串口+TCP)调试助手
包含esp8266模块的AT指令详解,以及要用到的串口调试助手,TCP调试助手
串口发送按键信息
监控mfc窗体的按键,输出相应的按键信息,包含了代码和exe文件
Linux串口编程(向空调发送十六进制指令)
Linux串口编程(向空调发送十六进制指令)
用Java语言向串口读写数据的方法
应用软件开发中java 是重要的一个方面,下面介绍用Java语言向串口读写数据的方法: Java对串口通信的支持 常见的Java串口包        SUN的CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。目前,常见的Java串口包有SUN在1998年发布的串口通信API:comm2.0.jar(Windows下)、comm3.0.jar(Li
C#串口通信-向串口发送数据,同步接收返回数据
最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用(不支持多线程调用)。     一、Machine类     1、Machine类有一个静态变量,定义如下: pr
51单片机串口通信(字符串接收和发送)
转自:http://www.cnblogs.com/weifeng727/category/845655.html #include //------------------串口通信协议-----------------// /* 客户端数据包格式解释(长度恒为15): 例如:A01_fmq_01Off___# A--------数据包的开始标记(可以为A到Z,意味
MSP430 串口接收指令控制LED亮灭
准备器材:MSP430开发板一块,串口线,PC,串口调试助手(可从网上下载) 八位数据,1个停止位,9600波特率无校验 /******************************************************************** //DM430-L型最小系统板串口测试程序,使用单片机的串口0 //使用板载BSL模块或者用户外接串口线到DB9,要求是直连公对母串口...
6-51单片机ESP8266学习-AT指令(测试TCP服务器--使用串口调试助手--不连接路由器)
上一篇连接 http://www.cnblogs.com/yangfengwu/p/8757513.html 注意:更加详细的操作请参考, http://www.cnblogs.com/yangfengwu/p/5205570.html 自己这篇文章的浏览量 记得自己写这篇文章的时候还是刚入门Android的小白,自己无论学什么东西都是尽自己最大努力学个明明白白,所以虽然自己学的东西...
11-51单片机ESP8266学习-AT指令(ESP8266作为TCP客户端,连接TCP服务器,用串口调试助手和手机TCP调试助手测试)...
写完题目刚想起来一件事情,如果手机作为客户端(不连接路由器的情况下),手机连接模块的无线会分配一个IP地址,,,这个IP地址事先我也不知道....我先看看AT指令里面有没有一个指令可以打印一下连接自己wifi信号后的设备的IP地址的指令. 没找到....................... 算啦,我直接用手机连接,看一下手机分配的IP地址,然后再设置模块       咱们还是设置模块的工作模式为...
串口发指令控制工控机自动关机
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Sy
问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?
经过不懈努力,不要问我为什么是不懈努力,这些年就没有操作过串口,也没有用过串口调试助手。终于知道了如何在这个工具里调用这个命令了。 一些东西,隔行,隔远山。
PC通过串口助手如何给单片机发送小数,单片机接收后如何处理?
两种思路,供参考。1. 原始字节按原始字节数据发送,这也是我个人比较倾向的方式。首先,位、字节和字节流本身没有任何意义,如果按约定的方式去解析,才能有具体的含义。用什么约定方式呢?使用符合IEEE 754的浮点数标准,每个浮点数为4个字节,按标准解析就可以了。其实这个标准,包括STM32在内的很多微控制器,都是支持的,内部的表达方式都是一致的,而且效率很快。技巧就是定义好一个联合体,这一步很关键:...
单片机MC9S12XS128串口接收指令控制小车运动程序
这是基于MC9S12XS128单片机开发的程序,通过串口接收到的指令控制小车的左转、右转、前进、后退和停止;小车的电机是直流电机,驱动芯片是L289N.程序简洁易懂,适合入门。
C# 串口 AT指令实现短信发送与读取等功能
C# 串口 AT指令实现短信发送与读取等功能 实现了最全的短信通信功能 界面完美 直接可能操作at 指令
VS2013+C#串口助手支持循环发送指令
VS2013+C#,串口助手,支持循环发送指令,自动识别串口
通过java替代超级终端,使用at指令调用modem
SerialTool.java类package serialPort;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.TooMan
串口发指令点亮小灯程序
适合初学STM32的用户,从普通的GPIO口到USART,利用USART外设资源,在串口接收中断服务函数中实现指令的识别,来点亮小灯
串口蓝牙模块通信AT命令结尾符问题
如下截图所示,今天使用STM32单片机+串口蓝牙模块实现蓝牙通信的功能。前期没有直接使用单片机程序控制和串口蓝牙模块通信,而是直接通过PC的串口助手调试通信命令。但是在AT命令的结尾,有一个\r,搞得不知如何用十六进制表示了。经过探索,终于知道,有以下两种方式。1,直接十六进制发送:2,取消勾选按十六进制发送,直接输入AT并按下回车键。以上两种方式都可以。其实本质是一样的。一个十六进制显示,一个A...
通过串口使用AT指令发送短消息
转自:http://blog.csdn.net/feelinghappy/article/details/9344605 Q 用串口连接GSM手机发送和接收短消息,在应用程序中如何编程实现? Q 我们打算开发一个基于GSM短消息方式的GPS系统,如何利用SMS进行数据通信? A 首先,我们要对由ESTI制订的SMS规范有所了解。与我们讨论的短消息收发有关的规范主要包括GSM 03.38、
AT指令调试助手
之前测试通讯模块的AT命令,网上下载的好多串口调试工具什么的用起来都不爽(要么不自动回车要么显示繁琐),最后自己写了一个AT指令测试的程序,也分享给大家把,新编写的AT指令调试工具。 如果有什么意见或建议,请马上提出来,我尽快改进~~ 话说,是不是该加一个AT解析或者查询的...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 python指令学习 python画图指令教程