微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教按键的程序问题,望大神能解答啊!

请教按键的程序问题,望大神能解答啊!

时间:10-02 整理:3721RD 点击:
先贴上原理图:

其中JP4的8口接P2^8,7口接P2^7,以此类推。然后下面是程序:
#include<reg52.h>
unsigned char code Led_Display[]=
        {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char keysta[4][4]={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char keybackup[4][4] ={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelayLong);
void keyservice();
void keyscan();
void InterruptTime0();
sbit keyout1_dr = P2^7;
sbit keyout2_dr = P2^6;
sbit keyout3_dr = P2^5;
sbit keyout4_dr = P2^4;
sbit keyin1_sr = P2^3;
sbit keyin2_sr = P2^2;
sbit keyin3_sr = P2^1;
sbit keyin4_sr = P2^0;
void main()
{
        initial_myself();
        delay_long(100);
        initial_peripheral();
        while(1)
        {
                keyservice();
        }
}
void keyservice()
{       
        unsigned char i;
        unsigned char j;
        for(i=0;i<4;i++)
        {
                for(j=0;j<4;j++)
                {
                        if(keybackup[j]!=keysta[j])
                        {
                                if(keybackup[j]==0)
                                {
                                        P0 = Led_Display[i*4+j];
                                }
                                keybackup[j]=keysta[j];
                        }
                }
        }
}
void keyscan()
{       
        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}};
        keybuf[keyout][0] = (keybuf[keyout][0]<<1)| keyin1_sr;
        keybuf[keyout][1] = (keybuf[keyout][1]<<1)| keyin2_sr;
        keybuf[keyout][2] = (keybuf[keyout][2]<<1)| keyin3_sr;
        keybuf[keyout][3] = (keybuf[keyout][3]<<1)| keyin4_sr;
        for(i=0;i<4;i++)
        {
                if((keybuf[keyout]&0x0F)==0x00)
                {
                        keysta[keyout]=0;
                }
        else if((keybuf[keyout]&0x0F)==0x0F);
                {
                        keysta[keyout]=1;
                }
        }
        keyout++;
        keyout=keyout&0x03;
        switch(keyout)
        {
                case 0:P0=0x7F;break;
                case 1:P0=0xBF;break;
                case 2:P0=0xDF;break;
                case 3:P0=0xEF;break;
                default:break;
        }
}
       
void InterruptTime0() interrupt 1
{
        TF0 = 0;
        TR0 = 0;
        keyscan();
        TH0 = 0xF8;
        TL0 = 0x30;
        TR0 = 1;
}
void delay_long(unsigned int DelayLong)
{
        unsigned int i;
        unsigned int j;
        for(i=0;i<DelayLong;i++)
        {
                for(j=0;j<50;j++)
                {
                        ;
                }
        }
}
void initial_myself()
{
        TMOD = 0x01;
        TH0 = 0xF8;
        TL0 = 0x30;
        P0 = Led_Display[0];
}
void initial_peripheral()
{
        EA = 1;
        ET0 = 1;
        TR0 = 1;
}
        我编程的思路是这样的:每1ms 中断一次,扫描按键状态,按一下为0,然后把0输送给备份值,当检测到4次都为0,则判断为按下,然后执行按键服务函数。
我出现的问题是:无论怎么按,都没反应, 望大神告诉哪里出现问题啊!
file:///C:\Users\gy-lrd\AppData\Roaming\Tencent\Users\314094918\QQ\WinTemp\RichOle\RGAFQS1QK{FXY}{4LSO}4HX.png


补充内容 (2016-8-23 14:07):
程序复制上来  有些地方没复制上,二维数组中的都不见了!实际程序有的!
补充内容 (2016-8-23 14:07):
[ i ]

你这个是用protues仿真还是实际有板子?

宋老师的程序被你改成这样,也是醉了,先把人家原创的程序分析明白,再去修改

实际板子的

原创我是弄明白啦,然后我是加上鸿哥的  3区一线理念去修改的,只是让程序更可读性吧!

还是老老实实的把宋老师的东西弄明白吧,你这样搞,要走弯路。

实际板子的话, 那就说明板子没有问题; 问题会是出现在你的程序中; 建议你排查的时候, 分步去看看, 在执行到按键的时候, 是否相关的数值有给到keybuffer中;建议一步步的去看看。 如果都OK,建议先实现按键就执行按键服务函数,在来添加按键次数。

问题是啥。怎么没发现

初始化你自己,延时,初始化外设。,然后死循环按键服务再然后,一个嵌套循环,就完了?你键盘扫描怎么进去,我没看到啊?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top