原创输出程序
晶振的速度与扫描输出无关
晶振速度越快,扫描速度就越快
建议是12MHz,12T模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include "lcd.c"
- #define GPIO_KEY P1
- uchar KeyValue;
- //存放捕获到的键值
- uchar KeyState;
- const uchar dat[]="0123456789ABCDEF";
- const uchar output[]={ //单个16进制
- 0xf0,0xf1,0xf2,0xf3,
- 0xf4,0xf5,0xf6,0xf7,
- 0xf8,0xf9,0xfa,0xfb,
- 0xfc,0xfd,0xfe,0xff
- };
- void Delay10ms() //延时10毫秒,误差0微秒
- {
- uchar a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- void keyscan()
- {
- char a;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)
- {
- Delay10ms();
- if(GPIO_KEY!=0x0f)
- {
- KeyState=1;
- //测试列
- GPIO_KEY=0X0F;
- // Delay10ms();
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=1;break;
- case(0X0d): KeyValue=2;break;
- case(0X0e): KeyValue=3;break;
- // default: KeyValue=17; //检测出错回复17意思是把数码管全灭掉
- }
- //测试行
- GPIO_KEY=0XF0;
- Delay10ms();
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue+4;break;
- case(0Xd0): KeyValue=KeyValue+8;break;
- case(0Xe0): KeyValue=KeyValue+12;break;
- // default: KeyValue=17;
- }
- while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
- {
- Delay10ms();
- a++;
- }
- a=0;
- }
- }
- }
- void main()
- {
- P3=0xf0;
- LcdInit();
- LcdPrintf("by:With commands");
- while(1)
- {
- keyscan();
- if(KeyState)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
button.zip
(49.73 KB, 下载次数: 46)
|