/*********************************************************
/ 线翻转法键盘扫描程序,只检测和处理单键,多键按下返回12
/高三位列 p456,低四位行p0123
/键盘排列如下:
2 1 0
--------------
3| 1 2 3 |
2| 4 5 6 |
1| 7 8 9 |
0| * 0 # |
--------------
输入:无
输出:键值
10:* 11:# 12:多个按键按下
*********************************************************/
#include <iom32v.h>
//#include <key_config.h>
#define uchar unsigned char
#define uint unsigned int
#define key_port PORTD //定义键盘接口
#define portDDR DDRD
#define port_PIN PIND
void delays(uint k);
uchar kbscan(void);
void main_init(void);
void dis_init(void);
#pragma data:code
const uchar table[3][4]={11,9,6,3,0,8,5,2,10,7,4,1}; //10:* 11:#
#pragma data:data
/*******************************************************************/
void main_init(void) /*单片机初始化 p456上拉输入高 0123输出低*/
{
key_port=0xff;
portDDR=0x0f;
key_port=0xf0;//低四位输出0
}
void dis_init(void)/*翻转: p456输出低 0123上拉输入高*/
{
key_port|=0x0f;
portDDR=0xf0;
key_port&=~0xf0;//p456输出0
}
/*************************************/
void delays(uint k)
{
uchar i;
uchar j;
for(j=k;j>0;j--)
{
for(i=255;i>0;i--);
}
}
uchar kbscan(void)
{
uchar row,col; //行列数值
/*给个初值*/
col=8;
row=8;
main_init(); /*扫描初始化*/
if((port_PIN&0xf0)!=0xf0) //有键按下
{
delays(4); //去抖动
if((port_PIN&0xf0)!=0xf0)
{
col=(port_PIN&0xf0); //列值
}
dis_init(); //翻转
if((port_PIN&0x0f)!=0x0f)
{
row=(port_PIN&0x0f);
}
/*判断列键值*/
switch(col)
{
case 0xb0: col=2;
break;
case 0xd0: col=1;
break;
case 0xe0: col=0;
break;
default: col=9; //未知数值
}
/*判断行键值*/
switch(row)
{
case 0x0e: row=0;
break;
case 0x0d: row=1;
break;
case 0x0b: row=2;
break;
case 0x07: row=3;
break;
default: row=9; //未知数值
}
}
if((col!=9)&(row!=9))
return table[col][row];
else return 12; //错误返回
}
/*
void main(void)
{
uchar key;
main_init(); //初始化
while(1);
{
key=kbscan(); /键盘扫描,键值给key/
//使用方法:
//Lcd_stringdisp 为lcd 显示程序。
key_tmp=kbscan();
switch (key_tmp)
{
case 0: {Lcd_stringdisp("0",2); break;}
case 1: {Lcd_stringdisp("1",2); break;}
case 2: {Lcd_stringdisp("2",2);break;}
case 3: {Lcd_stringdisp("3",2);break;}
case 4: {Lcd_stringdisp("4",2);break;}
case 5: {Lcd_stringdisp("5",2);break;}
case 6: {Lcd_stringdisp("6",2);break;}
case 7: {Lcd_stringdisp("7",2);break;}
case 8: {Lcd_stringdisp("8",2);break;}
case 9: {Lcd_stringdisp("9",2);break;}
case 10: {Lcd_stringdisp("*",2);break;}
case 11: {Lcd_stringdisp("#",2);break;}
case 12:{Lcd_stringdisp("错误返回!",10);break;}
default: {Lcd_stringdisp("NO",4);break;}
}
delays();
}
}*/
key_driver.rar_4 3 2 1_行扫描法_键盘扫描程序
版权申诉
4 浏览量
2022-09-23
23:31:27
上传
评论
收藏 1KB RAR 举报
寒泊
- 粉丝: 76
- 资源: 1万+