WUWEWU 发表于 2010-11-12 19:37:48

有谁用12864 PCF8591 51单片机做过示波器

//如题,我找了个现成的程序,但KEIL编译通不过,那位大侠能帮忙看下?程序如下:


#include "reg52.h"
#include "intrins.h"

#define pcf8591_write 0x90//pcf8591在IIC中的地址
#define pcf8591_read0x91
#define delaynop()_nop_();_nop_();_nop_();_nop_();

#define lcd_on      63
#define lcd_off   62
#define page       184
#define x_position64
unsigned char receive;
sbit SDA=P1^1;
sbit SCL=P1^0;
sbit d_i=P2^4;
sbit r_w=P2^5;
sbit e=P2^6;
sbit cs1=P2^1;
sbit cs2=P2^2;
sbit rst=P2^3;

void delay(unsigned char times)
{
unsigned i=920;
while(times--)while(i--);
}

void checkack(void)//查检对方应答
{SDA=1;SCL=1;delaynop();SCL=0;}//if(SDA==1); F0=1; }

void i2cstart() //开始IIC
{SDA=1;SCL=1;delaynop();   SDA=0;delaynop();   SCL=0;}

void i2c_w_byte(unsigned char com)//写一个字节
{
unsigned char n=8;
while(n--)
{
   if((com&0x80)==0x80)SDA=1;else SDA=0;
   SCL=1;
   delaynop();
   SCL=0;
   com<<=1;
}
    checkack();
}

unsigned char i2c_r_byte(void)//读一个字节
{
unsigned char n=8,read_data;
while(n--)
{
    SDA=1;
    SCL=1;
    delaynop();
    read_data<<=1;
    if(SDA)read_data|=0x01;
    SCL=0;
   }
   return read_data;
}   

void i2c_mack(void)//发送应答
{SDA=0;SCL=1;delaynop();SCL=0;}

void i2c_nack(void)//发送非应答
{SDA=1;SCL=1;delaynop();SCL=0;}

void i2c_stop(void)//停止IIC
{SDA=0; SCL=1;delaynop();SDA=1;delaynop();SCL=0;}

void check_busy(void)
{d_i=0; r_w=1;e=1;while(P0&0x80);e=0;}

void write( F0,unsigned char data_comm)//液晶屏写字节,F0=1为写数据,F0=0为写指令
{
d_i=F0;
r_w=0;
e=1;
P0=data_comm;
e=0;
check_busy();
}

unsigned char getpixel(void)//液晶屏读点
{
unsigned char valve;
d_i=1;
r_w=1;
e=1; P0=255; valve=P0;
e=0;
check_busy();
d_i=1;
e=1;
valve=P0;
e=0;
check_busy();
return valve;
}

void putpixel(unsigned char x,y)//液晶屏写点
{
unsigned char valve;
if(x<64) {cs1=1;cs2=0;} else {cs1=0;cs2=1;x-=64;}
write(0,page+(y>>3));
write(0,x_position+x);
valve=getpixel();
valve|=(1<<(y%8));
write(0,x_position+x);
write(1,valve);
}

void init_lcd(void)
{
unsigned char i,j;
rst=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
rst=1;
cs1=1;
cs2=1;
write(0,lcd_on);
for(i=0;i<8;i++)
{
    write(0,page+i);
    write(0,x_position);
    for(j=0;j<64;j++)write(1,0);
}
}

void adcpcf8591()//AD采样及显示
{
unsigned char i,j,a1,a2,a3,d,f;
i2cstart();
i2c_w_byte(pcf8591_write);
i2c_w_byte(1);
i2cstart();
i2c_w_byte(pcf8591_read);
i2c_r_byte();
i2c_mack();
for(i=0;i<107;i++)
   {
       for(j=0;j<11;j++){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
();}//减慢
       d=i2c_r_byte();//采样
       i2c_mack();
       }
       d=i2c_r_byte();
i2c_nack();
i2c_stop();
f=0;
for(i=0;i<107;i++)//显示
    {
      a1=63-(d>>2);
      a2=63-(d>>2);
      if(a1>a2){a3=a2;a2=a1;a1=a3;}
      if(a1>30)f=1;//检测到信号f=1,下面就沿时
      for(j=a1;j<=a2;j++)putpixel(i,j);
    }
    if(f) delay(7);
}

void main(void)
{
TH0=0X93;
TL0=0X00;
   while(1)
   {
    init_lcd();//初始化及清屏
    adcpcf8591();
   }
}

WUWEWU 发表于 2010-11-12 21:47:03

搞定了

hyscwhhc 发表于 2011-9-7 10:23:17

楼主,是哪里出问题了?

pangjineng 发表于 2012-5-2 16:06:01

垃圾贴,搞定了,也不告诉怎么解决的。只知道求人不知道教人。

hamipeter 发表于 2012-5-2 23:09:32

楼上的图片,太!!!!!!!!!!!

ken2010aa 发表于 2012-5-17 13:48:23

楼主能说一下那里出问题了么谢谢

WUWEWU 发表于 2012-5-17 17:43:03

ken2010aa 发表于 2012-5-17 13:48 static/image/common/back.gif
楼主能说一下那里出问题了么谢谢

早忘了,都1年多没玩单片机了

331086846 发表于 2012-5-20 10:45:53

WUWEWU 发表于 2012-5-17 17:43 static/image/common/back.gif
早忘了,都1年多没玩单片机了

那当时的程序还在么?

WUWEWU 发表于 2012-5-20 14:19:07

331086846 发表于 2012-5-20 10:45 static/image/common/back.gif
那当时的程序还在么?

就是上面的了,后来也没改,没什么功能,就是采集 显示,不好用的 别指望太高

bbssilverkey 发表于 2013-3-4 10:15:46

这个芯片是8位的,你想要什么结果?
页: [1]
查看完整版本: 有谁用12864 PCF8591 51单片机做过示波器