renwocai 发表于 2012-10-14 23:50:08

已解决,不是程序的问题,是仿真的问题。一个按键控制...

本帖最后由 renwocai 于 2012-10-15 13:57 编辑

我的控制目的很简单,就是8位共阳数码管动态扫描,按键每按一次数码管最后两位显示加一,前面6位固定显示为0.
我的思想是,数码管和按键都放在定时器中断里面,按键用状态机做。我本来是想把这个做好后把按键和数码管扫描都放在主程序中的,但通过定时器设定标志位决定什么时候运行。用软件仿真的时候可以看到按键控制的变量的确是按一次加一的,但用PROTEUS仿真确看不到这个效果。
现将程序贴出来,工程和仿真打包上传。#include <reg51.h>
#define uchar unsigned char
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar shu=85;
sbit kb=P3^4;



void sumaguan()
{
        static uchar i=0;
        i++;
        P0=0XFF;
        P2=1<<(i-1);
        if(i<7)
                P0=0XC0;
        else if(i==7)
                P0=tab;
        else if(i==8)
                {
                        P0=tab;
                        i=0;
                }
}
void anjianchuli()
{
        static uchar zhuangtai=0;
        switch(zhuangtai)
                {
                        case 0:
                                {
                                        if(kb==0)
                                                zhuangtai++;
                                };break;
                        case 1:
                                {
                                        if(kb==0)
                                                zhuangtai++;
                                        else
                                                zhuangtai--;

                                };break;
                        case 2:
                                {
                                        if(kb==0)
                                                {
                                                        zhuangtai++;
                                                        shu++;
                                                        if(shu==100)
                                                                shu=0;
                                                }
                                };break;
                        case 3:
                                {
                                        if(kb==1)
                                                zhuangtai=0;
                                };break;
                }
        }



main()
{
        TMOD = 0x01;
    TH0 = 0x0E8;
    TL0 = 0x90;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
        while(1);
       
}
void timer0() interrupt 1
{
    TH0 = 0x0E8;
    TL0 = 0x90;
        sumaguan();       
        anjianchuli();
}


renwocai 发表于 2012-10-15 11:38:06

思想很简单,就是数码管和按键的处理都放到中断里面去完成,我想先测试完这个再把这两个函数都放到主程序中去。但现在第一步就不能成功

xiaoyigechaos 发表于 2012-10-15 12:56:37

感觉 似乎每次计时到时见之后 数码管重新扫描如果数码管刚才没显示完那剩下的不显示了程序没看感觉你的思路需要考虑这个问题

renwocai 发表于 2012-10-15 13:56:35

谢谢。已经搞定。在硬件上没有问题的,再次见到PROTEUS的BUG
页: [1]
查看完整版本: 已解决,不是程序的问题,是仿真的问题。一个按键控制...