单片机 错位修正

今天我们来聊聊电路板上引脚错位应该怎么办,

我们不必更换板子,只要程序稍作改动即可。

好了,废话不多说,看题。

注意观察,AT89S51的引脚P24和P25换位置了,那正常显示0~9应该怎么办呢?

直接上代码讲解

最关键的一步P2怎么写

 P2=(((dsn[x])/64)*64)+(dsn[x])/32)%2)*16+((dsn[x])/16)%2)*32)+dsn[x]%16;
(dsn[x])/64)*64   /64是指要取最高位   *64是指最高位的位置不变
(dsn[x])/32)%2)*16    /32   取第六位   *16把它移到第五位     
(dsn[x])/16)%2)*32)   /16  取第五位   *16把它移到第六位     
dsn[x]%16  取低四位不变

因为这一题是五六两个换位置了,我们只要把它们错位一下就OK啦

那现在,我说P23和P24错位,你会怎么写?

(((dsn[x])/64)*64)+(dsn[x])/32)*32)+(dsn[x])/16)%2)*8+(dsn[x])/8)%2)*16) +dsn[x]%8

知道为什么吗?保持最高两位不变,低三位不变,P23和P24交换一下位置就好了嘛,言简意赅。

我们来看看有没有实现预期结果。

好了,我们已经实现了0~9的正序,没有受到引脚错位而影响。

代码给你

#include <reg52.h>
int i,cou;
int y;   
void display(unsigned int x);
void delay(unsigned int x);
unsigned char code dsn[]=
{
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void main(void)
{   
    
    while(1)                     
    {
        display(i);
        i=(i+1)%10;
        delay(50000);
    }
}
void display(unsigned int x)
{
        P2=(((dsn[x]/64)*64)+((dsn[x]/32)%2)*16+(((dsn[x]/16)%2)*32)+dsn[x]%16);
}
void delay(unsigned int x)
{
    while(x--);
}

可以自己试一试,错位就换位好了。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值