搜索
bottom↓
回复: 23

参考书本改写成的的3*4键盘扫描程序

[复制链接]

出0入27汤圆

发表于 2005-4-14 18:30:13 | 显示全部楼层 |阅读模式
接口:

MCU----(8个单个)LED(从左至右)

PA0----LED0

.

.

PA7----LED7



MCU----键盘

PD0----Y1

:

PD2----Y3

//////////////////

PD4----X1

:

PD7----X4

其它:

M16芯片,外接4M晶振,ICCAVR 6.31A编译通过。

说明:初始时8个LED全亮,按0号则0号LED熄灭,按1号1号LED灭……………………

键号大于7两个LED灭

键号安排

0 4 8

1 5 9

2 6 10

3 7 11

点击此处下载armok0145422.zip

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2005-4-15 11:54:03 | 显示全部楼层
很好, 謝謝分享!

出0入0汤圆

发表于 2005-4-19 21:44:09 | 显示全部楼层
我正要写键盘程序,谢谢!

出0入0汤圆

发表于 2005-8-8 10:26:57 | 显示全部楼层
感谢,原来键盘的工作原理是这样的



正好请教一下:pc机的键盘也是这样工作的吗?

出0入0汤圆

发表于 2005-8-19 17:29:18 | 显示全部楼层
我也上传一个我写的吧,不过是用串口在电脑上显示的。



点击此处下载armok0163946.rar

出0入0汤圆

发表于 2005-8-19 17:32:24 | 显示全部楼层
而且没有外加5V的。直接用MEGA的口驱动。

出0入0汤圆

发表于 2005-9-16 22:00:49 | 显示全部楼层
请问,如果我改为4X4,这个程序的接法是不是低四位(列)输出低电平,然后读高四位(行)的输入,看那个键按下,这样理解对吗

出0入0汤圆

发表于 2005-9-17 15:44:31 | 显示全部楼层
楼主在吗,为什么你的程序我改了用C口扫描之后就不能运行了,??????????

/*--------------------------------------------------------------------------------

**工程名称:键盘扫描测试程序

**编译器:ICCAVR6.31A pro

**日期:2005.04.14





**芯片类型:M16

**时钟频率:外接4M

接口:

MCU----(8个单个)LED(从左至右)

PA0----LED0

.

.

PA7----LED7



MCU----键盘

PD0----Y1 (列)

:

PD2----Y3

//////////////////

PD4----X1 (行)

:

PD7----X4

其它:

M16芯片,外接4M晶振,ICCAVR 6.31A编译通过。

说明:初始时8个LED全亮,按0号则0号LED熄灭,按1号1号LED灭……………………

键号大于7两个LED灭

键号安排

0 4 8

1 5 9

2 6 10

3 7 11



---------------------------------------------------------------------------------*/

#include <iom16v.h>

#include <macros.h>







/*------------------------------------函数声明----------------------------------*/

signed char get_key(void);

void delay_1us(void);

void delay_nus(unsigned int n);

void delay_1ms(void);

void delay_nms(unsigned int n);



/*----------------------------------主函数--------------------------------------*/

void main(void)

{

        //端口初始化

        DDRA=0xff;

        PORTA=0x00;

        DDRC=0x0F;

        PORTC=0xFF;



        //死循环,获取键值,并在发光二极管上提示

        while(1)

        {

                signed char key;

                key=get_key();

                if(key!=0xff)

                {

                        switch(key)

                        {

                                case 0:PORTA=0x01;break;

                                case 1:PORTA=0x02;break;

                                case 2:PORTA=0x04;break;

                                case 3:PORTA=0x08;break;

                                case 4:PORTA=0x10;break;

                                case 5:PORTA=0x20;break;

                                case 6:PORTA=0x40;break;

                                case 7:PORTA=0x80;break;

                                case 8:PORTA=0x03;break;

                                case 9:PORTA=0x06;break;

                                case 10:PORTA=0x0c;break;

                                case 11:PORTA=0x18;break;

                                default:break;

                                }

                        }

                }

        }

                       

/*----------------------------------------------获取按键函数---------------------------------*/

//获取键值函数,返回0~11号按键,无按键按下则返回0xff

signed char get_key(void)

{

        unsigned char i,tem;

        DDRC=0x0f;//使能键盘口高四位的上拉电阻

        PORTC=0xff;

        for(i=0;i<3;i++)//若4*4键盘,这里应为i<4,因为现在PD3悬空,PD3没电平变化,所以你改i<4也不会出错^__^

        {

                PORTC=~(1<<i);//键盘线扫描,从PD0~PD2逐位电位变低

                delay_nus(100);//延时等待电平稳定

                tem=PINC&0xf0;//读键盘扫描信号(PD口高四位)状态,屏蔽低四位

                if(tem!=0xf0)//若PD高四位不等于0xf0,则PD高四位引脚有可能被拉低(即有按键按下)

                {

                        delay_nms(15);//延时消抖动

                        tem=PINC&0xf0;//再读键盘

                        if(tem!=0xf0)//确认按键按下

                        {

                                tem&=0xf0;

                                switch(tem)//计算键值

                                {

                                        case 0x70:tem=15-(3-i)*4;break;//这里可以改tem=11-(2-i)*4,不过一改4*4键就不适用了^___^

                                        case 0xb0:tem=14-(3-i)*4;break;

                                        case 0xd0:tem=13-(3-i)*4;break;

                                        case 0xe0:tem=12-(3-i)*4;break;

                                        default:break;

                                        }

                                        return tem;//返回0~11号键

                                }

                        }

                        PORTC=0xff;

                }

                return 0xff;//无按键按下则返回0xff

        }



