单片机按钮2
来源:互联网 发布:高斯过程 知乎 编辑:程序博客网 时间:2024/05/16 15:32
////========================================================
// PA2-PA5 PC3-PC5作为引脚
//行扫描法:从PA2开始逐行置低电压
//双键扫描:K1 K5 K9为同一列PA2控制,如果为同一列,例如K1 K5同时按下,PC5 PC4 PC3的电压为 100 此时PA5 PA4 PA3 PA2 1110
//如果只是K1按下,PC5 PC4 PC3的电压为 110 此时PA5 PA4 PA3 PA2 1110
void GetKeyStatus()
{
u8 i,j, k=0;
u8 tmp,sccode,recode;
u8 TmpCode,TmpPreCode = 0;
u8 KeyCode[4] = 0;
u8 ComplexFlag = 0;
//设置单片机输入输出,此为芯片仿真所用,在板子上调试
PAOutputMode();
PCInputModePush();
xPORT_A=xPORT_A&(~0x3C); //0x3C(111100)
Wait_ms(10);
tmp=xPORT_C;
tmp=tmp&0x38; //00111000
if(0x38 != tmp)
{
Wait_ms(10); // Eliminating shiver
if(0x38 != (tmp & 0x38))
{
Wait_ms(30);
sccode = ~0x04; //从PA2开始扫描
while(0x3C != (sccode & 0x3C))
{
xPORT_A = sccode;
tmp = xPORT_C;
tmp = tmp & 0x38 ;
if(0x38 != tmp)
{
recode = ((sccode & 0x3C) >> 2) & 0x0f | 0xf0; //PA: xxxx 00 >>2 = xxxx 11111101
TmpCode = (~((tmp << 1) & 0xf0 | 0x0f)) & 0x7f | (~recode); //Mode:xxx(pc) xxxx(pa)
if(TmpPreCode != TmpCode)
{
KeyCode[k] = TmpCode;
k++;
TmpPreCode = TmpCode;
}
}
sccode = (sccode << 1)|0x01;
}
}
for(i=0,j = 0;i<(sizeof(KeyCode) /sizeof(u8)); i++)
{
if(0 != KeyCode[i])
{
KeyNo[j] = fnKeycode(KeyCode[i]);
j++;
}
}
if(j < 2 && 0x0B >= KeyNo[0])//00:Sigle Button 01:Multi Button
{
KeyCode[0] = '0';
KeyCode[1] = '0';
KeyCode[2] = KeyNo[0];
}
else
{
KeyCode[0] = '0';
KeyCode[1] = '1';
if( 0x0B < KeyNo[0])
{
KeyCode[2] = KeyNo[0] & 0xF0;
KeyCode[3] = KeyNo[0] & 0x0F;
}
else
{
KeyCode[2] = KeyNo[1] ;
KeyCode[3] = KeyNo[2] ;
}
}
}
}
u8 fnKeycode(u8 key)
{
switch(key)
{
case 0x11:
key = 0x01;
break;
case 0x12:
key = 0x02;
break;
case 0x14:
key = 0x03;
break;
case 0x18:
key = 0x04;
break;
case 0x21:
key = 0x05;
break;
case 0x22:
key = 0x06;
break;
case 0x24:
key = 0x07;
break;
case 0x28:
key = 0x08;
break;
case 0x41:
key = 0x09;
break;
case 0x42:
key = 0x0A;
break;
case 0x44:
key = 0x0B;
break;
//===Fuction Keytable===//
case 0x31:
key = 0x15; //K1+K5=15
break;
case 0x51:
key = 0x19; //K1+K9=19
break;
case 0x61:
key = 0x59; //K5+K9=59
break;
case 0x32:
key = 0x26; //k2+k6
break;
case 0x52:
key = 0x2A; //k2+ka
break;
case 0x62:
key = 0x6A;//k6+ka
break;
case 0x34:
key =0x37; //k3+k7
break;
case 0x54:
key =0x3B;// k3+kb
break;
case 0x64:
key = 0x7B; //k7+kb
break;
case 0x38:
key = 0x48; //k4+k8
break;
default:
key = 0x00;
break;
}
return key;
}
- 单片机按钮2
- STM8S单片机入门2(关机模式开关机按钮)
- 单片机 按钮——1
- 单片机按钮防抖C语言程序
- 单片机AT89c51——单个按钮控制蜂鸣器和灯
- AVR单片机软件按钮消抖与确认
- 单片机串口通信(2)
- 单片机学习2
- 单片机-->流水灯2
- 单片机试验代码2
- 52单片机定时器2
- 单片机编程-2
- 单片机学习记录2
- 单片机原理(2):程序设计
- 单片机
- 单片机
- 单片机
- 单片机
- POJ 2455Secret Milking Machine(二分+网络流之最大流)
- Adb驱动装好,但adb devices找不到设备
- HDU - 4054 Hexadecimal View (2011 Asia Dalian Regional Contest)
- linux终端下用vi命令创建一个文件(a),创建进入文本编辑界面命令?
- 将程序exe制作成安装包
- 单片机按钮2
- sfnetworking
- PowerDesigner15在win7-64位系统连接MySQL并设置逆向工程
- ArcGIS For Android 中文标注不显示解决方案
- mysql 多表联合查询的时的注意
- Java UNIX时间转换
- html5 canvas fillRect
- hdu 4727 The Number Off of FFF(模拟)
- 谈谈去 IOE 运动