完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
小弟看过郭天祥的视频后,给自己的实验板写的矩阵键盘程序,但是下载后什么反应也没有,又找不出哪里不对。请各位前辈帮小弟找找错在哪里。
程序: #include #define uint unsigned int #define uchar unsigned char uchar num,temp; ***it dula=P3^6; ***it wela=P3^7; uchar code table[]={ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e , 0xff}; void delay(uint z); void display(uchar aa); uchar keyscan(); void main() { num=17; dula=1; P0=0xff; dula=0; wela=1; P2=0xfe; wela=0; while(1) { display(keyscan()); } } void display(uchar aa) { dula=1; P0=table[aa-1]; dula=0; } uchar keyscan() { P1=0xf7; temp=P1; temp=temp&0xf0; while(1) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe0: num=1; break; case 0xd0: num=2; break; case 0xb0: num=3; break; case 0x70: num=4; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb; temp=P1; temp=temp&0xf0; while(1) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe0: num=5; break; case 0xd0: num=6; break; case 0xb0: num=7; break; case 0x70: num=8; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd; temp=P1; temp=temp&0xf0; while(1) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe0: num=9; break; case 0xd0: num=10; break; case 0xb0: num=11; break; case 0x70: num=12; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfe; temp=P1; temp=temp&0xf0; while(1) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xe0: num=13; break; case 0xd0: num=14; break; case 0xb0: num=15; break; case 0x70: num=16; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } return num; } void delay(uint z) { uint x,y; for(x=110;x>0;x--) for(y=z;y>0;y--); } |
|
相关推荐
13个回答
|
|
|
|
|
|
|
|
/*矩阵键盘扫描程序:线反转法(经典矩阵键盘检测程序)
动态扫描显示数码管、线反转法检测4×4矩阵键盘 P1口流水灯实时显示P3口电平(熄灭表示高电平、点亮表示低电平) 用程序状态寄存器PSW中的PSW^5,作为全局标志位 // Header:P3口低4位接矩阵键盘行、高4位接矩阵键盘列 // File Name:经典矩阵键盘检测程序(线反转法) // Author:田 // Date:2012年12月7日 */ #include #include #define uint unsigned int//宏定义 #define uchar unsigned char//宏定义 uchar num;//定义全局变量 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阳极数码管字符表 void delay(uint xms) //延时函数 { uint i,j; for(i=0;i } void display(num) //显示函数 { uchar numwe,xwei; xwei=6;//用几位数码管显示? numwe=0xfe;//初始化数码管位选控制 for(;xwei!=0;xwei--) { dula=1; //开段选锁存器 P0=table[num];//送显示数 dula=0; //关段选锁存器 P0=0xff;//消影 wela=1; //开位选锁存器 P0=numwe;//送数码管位选控制 wela=0; //关位选锁存器 numwe=_crol_(numwe,1); //对数码管位选控制 左移位 delay(1);//调用延时函数 } } void keyscan()//矩阵键盘扫描函数 开始 { uchar x,y,key,temp;//定义:行坐标x、列坐标y、按键key temp=0x0f;// 0000 1111 P3=temp;//P3口:4列送0000、4行送1111; if (P3!=temp)//1判断是否有按键按下; { delay(10);//延时10毫秒消抖动; P3=temp;//P3口:列送0000、行送1111; if (P3!=temp)//2次判断是否有按键按下; { x=P3&temp;//取按下矩阵键盘的行坐标 temp=~temp;//按位取反,线反转使用; P3=temp;//线反转P3口:4列送高电平、4行送低电平; y=P3&temp;//取按下矩阵键盘的列坐标 key=x|y;//行坐标x、列坐标y 进行或运算组合在一起。 while(P3!=temp);//按键释放检测语句 P1=key;//用流水灯显示当前的P3口状态 switch (key) //进入开关多分支语句判断 { case 0xee: num=0; F0=1; break; case 0xde: num=1; F0=1; break; case 0xbe: num=2; F0=1; break; case 0x7e: num=3; F0=1; break; case 0xed: num=4; F0=1; break; case 0xdd: num=5; F0=1; break; case 0xbd: num=6; F0=1; break; case 0x7d: num=7; F0=1; break; case 0xeb: num=8; F0=1; break; case 0xdb: num=9; F0=1; break; case 0xbb: num=10; F0=1; break; case 0x7b: num=11; F0=1; break; case 0xe7: num=12; F0=1; break; case 0xd7: num=13; F0=1; break; case 0xb7: num=14; F0=1; break; case 0x77: num=15; F0=1; break; default://出错处理! F0=0;//程序状态字 置0 break; } } } }//矩阵键盘扫描函数 结束 void init()//初始化函数 { F0=0;//程序状态字:上电数码管不显示、以及出错处理 num=0; } void main() //主函数 开始 { init(); //调用 初始化函数 while(1)//大循环 开始 { keyscan();//调用按键扫描函数 if (F0==1)//判断是否正确按下了矩阵按键 { display(num);//调用 显示函数 } else//错误按键处理(关闭数码管显示、关闭流水灯) { dula=1; //开U1锁存器 P0=0xff;//送关闭数据 dula=0; //关U1锁存器 wela=1; //开U2锁存器 P0=0xff; //送关闭数据 wela=0; //关U2锁存器 P1=0xff;//熄灭流水灯 delay(100); P1=~P1;//流水灯闪烁 delay(100); } }//大循环 结束 }//主函数 结束 |
|
|
|
|
|
|
|
|
|
|
|
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
|
|
|
|
首先你得确定你的矩阵硬件电路,和郭的一样,不然的话不做更改肯定还是不行!
|
|
|
|
有道理 我的板子就和郭天祥的不一样 就改了 可以运行mobile_fromtype_android
|
|
|
|
看看键盘是否接在P2口上mobile_fromtype_android
|
|
|
|
看看键盘是否接在P2口上mobile_fromtype_android
|
|
|
|
怎么那么多 while(1)
|
|
|
|
switch case语句中,case后面的判断数据是不一样的,你四个里面都一样,按下键盘后,当然不能实现功能
|
|
|
|
请加注释再放电路图,我给你弄到任务区去 速度
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
726 浏览 0 评论
777 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
680 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1149 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1120 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11806 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 14:41 , Processed in 0.807020 second(s), Total 93, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号