打印

关于AT89C51的中断实现4*4键盘输入显示的问题,大神们进来看看呀(~ ̄▽ ̄)~

[复制链接]
1433|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaola_robert|  楼主 | 2016-10-3 13:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道为什么,中断函数跳不进去,不能赋值0XF0。
已经弄了一天了,濒临崩溃,大神快来看看
#include<reg51.h>

sbit stl0=P2^0;
sbit stl1=P2^1;
sbit stl2=P2^2;
sbit enabled=P2^3;    //控制锁存器管脚

unsigned char code DIG_CODE[17]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//0-F共阳极方式

unsigned char keystate=0;
unsigned char fix=0;


void configuration();
void delay1ms();


void main()
{   
        configuration();
        stl0=0;           //选中第一个数码管
        stl1=0;
        stl2=0;
        while(1)
        {
                if(fix==1)
                {
               
                        enabled=1;               //锁存器解锁
                        P0=DIG_CODE[keystate];
                        enabled=0;               //锁存器加锁
                        fix=0;
                }
        }
}
               

void checkout()
{
        char a=0;
        P1=0X0f;
//        TR0=0;
        ET0=0;
        if(P1!=0X0f)
        {
                delay1ms();
//                P1=0X0f;
                if(P1!=0x0f)
                {
                        fix=1;
                        switch(P1)
                        {
                                case (0x0e):        keystate=0;  break;
                                case (0x0d):    keystate=1;  break;
                                case (0x0b):        keystate=2;  break;
                                case (0x07):        keystate=3;  break;
                                default:        break;
                        }
                        P1=0xf0;
                        delay1ms();
                        switch(P1)
                        {
                                case (0xe0):        keystate+=0;  break;
                                case (0xd0):    keystate+=4;  break;
                                case (0xb0):        keystate+=8;  break;
                                case (0x70):        keystate+=12;  break;
                                default:                break;
                        }
                        ET0=1;
                        while(P1==0xf0&&a<=100)
                        {       
                                a++;
                                delay1ms();
                        }
                        a=0;                       
                }
        }
//        ET0=1;
//        TH0=0XFC;
//        TL0=0X18;
//        TR0=1;
}       


void configuration()             //初始化函数
{
        TMOD=0X02;//选择为定时器0模式,工作方式2

        TH0=0X9C;        //计时100us
        TL0=0X9C;       
//        TMOD=0x01;          //定时1ms,使用方式1,这个是我自己写的
//        TH0=0XFC;
//        TL0=0X18;       
        ET0=1;
        EA=1;
        TR0=1;

}

void set0() interrupt 1         //中断函数
{
        checkout();
       
}

void delay1ms()  //延时1ms
{
        unsigned char a1,b1;
         for(a1=50;a1>=0;a1--)
           for(b1=10;b1>=0;b1--);
}

相关帖子

沙发
xyz549040622| | 2016-10-3 21:46 | 只看该作者
中断中居然有延时,把延时去掉,中断只扫描按键状态,并送出按键值就好了。你需要换个好点的教程看

使用特权

评论回复
板凳
一事无成就是我| | 2016-10-5 19:30 | 只看该作者
没有看到开中中断,自己检查一下,一般中断程序要尽量得短,熟悉有限状态机可以用有限状态机+滴答定时轮询

使用特权

评论回复
地板
ningling_21| | 2016-10-8 10:44 | 只看该作者
进中断关中断,出中断不是每次都打开

使用特权

评论回复
5
icecut| | 2016-10-9 09:42 | 只看该作者
先搜个别人能用的程序,然后再改扫描键盘....一般都能搜到好例程

使用特权

评论回复
6
dirtwillfly| | 2016-10-12 21:51 | 只看该作者

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