A. 单片机,设计一个计算器,能够自定义按键键值,并能通过串口调试助手将执行结果显示到计算机上。
你的这个题目范围太大了。限于篇幅无法在细节上一一讲明白。
主要的思路如下:
硬件设计:单片机需要能够检测键是否按下,就需要搭建电路。通常情况下按键有两种方式:一种是直接将键通过电阻电容连接到单片机IO引脚上,这种方式适用于按键数量不太多或单片机引脚数量足够多的情况。另外一种是将键纵横排列成按键网络,通过扫描的方法检测按下的是哪个键,这种适用于键数量较多,或IO引脚不足的情况,比如你的图上有4X4=16键,直接连接的方法需要16个IO口,网络的话,只需要4+4=8个IO口即可完成。具体哪种根据需要来,具体电路网上搜索。
另外就是通讯电路,这个网上有好多RS232的,不再细说
算法设计
由于是键盘,除了检测到哪个键按下外,还应该包含一定的消除抖动的能力,防止按下一个键却触发好多次同样的按下此键的情况。
另外需要在单片机内存中建立“键-键值”的对应关系表,因为你要求能够自定义键值。
通讯
你没有提到通讯是实时发送还是按下一个键,比如回车键后才发送。
由于键盘的速度比较低,为了简单,可以采用检测到一个键按下后就发送一个键的代码。
根据你所采用的单片机的不同,所用的对通讯的初始化、发送等代码也有所不同。具体不再细说。
B. 用51单片机1602LCD怎么显示仿手机键盘按键字符,要用c语言编,谢谢
检测按键状态吧,比如在1秒内发生的连续按键则切换对应的字符,比如数字1按键(字母A B C)在一定时间内1-2秒被按连续下(不是按住不放),则显示循环切换1 A B C。
关键应该是连续按键的检测问题。
C. 键值识别(单片机训练)急急急!!!
很亲切,我想电子专业的在大学都做过这个实验,好好看书,不难,自己动手搞出来的意义非常重大。
D. 51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示
1、首先,要把代码写好,点亮数码管。
E. 51单片机怎样用键盘控制数码管显示
51单片机怎样用键盘控制数码管显示的方法。
如下参考:
1.首先,编写代码并点亮数码管。
F. 在单片机C语言中,将按键设为1到9的数,怎样记录下按键的次数,并且将按键的键值按顺序在LCD上显示
假定你的单片机和LCD的关联部分已经做好了,直接调用函数就能在LCD上显示内容。
键盘的话,假定是每个键都和一个引脚串联(即按下该键,为高电平-1,否则低电平-0)
int num[16];//一般的LCD是16位数字吧,不知道你用的什么字库啊!
int index=15;
int i=0;
for( i=0; i<16; i++)num[i]=0;//初始化数组
//如果有按键
int GetKeyPress( k:int ){
num[index]=k;
index--;
if(index<0)index=15;
}
每次接受到按键后都将num数组的数据发送到LCD去显示,发送的顺序是从index位置开始往后
G. 用51单片机让1602液晶连续的显示矩阵键盘按键值,连续按下的数都回被显示出来。
先根据你要显示数字的个数定义一个unsigned char型的字符数组,调用扫描键盘函数,扫描到哪个键被按下的同时将键值存进对应的数组元素中,再调用液晶显示程序显示,液晶显示程序中显示的位数可变,可以定义一个变量来记录已按下的位数,显示的程序中实参为已按下按键的个数,这样就能实时显示数字了。
H. (51单片机)矩阵键盘计算出键值之后如何查表\显示
我想问一下,你的硬件连接是怎么连接的...
还有就是你现在算出的值是什么关系..
其实,书上有这方面的例程序的..
还有就是,建议不要装在P3口上,那样第二功能就不好用了....
我想问的是,键盘的行和例是怎么连接的...
下面我改了一下程序,行是,P3.0-P3.3,例是,P3.4-P3.7,最后得到的键值存在,KEYS中数为,0-15,
有什么问题可以再问...
START:
MOV P1,#00H
MOV P2,#0FH
CLR KEYCARD
LOOP:
ACALL KEY_CHECK
JNB KEYCARD,LOOP ;为0从重新扫描
ACALL KEY_MARK ;为1有按键,调用KEY_MARK
AJMP LOOP
KEY_CHECK: ;键盘扫描
MOV P3,#0FH
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_C1
CLR KEYCARD
RET
KEY_C1:
ACALL DELAY ;有键接下,消抖
SETB KEYCARD
RET
KEY_MARK:
MOV A,#0EFH ;第一例,行扫描,
KEY_M1: ;键值扫描
MOV P3,A
MOV KEYS,A
MOV A,P3
ANL A,#0FH ;取与
CJNE A,#0FH,KEY_M2 ;在第一例则跳,KEY_M2
MOV A,KEYS ;并非在第一例刚移位
SETB C
RLC A
JC KEY_M1 ;C=1,重新扫描..
CLR KEYCARD ;扫完一圈后,完成..
RET
KEY_M2: ;键值计算
MOV R0,#KEYS ;将KEYS的地址装入R0
XCH A,@R0 ;交换KEYS,A
XCHD A,@R0 ;交换低4位..
MOV KEYS,A
MOV R0,#0
LCALL KEY_ZHI
KEY_MX: ;等待按键释放
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_MX
CLR KEYCARD
RET
KEY_ZHI:
MOV A,R0
INC R0
MOV DPTR,#KEY_VALUE
MOVC A,@A+DPTR
CJNE A,KEYS,KEY_ZHI ;查找键值.
DEC R0
MOV KEYS,R0
MOV P1,KEYS ;KEYS中的数为:0-15
RET
DELAY:
MOV R7,#20 ;延时大约2ms
D1: MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
KEY_VALUE: DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH,0EBH,0DBH,0BBH,07BH,07EH,07DH,077H
END
I. 怎样将单片机矩阵键盘的值保存起来并显示
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
uchar code table[]=
{
0x3f,
0x06,
0x5b,
0x4f,
0x66,
0x6d,
0x7d,
0x07,
0x7f,
0x6f,
0x77,
0x7c,
0x39,
0x5e,
0x79,
0x71,
};
void delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
la=1;
la=0;
}
void keyscan()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp&=0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp=P3;
temp&=0xf0;
if(temp!=P3)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp&=0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp&=0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp=P3;
temp&=0xf0;
if(temp!=P3)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp&=0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp&=0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp=P3;
temp&=0xf0;
if(temp!=P3)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp&=0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp&=0xf0;
if(temp!=0xf0)
{
delay_ms(10);
temp=P3;
temp&=0xf0;
if(temp!=P3)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp&=0xf0;
}
display(key);
}
}
}
void main()
{
P0=0;
la=1;
la=0;
P0=0xfe;
wela=1;
wela=0;
while(1)
{
keyscan();
}
}