?? 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 + -