#include #define keys P1//宏定义矩阵键盘 #define smg P0//宏定义数码管 sbit SMGA=P2^2;//位定义 sbit SMGB=P2^3; sbit SMGC=P2^4; unsigned int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管字形码 unsigned int k; void delay()//延时函数 { unsigned char a,b; for(a=0;a<200;a++) for(b=0;b<200;b++); } void jzjp()//矩阵键盘函数 { unsigned int i=0; //unsigned int k; 本人遇到的错误,在该函数下定义的k,导致主函数中用k时出现错误,应在整体下定义 keys=0x0f;//行列扫描,高四位输出低电平,低四位输出高电平 if(keys!=0x0f)//如果keys不等于该值则说明有按键按下 { delay();//按键消抖 if(keys!=0x0f)//确实按下按键,第四位不全为1 { switch(keys)//列判断 { case(0x07):k=0;break;//对应列按键按下时矩阵键盘对应的数,并存储于k case(0x0b):k=1;break; case(0x0d):k=2;break; case(0x0e):k=3;break; } keys=0xf0; switch(keys)//行判断 { case(0x70):k=k;break;//对应行按键按下时矩阵键盘对应的数,并存储于k case(0xb0):k=k+4;break; case(0xd0):k=k+8;break; case(0xe0):k=k+12;break; } //扫描过程,如果case(0x07)时第一列按键按下,k=0,break跳出switch, //行判断,case(0x70)时第一行按键按下,k=k,跳出switch // 如果case(0x0b)时第二列按键按下,k=1,break跳出switch, //行判断,case(0xb0)时第二行按键按下,k=k+4(第一个按键向后数4个)跳出switch。。 while((i<50)&&(keys!=0xf0))//按键总是按着不松开超过一定时间时强制退出,从新扫描显示你所按着不动的按键 { delay(); i++; } } } } void main()//主函数 { while(1) { SMGA=0;//Y0非输出端对应的数码管显示 SMGB=0; SMGC=0; jzjp(); smg=table[k];//数码管显示 } } 注: 该开发板矩阵键盘接于P1口 该程序时用矩阵键盘控制的最后一个动态数码管,3-8译码器的输入端接于P2口的2,3,4端,P0口接数码管驱动端。
上一篇:用51单片机中断控制LED灯亮灭
下一篇:用51单片机显示静态数码管
推荐阅读最新更新时间:2024-10-31 12:33
设计资源 培训 开发板 精华推荐
- 开源SMD回流焊
- 【物联网】鸿蒙智能开关
- 使用 Analog Devices 的 LTC2992IMS 的参考设计
- LT3686 的典型应用 - 采用 3mm-3mm DFN 封装的 37V/1.2A 降压型稳压器
- LT3663EMS8E-5、2.5V 降压转换器的典型应用
- 微处理器电源监控应用电路
- 使用 Richtek Technology Corporation 的 RT9301 的参考设计
- 用于雷达系统的 68.75 至 2200MHz PLL 时钟发生器
- SY89840U,用于 GB 以太网交换机的时钟缓冲器的评估板
- DC2197A-A,使用 LTC2645 四通道、12 位 PWM 至 Vout DAC 的演示板