/*--------------------------------------------延时函数------------------------------------*/                                       

//1us延时函数

void delay_1us(void)

{

        NOP();

}



//n us 延时函数

void delay_nus(unsigned int n)

{

        unsigned int i;

        for(i=0;i<n;i++)delay_1us();

}



//1ms延时函数

void delay_1ms(void)

{

        unsigned int i;

        for(i=0;i<600;i++);

}



//n ms延时函数

void delay_nms(unsigned int n)

{

        unsigned int i;

        for(i=0;i<n;i++)delay_1ms();

}就是这个程序,就不能在实验板上运行了,请问是那里有错???

出0入27汤圆

 楼主| 发表于 2005-9-17 18:54:49 | 显示全部楼层
是编译不通过还是怎么个错法?

出0入0汤圆

发表于 2005-9-17 20:37:07 | 显示全部楼层
编译通过了,可是在Proteus防真时就不能通过

而按你的程序的D口就可以防真成功

一改回C口就不行了,我一直想来想去都想不出是什么原因啊,搞了大半天,请你帮下忙,谢了

出0入27汤圆

 楼主| 发表于 2005-9-19 11:47:19 | 显示全部楼层
端口初始化不行

“//端口初始化

   DDRA=0xff;

   PORTA=0x00;

   DDRC=0x0F;

   PORTC=0xFF;



应该

DDRC=0xF0;

PORTC=0xF0;

出0入0汤圆

发表于 2005-9-20 19:09:54 | 显示全部楼层
不好意思,刚改过也是不行啊,真是百思不得其解啊,????????

为什么只改口就不能达到效果了,我的电芯片只其它口都用了,只剩余C口现在就是键盘那里搞不成功啊,

搞了几天都不行,可以帮手解决!!!!!!!!!!!!!!

出0入0汤圆

发表于 2005-9-20 19:11:38 | 显示全部楼层
真是麻烦楼主帮下小弟啊,谢谢

出0入0汤圆

发表于 2005-9-20 19:12:15 | 显示全部楼层
真是麻烦楼主帮下小弟啊,谢谢

出0入27汤圆

 楼主| 发表于 2005-9-20 22:16:16 | 显示全部楼层
“//端口初始化  

   DDRA=0xff;  

   PORTA=0x00;  

   DDRC=0x0F;  

   PORTC=0xFF;  





“//端口初始化  

   DDRA=0xff;  

   PORTA=0x00;  

   DDRC=0xF0;  

   PORTC=0xFF;  



不可以,你该其它(非C)可以吗?

出0入27汤圆

 楼主| 发表于 2005-9-20 22:19:06 | 显示全部楼层
还有PORTC是JTAG口,要做普通I/O口用,要先在镕丝位禁止JTAG功能!!!

出0入0汤圆

发表于 2005-9-22 14:47:43 | 显示全部楼层
对不起啊,我只会用C的啊,其它语言不会啊,如果按你改的那样,就是改为

   DDRC=0xF0;   

   PORTC=0xFF

但是很奇怪,只是6,7,11,12键下起作用,指示的灯不是按要求的,就是只是光第三,第四个灯,为什么这么奇怪的,如果一按回D口,就一点事也没有,我现在是用PROTUES防真的,你讲的先在镕丝位禁止JTAG功能!!! 我现在在软件有影响的吗,请问又如何来禁止,我是新手,请你多多指点,谢谢你不厌其烦的回答我的问题,谢谢,

出0入0汤圆

发表于 2005-9-22 14:53:57 | 显示全部楼层
我上转我的防真时的图给你看下

出0入0汤圆

发表于 2005-9-22 14:56:00 | 显示全部楼层
我只是把它改为4X4,用D口防真就成功,改C口就是上面图那样,一点反应也没有,看了几天也不知那里有问题啊

出0入27汤圆

 楼主| 发表于 2005-9-22 17:25:05 | 显示全部楼层
要禁用JTAG,在软件里仿真我不知道怎么设。

出0入0汤圆

发表于 2005-9-22 22:06:37 | 显示全部楼层
原来是这样啊,那如果在硬件上如何设呢?

我试下做出来试下行不行啊,

请你讲下如何设啊,

谢谢

出0入27汤圆

 楼主| 发表于 2005-9-24 21:09:38 | 显示全部楼层
通过下载线配置熔丝,熔丝的配置请看datasheet。

这个开头挺麻烦,搞过一次之后就好了。。。

出0入0汤圆

发表于 2005-9-26 07:51:17 | 显示全部楼层
谢谢你啊,

今天试到了,真是开心啊,

搞了几天,多谢你的提醒啊,果然是迷人丝位问题,

谢谢啊

出0入0汤圆

发表于 2006-8-21 16:42:44 | 显示全部楼层
是的,熔丝位要改才行的.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 02:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表