单片机 矩阵按键 函数
单片机按键实现的功能有哪些?
怎样去编写矩阵按键的函数呢?
回帖(1)
2022-2-23 10:29:03
如果你和我一样正在学习 微机原理。希望我写的东西对你有帮助。
实现的功能:
对应按键按下,仿真出对应波形。
只写了三个波形,不过按键有16个。
#include
#include
#define DAC0832 XBYTE[0XF7FF]
#define uint unsigned int
#define uchar unsigned char
unsigned char i, dat, flag = 1;
uint j = 0;
uchar line, row, kvalue, kscan;
// 延时消抖函数
// void delay() //T0
// {
// TMOD = 0X01;
// TH0 = (65536 - 20000) / 256;
// TL0 = (65536 - 20000) % 256;
// TR0 = 1;
// do
// {
// /* code */
// } while (!TF0);
// TF0 = 0;
// }
void delay1ms(uint n) //粗略延时n ms
{
uint m, h, k;
for (k = n; k > 0; k--)
for (m = 195; m > 0; m--)
for (h = 4; h > 0; h--)
;
}
/*矩阵按键函数*/
// 键盘扫描法
uchar keyScanning()
{
P1 = 0xf0;
row = P1;
if (row != 0xf0)
{
delay1ms(20);
/* 粗扫描 */
row = P1;
if (row != 0xff)
{
/*按键确实被按下,开始细扫描*/
line = 1;
P1 = ~line;
row = P1 & 0xf0;
do
{
/* code */
if (row == 0xf0)
{
/*逐行取0,判断列的状态 */
line = line << 1;
if (line == 0x10)
{
/* 最后一行,无键 */ return 0xff;
}
}
} while (row == 0xf0);
line = ~line & 0x0f;
kscan = line | row;
return kscan;
}
}
return 0xff;
}
// 行列反转法
uchar keyRowLine()
{
P1 = 0x0f;
line = P1;
if (line != 0x0f)
{
/* 判断行状态 */
delay1ms(20);
line = P1;
if (line != 0x0f)
{
/* 有按键按下 */
line = line & 0x0f;
P1 = 0xf0;
delay1ms(1); //等待变化时间
row = P1;
row = row & 0xf0;
kscan = line | row;
return kscan;
}
}
return 0xff;
}
// 获得键编码
void getKeyVaule()
{
uchar Kscan;
// Kscan = keyScanning();
Kscan = keyRowLine();
switch (Kscan)
{
case 0xee:
kvalue = 0;
break;
case 0xde:
kvalue = 1;
break;
case 0xbe:
kvalue = 2;
break;
case 0x7e:
kvalue = 3;
break;
case 0xed:
kvalue = 4;
break;
case 0xdd:
kvalue = 5;
break;
case 0xbd:
kvalue = 6;
break;
case 0x7d:
kvalue = 7;
break;
case 0xeb:
kvalue = 8;
break;
case 0xdb:
kvalue = 9;
break;
case 0xbb:
kvalue = 10;
break;
case 0x7b:
kvalue = 11;
break;
case 0xe7:
kvalue = 12;
break;
case 0xd7:
kvalue = 13;
break;
case 0xb7:
kvalue = 14;
break;
case 0x77:
kvalue = 15;
break;
default:
break;
}
}
/*矩阵按键函数*/
// 按键函数,单个。
void key_board()
{
P1 = 0xff;
if (0xff != P1)
{
delay1ms(20);
if (0xff != P1)
{
flag++;
}
}
while (0xff != P1)
{
/* code */
}
}
// 主函数
void main()
{
TMOD = 0X10;
EA = 1;
ET1 = 1;
TR1 = 1;
while (1)
{
/* code */
}
}
// 锯齿波
void sawtooth()
{
TH1 = (65536 - 1000) / 256;
TL1 = (65536 - 1000) % 256;
DAC0832 = dat;
dat++;
}
// 方波
void square()
{
TH1 = (65536 - 2000) / 256;
TL1 = (65536 - 2000) % 256;
i++;
if (i % 2)
{
dat = 0x00; //0v
}
else
{
dat = 0xcc; //4v
}
DAC0832 = dat;
}
// 三角波
void triangle()
{
TH1 = (65536 - 500) / 256;
TL1 = (65536 - 500) % 256;
j++;
if (j >= 0 && j < 0xff)
{
dat++;
}
else
{
dat--;
}
if (dat == 0)
{
j = 0;
}
DAC0832 = dat;
}
// 中断函数
void timer1() interrupt 3
{
// key_board();
getKeyVaule();
if (kvalue == 0)
{
sawtooth();
}
else if (kvalue == 1)
{
square();
}
else if (kvalue == 2)
{
triangle();
}
}

