|
單片機C語言實例-358-將流水燈控制碼寫入X5045并讀出送P1口顯示
//實例92:將流水燈控制碼寫入X5045并讀出送P1口顯示
#include<reg51.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數(shù)定義的頭文件
sbit SCK=P3^4; //將SCK位定義為P3.4引腳
sbit SI=P3^5; //將SI位定義為P3.5引腳
sbit SO=P3^6; //將SO位定義為P3.6引腳
sbit CS=P3^7; //將SCK位定義為P3.7引腳
#define WREN 0x06 //寫使能鎖存器允許
#define WRDI 0x04 //寫使能鎖存器禁止
#define WRSR 0x01 //寫狀態(tài)寄存器
#define READ 0x03 //讀出
#define WRITE 0x02 //寫入
unsigned char lamp[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,
0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,
0xE7,0xDB,0xBD,0x7E,0xFF, 0xFF,0x3C,0x18,0x00,
0x81,0xC3,0xE7,0xFF,0xFF,0x7E,0xBD,0xDB,0xE7,
0xBD,0xDB,0x7E,0xFF,0xAA}; //流水燈控制碼
/*****************************************************
函數(shù)功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數(shù)功能:延時若干毫秒
入口參數(shù):n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數(shù)功能:從X5045的當前地址讀出數(shù)據(jù)
出口參數(shù):x
***************************************************/
unsigned char ReadCurrent(void)
{
unsigned char i;
unsigned char x=0x00; //儲存從X5045中讀出的數(shù)據(jù)
SCK=1; //將SCK置于已知的高電平狀態(tài)
for(i = 0; i < 8; i++)
{
SCK=1; //拉高SCK
SCK=0; //在SCK的下降沿輸出數(shù)據(jù)
x<<=1; //將x中的各二進位向左移一位,因為首先讀出的是字節(jié)的最高位數(shù)據(jù)
x|=(unsigned char)SO; //將SO上的數(shù)據(jù)通過按位“或“運算存入 x
}
return(x); //將讀取的數(shù)據(jù)返回
}
/*****************************************************
函數(shù)功能:寫數(shù)據(jù)到X5045的當前地址
入口參數(shù):dat
***************************************************/
void WriteCurrent(unsigned char dat)
{
unsigned char i;
SCK=0; //將SCK置于已知的低電平狀態(tài)
for(i = 0; i < 8; i++) // 循環(huán)移入8個位
{
SI=(bit)(dat&0x80); //通過按位“與”運算將最高位數(shù)據(jù)送到S
//因為傳送時高位在前,低位在后
SCK=0;
SCK=1; //在SCK上升沿寫入數(shù)據(jù)
dat<<=1; //將y中的各二進位向左移一位,因為首先寫入的是字節(jié)的最高位
}
}
/*****************************************************
函數(shù)功能:寫狀態(tài)寄存器 ,可以設(shè)置看門狗的溢出時間及數(shù)據(jù)保護
入口參數(shù):rs; //儲存寄存器狀態(tài)值
***************************************************/
void WriteSR(unsigned char rs)
{
CS=0; //拉低CS,選中X5045
WriteCurrent(WREN); //寫使能鎖存器允許
CS=1; //拉高CS
CS=0; //重新拉低CS,否則下面的寫寄存器狀態(tài)指令將被丟棄
WriteCurrent(WRSR); //寫狀態(tài)寄存器
WriteCurrent(rs); //寫入新設(shè)定的寄存器狀態(tài)值
CS=1; //拉高CS
}
/*****************************************************
函數(shù)功能:寫數(shù)據(jù)到X5045的指定地址
入口參數(shù):addr
***************************************************/
void WriteSet(unsigned char dat,unsigned char addr)
{
SCK=0; //將SCK置于已知狀態(tài)
CS=0; //拉低CS,選中X5045
WriteCurrent(WREN); //寫使能鎖存器允許
CS=1; //拉高CS
CS=0; //重新拉低CS,否則下面的寫入指令將被丟棄
WriteCurrent(WRITE); //寫入指令
WriteCurrent(addr); //寫入指定地址
WriteCurrent(dat); //寫入數(shù)據(jù)
CS=1; //拉高CS
SCK=0; //將SCK置于已知狀態(tài)
}
/*****************************************************
函數(shù)功能:從X5045的指定地址讀出數(shù)據(jù)
入口參數(shù):addr
出口參數(shù):dat
***************************************************/
unsigned char ReadSet(unsigned char addr)
{
unsigned char dat;
SCK=0; //將SCK置于已知狀態(tài)
CS=0; //拉低CS,選中X5045
WriteCurrent(READ); //開始讀
WriteCurrent(addr); //寫入指定地址
dat=ReadCurrent(); //讀出數(shù)據(jù)
CS=1; //拉高CS
SCK=0; //將SCK置于已知狀態(tài)
return dat; //返回讀出的數(shù)據(jù)
}
/*****************************************************
函數(shù)功能:看門狗復(fù)位程序
***************************************************/
void WatchDog(void)
{
CS=1; //拉高CS
CS=0; //CS引腳的一個下降沿復(fù)位看門狗定時器
CS=1; //拉高CS
}
/*****************************************************
函數(shù)功能:主程序
***************************************************/
void main(void)
{
unsigned char i;
WriteSR(0x12); //寫狀態(tài)寄存器(設(shè)定看門狗溢出時間為600ms,寫不保護)
delaynms(10); //X5045的寫入周期約為10ms
for(i=0;i<50;i++)
{
WriteSet(lamp,0x00+i); //將數(shù)據(jù)“0xaa”寫入指定地址“0x10”
delaynms(10); //X5045的寫入周期約為10ms
}
while(1)
{
for(i=0;i<50;i++)
{
P1=ReadSet(0x00+i); //將數(shù)據(jù)讀出送P1口顯示
delaynms(100);
WatchDog();
}
}
}
更多詳情參考附件文檔
+08:00C104聯(lián)盟網(wǎng)9102.png (10.68 KB, 下載次數(shù): 4)
下載附件
保存到相冊
2022-4-2 09:30 上傳
|
|