一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 1360|回复: 2

紧急求救上位机高手!

[复制链接]
发表于 2013-5-10 19:16 | 显示全部楼层 |阅读模式
做了个32x64单色点阵屏的上位机软件,这是网友写的程序,看不懂!!那位做点阵屏的高手能够指点指点啊
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint   unsigned int
#define SPEED 3 //

sbit A=P1^0;
sbit BB=P1^1;
sbit C=P1^2;
sbit D=P1^3;
                                                          
sbit R1=P3^0;
//bit R2=P1^5;
sbit STB=P1^5;
sbit CLK=P3^1;
sbit OE=P1^4;

sbit SDA=P2^0;
sbit SCL=P2^1;

//sbit WP=P2^7;  //测试数据是否到达下位机
sbit  led=P1^7; //指示灯判断是否数据传送过
uchar disrow,col;
uint word;
uchar BUFF[32]; //存储的数据
void loadoneline(void); // 装载一线数据
void sendoneline(void);
uchar two_onebyte(uchar h1,uchar h2);
void delayms();
void delay();
void  serial_init(void);
void  serial_int(void);
void  write();

void delayms(unsigned char z)
{
  uchar i,j;
  for(i=z;i>0;i--)
       
          for(j=110;j>1;j--);
       

}
void delay()  //延时1秒
{
_nop_();
_nop_();
_nop_();
_nop_();

}

