電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 2954|回復(fù): 1
收起左側(cè)

單片機(jī)C語言實(shí)例-358-將流水燈控制碼寫入X5045并讀出送P1口顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-4-2 09:30:25 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
單片機(jī)C語言實(shí)例-358-將流水燈控制碼寫入X5045并讀出送P1口顯示

//實(shí)例92:將流水燈控制碼寫入X5045并讀出送P1口顯示
#include<reg51.h>    //包含單片機(jī)寄存器的頭文件
#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ù)功能:延時(shí)1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認(rèn)為是1毫秒
***************************************************/
void delay1ms()
{
   unsigned char i,j;       
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
/*****************************************************
函數(shù)功能:延時(shí)若干毫秒
入口參數(shù):n
***************************************************/
void delaynms(unsigned char n)
{
   unsigned char i;
        for(i=0;i<n;i++)
           delay1ms();
}
/*****************************************************
函數(shù)功能:從X5045的當(dāng)前地址讀出數(shù)據(jù)
出口參數(shù):x
***************************************************/
unsigned char ReadCurrent(void)
{
          unsigned char i;
        unsigned char x=0x00;      //儲(chǔ)存從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中的各二進(jìn)位向左移一位,因?yàn)槭紫茸x出的是字節(jié)的最高位數(shù)據(jù)          
                x|=(unsigned char)SO;  //將SO上的數(shù)據(jù)通過按位“或“運(yùn)算存入 x      
        }
        return(x);   //將讀取的數(shù)據(jù)返回
}
/*****************************************************
函數(shù)功能:寫數(shù)據(jù)到X5045的當(dāng)前地址
入口參數(shù):dat
***************************************************/
void WriteCurrent(unsigned char dat)
{
   unsigned char i;
        SCK=0;                 //將SCK置于已知的低電平狀態(tài)
  for(i = 0; i < 8; i++)  // 循環(huán)移入8個(gè)位
        {
         SI=(bit)(dat&0x80);   //通過按位“與”運(yùn)算將最高位數(shù)據(jù)送到S
                                    //因?yàn)閭魉蜁r(shí)高位在前,低位在后
         SCK=0;
         SCK=1;               //在SCK上升沿寫入數(shù)據(jù)
    dat<<=1;   //將y中的各二進(jìn)位向左移一位,因?yàn)槭紫葘懭氲氖亲止?jié)的最高位
  }
}

/*****************************************************
函數(shù)功能:寫狀態(tài)寄存器 ,可以設(shè)置看門狗的溢出時(shí)間及數(shù)據(jù)保護(hù)
入口參數(shù):rs;  //儲(chǔ)存寄存器狀態(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引腳的一個(gè)下降沿復(fù)位看門狗定時(shí)器
CS=1;    //拉高CS
}
/*****************************************************
函數(shù)功能:主程序
***************************************************/
void main(void)
{
  unsigned char i;
WriteSR(0x12);        //寫狀態(tài)寄存器(設(shè)定看門狗溢出時(shí)間為600ms,寫不保護(hù))  
  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();
                  }                 
     }
}

更多詳情參考附件文檔


游客,如果您要查看本帖隱藏內(nèi)容請(qǐng)回復(fù)

1

主題

762

帖子

2581

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2581
沙發(fā)
發(fā)表于 2022-4-3 19:24:48 | 只看該作者
感謝大佬的分享

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表