本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include <REG52.H>
//#include <STRING.H>
//#include <stdio.h>
//#include <stdlib.h>
#include <intrins.h> //_nop_();
//数据类型的定义
#define uchar unsigned char
#define uint unsigned int
#define BIT(x) (1 << (x))
//位变量操作宏定义
#define bit_set(a,b) a|=BIT(b) //置1
#define bit_clr(a,b) a&=~BIT(b) //置0
#define bit_inv(a,b) a^=BIT(b) //取反
#define bit_status(a,b) (a&BIT(b)) //位判断“真”“假”
//---------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
//***********5045**********************
#define WREN_INST 0x06 //写允许指令(WREN)
#define WRDI_INST 0x04 //写禁止指令(WRDI)
#define WRSR_INST 0x01 //写状态寄存器指令(WRSR)
#define RDSR_INST 0x05 //读状态寄存器指令(RDSR)
#define WRITE_INST 0x02 //写寄存器指令(WRITE)
#define READ_INST 0x03 //读寄存器指令(READ)
#define BYTE_ADDR 0x55 //字节工作模式的地址
#define BYTE_DATA 0x11 //字节写操作的数据
#define PAGE_ADDR 0x1F0 //页操作模式的存储器地址
#define PAGE_DATA1 0x22 //页写模式的第1个数据
#define PAGE_DATA2 0x33 //页写模式的第2个数据
#define PAGE_DATA3 0x44 //页写模式的第3个数据
#define STATUS_REG 0x00 //状态寄存器
#define MAX_POLL 0x99 //Maximum number of polls
#define INIT_STATE 0x09 //控制端口初始化(P1)
#define USER 0x30 //用户代码地址
sbit mark = P0^5;
sbit zero = P3^7;
sbit CS = P3^2;
sbit SI = P3^1;
sbit SCK = P3^0;
sbit SO = P3^3;
sbit L_SCK = P1^0;
sbit L_DT1 = P0^4;
sbit L_DT2 = P0^3;
sbit L_DT3 = P0^2;
sbit L_DT4 = P0^1;
sbit L_DT5 = P0^0;
uchar XHBZ; //==0,无信号,无输出/==1,有信号,有输出
long int count;
uint DOG1;
uchar pA;
uchar LJCQ1,LJCQ2,LJCQ3,LJCQ4,LJCQ5; //5个LED寄存器
uchar pR1,pR2,pR3,pR4,pR5,pR7;
uchar code tab[26] =
{
0x11,0xd7,0x32,0x92,0xd4, //"0","1","2","3","4" (QH,QG,QF,QE,QD,QC,QB,QA) 共阳极,低电平亮
0x98,0x18,0xd3,0x10,0x90, //"5","6","7","8","9"
0xff,0xfe,0x3d,0x94,0x38,0xff, //"DARK","-",L,Y,E,00H
0x01,0xC7,0x22,0x82,0xc4, //"0.""1.""2."...
0x88,0x08,0xc3,0x00,0x80
};
//函数声明
void Send_Byte(uchar send_data);
static In_Byte();
void WREN_CMD();
void WRDI_CMD(); //禁止写EEPROM存储器阵列或状态寄存器
static RDSR_CMD();
void WIP_POLL(); //通过检测状态寄存器中的WIP位,来查询非易失性写周期是否完成
void WRSR_CMD();
void Byte_Write(uint ADDR,uchar send_data);//Byte_Write
static Byte_Read(uint ADDR); //Byte_Read
void rst_wdog(); //清除WDT
void dog0(); //初始化5045
void delay_k(uint time_k); //延时子程序
void LOUT(); //显示子程序
//主程序初始化
void main(void)
{
EA=0; //关中断
TR0=0;
TR1=0;
TF0=0;
TF1=0;
IE0=0;
IE1=0;
P0=0x00;
dog0();//5045初始化
DOG1=0;
// SP=0x60; // SP==60H ;
//
// LJCQ1=0x0c; //初始显示LY-01
// LJCQ2=0x0d;
// LJCQ3=0x0b;
// LJCQ4=0x00;
// LJCQ5=0x01;
// LOUT();
// delay_k(200); //延时
//
count=0;
// LJCQ1=0x00; //初始显示000.00
// LJCQ2=0x01;
// LJCQ3=0x02;
// LJCQ4=0x03;
// LJCQ5=0x04;
// LOUT();
//
TMOD=0x66; //0110,0110 外部计数,CT0 IS IN MODEL 2,AND CT1 IS IN MODEL 2 ;
IE=0x0a; //0000,1010 -- ONLY ALLOW CT0ZD AND CT1ZD ;
IP=0x00; //XX00,1000 -- CT0ZD IS MOST HIGH ;
PCON=0x00; //PCON==00H 不进掉电方式,不进空闲方式 ; //计数器方式:外部,T0/T1,方式2--8位;
TH0=0xff;
TL0=0xff;
TH1=0xff;
TL1=0xff;//TH1=TH0=TL1=TL0=0FFH-K+0x01;
// TR0=1;
// TR1=1;
// EA=1; //开中断
//;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
while(1)
{
...
rst_wdog();
}
}
//;;;;;;;;;;;;;;;;程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
//;;;;;;;;;;;;;;;;;;;;中断子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;
//反转
void IsrTime0() interrupt 1
{
XHBZ=1;
count--;
}
//正转
void IsrTime1() interrupt 3
{
XHBZ=1;
count++;
}
//5045子程序
/**********************************************
发送一个字节
**********************************************/
void Send_Byte(uchar send_data)
{
uchar i;
for(i=0;i<8;i++)
{
SCK=0;
if(send_data&0x80)
SI=1;
else
SI=0;
SCK=1;
send_data=send_data<<1;
}
}
/**********************************************
接收一个字节
**********************************************/
static In_Byte(void)
{
uchar i,in_data=0;
for(i=0;i<8;i++)
{
SCK=1;
SCK=0;
if(SO)
in_data|=0x01;
else
in_data&=0xFE;
if(i!=7)
in_data=in_data<<1;
}
return in_data;
}
/**********************************************
允许写EEPROM存储器阵列或状态寄存器
**********************************************/
void WREN_CMD(void)
{
SCK=0;
CS=0;
Send_Byte(WREN_INST);
SCK=0;
CS=1;
}
/**********************************************
禁止写EEPROM存储器阵列或状态寄存器
**********************************************/
void WRDI_CMD(void)
{
SCK=0;
CS=0;
Send_Byte(WRDI_INST);
SCK=0;
}
/**********************************************
**********************************************/
static RDSR_CMD(void)
{
uchar temp;
SCK=0;
CS=0;
Send_Byte(RDSR_INST);
temp=In_Byte();
SCK=0;
CS=1;
return temp;
}
/**********************************************
通过检测状态寄存器中的WIP位,来查询非易失性写周期是否完成
**********************************************/
void WIP_POLL(void)
{
uchar i;
uchar temp;
for(i=0;i<MAX_POLL;i++)
{
temp=RDSR_CMD();
if(!(temp&=0x01))
i=MAX_POLL;
}
}
/**********************************************
**********************************************/
void WRSR_CMD(void)
{
SCK=0;
CS=0;
Send_Byte(WRSR_INST);
Send_Byte(STATUS_REG);
SCK=0;
CS=1;
WIP_POLL();
}
/**********************************************
Byte_Write
**********************************************/
void Byte_Write(uint ADDR,uchar send_data)
{
uchar temp;
temp=WRITE_INST;
SCK=0;
CS=0;
if(ADDR&0X0100)
temp|=0x08;
else
temp&=0xf7;
Send_Byte(temp);
Send_Byte(ADDR);
Send_Byte(send_data);
SCK=0;
CS=1;
WIP_POLL();
}
/**********************************************
Byte_Read
**********************************************/
static Byte_Read(uint ADDR)
{
uchar temp,temp1;
temp=READ_INST;
SCK=0;
CS=0;
if(ADDR&0X0100)
temp|=0x08;
else
temp&=0xf7;
Send_Byte(temp);
Send_Byte(ADDR);
temp1=In_Byte();
SCK=0;
CS=1;
return temp1;
}
/* 清除WDT
--------------------------------------*/
void rst_wdog(void)
{
CS=0;
_nop_();
CS=1;
}
//********初始化5045********************************
void dog0(void)
{
WRSR_CMD();
WREN_CMD();
rst_wdog();
}
//*****延时子程序*************************************
void delay_k(uint time_k)
{
rst_wdog();
while(--time_k);
}
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
//显示子程序
void LOUT(void)
{
pR1 = tab[LJCQ1];
pR2 = tab[LJCQ2];
pR3 = tab[LJCQ3];
pR4 = tab[LJCQ4];
pR5 = tab[LJCQ5];
pR7 = 8;
while(pR7)
{
// EA=0;
if(bit_status(pR1,(pR7-1)))
{
L_DT1=1;
}
else
{
L_DT1=0;
}
if(bit_status(pR2,(pR7-1)))
{
L_DT2=1;
}
else
{
L_DT2=0;
}
if(bit_status(pR3,(pR7-1)))
{
L_DT3=1;
}
else
{
L_DT3=0;
}
if(bit_status(pR4,(pR7-1)))
{
L_DT4=1;
}
else
{
L_DT4=0;
}
if(bit_status(pR5,(pR7-1)))
{
L_DT5=1;
}
else
{
L_DT5=0;
}
L_SCK=0;
L_SCK=1;
L_SCK=0;
pR7--;
}
} |