历史上的今天
今天是:2024年11月13日(星期三)
2019年11月13日 | PIC单片机开发板之矩阵键盘扫描(if()else嵌套方式)
2019-11-13 来源:51hei
/*
为自已写的矩阵键盘检测+数码管显示+蜂鸣器响
采用if().....else嵌套方式;编译通过,却后二列显示不出来(你找出来了吗?一个不算问题的问题)
*/
//----------------------------------------------------------------
#include #define uint unsigned int #define uchar unsigned char __CONFIG(0x3B31); const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管数组 //--------------------变量定义------------------------------------ uint keynum,keytem,num; //定义变量,//keynum按键端口读回值,keytem为松手检测值(以示区分),num数码管 //--------------------函数调用 声明------------------------------- void init(); //初始化函数 void keyscan(); //矩阵键盘扫描 void didi(uchar dinum); //蜂鸣器 void disp(); //数码管显示 //-------------------主函数--------------------------------------- void delay(x) //延时函数,几乎每个程序都要用到,所以放在了主函数分界线内 { uchar a,b; for (a=x;a>0;a--) for(b=110;b>0;b--); } void main() { init(); //初始化 while(1) { keyscan(); //矩阵键盘扫描 disp(); //数码管显示 } } //------------初始化函数------------------------------------------- void init() { TRISA=0;PORTA=0x02; //38译码器 TRISB=1; //矩阵键盘 TRISC=0;PORTC=0x01;; //38使能 TRISD=0;PORTD=0x00; //LED灯(数码管) TRISE=0;PORTE=0x00; //蜂鸣器 } //----------要调用的函数-------------------------------------------- void keyscan() { //第一列扫描 PORTB=0xef; //送出RB4=1110 1111 keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0xef) { delay(5); keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0x0f) { keytem=keynum; didi(1); while(keytem!=0x0f) { keytem=PORTB; keytem=keytem&0x0f; } keynum=keynum|0xe0; } else //第二列扫描 { PORTB=0xdf; keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0xdf) { delay(5); keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0x0f) { keytem=keynum; didi(1); while(keytem!=0x0f) { keytem=PORTB; keytem=keytem&0x0f; } keynum=keynum|0xd0; } } else { PORTB=0xbf; keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0xbf) { delay(5); keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0x0f) { keytem=keynum; didi(1); while(keytem!=0x0f) { keytem=PORTB; keytem=keytem&0x0f; } keynum=keynum|0xb0; } else //第四列扫描 { PORTB=0x7f; keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0x7f) { delay(5); keynum=PORTB; keynum=keynum&0x0f; if(keynum!=0x0f) { keytem=keynum; didi(1); while(keytem!=0x0f) { keytem=PORTB; keytem=keytem&0x0f; } keynum=keynum|0x70; } } } //////// } } } } } void didi(uchar dinum) { uchar di_num; for(di_num=dinum;di_num>0;di_num--) { RE0=1; delay(100); RE0=0; delay(50); } } void disp() { switch(keynum) { case 0xee:PORTD=table[1];break; case 0xed:PORTD=table[2];break; case 0xeb:PORTD=table[3];break; case 0xe7:PORTD=table[4];break; case 0xde:PORTD=table[5];break; case 0xdd:PORTD=table[6];break; case 0xdb:PORTD=table[7];break; case 0xd7:PORTD=table[8];break; case 0xbe:PORTD=table[9];break; case 0xbd:PORTD=table[10];break; case 0xbb:PORTD=table[11];break; case 0xb7:PORTD=table[12];break; case 0x7e:PORTD=table[13];break; case 0x7d:PORTD=table[14];break; case 0x7b:PORTD=table[15];break; case 0x77:PORTD=table[0];break; } }
上一篇:PIC单片机的常见问题
下一篇:单片机C语言的位操作
史海拾趣
|
1. 金属密度的问题,我使用的chartered工艺,现在采用扩充周围面积,解决了。但是我想问下,在PAD外围放了DUMMY金属,对以后COB测试的放置引线会不会产生影响,流片出来后是只有PAD裸露在外面,其他的有保护膜,是不是?? ...… 查看全部问答> |
|
请教大家2个关于充电器的问题: 一:不知道为什么我用的充电器总是烧前级220V近来的电阻; 二:就是我给锂电池充电,2节理电池串联8.4V,请问我若是想在充电器与电池之间加上一个保护二极管,请问充电器的电压要多大?(因为我测试发现二极管的压降 ...… 查看全部问答> |
|
请问linux内核中的hmac-sha1算法支持分块运算吗? 内存资源有限,文件太大的情况,想分块做多次hmac-sha1运算最终得出20字节的digest,自己写了个,但是还是想,能用内核自带的最好罗,就是不知道内核的hamc-sha1算法支不支持分块运算,哪位同学用过有经验的??????????谢谢哦… 查看全部问答> |
|
RT。 开发环境使用EVC或者VS2005,最好配置,学习快速上手。用wince的GDI界面不好看,我要的就是好看点,快速点。一定要支持反走样的。… 查看全部问答> |
|
非linux/winCE嵌入文件系统如何实现? 硬件环境 Nec6100 flash 32M/64M sdram 64M/128M OS uITRON4.0 要求实现一个文件系统,大家有相关经历的请赐教.… 查看全部问答> |
|
上海辰汉电子I.MX31 MDK2 与I.MX27 MDK1分析介绍 给大家分析一下几个ARM嵌入式开发板 市场上有S3C,TI,Freescale等不同品牌的产品,但是那一款比较适合做消费电子产品,下面我给大家做个分析。S3C的开发板产品价格相对较低,受到很多高校的钟爱,但是,要知道作为工程师必须使用和 ...… 查看全部问答> |