如果你和我一样正在学习 微机原理。希望我写的东西对你有帮助。
实现的功能:
对应按键按下,仿真出对应波形。
只写了三个波形,不过按键有16个。
#include
#include
#define DAC0832 XBYTE[0XF7FF]
#define uint unsigned int
#define uchar unsigned char
unsigned char i, dat, flag = 1;
uint j = 0;
uchar line, row, kvalue, kscan;
// 延时消抖函数
// void delay() //T0
// {
// TMOD = 0X01;
// TH0 = (65536 - 20000) / 256;
// TL0 = (65536 - 20000) % 256;
// TR0 = 1;
// do
// {
// /* code */
// } while (!TF0);
// TF0 = 0;
// }
void delay1ms(uint n) //粗略延时n ms
{
uint m, h, k;
for (k = n; k > 0; k--)
for (m = 195; m > 0; m--)
for (h = 4; h > 0; h--)
;
}
/*矩阵按键函数*/
// 键盘扫描法
uchar keyScanning()
{
P1 = 0xf0;
row = P1;
if (row != 0xf0)
{
delay1ms(20);
/* 粗扫描 */
row = P1;
if (row != 0xff)
{
/*按键确实被按下,开始细扫描*/
line = 1;
P1 = ~line;
row = P1 & 0xf0;
do
{
/* code */
if (row == 0xf0)
{
/*逐行取0,判断列的状态 */
line = line << 1;
if (line == 0x10)
{
/* 最后一行,无键 */ return 0xff;
}
}
} while (row == 0xf0);
line = ~line & 0x0f;
kscan = line | row;
return kscan;
}
}
return 0xff;
}
// 行列反转法
uchar keyRowLine()
{
P1 = 0x0f;
line = P1;
if (line != 0x0f)
{
/* 判断行状态 */
delay1ms(20);
line = P1;
if (line != 0x0f)
{
/* 有按键按下 */
line = line & 0x0f;
P1 = 0xf0;
delay1ms(1); //等待变化时间
row = P1;
row = row & 0xf0;
kscan = line | row;
return kscan;
}
}
return 0xff;
}
// 获得键编码
void getKeyVaule()
{
uchar Kscan;
// Kscan = keyScanning();
Kscan = keyRowLine();
switch (Kscan)
{
case 0xee:
kvalue = 0;
break;
case 0xde:
kvalue = 1;
break;
case 0xbe:
kvalue = 2;
break;
case 0x7e:
kvalue = 3;
break;
case 0xed:
kvalue = 4;
break;
case 0xdd:
kvalue = 5;
break;
case 0xbd:
kvalue = 6;
break;
case 0x7d:
kvalue = 7;
break;
case 0xeb:
kvalue = 8;
break;
case 0xdb:
kvalue = 9;
break;
case 0xbb:
kvalue = 10;
break;
case 0x7b:
kvalue = 11;
break;
case 0xe7:
kvalue = 12;
break;
case 0xd7:
kvalue = 13;
break;
case 0xb7:
kvalue = 14;
break;
case 0x77:
kvalue = 15;
break;
default:
break;
}
}
/*矩阵按键函数*/
// 按键函数,单个。
void key_board()
{
P1 = 0xff;
if (0xff != P1)
{
delay1ms(20);
if (0xff != P1)
{
flag++;
}
}
while (0xff != P1)
{
/* code */
}
}
// 主函数
void main()
{
TMOD = 0X10;
EA = 1;
ET1 = 1;
TR1 = 1;
while (1)
{
/* code */
}
}
// 锯齿波
void sawtooth()
{
TH1 = (65536 - 1000) / 256;
TL1 = (65536 - 1000) % 256;
DAC0832 = dat;
dat++;
}
// 方波
void square()
{
TH1 = (65536 - 2000) / 256;
TL1 = (65536 - 2000) % 256;
i++;
if (i % 2)
{
dat = 0x00; //0v
}
else
{
dat = 0xcc; //4v
}
DAC0832 = dat;
}
// 三角波
void triangle()
{
TH1 = (65536 - 500) / 256;
TL1 = (65536 - 500) % 256;
j++;
if (j >= 0 && j < 0xff)
{
dat++;
}
else
{
dat--;
}
if (dat == 0)
{
j = 0;
}
DAC0832 = dat;
}
// 中断函数
void timer1() interrupt 3
{
// key_board();
getKeyVaule();
if (kvalue == 0)
{
sawtooth();
}
else if (kvalue == 1)
{
square();
}
else if (kvalue == 2)
{
triangle();
}
}

举报
更多回帖