📄 led移位显示测试.c
字号:
#include <AT89X52.H>
#include <INTRINS.h>
unsigned char code Tab[]={0xff,0Xfd,0xff,0xfe,0xff,0xf7,0xff,0xfb,0xff,0xdf,0xff,0xef,0xff,0x7f,0xff,0xbf,
0Xfd,0xff,0xfe,0xff,0xf7,0xff,0xfb,0xff,0xdf,0xff,0xef,0xff,0x7f,0xff,0xbf,0xff};
unsigned char code codedisplay[]={0xDF,0xBF,0xDF,0xBF,0xDF,0xBF,0xDC,0x03,0x03,0xBF,0xDF,0xBF,0x88,0x01,0x97,0xFF,
0x97,0xBF,0x5F,0xBF,0xDC,0x03,0xDF,0xBF,0xDF,0xBF,0xDF,0xBF,0xD0,0x01,0xDF,0xFF,/*"桂",0*/
0xEF,0xDF,0xEF,0xDF,0xEF,0xDF,0xEF,0xDF,0x02,0x01,0xEF,0xDF,0xEF,0x9F,0xC7,0x8F,
0xCB,0x4F,0xAB,0x57,0xAE,0xD7,0x6D,0xD9,0xEB,0xDB,0xEF,0xDF,0xEF,0xDF,0xEF,0xDF,/*"林",1*/
0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,
0xDE,0xF7,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xFE,0xFD,0xFE,0xFD,0xFF,0x01,0xFF,0xFF,/*"电",2*/
0xFF,0xFF,0xC0,0x1F,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFE,0xFF,0xFE,0xFF,0xFE,0xFB,
0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFA,0xFF,0xFD,0xFF};/*"子",3*/
unsigned char display_buff[8];
unsigned char m,addr,dat=0;
#ifndef I2C_H
#define I2C_H
typedef unsigned char uchar; //重新定义数据类型
typedef unsigned int uint;
const uchar WR24C02 = 0xa0; //读写控制命令 //EEPROM地址+写命令
const uchar RD24C02 = 0xA1; //EEPROM地址+读命令
sbit I2C_SCL = P2^4; //I/O口定义
sbit I2C_SDA = P2^5;
bit ErrorBit; //用户变量声明 //读写错误标志 1错误 0 正确
uchar idata ErrorCode; //错误码
uchar da=0;
//************************函数声明***************************
void Start(void);
void Stop(void);
void Ack(void);
void NoAck(void);
void TestAck(void);
void Write_I2c(uchar date);
uchar Read_I2c(void);
void DelayMs(uchar time);
void Write_Date(uchar StartAddress,uchar *date,uchar bytes);
void Read_Date(uchar StartAddress,uchar *date,uchar bytes);
#endif
unsigned int result,count=0;
void Start(void)
{ I2C_SDA = 1; //起始条件的数据信号
_nop_();
I2C_SCL = 1; //起始条件时钟信号
_nop_(); //信号建立时间>4.7us
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 0; //起始信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0; //钳住I2C总线, 准备发送或者接受数据
_nop_();
_nop_();
}
void Stop(void)
{ I2C_SDA = 0; //结束条件的数据信号
_nop_();
I2C_SCL = 1; //结束条件的时钟信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 1; //结束信号
_nop_();
_nop_();
_nop_();
_nop_();
}
void Ack(void)
{ I2C_SDA = 0;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
I2C_SDA = 1;
}
void NoAck(void)
{ I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
void TestAck(void)
{ I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
ErrorBit = I2C_SDA;
I2C_SCL = 0;
_nop_();
_nop_();
}
void Write_I2c(uchar date)
{ uchar i;
for(i=0;i<8;i++)
{
I2C_SDA=date&0x80; //送数据到数据线上
date<<=1;
_nop_();
I2C_SCL=1; //置时钟信号为高电平,使数据有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL=0;
_nop_();
_nop_();
}
}
uchar Read_I2c(void)
{ uchar i;
uchar byte = 0;
for(i = 0; i < 8; i++)
{ I2C_SCL = 0; //置时钟为低电平,准备接受数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 1; //置时钟为高电平,使数据线数据有效
_nop_();
_nop_();
byte <<= 1;
byte |= I2C_SDA;
_nop_();
_nop_();
I2C_SCL = 0;
}
return(byte);
}
void DelayMs(uchar time)
{ uchar i;
do
{ for(i=0; i<125 ; i++); //*延时 8us x 125 = 1ms
}
while (time--);
}
void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
{ uchar i = 0;
Start();
Write_I2c(WR24C02);
TestAck();
Write_I2c(StartAddress);
TestAck();
for(i = 0;i < bytes; i++)
{
Write_I2c(*date);
TestAck();
date++;
}
Stop();
DelayMs(20);
}
void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
{ uchar i;
Start();
Write_I2c(WR24C02);
TestAck();
Write_I2c(StartAddress);
TestAck();
Start();
Write_I2c(RD24C02);
TestAck();
for (i = 0; i<bytes; i++)
{
*date= Read_I2c();
Ack();
date++;
}
NoAck();
Stop();
}
void delay(void)
{ unsigned char i,j;
for(i=0;i<15;i++){ for(j=0;j<50;j++) ; }
}
void main(void)
{ SCON=0; P1=0; SP=0x70;
// dat=&display_buff;
//for(addr=0;addr<113;addr++)
// { Write_Date(addr,codedisplay+dat,1);dat++; }
Write_Date(0+16,codedisplay,16);Write_Date(16+16,codedisplay+16,16);Write_Date(32+16,codedisplay+32,16);Write_Date(48+16,codedisplay+48,16);
Write_Date(64+16,codedisplay+64,16);Write_Date(80+16,codedisplay+80,16);Write_Date(96+16,codedisplay+96,16);Write_Date(112+16,codedisplay+112,16);
while(1)
{
for(m=0;m<16;m++)
{ Read_Date(2*m+16,display_buff,1);Read_Date(2*m+1+16,display_buff+1,1);Read_Date(32+2*m+16,display_buff+2,1);Read_Date(32+2*m+1+16,display_buff+3,1);
Read_Date(64+2*m+16,display_buff+4,1);Read_Date(64+2*m+1+16,display_buff+5,1);Read_Date(96+2*m+16,display_buff+6,1);Read_Date(16+96+2*m+1,display_buff+7,1);
SBUF=display_buff[0]; while(!TI) ; TI=0;
SBUF=display_buff[1]; while(!TI) ; TI=0;
SBUF=display_buff[2]; while(!TI) ; TI=0;
SBUF=display_buff[3]; while(!TI) ; TI=0;
SBUF=display_buff[4]; while(!TI) ; TI=0;
SBUF=display_buff[5]; while(!TI) ; TI=0;
SBUF=display_buff[6]; while(!TI) ; TI=0;
SBUF=display_buff[7]; while(!TI) ; TI=0;
SBUF=Tab[2*m]; while(!TI) ; TI=0;
SBUF=Tab[2*m+1];while(!TI) ; TI=0;
P3_4=0;P3_4=1; P3_4=0;
//delay();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -