标题: 新手求救,51单片机+08接口点阵屏显示不正常 [打印本页]

作者: inhq    时间: 2021-5-12 04:50
标题: 新手求救,51单片机+08接口点阵屏显示不正常

想用8个0x11点亮上半个屏幕(16行)每行应该是0001000100010001001....即3个灯灭1个灯亮重复16次
但实际却是1111111111111111111....整个屏幕都在发光

请大神看下代码,出出主意



#include<STC12C5A60S2.H>

#define  uchar         unsigned char  
#define  uint  unsigned int


sbit IA  =P2^0;
sbit IB  =P2^1;
sbit IC  =P2^2;
sbit ID  =P2^3;

#define  scan0    {IA=0;IB=0;IC=0;ID=0;}
#define  scan1    {IA=1;IB=0;IC=0;ID=0;}
#define  scan2    {IA=0;IB=1;IC=0;ID=0;}
#define  scan3    {IA=1;IB=1;IC=0;ID=0;}
#define  scan4    {IA=0;IB=0;IC=1;ID=0;}
#define  scan5    {IA=1;IB=0;IC=1;ID=0;}
#define  scan6    {IA=0;IB=1;IC=1;ID=0;}
#define  scan7    {IA=1;IB=1;IC=1;ID=0;}
#define  scan8    {IA=0;IB=0;IC=0;ID=1;}
#define  scan9    {IA=1;IB=0;IC=0;ID=1;}
#define scan10    {IA=0;IB=1;IC=0;ID=1;}
#define scan11    {IA=1;IB=1;IC=0;ID=1;}
#define scan12    {IA=0;IB=0;IC=1;ID=1;}
#define scan13    {IA=1;IB=0;IC=1;ID=1;}
#define scan14    {IA=0;IB=1;IC=1;ID=1;}
#define scan15    {IA=1;IB=1;IC=1;ID=1;}

sbit SH=P2^7;
sbit ST=P2^6;
sbit R1=P1^0;
sbit R2=P1^1;
sbit G1=P1^2;
sbit G2=P1^3;
sbit OE=P2^5;

void scan(unsigned char Value)  
{switch(Value)
        {case  0: scan0;break;
                  case  1: scan1;break;
                   case  2: scan2;break;
                    case  3: scan3;break;
             case  4: scan4;break;
                      case  5: scan5;break;
                       case  6: scan6;break;
                        case  7: scan7;break;
                 case  8: scan8;break;
                       case  9: scan9;break;
                      case 10:scan10;break;
                     case 11:scan11;break;
            case 12:scan12;break;
                  case 13:scan13;break;
                 case 14:scan14;break;
            case 15:scan15;break;
           default:break;
        }
}

void WriteR1(unsigned char byte)   
{
        unsigned int i;
        for(i=0;i<8;i++)
        {
                SH=1;
                R1=byte&(0x80>>i);
                SH=0;
        }
}
void WriteR2(unsigned char byte)
{
        unsigned int i;
        for(i=0;i<8;i++)
        {
                SH=1;
                R2=byte&(0x80>>i);
                SH=0;
        }
}
void WriteG1(unsigned char byte)
{
        unsigned int i;
        for(i=0;i<8;i++)
        {
                SH=0;
                G1=byte&(0x80>>i);
                SH=1;
        }
}

void WriteG2(unsigned char byte)
{
        unsigned int i;
        for(i=0;i<8;i++)
        {
                SH=0;
                G2=byte&(0x80>>i);
                SH=1;
        }
}



void main()
{

        while(1)
        {
        unsigned int i,j;
                        for(i=0;i<16;i++)  //16DDé¨Ãè
                {
                        OE=0;
                        for(j=0;j<8;j++){
                                WriteR1(0x11);
                                WriteR2(0x00);
                                WriteG1(0x00);
                                WriteG2(0x00);
                        }
                        ST=0;
                        scan(i);
                        ST=1;
                        OE=1;
                       
                }
        }
        }



作者: 人人学会单片机    时间: 2021-5-12 08:00

这种就是08接口的,ABCD控制0~16行。

作者: wpppmlah    时间: 2021-5-12 14:36
至少有电原理图啥的参考,才能明白你要干嘛,都是代码,难道你以为别人都 是神仙吗
作者: glinfei    时间: 2021-5-12 15:10
好几个函数中有类似: = byte&(0x80>>i); 的,建议 改为 =(byte<<i)&0x80;
作者: inhq    时间: 2021-5-12 16:27
glinfei 发表于 2021-5-12 15:10
好几个函数中有类似: = byte&(0x80>>i); 的,建议 改为 =(byte

多谢,今天回家试试
作者: inhq    时间: 2021-5-12 16:28
wpppmlah 发表于 2021-5-12 14:36
至少有电原理图啥的参考,才能明白你要干嘛,都是代码,难道你以为别人都 是神仙吗

回家画完Proteus上传




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