高级会员
主题
回帖0
积分264
阅读权限30
注册时间2012-11-7
最后登录1970-1-1
在线时间 小时
|
做了个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;//关闭串行口中断
}
}
}
我的屏是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
|