void start()  // 开始信号          //EEPOROW 读写部分
{
   SDA=1;
   delay();
   SCL=1;
   delay();
   SDA=0;
   delay();
}       
void stop()        // 停止信号
{
  SDA=0;
  delay();
  SCL=1;
  delay();
  SDA=1;
  delay();
}
void respons() //应答信号
{
   uchar i;
   SCL=1;
   delay();
   while((SDA==1)&&(i<50))
   i++;
    SCL=0;
        delay();
}
void  write(uchar slave_write_address,uchar byte_high_address,uchar byte_low_address, uchar data_data)
{
   uchar temp,temp1,i,ii;
    start();
        for(ii=0;ii<4;ii++)
        {
        if(ii==0)
     {
           temp1=slave_write_address;
         }
         else if(ii==1)
         {
                 temp1=byte_high_address;
         }
         else if(ii==2)
         {
             temp1=byte_low_address;
         }
         else if(ii==3)
         {
            temp1=data_data;
         }
         for(i=0;i<8;i++)
         {
           SCL=0; //时钟线拉低
           delay();
           temp=temp1;        //两个合为一个
           temp=temp&0x80; //取出高位
           if(temp==0x80)
           SDA=1;//数据线拉高准备传数据

           else
           SDA=0;

           delay();
           SCL=1;
           delay();
           SCL=0;
           delay();
           temp1=temp1<<1;
         }
         SDA=1;
         delay();
         SCL=1;
         delay();
         respons(); //应答信号

        }
        stop();
}
/*********************************************
读出地址的高位数据
************************************************/
uchar read(uchar slave_write_address, uchar byte_high_address, uchar byte_low_address,uchar slave_read_address)
{
      uchar temp, temp1,i,ii,x,data_data;
          start();
          for(ii=0;ii<4;ii++)
           {
          
              if(ii==0)
                  {
                          temp1=slave_write_address;
                  }
                     else if(ii==1)
                  {
                   temp1=byte_high_address;
                  }
                  else if(ii==2)
                  {
                    temp1=byte_low_address;
                  }
                  else if(ii==3)
                  {
                    start();
                        temp1=slave_read_address;
                  }
                  for(i=0;i<8;i++)
                  {
                    SCL=0;
                        delay();
                        temp=temp1;
                        temp=temp1&0x80;         //选出最高位  0000 1111
                        if(temp==0x80)
                         SDA=1;
                         else
                         SDA=0;
                         delay();

                         SCL=1;
                         delay();
                         SCL=0;
                         delay();
                         temp1=temp1<<1; //做一位后取出下一位

                  }
                  SDA=1;
                  delay();
                  SCL=1;
                  delay();
                  respons(); //应答信号

           }
           for(x=0;x<8;x++)
           {
             data_data=data_data<<1;
                 SDA=1;
                 delay();
                 SCL=0;
                 delay();
                 SCL=1;
                 delay();
                 if(SDA==1)
                 data_data|=0x01;//取出存储器中编码的第一位
                  else
                  data_data|=0x00;
           }
           respons();
           stop();
           return data_data;
}
void serial_init(void) //串口初始化函数
{
  EA=1;
  TMOD=0x20;//设置定时器1 工作方式2
  TH1=0XFD;
  TL1=0XFD;
  TR1=1; //起点定时器
  PCON=0x80;//设置波特率方式
  SCON=0x50;
  ES=1;
  PS=1;

}
void main()
{
  uchar i;
  col=0; word=0;
   serial_init();
  while(1)
  {
     while(col<16)
         {
           for(i=0;i<SPEED;i++)
           {
             for(disrow=0;disrow<16;disrow++) //16行扫描
                 {
                        OE=0; //低电平有效
                   loadoneline();
                   sendoneline();//发送一线数据
           //P1=0x01+disrow;
                   //P1=0x02+disrow;
                        A=disrow&0x01;
                        BB=disrow&0x02;
                        C=disrow&0x04;
                        D=disrow&0x08;
                    STB=0;
                    STB=1;
                        CLK=0;
               
                 }
           }
          col++;
         }
         col=0;word=word+32;
         if(word>=1280)word=0;//如果输入的字大于1280
  }
}
uchar two_onbyte(uchar h1, uchar h2        )         //这个主意是把两个字节合成一个字节
{
   uchar temp,tempcol;
   if(col<8)tempcol=col;
   else tempcol=col-8;
   temp=(h1<<tempcol)|(h2>>(8-tempcol));
   temp=~temp;
   return temp;
}
void loadoneline(void)
{
   uchar s,r_high,r_low;
   uint temp;
   for(s=0;s<8;s++)
   {
     CLK=0;
     temp=32*s+2*disrow;  //扫描16X16
         r_low=(uchar)temp;
         r_high=(uchar)(temp>>8);
         BUFF[2*s]=read(0xa0,r_high,r_low,0xa1);//读的是存储器中存入的地址
         temp=32*s+2*disrow+1; // 扫描下一行的信息
         r_low=(uchar)temp;
         r_high=(uchar)(temp>>8);
         BUFF[2*s+1]=read(0xa0,r_high,r_low,0xa1);//读的是存储器中存入的地址
         // temp=32*s+2*disrow+1; // 扫描下一行的信息
   }
}
void sendoneline(void)          //发送一线数据
{
  char s;uchar inc;
  if(col<8)inc=0;
  else inc=1;
  for(s=10+inc;s>=0+inc;s--)

  {
     SBUF=two_onebyte(BUFF,BUFF[s+1]);
         while(!TI);
         TI=0; //中断接收为0,或者不接受
  }
}
void serial_int(void) interrupt 4 //中断传送数据
{
  uchar temp,w_high,w_low;
  uint cnt=0;
  ES=0; //关总中断
  while(1)
  {
   led=0;
        delayms(50); //5ns
        led=1;
        delayms(50);
        while(!RI);
        temp=SBUF;
        RI=0;
        //WP=0;
        w_low=(uchar)cnt;
        w_high=(uchar)(cnt>>8);
        write(0xa0,w_high,w_low,temp);
        delayms(10);
        //WP=1;
        cnt++;
        led=0;
        delayms(150);
        if(cnt==320)
        {
          ES=1;break;//关闭串行口中断
        }
  }
}

IMG_20130510_091933.jpg

我的屏是32X64的单色屏有2个245+2个138+16个595 组成
屏的接口如下

R2     GND
A      GND
B
C
D      GND
OE
R1
STB     GND
CLK     GND  这边都接地

上位机是我写的搞了好久才出个雏形,不过可以发送数据,就是下位机单片机写的不对,下位机用的STC89C58的芯片 外部用存储器芯片AT24C64 ,准备上位机发来把数据存到存储器里,然后用中断去读取24C64中的数据,不知道这样思路对不对,哪位大哥能帮下个下位机参考吗,谢啦/
看看这个上位机能用吗,只搞了XEX格式,本来打包的但有11M传出不进去
看看哪位大哥能搞个下位机吗/

上位机.rar

9.83 KB, 下载次数: 105, 下载积分: 一乐金币 -1

发表于 2013-5-10 20:34 | 显示全部楼层
看得我是头晕眼花加腿抽筋!建议楼主这些还是自己来的好!
回复

使用道具 举报

 楼主| 发表于 2013-5-11 09:36 | 显示全部楼层
我是自己来过哦,没搞出来
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-1-12 13:58 , Processed in 0.040738 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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