通过键盘往单片机中输入任意数字的C语言程序?

C语言中的输入函数是scanf,但是c51中好像没有这条语句,现在想通过矩阵式键盘向单片机中输入任意数据,该怎样写?给个思路,能有程序更好。谢谢!... C语言中的输入函数是scanf,但是c51中好像没有这条语句,现在想通过矩阵式键盘向单片机中输入任意数据,该怎样写?给个思路,能有程序更好。谢谢! 展开
 我来答
高茂程
2012-07-14 · TA获得超过260个赞
知道答主
回答量:130
采纳率:100%
帮助的人:46.6万
展开全部
我这有个AVR的矩阵键盘的识别程序、其中PORTA就相当于51里的P0一样的端口的表示、PINA也是指的PORTA口、和PORTA的区别是PINA只能读!其他都一样的和51
/********************************************************
实验七: 矩阵式键盘实验
说明: 按按键K1-K16 数码管显示0-F的键码
注意: K17-K19为独立按键,使用这个程序是没有反应的

CPU型号: ATMEGA128A
晶振频率: 8MHZ
日期: 2011-3-12
联系方法: MCU.2000@163.com
********************************************************/
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void Delayus(uint US); //微秒延时子程序
void Delayms(uint MS); //毫秒延时子程序
uchar key_scan(void);
void init_io(void);
//共阳数码管数字码
uchar led_discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

uchar key_val=0;
//主函数
void main (viod)
{
uchar key_io;
init_io();
while(1)
{
PORTD=0XF0;
Delayms(5);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
PORTD=0XF0;
Delayms(1);
key_io=PIND & 0xf0;
if(key_io !=0xf0)
{
key_val=key_scan();
key_val |= key_io;
}
switch(key_val)
{
case 0xee: key_val=0x00; break; //按键K1

case 0xde: key_val=0x01; break; //按键K2

case 0xbe: key_val=0x02; break; //按键K3

case 0x7e: key_val=0x03; break; //按键K4

case 0xed: key_val=0x04; break; //按键K5

case 0xdd: key_val=0x05; break; //按键K6

case 0xbd: key_val=0x06; break; //按键K7

case 0x7d: key_val=0x07; break; //按键K8

case 0xeb: key_val=0x08; break; //按键K9

case 0xdb: key_val=0x09; break; //按键K10

case 0xbb: key_val=0x0a; break; //按键K11

case 0x7b: key_val=0x0b; break; //按键K12

case 0xe7: key_val=0x0c; break; //按键K13

case 0xd7: key_val=0x0d; break; //按键K14

case 0xb7: key_val=0x0e; break; //按键K15

case 0x77: key_val=0x0f; break; //按键K16
} // switch(key_val)
} // if(key_io !=0xf0)

PORTD=0XF0;
//等待松开按键
key_io=PIND & 0xf0;
while(key_io !=0xf0)
{
key_io=PIND & 0xf0;
}
PORTC=led_discode[key_val]; //显示按键码
} // while(1)
}
void init_io(void)
{
DDRA=0XFF;//设置A口味输出
PORTA=0XFF;

DDRB=0XFf;;//设置B口味输出
PORTB=0XFF; //数码管位控制

DDRC=0XFF; //数码管段控制
PORTC=0X00;

DDRD=0X0F; //键盘接口
PORTD=0XF0;

DDRF=0X0E;
PORTF=0X0E;
PORTF&=0XF7; //锁存关闭LED显示

DDRB |=0X10; //PB4设为输出
PORTB|=0X10; //关闭PB4外接的LED
}
uchar key_scan(void)
{
uchar m,temp=0xf7;
for(m=0;m<4;m++)
{
PORTD=temp | 0xf0;
Delayms(1);
if((PIND & 0XF0)!=0XF0)
return(temp & 0x0f);
temp>>=1;
}
}
/****************************************************
函数名称: Delayus
功 能: 延时指定微秒(8M晶振)
参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值 : 无
/****************************************************/
void Delayus(uint US)
{
uint i;
US=US*5/4;
for( i=0;i<US;i++);
}
/****************************************************
函数名称: Delayms
功 能: 延时指定毫秒(8M晶振)
参 数: MS--延时的毫秒数
返回值 : 无
通过软件仿真反复实验得到的数值
/****************************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++);
}
七终多E
2012-07-25 · TA获得超过1.4万个赞
知道大有可为答主
回答量:3756
采纳率:46%
帮助的人:3440万
展开全部
买个编码键盘好了 到时候读取对应的引脚电平 然后转成对应的char就可以了 任意字符 对于单片机的4×4矩阵来说还是少了些
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友83a12df
2012-07-14 · TA获得超过111个赞
知道小有建树答主
回答量:198
采纳率:0%
帮助的人:121万
展开全部
所谓矩阵式键盘也只是在单片机外部电路构成的LED或者LCD显示屏中显示数据,没有那种可以像程序一样可以输入任意数字,如果你想和单片机通讯,最好是用串口或者I2C接口的方式和单片机通讯,这样你就得编写单片机的串口接收程序和I2C接收程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hupengfei311
2012-07-14 · TA获得超过375个赞
知道小有建树答主
回答量:329
采纳率:0%
帮助的人:265万
展开全部
首先就是键盘肯定是和你单片机的某些接口相连的对吧? 找到那些接口, 你矩阵键盘任何一个键按下的时候都会导致对应的接口发生电平的变化, 扫描式的方法就可以得到哪个键按下。 这是大概思路, 找个键盘例程。 可以搜扫描键值看看试试~
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
158967630
2012-07-14 · 贡献了超过167个回答
知道答主
回答量:167
采纳率:0%
帮助的人:56万
展开全部
switch(temp)
case 0xee num=1
break:
case:0xde num=2
break;
主体就是这个思路
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式