AVR ATMEGA16 矩阵键盘

2019-03-24 20:53发布

大家好,我是一个AVR初学者,变了一个数码管动态显示矩阵键盘的值的程序,是用AVR-GCC编的,但是显示不了值,但我将头文件改了,在ICCAVR上就可以正常显示。求各位大侠帮我解决下,希望在AVR-GCC上能够正常运行,小弟将非常感谢!
#include <avr/io.h>
//#define F_CPU 1000000UL //延时
//#include <util/delay.h>
//#include <iom16v.h>
//#include <macros.h>
unsigned char const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值01234567 0~F
unsigned char  tabwei[]={0,1,2,3};//位选码
unsigned char keybuff[4];//按键值缓存
void _delay_ms(unsigned int z)
{
while(z--);
}
void display(void)
{
unsigned char i;
for (i=0;i<4;i++)
{
PORTA = table[keybuff];
PORTC = tabwei;
_delay_ms(200);
}
}
unsigned char keyboard(void)
{
/*unsigned char key1,cord_h,cord_l;
DDRD = 0xf0; //设置低四位端口为输入
PORTD = 0x0f; //PD4`PD7列线全设置为0
_delay_ms(100);
cord_l = PIND | 0x0f; //读入行线值
if (cord_l !=0x0f) //先检测有无按键按下
{
_delay_ms(100); //去抖
if (cord_l !=0x0f) //在判断
{
cord_l = PIND | 0x0f; //读入行线值
DDRD =0x0f;
PORTD=cord_l|0xf0; //输出当前行线值
_delay_ms(100);
cord_h=PIND&0xf0; //读入列线值
key1=cord_h+cord_l;//键盘最后组合码值
}
else key1=0xff;
switch(key1)
{
case 0xee:return 0;break;//0
case 0xde:return 1;break;//1
case 0xbe:return 2;break;
case 0x7e:return 3;break;
case 0xed:return 4;break;
case 0xdd:return 5;break;
case 0xbd:return 6;break;
case 0x7d:return 7;break;
case 0xeb:return 8;break;
case 0xdb:return 9;break;
case 0xbb:return 10;break;
case 0x7b:return 11;break;
case 0xe7:return 12;break;
case 0xd7:return 13;break;
case 0xb7:return 14;break;
case 0x77:return 15;break;
}
return 16;
}
}
int main(void)
{
unsigned char key,t;
DDRA = 0xFF; // 定义为输出
PORTA = 0xFF; // 输出高电平
DDRC=0xff;
DDRD = 0xff;
PORTD = 0xff;
while(1)
{
//TODO:: Please write your application code
display();
key = keyboard();
if (key<16)
{
if (t<4)
{
keybuff[t]=key;
}
t++;
if(t==4)
t=0;
while (key<16)
{
key=keyboard();
display();
}
}
}
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
xiaopao123
1楼-- · 2019-03-25 05:49
 精彩回答 2  元偷偷看……
xiaopao123
2楼-- · 2019-03-25 11:45
怎么把头文件给弄没了。。。而且程序全乱了
xiaopao123
3楼-- · 2019-03-25 15:12
#include <avr/io.h>
#include <util/delay.h>
unsigned char read_key(void)
{
unsigned char i,j,key_value=0xff;
DDRD=0XF0;
PORTD=0X0F;
if((PIND&0XOF)==0X0F)
return 0xff;
else
{
delay_ms(5);
if(((PIND&0XOF)==0X0F)
return 0xff;
else
for(i=4;i<8;i++)
{
PORTD=~(1<<i)|0x0f;
for(j=0;j<4;j++)
{
if((PIND&(<<j))==0)
key_value=(i-4)*4+j;
}
}
return key_value;//对应的键值
}
}
void main()
{
//加你的显示部分或其他。。。。
}
xiaopao123
4楼-- · 2019-03-25 15:36
还是不行啊,发上去自动变那样了,我无语了
linda
5楼-- · 2019-03-25 20:48

原帖由 xiaopao123 于 2012-6-5 23:48 发表 还是不行啊,发上去自动变那样了,我无语了

 

估计是和网页代码冲突,我让技术看看,xiaopao123可以用代码功能试试。

 

 

linda
6楼-- · 2019-03-26 02:23

原帖由 xiaopao123 于 2012-6-5 23:47 发表 #include #include unsigned char read_key(void) { unsigned char i,j,key_value=0xff; DDRD=0XF0; PORTD=0X0F; if((PIND&0XOF)==0X0F) return 0xff; else { delay_ms(5); if(((PIND&0XOF)==0X0F) ...

 

是否方便加我QQ(1206973913),将代码给我一下,我让技术测试一下是怎么回事?

一周热门 更多>