标题: 萌新求助:如何将单片机P1分拆表示? [打印本页]

作者: alex-yang    时间: 2019-1-7 08:59
标题: 萌新求助:如何将单片机P1分拆表示?
#define uchar unsigned char


sbit SEDB = p1^0;
sbit SEDA = p1^1;
sbit SEDF = p1^2;
sbit SEDG = p1^3;
sbit SEDD = p1^4;
sbit SEDE = p1^5;
sbit SEDC = p1^6;//控制数码管显示数字

sbit COM0 = p1^7;
sbit COM1 = p2^4;//控制数码管位

uchar LEDCode[]={
        0x77,                // 0
        0x41,                // 1
        0x3b,                // 2
        0x5b,                // 3
        0x4d,                // 4
        0x5e,                // 5
        0x7e,                // 6
        0x43,                // 7
        0x7f,                        // 8
        0x5f,                        // 9
        0x6f,                        // A
        0x7c,                // B
        0x36,                // C
        0x79,                // D
        0x3e,                // E
        0x2e,                // F};//数码管真值表

}

void zhuangduan()interrupt 1//中断函数
{
        TH0  = 0xdc;
           TL0  = 0x00;//10ms
        
        i++;
        if(i>2) i=0;//看数码管个数决定i的值
        switch (i)
        {
                case 0: COM0=0;COM1=1;P1=LEDCode[0];break;//十位
                case 1: COM0=1;COM1=0;P1=LEDCode[1];break;//个位
                default:break;//动态扫描数码管显示
        }
}

现在个位不管怎么改数码管上都是8,十位正常。
求大佬们帮帮忙解答一下


作者: wulin    时间: 2019-1-7 08:59
由于你把P1.7用作位选,P1.0~1.6作段选,送段码时操作P1必须保持P1.7状态不变。给你改成0~99秒计数示例程序。


#include<reg51.h>
#define uchar unsigned char

sbit SEDB = P1^0;
sbit SEDA = P1^1;
sbit SEDF = P1^2;
sbit SEDG = P1^3;
sbit SEDD = P1^4;
sbit SEDE = P1^5;
sbit SEDC = P1^6;//控制数码管显示数字

sbit COM0 = P1^7;
sbit COM1 = P2^4;//控制数码管位

uchar LEDCode[]={
        0x77,                // 0
        0x41,                // 1
        0x3b,                // 2
        0x5b,                // 3
        0x4d,                // 4
        0x5e,                // 5
        0x7e,                // 6
        0x43,                // 7
        0x7f,                // 8
        0x5f,                // 9
        0x6f,                // A
        0x7c,                // B
        0x36,                // C
        0x79,                // D
        0x3e,                // E
        0x2e,                // F};//数码管真值表

};
/***********定时器初始化程序****************/
void Timer0Init(void)                //10毫秒@11.0592MHz
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xDC;                //设置定时初值
        TR0 = 1;                //定时器0开始计时
        EA=1;                                //开总中断
        ET0=1;                        //开定时器0中断
}

void main()
{
        Timer0Init();        //定时器初始化
        while(1);
}

void zhuangduan()interrupt 1//中断函数
{
        static uchar i,j,num;
        TL0 = 0x00;
        TH0 = 0xDC;                //10ms
        j++;
        if(j>=100)
        {
                j=0;
                num++;
                if(num>99)
                        num=0;
        }
        i++;
        if(i>=2) i=0;//看数码管个数决定i的值
        P1&=0x80;//消隐,保留P1.7状态不变
        switch (i)
        {
                case 0: COM0=0;COM1=1;P1|=LEDCode[num/10];break;//十位
                case 1: COM0=1;COM1=0;P1|=LEDCode[num%10];break;//个位
                default:break;//动态扫描数码管显示
        }
}


作者: IdeaMing    时间: 2019-1-7 12:35
在switch语句前加一个P1 = 0X00;
作者: alex-yang    时间: 2019-1-7 16:51
IdeaMing 发表于 2019-1-7 12:35
在switch语句前加一个P1 = 0X00;

感谢大佬,已经搞明白了
作者: alex-yang    时间: 2019-1-7 16:52
wulin 发表于 2019-1-7 14:42
由于你把P1.7用作位选,P1.0~1.6作段选,送段码时操作P1必须保持P1.7状态不变。给你改成0~99秒计数示例程序 ...

感谢大佬回答,已经搞明白了。给你一万个好评!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1