51 单片机使用串入并出芯片 164 以及矩阵键盘
扫描二维码
随时随地手机看文章
硬件:74HC164驱动四个数码管,矩阵键盘。
设计要求:
第一次按按键1显示1- - -、按按键2显示2- - -,以此类推,按1~9都是这样显示。
第二次按按键(如果第一次按的是1)(第二次按的是2)显示12-- ;
第三次按按键(如果第一次是1第二次是2第三次试3)显示123-;
按键第四次(如果第一次是1第二次是2第三次是3第四次是4)显示1234。
C语言编程如下:
//=======================================================
#include 51.H>
char disp_buff [4] = {0}; //显示缓冲单元.
//-------------------------------------------------------
delay(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[] = { //共阳段码 0 ~ 9
0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
char i;
for (i = 0; i < 4; i++) {
SBUF = table[disp_buff [i]];//输出段码
while(!TI);
TI = 0;
}
}
//-------------------------------------------------------
unsigned char keyboard(void) //扫描键盘函数
{
unsigned char i, tmp1, tmp2;
for(i = 0; i < 4; i++) {
P1 = ~(1 << i); //i = 0 : P1 = 1111 1110
tmp1 = P1 & 0xF0;
if(tmp1 != 0xF0) { //有键按下
delay(10); //延时
tmp2 = P1 & 0xF0; //再读
if(tmp1 == tmp2) { //两次相等,即不是抖动
if (tmp1 == 0x70) return i * 4 + 0; //键值
if (tmp1 == 0xb0) return i * 4 + 1;
if (tmp1 == 0xd0) return i * 4 + 2;
if (tmp1 == 0xe0) return i * 4 + 3;
} } }
return 16; //没有键按下
}
//-------------------------------------------------------
void main(void)
{
unsigned char key;
display(); //初始显示.
while(1) { //无限循环.
key = keyboard(); //读出一遍键盘.
if (key < 10) { //如果0~9
//--------------------进行按键处理.
disp_buff [3] = disp_buff [2];
disp_buff [2] = disp_buff [1];
disp_buff [1] = disp_buff [0];
disp_buff [0] = key;
display(); //显示.
//--------------------处理结束,去等待按键释放.
while(key < 16) key = keyboard();//等待按键释放.
} } //无限循环.
}
//=======================================================
仿真截图如下: