通过键盘往单片机中输入任意数字的C语言程序?
C语言中的输入函数是scanf,但是c51中好像没有这条语句,现在想通过矩阵式键盘向单片机中输入任意数据,该怎样写?给个思路,能有程序更好。谢谢!...
C语言中的输入函数是scanf,但是c51中好像没有这条语句,现在想通过矩阵式键盘向单片机中输入任意数据,该怎样写?给个思路,能有程序更好。谢谢!
展开
5个回答
展开全部
我这有个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++);
}
/********************************************************
实验七: 矩阵式键盘实验
说明: 按按键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++);
}
展开全部
买个编码键盘好了 到时候读取对应的引脚电平 然后转成对应的char就可以了 任意字符 对于单片机的4×4矩阵来说还是少了些
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
所谓矩阵式键盘也只是在单片机外部电路构成的LED或者LCD显示屏中显示数据,没有那种可以像程序一样可以输入任意数字,如果你想和单片机通讯,最好是用串口或者I2C接口的方式和单片机通讯,这样你就得编写单片机的串口接收程序和I2C接收程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先就是键盘肯定是和你单片机的某些接口相连的对吧? 找到那些接口, 你矩阵键盘任何一个键按下的时候都会导致对应的接口发生电平的变化, 扫描式的方法就可以得到哪个键按下。 这是大概思路, 找个键盘例程。 可以搜扫描键值看看试试~
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
switch(temp)
case 0xee num=1
break:
case:0xde num=2
break;
主体就是这个思路
case 0xee num=1
break:
case:0xde num=2
break;
主体就是这个思路
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询