打印
[51单片机]

使用矩阵按键对数码管进行控制的疑问?

[复制链接]
640|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
快鲨1|  楼主 | 2019-4-20 20:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>

//********键盘矩阵*******//
sbit KEY_IN_1 = P2^4;//KEY_IN=x轴
sbit KEY_IN_2 = P2^5;//KEY_OUT=Y轴
sbit KEY_IN_3 = P2^6;
sbit KEY_IN_4 = P2^7;
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P2^1;
sbit KEY_OUT_4 = P2^0;
//***********************//
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;

unsigned char code LedChar[] = {
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90
};

unsigned char KeySta[4][4] ={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};

void main()
{
        unsigned char i,j;
        unsigned char backup[4][4] = {
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
        };
       
        EA = 1;
        //*******采用138 Y1 接LED A*******//
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 0;
        //********************************//
        TMOD = 0x01;
        TH0 = 0xFC;
        TL0 = 0x67;
        ET0 = 1;
        TR0 = 1;
        P0 = LedChar[0];
       
        while(1)
        {
                for(i = 0; i < 4; i++)
                {
                        for(j = 0; j < 4; j++)
                        {
                                if(backup[i][j] != 0)
                                {
                                        P0 = LedChar[i * 4 +j];
                                }
                                backup[i][j] = KeySta[i][j];
                        }
                }
        }
}


void InterruptTimer0() interrupt 1
{
        unsigned char i;
        static unsigned char keyout = 0;
        static unsigned char keybuf[4][4] = {
        {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
        {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
        };
       
        TH0 = 0xFC;
        TL0 = 0x67;
        keybuf[keyout][0] == (keybuf[keyout][0] << 1) | KEY_IN_1;
        keybuf[keyout][1] == (keybuf[keyout][0] << 1) | KEY_IN_2;
        keybuf[keyout][2] == (keybuf[keyout][0] << 1) | KEY_IN_3;
        keybuf[keyout][3] == (keybuf[keyout][0] << 1) | KEY_IN_4;
       
        for (i=0;i<4;i++)
        {
                if((keybuf[keyout][i] & 0x0F) == 0x00)
                {
                        KeySta[keyout][i] = 0;
                }
                else if((keybuf[keyout][i] & 0x0F) == 0x0F)
                {
                        KeySta[keyout][i] = 1;
                }
        }
        keyout++;
        keyout = keyout & 0x03;
        switch(keyout)
        {
                case 0:KEY_OUT_4 = 1;
                                         KEY_OUT_1 = 0;
                                         break;
                case 1:KEY_OUT_1 = 1;
                                         KEY_OUT_2 = 0;
                                         break;
                case 2:KEY_OUT_2 = 1;
                                         KEY_OUT_3 = 0;
                                         break;
                case 3:KEY_OUT_3 = 1;
                                         KEY_OUT_4 = 0;
                                         break;
                default:break;
                       
        }
}


1.我想使用矩阵按键控制8位数码管,矩阵按键按一下就加一,一直到9为止。这个程序有什么问题吗(程序是根据书上的程序改了一下的,原来的程序是用单个数码管的,我改为使用8位数码管,多了一个138译码器)?运行的时候发现数码管没反应。
2.keybuf[keyout][0] == (keybuf[keyout][0] << 1) | KEY_IN_1;后面的| KEY_IN_1有什么作用?

IMG_20190420_202114.jpg (506.13 KB )

IMG_20190420_202114.jpg

361945cbb0b7d5b328.png (102.59 KB )

361945cbb0b7d5b328.png

使用特权

评论回复

相关帖子

沙发
快鲨1|  楼主 | 2019-4-22 07:30 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

45

帖子

0

粉丝