📄 bothside.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
//#define WDI P3_4
uint AT24c64_address ; //A2,A1,A0,接GND。EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
#define delayNOP(); _nop_();_nop_();_nop_();_nop_();
#define NUM 10
uchar idata sendbuf[NUM];
uchar idata receivebuf[NUM];
bit bdata SystemError;
sbit SDA=P3^5;
sbit SCL=P3^4;
/*************************************************************************************/
#define row 49 //有多少行
#define list 6 //一行有多少个像素;
#define wbyte list/2 //两个像素合成了一个字节
#define jiepai 17 //一个花样循环有多少个节拍
#define list1 66
#define list2 78
#define list3 66
/*************************************************************************************/
#define h_l 1 //1是高电平有效,0是低电平有效
#define tset 1 //数码管RGB排列情况
//0是RGB RGB RGB
//1是RGBx RGBx RGBx
//2是xRGB xRGB xRGB
uint ts;
uint dpara;
//#define dpara 207/8;
#define KEY P1
uchar code color_data[8]={0,4,2,1,6,5,3,7};//黑,红,绿,蓝,黄,紫,白//阳码
uchar code color_data01[7]={4,2,1,6,5,3,7};
//uchar code dat[8]={0,4,2,1,6,5,3,7};//黑,红,绿,蓝,黄,紫,白//阳码
//uchar code color_data[8]={7,3,5,6,1,2,4,0};//黑,红,绿,蓝,黄,紫,白//阴码
/*定义颜色控制端口*/
sbit DQ_595=P1^3;/*蓝线 HS74HC595的数据输入*/
sbit CLK_595=P1^2;/*绿线 HS74HC595的时钟*/
sbit STB_595=P1^1;/*红线 HS74HC595的数据锁存*/
sbit EN_595=P1^0;/*黄线 HS74HC595的数据使能*/
/*定义同步协议*/
sbit WT0=P2^0;
sbit WT1=P2^1;
sbit WT2=P2^2;
sbit WT3=P2^3;
uchar data dat[8];
void iic_start();//启动IIC总线
void iic_stop();//停止IIC总线
void slave_ACK();//从机发送应答
void slave_NOACK(void);//从机发送非应答
void check_ACK(void);//主机应答位检查
void IICSendByte(uchar ch);//发送1BYTE
uchar IICReciveByte(void);//接收1BYTE
void AT24c64_write_byte(uint address,uchar dat);// 24c64存储1BYTE
uchar AT24c64_read_byte(uint address);//读指定的地址的1BYTE数据
void AT24c64_read_bytes(uint address,uchar *pdat,uchar length);//读指定地址后的连续的数据
void AT24c64_write_bytes(uint address,uchar *pdat,uchar length);//写一页数据到24c64中
delay_tt_ms(uchar tt);//延时TTMS
///////////////////////////////
void iic_start(void)//启动IIC总线
{
EA=0;
SDA=1;
SCL=1;
delayNOP();//延时5us
SDA=0;
delayNOP();
SCL=0;
}
/////////////////////////////////
void iic_stop(void)//停止IIC总线
{
SDA=0;
SCL=1;
delayNOP();
SDA=1;
delayNOP();
SCL=0;
}
////////////////////////////////
void slave_ACK(void)//从机发送应答
{
SDA=0;
SCL=1;
delayNOP();
SCL=0;
SDA=1;
}
/////////////////////////////////
void slave_NOACK(void)//从机发送非应答
{
SDA=1;
SCL=1;
delayNOP();
SDA=0;
SCL=0;
}
/////////////////////////////////
void check_ACK(void)//主机应答位检查
{
SDA=1;
SCL=1;
F0=0;//非应答标志F0
if(SDA==1)
F0=1;//表明非应答
SCL=0;
}
//////////////////////////////////
void IICSendByte(uchar ch)//发送1BYTE
{
uchar idata n=8;//1字节共8位
while(n--)
{
if((ch&0x80)==0x80)//发送高位
{
SDA=1;//传输1
SCL=1;
delayNOP();
SCL=0;
}
else
{
SDA=0;//传输0
SCL=1;
delayNOP();
SCL=0;
}
ch<<=1;//数据左移
}
}
//////////////////////////////////
uchar IICReceiveByte(void)//接收1BYTE
{
uchar idata n=8;
uchar tdata;
while(n--)
{
SDA=1;
SCL=1;
tdata<<=1;//左移一位
if(SDA==1)
tdata=tdata|0x01;//收到1,数据最后一位为1
else
tdata=tdata&0xfe;
SCL=0;
}
return(tdata);
}
////////////////////////////////////
void AT24c64_write_byte(uint address,uchar dat)// 24c64存储1BYTE
{
uchar value;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();//检测应答
if(F0==1)
{
SystemError=1;
return;
}
value=address/0x100;//发送AT24C64内存地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address%0x100;//发送AT24C64内存地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=dat;
IICSendByte(value);//发送数据
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
iic_stop();
}
///////////////////////////////////
uchar AT24c64_read_byte(uint address)//读指定的地址的1BYTE数据
{
uchar value;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();
value=address/0x100;//发送地址高字节
IICSendByte(value);
check_ACK();
value=address%0x100;//发送地址低字节
IICSendByte(value);
check_ACK();
iic_stop();
iic_start();
value=AT24c64_address|0x01; //发送器件地址
IICSendByte(value);
check_ACK();
value=IICReceiveByte();
slave_NOACK(); //主不应答信号;主机发送非应答,迫使数据传输结束
iic_stop();
return(value);
}
//////////////////////////////////
void AT24c64_write_bytes(uint address,uchar *pdat,uchar length)//写一页数据到24c64中
{
uchar value,i;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address/0x100;//发送地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address%0x100;//发送地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
for(i=0;i<length;i++ )
{
value=*pdat;
IICSendByte(value);//发送数据
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
pdat++;
}
iic_stop();
}
//////////////////////////////////////
void AT24c64_read_bytes(uint address,uchar *pdat,uchar length)//读指定地址后的连续的数据
{
uchar value,i;
iic_start();
value=AT24c64_address&0xfe; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address/0x100;//发送AT24C64内存地址高字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
value=address%0x100;//发送AT24C64内存地址低字节
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
iic_stop();
iic_start();
value=AT24c64_address|0x01; //发送器件地址
IICSendByte(value);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
i=length-1;
while(i--)
{
*pdat=IICReceiveByte();
slave_ACK();//主应答信号
pdat++;
}
*pdat=IICReceiveByte();
slave_NOACK();//主不应答信号
iic_stop();
}
//////////////////////////////////
delay_tt_ms(uchar tt)//延时TTMS
{
uchar i;
while(tt--)
for(i=0;i<125;i++);
}
//调速度函数oid ts_key(void)
//调速度函数
void ts_key(void)
{
ts=KEY&0xF0;//保留高4位,去掉低4位
ts=ts>>4;
if (ts==0||ts==15){ts=1;}
}
/*********************延时函数*************
函数原型:void dely(ulint timepara);
功 能:延时等待,参数timepara为延时时间*/
void delay(ulint timepara)
{ulint mpara;
mpara=0;
do
{
mpara=mpara+1;
}
while (mpara!=timepara);
}
/*********************延时函数*************
函数原型:void dely(ulint timepara);
功 能:延时等待,参数timepara为延时时间*/
void delays(ulint timepara)
{ulint i;
for(i=0;i<timepara;i++)
{
ts_key();
delay(dpara*ts);//12M ---207---0.010S=10ms
}
}
/*********************595数据锁存函数*************
函数原型:void stb_data_595(void);
功 能:595数据锁存*/
void stb_data_595(void)
{
STB_595=0;
STB_595=1;
delay(5);
STB_595=0;
}
/*void xieyi(void)
{
/*****分**********
while(WT0);
WT1=0;*/
/********主************
WT0=0;
while(WT1);
}
void xieyi_start(void)
{
WT1=1;
WT0=1;
}
/*********************向由低位到高位595发送一个像素的数据函数*************
函数原型:send_byte_lsbtomsb(uint8 bt);
功 能:向595发送一个像素,参数bt为要发送的数据*/
void send_3bit_lsbtomsb( uchar bt1)
{
uint i;
//SBUF=bt1;
//if(!h_l)bt1=7-bt1;
//EN_595=1;
// xieyi();
if(tset==1)
{
CLK_595 = 0;
DQ_595 =0;
CLK_595 = 1;
}
for(i=0;i<3;i++)
{
CLK_595 = 0;//将时钟线置低
DQ_595 =(bt1 & 0x01)?1:0;//判断当前位为1还是为0;当为1时将数据线置高;当为0时将数据线置低;
CLK_595 = 1;//将时钟线置高
bt1>>=1;//将当前数据右移一位,准备与0x01进行比较
}
if(tset==2)
{
CLK_595 = 0;
DQ_595 =0;
CLK_595 = 1;
}
//EN_595=0;
//xieyi_start();
}
/*********************向595发送N个某像素的函数*************
函数原型:void send_n_byte(n,bt);
功 能:向595发送n个bt字节*/
void send_n_3bit(register uint k,uchar bt1)
{ while(k!=0)
{send_3bit_lsbtomsb(bt1);
k--;
}
}
/************************************************************************/
void low_to_hightbit(uchar num)
{
uchar cor_data;
cor_data=(num&0x0f);
send_n_3bit(1,cor_data);
cor_data=num&0xf0;
cor_data=cor_data>>4;
send_n_3bit(1,cor_data);
}
void hight_to_lowbit(uchar num)
{
uchar cor_data;
cor_data=num&0xf0;
cor_data=cor_data>>4;
send_n_3bit(1,cor_data);
cor_data=num&0x0f;
send_n_3bit(1,cor_data);
}
/************Z型用字模软件取出的字或图片的颜色及发数据处理函数*************
功 能:(s型水平安装,左上角进数据)
****************************************************************************/
void words_z_h_dynamic_left_bottom(void)
{
ulint i,j,kt, addr,add=0x00; ////add 为花样数据的首地址
//stop:
for(i=0;i<1000000000;i++)
{ // addr=m+row*i*wbyte;
for(j=0;j<row;j++)
{
addr=add+ i*(wbyte*row) + j*wbyte; //定点采集数据。wbyte*row 为一屏的字节数
if(addr>=0x0fff0) //24c512总大小为0x0ffff,
{ goto pt;}
AT24c64_read_bytes(addr,dat,wbyte); //读取一行的字节数
if(dat[0]==0x0ff) // 若碰到填充数0xff则返回,此条件判断仅用于对16进制。
{goto pt;}
for(kt=0;kt<wbyte;kt++) //先高半字节,后发低半字节,连续发一行。
{ hight_to_lowbit(dat[kt]);}
}
stb_data_595();
//dpara=207/2;
//delays(10);
}
pt:
delay(1);
}
//////////////////////////////////
void main()
{
uchar *p;
//WT1=1;
//WT0=1;
EN_595=0;
//xieyi();
start:
AT24c64_address =0xa0;
words_z_h_dynamic_left_bottom();
AT24c64_address =0xa2;
words_z_h_dynamic_left_bottom();
AT24c64_address =0xa4;
words_z_h_dynamic_left_bottom();
AT24c64_address =0xa6;
words_z_h_dynamic_left_bottom();
goto start;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -