找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1920|回复: 4
收起左侧

萌新求助:如何将单片机P1分拆表示?

[复制链接]
ID:420008 发表于 2019-1-7 08:59 | 显示全部楼层 |阅读模式
2黑币
#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,十位正常。
求大佬们帮帮忙解答一下

最佳答案

查看完整内容

由于你把P1.7用作位选,P1.0~1.6作段选,送段码时操作P1必须保持P1.7状态不变。给你改成0~99秒计数示例程序。 #include #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, ...
回复

使用道具 举报

ID:213173 发表于 2019-1-7 08:59 | 显示全部楼层
由于你把P1.7用作位选,P1.0~1.6作段选,送段码时操作P1必须保持P1.7状态不变。给你改成0~99秒计数示例程序。
无标题.jpg

#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;//动态扫描数码管显示
        }
}

回复

使用道具 举报

ID:276663 发表于 2019-1-7 12:35 | 显示全部楼层
在switch语句前加一个P1 = 0X00;
回复

使用道具 举报

ID:420008 发表于 2019-1-7 16:51 | 显示全部楼层
IdeaMing 发表于 2019-1-7 12:35
在switch语句前加一个P1 = 0X00;

感谢大佬,已经搞明白了
回复

使用道具 举报

ID:420008 发表于 2019-1-7 16:52 | 显示全部楼层
wulin 发表于 2019-1-7 14:42
由于你把P1.7用作位选,P1.0~1.6作段选,送段码时操作P1必须保持P1.7状态不变。给你改成0~99秒计数示例程序 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表