要求使用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(); //别忘了显示
} } } //无限循环
}
评论
查看更多