📄 keyboard.c
字号:
#include "init.h"
//unsigned int tab[]={0x77,0x7b,0x7d,0x7e,0x0b7,0x0bb,0x0bd,0x0be,
// 0x0d7,0x0db,0x0dd,0x0de,0x0e7,0x0eb,0x0ed,0x0ee}; /*键码表*/
//unsigned char tab1[]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,
// 0x90,0x88,0x83,0x0c6,0x0a1,0x86,0x8e}; /*段码表*/
unsigned char tab[]={0x77,0x7b,0x7d,0x7e,
0x0b7,0x0bb,0x0bd,0x0be,
0x0d7,0x0db,0x0dd,0x0de,
0x0e7,0x0eb,0x0ed,0x0ee}; /*键码表*/
unsigned char tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D',0x0D,'F'};
//端口8的P80~P83与键盘的列Y4~Y1连,端口1的P14~P17与键盘的行X4~X0连
delay_key(unsigned long int i)
{ unsigned long int y;
for (y=0;y<i;y++);
}
void keyboard(char key_num[], int len)
{
unsigned char i,a,b;
int k=0;
for(;;)
{
//列线输出低电平,并读入行线的值,判断是否有键按下
a=0xf0;
while( a==0xf0)
{ IO.PCR8 = 0x0f; //端口8低4位输出
IO.PDR8.BYTE=0; //端口8输出列线低电平
delay(1000);
IO.PCR1=0x0f; //端口1高4位输入,低4位输出
a=IO.PDR1.BYTE; //读入行线值
a=a&0xf0; //保留高4位值
};
b=a; //如有键按下,则保存高4位
a=a|0x0f; //高4位不变,低4位置1,准备从行线输出
IO.PCR1=0xff; //端口1高4位输出,低4位输出
IO.PDR1.BYTE=a;
delay_key(1000);
//读入列线的值
IO.PCR8 = 0x00; //端口8低4位输入
//使用下面语句,读到的端口8的值与实际端口8的值不等
// a=IO.PDR8.BYTE;
// a=a&0x0f; //保留低4位的值
// b=b|a; //合并行线与列线的值
delay_key(1000);
//改为:
b=b|(IO.PDR8.BYTE&0x0f); //合并行线与列线的值
i=0; //计数器清零
a=tab[i];
//在键码表中查找相应的键码,并计算在段码中的位置
a=tab[0];
while (i<16&b!=a)
{
i++;
a=tab[i];
}
// while(SCI3.SSR.BIT.TDRE != 1)
// { ; /*查询状态*/
//
// };
a=tab1[i];
if (i<16) {
// TDR=a; //向串口发送
LCD(a);
key_num[k]=a;
k++;
if(k>=len || a == 0x0D) break;
}
delay_key(600000); //延时,去抖动
//判断按键是否结束
a=0xd0;
while( a!=0xf0)
{ IO.PCR1=0x0f; //端口1高4位输入,低4位输出
a=IO.PDR1.BYTE; //读入行线值
a=a&0xf0; //保留高4位值
};
delay_key(600000); //延时
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -