📄 picc_keyboard.c
字号:
//实验目的:熟悉键盘矩阵的扫描方法
//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。
//最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25)
//无按键按下的时候显示FF
//按键跟按键的扫描结果满足如下关系:
// 按键 扫描结果(result) 按键 扫描结果
// K10 0XE7 K18 0XB7
// K11 0XEB K19 0XBB
// K12 0XED K20 0XBD
// K13 0XEE K21 0XBE
// K14 0XD7 K22 0X77
// K15 0XDB K23 0X7B
// K16 0XDD K24 0X7D
// K17 0XDE K25 0X7E
//硬件要求:拨码开关S4全部置ON
// 拨码开关S6全部置ON,拨码开关S5第5-6位置ON,其他位置OFF
// 其它拨码开关置OFF
#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
int result;
void delay(); //delay函数申明
void init(); //I/O口初始化函数申明
void scan(); //按键扫描程序申明
void display(); //显示函数申明
//---------------------------------------------------
//主程序
void main()
{
init();
while(1) //循环工作
{
//调用初始化子程序
scan(); //调用按键扫描子程序
display(); //调用结果显示子程序
}
}
//---------------------------------------------------
//初始化函数
void init()
{
TRISB=0X00;
ADCON1=0X07; //设置A口为普通I/O口
TRISA=0X0f; //设置A口高2位为输出,低4位为输入
TRISC=0XF0; //设置C口高4位为输入,低4位为输出
TRISD=0X00; //设置D口为输出
PORTA=0Xff;
PORTD=0Xff; //先清除所有显示
}
//---------------------------------------------------
//按键扫描程序
bit pkey()//整体扫描
{
PORTC=0XF0;
if (PORTC!=0XF0)
{
delay();
if(PORTC!=0XF0)
return 1;
else return 0;
}
else return 0;
}
void scan()
{
unsigned char key,s,k,c;
while(pkey())
{
PORTC=0XFe;
k=0xfe;
for(c=0;c!=4;c++)
{
s=PORTC&0xf0;
if(s==0x70)key=4*c+0;
if(s==0xb0)key=4*c+1;
if(s==0xd0)key=4*c+2;
if(s==0xe0)key=4*c+3;
/*switch(s)
{
case 0x70: key=4*c+0; break;
case 0xb0: key=4*c+1; break;
case 0xd0: key=4*c+2; break;
case 0xe0: key=4*c+3; break;
default: break;
}*/
k=(k<<1)|0x01;//左移一位 第二行一个低电平 然后扫描列 如果是第二列就加4
PORTC=k;
}
while(pkey());result=key;
}
}
//----------------------------------------------------------
//显示程序
void display()
{
switch(result)
{
case 0:
PORTA=0X2f;PORTD=0x3f;PORTA=0X00;delay(); PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break; //K10
case 1:
PORTA=0X2f;PORTD=0x06;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break; //K11
case 2:
PORTA=0X2f;PORTD=0x5b;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break; //K12
case 3:
PORTA=0X2f;PORTD=0x4f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break; //K13
case 4:
PORTA=0X2f;PORTD=0x66;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break; //K14
case 5:
PORTA=0X2f; PORTD=0x6d;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break; //K15
case 6:
PORTA=0X2f;PORTD=0x7d;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X3f;PORTA=0X00;delay();break; //K16
case 7:
PORTA=0X2f;PORTD=0x7f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X3f;PORTA=0X00;delay();break; //K17
case 8:
PORTA=0X2f; PORTD=0x6f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X3f;PORTA=0X00;delay();break; //K18
case 9:
PORTA=0X2f;PORTD=0x77;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X06;PORTA=0X00;delay();break; //K19
case 10:
PORTA=0X2f; PORTD=0x3f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break; //K20
case 11:
PORTA=0X2f; PORTD=0x06;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break; //K21
case 12:
PORTA=0X2f; PORTD=0x5b;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break; //K22
case 13:
PORTA=0X2f; PORTD=0x4f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break; //K23
case 14:
PORTA=0X2f; PORTD=0x66;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break; //K24
case 15:
PORTA=0X2f; PORTD=0x6d;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break; //K25
case 16:
PORTA=0X2f; PORTD=0x8e;PORTA=0X00;delay(); PORTA=0X1f;PORTD=0x8e; PORTA=0X00; delay();break; //无按键按下
}
}
//------------------------------------------------------------------
//延时程序
void delay() //延时程序
{
int i; //定义整形变量
for(i=50;i>0;i--); //延时
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -