要求运用4×4矩阵键盘,数码显现器。键盘接在P1,数码显现器接在P0、P2口。
电路、以及运转后的显现作用如下:
C言语的操控程序如下:
//=======================================================
#include
char disp_buff [] ={0, 0, 0, 0, 0, 0, 0, 0};//显现缓冲单元
//——————————————————-
delay1ms(unsigned int t) //1ms延时函数
{
unsigned int i, j;
for(i = 0; i 《 t; i++) for(j = 0; j 《 120; j++);
}
//——————————————————-
void display(void) //显现函数
{
char code table[] = { //共阴数码管的段码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
char code wei[] = {128, 64, 32, 16, 8, 4, 2, 1};//位选代码
char i;
for (i = 0; i 《 8; i++) {
P2 = 0; //先消隐
P0 = ~table[disp_buff [i]]; //取反,用于共阳数码管
P2 = wei[i];
delay1ms(2);
}
}
//——————————————————-
unsigned char keyboard(void) //扫描键盘函数
{
char i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j 《 4; j++) { //循环扫描四行
P1 = Buffer[j]; //在高四位别离输出一个低电平
temp = 0x01; //方案先判别第0位
for(i = 0; i 《 4; i++) { //循环扫描四列
if(!(P1 & temp)) //从低四位,截取1位
return (i + j * 4); //假如为0就回来按键值
temp 《《= 1; //判别的位,左移一位
} }
return 16; //判别完毕,没有键按下,回来16
} //呵呵,实质性的句子不过8行,便是这么简练!
//——————————————————-
void main(void)
{
unsigned char i, key;
while(1) { //无限循环
display(); //显现一遍
key = keyboard(); //读出一遍键盘
if (key 《 16) { //假如有人按键
//——————–进行按键处理
disp_buff [7] = disp_buff [6];
disp_buff [6] = disp_buff [5];
disp_buff [5] = disp_buff [4];
disp_buff [4] = disp_buff [3];
disp_buff [3] = disp_buff [2];
disp_buff [2] = disp_buff [1];
disp_buff [1] = disp_buff [0];
disp_buff [0] = key;
//——————–处理完毕,去等候按键开释
for (i = 0; i 《 20; i++) display();//稍稍延时
while(key 《 16) { //等候按键开释
key = keyboard(); //再读
display(); //别忘了显现
} } } //无限循环
}