100分!!!换个单片机AVR键盘程序,困扰2天了。
#define uchar unsigned char
#define uint unsigned int
flash uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{uint i;
for(i=300;i>0;i--);
}
uchar keyscan(void)
{
uchar scancode,tmpcode;
DDRB=0xff;
PORTB= 0xf0;
DDRB=0X00; // 发全0行扫描码
if ((PINB&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((PINB&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
DDRB=0XFF;
PORTB = scancode; // 输出行扫描码
DDRB=0X00;
if ((PINB&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (PINB&0xf0)|0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
void main()
{uchar k,key;
DDRC=0xff;
PORTC=0xff;
while(1)
{key=keyscan();
switch(key)
{case 0x11:
k=1;
break;
case 0x12:
k=2;
break;
case 0x14:
k=3;
break;
case 0x21:
k=4;
break;
case 0x22:
k=5;
break;
case 0x24:
k=6;
break;
case 0x41:
k=7;
break;
case 0x42:
k=8;
break;
case 0x44:
k=9;
break;
case 0x82:
k=0;
break;
}
PORTC=led[k];
}
}
这里的键盘程序有误,运行不出程序,帮忙改改!! 展开
哈哈,我也是刚开始学习AVR的菜鸟,才学习几天。像你这种问题高手是不会理你的,所以只能是菜鸟帮菜鸟了,呵呵。我抱着学习的心态,搞了半个钟,差不多搞定,你试试看有没有问题,没有问题就给分我吧。
我用的编译器是WinAVR,不知你用的是什么,可能要修改下头文件。
#include"avr/io.h"
#define uchar unsigned char
#define uint unsigned int
uchar led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay()
{uint i;
for(i=300;i>0;i--);
}
uchar keyscan(void)
{
uchar scancode,tmpcode;
DDRB=0x0f; // DDRB=0xff;
PORTB= 0xf0;//PORTB= 0xf0;
//DDRB=0X00;
// 发全0行扫描码
if ((PINB&0xf0)!=0xf0) // 若有键按下
{
delay(); // 延时去抖动
if ((PINB&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0) // 逐行扫描
{
// DDRB=0XFF;
PORTB = scancode; // 输出行扫描码
// DDRB=0X00;
if ((PINB&0xf0)!=0xf0) // 本行有键按下
{
tmpcode = (PINB&0xf0)|0x0f;
/* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01; // 行扫描码左移一位
}
}
}
return(0); // 无键按下,返回值为0
}
int main()
{uchar k,key;
DDRC=0xff;
PORTC=0xff;
while(1)
{key=keyscan();
switch(key)
{case 0x11:
k=1;
break;
case 0x12:
k=4;
break;
case 0x14:
k=7;
break;
case 0x18:
k='*';
break;
case 0x21:
k=2;
break;
case 0x22:
k=5;
break;
case 0x24:
k=8;
break;
case 0x28:
k=0;
break;
case 0x41:
k=3;
break;
case 0x42:
k=6;
break;
case 0x44:
k=9;
break;
case 0x48:
k='#';
break;
}
PORTC=led[k];
}
}