📄 fbtdog.c
字号:
//AT89C51单片机,12MHZ晶振,X5045,共阳LED数码管
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define LEDag P0 //LED笔画输出P口,P1.1~7对应a~g
#define WREN=0x06; //5045操作指令,芯片写允许
#define WRDI=0x04; //芯片写禁止
#define RDSR=0x05; //读状态寄存器
#define WRSR=0x01; //写状态寄存器
#define READ=0x03; //从所选的地址单元开始,读取数据
#define WRITE=0x02;
sbit LEDA=P1^0; //LED片选信号,P3.0~5对应LEd1~6
sbit LEDB=P1^1;
sbit LEDC=P0^0;
sbit SO=P3^0; //X5045数据输出
sbit SI=P3^1; //X5045数据输入
sbit SCK=P3^5; //X5045时钟输入
sbit CS=P3^6; //X5045片选
/*
unsigned char code WREN=0x06; //5045操作指令,芯片写允许
unsigned char code WRDI=0x04; //芯片写禁止
unsigned char code RDSR=0x05; //读状态寄存器
unsigned char code WRSR=0x01; //写状态寄存器
unsigned char code READ=0x03; //从所选的地址单元开始,读取数据
unsigned char code WRITE=0x02; //向所选的地址单元开始,写入数据
*/
unsigned char code LEDa_g[15]={0x80,0xf2,0x48,0x60,0x32,0x24,0x4,0xf0,0x0,0x20,0xfe, 0xe2,0x24,0x8c, 0x0};
//共阳LED段码表,对应 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "J" "S " "℃" "全亮"
void Delay_ms(unsigned char ms) // mS 延时,12M晶振时:(11+ms*1002)us,最大延时255ms。
{ unsigned char i;
while (ms--){ for(i=90;i>0;i--){_nop_();_nop_();_nop_(); } } }
unsigned char ReadX5045_Byte(void) //由X5045读取一字节
{ unsigned char Data,i;
for (i=8;i>0;i--){
SCK=1;
SCK=0;
if(SO) Data++;
// Data|=(unsigned char)SO;
Data<<=1; } //SCK下降沿,数据由SO输出,MCU在下1个SCK下降沿前读取
return Data; }
void WriteX5045_Byte(unsigned char Data) //向X5045与入一字节
{ unsigned char i;
for (i=8;i>0;i--){
SCK=0;
if(Data&0x80) SI=1; //SCK上升沿,数据SI被锁存,MCU在下1个SCK上升沿前提供数据
else SI=0;
Data<<=1;
SCK=1; }
SI=0; }
void WREN_cmd(void)
{ unsigned char Data;
SCK=0; /* Bring SCK low */
CS=0;
Data=WREN; /* Bring /CS low */
WriteX5045_Byte(Data);
SCK=0; /* Bring SCK low */
CS=1; /* Bring /CS high */
}
unsigned char WriteSR(unsigned char Data)
{ unsigned char wip;
SCK=0;
CS=0;
do { wip=RDSR;
WriteX5045_Byte(wip); //读X5045寄存器
wip=ReadX5045_Byte();} //WIP=1,内部正在写
while (wip&0x01); //等待内部写完成
wip=WREN;
WriteX5045_Byte(wip); //写允许置1
// WREN_cmd();
CS=1;
SCK=0;
CS=0;
wip=WRSR;
WriteX5045_Byte(wip);
WriteX5045_Byte(Data);
SCK=0;
CS=1;
return 1; }
/*
uchar rdsr_cmd (void)
{
uchar aa;
SCK=0;
CS=0;
aa=RDSR_INST;
outbyt(aa);
aa=inputbyt();
SCK=0;
CS=1;
return aa;
}
*/
unsigned char ReadSR() //读X5045寄存器,任何时候都可以读
{ unsigned char Data;
CS=0;
Data=RDSR;
WriteX5045_Byte(Data); //读X5045寄存器
Data=ReadX5045_Byte(); //WIP=1,内部正在写
CS=1;
return Data; }
void DisplaySR(void)
{ unsigned char Data,temp;
Data=ReadSR();
temp=Data&0xf;
LEDC=0;LEDB=0;LEDA=1;
LEDag=LEDa_g[temp]|LEDC;
CS=0;
CS=1;
Delay_ms(250);
CS=0;
CS=1;
temp=Data&0xf0;
temp>>=4;
LEDC=0;LEDB=1;LEDA=1;
LEDag=LEDa_g[temp]|LEDC;
Delay_ms(250);
CS=0;
CS=1;
}
/*
unsigned char WriteX5045_EEPROM_Byte(unsigned char Data,unsigned int Addr)
// 向X5045的EEPROM中写入一个字节,Data为写入的数,Address为写入地址
{ unsigned char wip,Twrite;
CS=0;
do { WriteX5045_Byte(RDSR); //读X5045寄存器
wip=ReadX5045_Byte();} //WIP=1,内部正在写
while (wip&0x01); //等待内部写完成
WriteX5045_Byte(WREN); //写允许置1
CS=1; //写时序要求
SCK=0;
CS=0;
Twrite=(((unsigned char)(Addr>>8))<<3)|WRITE; //计算高位地址,用(addr-0xff)<<3也行。 //
WriteX5045_Byte(Twrite); //发送写X5045命令及高位地址
WriteX5045_Byte((unsigned char)(Addr&0xff)); //发送写X5045低位地址
WriteX5045_Byte(Data); //发送写X5045数据
// SCK=0; //WriteX5045_Byte()运行完毕,SCK=1
CS=1;
return 1;
}
unsigned char ReadX5045_EEPROM_Byte(unsigned int Addr)
// 由X5045的EEPROM中读取一个字节,Address为地址
{ unsigned char Data,wip;
CS=0;
do { WriteX5045_Byte(RDSR); //读X5045寄存器
wip=ReadX5045_Byte();} //WIP=1,内部正在写
while (wip&0x01); //等待内部写完成
WriteX5045_Byte((unsigned char)(Addr>>8)<<3|READ); //发送读X5045命令及高位地址
WriteX5045_Byte(Addr&0xff); //发送读X5045低位地址
Data=ReadX5045_Byte(); //读取X5045数据
// SCK=0; //WriteX5045_Byte()运行完毕,SCK=1
CS=1;
return Data;
}
*/
main()
{ unsigned char i;
WriteSR(0x0);
while(1){
LEDC=0;LEDB=0;LEDA=0;
for (i=0;i<10;i++) {
LEDag=LEDa_g[i]|LEDC;
Delay_ms(150);
// CS=1;
// CS=0;
// CS=1;
Delay_ms(250); }
}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -