仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*
- #include <reg51.h>
- #include <intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit DAT = P0^2;
- sbit CLK = P0^1;
- //////////////
- void Delay_1ms(uint x)
- {
- uint i;
- uchar j;
- for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
- }
- //名称: Keyscan()
- //功能: P1外接4×4按键, 用扫描法读出键值
- //返回: 按键值0~15/如无键按下, 返回16
- //
- uchar Keyscan(void)
- {
- uchar i, j, temp;
- uchar Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
- for(j = 0; j < 4; j++)//循环四次
- {
- P1 = Buffer[j]; //在P1高四位分别输出一个低电平
- temp = 0x01; //计划先判断P1.0位
- for(i = 0; i < 4; i++) //循环四次
- {
- if(!(P1 & temp)) //从P1低四位,截取1位
- return (i + j * 4); //返回取得的按键值
- temp <<= 1; //判断的位,左移一位
- }
- }
- return 16; //判断结束,没有键按下,返回16
- } //呵呵,实质性的语句不过8行,就是这么简练!
- // 功能: 经由 P0 驱动 164,再使得共阳数码管显示 0~F
- //参数: k (键盘数值)
- void Display(uchar k)
- {
- uchar code table[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳段码
- uchar i, j;
- j = table[k]; //取出段码
- for(i = 0; i < 8; i++)
- {
- DAT = j & 0x01; //低位在前
- CLK = 0;
- Delay_1ms(1);
- CLK = 1;
- j >>= 1;
- }
- }
- /////////////////////////////////////////
- void Main(void)
- {
- uchar Key_Value = 16, Key_Temp1, Key_Temp2;//两次读出的键值
- P0 = 0xff;
- while(1)
- {
- //---------以下读入按键、消抖、等待按键释放
-
- P1 = 0xff;
- Key_Temp1 = Keyscan(); //先读入按键
- if(Key_Temp1 != 16)
- { //如果有键按下
- Delay_1ms(10); //延时一下
- Key_Temp2 = Keyscan(); //再读一次按键
- if (Key_Temp1 == Key_Temp2)
- { //必须是两次相等
- Key_Value = Key_Temp1; //才保存,这就是消除抖动
- Display(Key_Value); //显示键值
- }
- }
- }
- }
- */
复制代码
所有资料51hei提供下载:
两种4X4按键扫描.rar
(113.67 KB, 下载次数: 9)
|