- #include<STC15W4K32S4.h> // 引用標準庫的頭文件
- #define uchar unsigned char // 定義一下方便使用
- #define uint unsigned int
- #define ulong unsigned long
- char code dx516[3] _at_ 0x003b;// 這是為了仿真設置的
- #define WriteDeviceAddress 0xa0 // 定義器件在 IIC 總線中的地址,且方式為寫
- #define ReadDeviceAddress 0xa1 // 定義器件在 IIC 總線中的地址,且方式為讀
- sbit SCL=P1^6; // 串行IIC時鐘
- sbit SDA=P1^7; // 串行IIC數據、地址
- sbit DIN = P0^0; // 串行數據輸入
- sbit CLK = P0^1; // 串行時鐘
- sbit LOAD = P4^6; // 顯示數據鎖存控制
- sbit led=P2^6;
- /****************************
- MAX7219特殊功能寄存器定義
- ************************/
- #define DECODE_MODE 0x09 // 譯碼模式寄存器
- #define INTENSITY 0x0a // 亮度寄存器
- #define SCAN_LIMIT 0x0b // 掃描位數寄存器
- #define SHUT_DOWN 0x0c // 低功耗模式寄存器
- #define DISPLAY_TEST 0x0f // 顯示測試寄存器
- unsigned int cntb=0 ,n=0,m=0,k=0;
- void Write_Max7219_byte(unsigned char temp);
- void Write_Max7219(unsigned char address,unsigned char dat);
- void Init_Max7219(void);
- void delay_ms(unsigned int time);
- void Init_interrupt();
- void show();
- uchar Read24c02(uchar address);
- void Write24c02(uchar ch,uchar address);
- void DelayMsK(unsigned int number);
- /* 主函數 */
- void main(void)
- {
- Init_Max7219(); //7219初始化
- Init_interrupt(); //定時器初始化
- P1M0=0X00;
- P1M1=0X00;
- P2M0=0X00;
- P2M1=0X00;
- n=Read24c02(0x03);
- k=Read24c02(0x04);
- if(n>59||k>59)
- { //防止首次上電讀出的數據出錯
- n=0;
- k=0;
- }
- while(1)
- {
-
- show(); //調用數碼管顯示
- }
- }
- /*******************************
- MAX7219顯示子程序
- *******************************/
- void show()
- {
- Write24c02(n,0x03); // 寫入一個字節到 24c02 中的0x03地址
- DelayMsK(8000);
- Write_Max7219(4,n%10); //數碼管分鐘個位數值分離
- delay_ms(1);
- Write_Max7219(3,n%100/10); //數碼管分鐘十位數值分離
- delay_ms(1);
- Write24c02(k,0x04); // 寫入一個字節到 24c02 中的0x04地址
- DelayMsK(8000);
- Write_Max7219(2,k%10); //數碼管小時個位數值分離
- delay_ms(1);
- Write_Max7219(1,k%100/10); //數碼管小時十位數值分離
- delay_ms(1);
- }
- /**************************
- 定時器0初始化子程序
- *****************************/
- void Init_interrupt()
- {
- TMOD=0X01;
- TH0=(65536-46080)/256; //定時器賦初值11.0592MHZ晶振,賦初值TH0=(65536- 1000*50*(11.0592/12)/256) 50ms
- TL0=(65536-46080)/256;
- TR0=1;
- ET0=1;
- IT0=1;
- IT1=1;
- EX0=1;
- EX1=1;
- EA=1;
- }
- /********************************
- ms級延時子程序
- ******************************/
- void delay_ms(unsigned int time)
- {
- unsigned int i,j;
- for(i=time;i>0;i--)
- for(j=125;j>0;j--);
- }
- void t0(void) interrupt 1 using 0
- {
- TH0=(65536-46080)/256;
- TL0=(65536-46080)/256;
- cntb ++;
- m++;
- if(m==30) ////m執行30次,led燈1s交替閃爍
- {
- led=~led;
- m=0;
- }
-
- if(cntb==1200) //cntb執行1200次,一分鐘時間到
- {
- n=n+1; //分鐘變量加1操作
- cntb=0; //定時器計數變量清零
- }
- if(n>59) //分鐘 顯示大于59秒
- {
- k=k+1; //小時變量加1操作
- n=0; //分鐘變量清零
- }
-
- if(k>99) //時間顯示大于99小時
- {
- k=99;
- }
-
- }
- /******************
- MAX7219讀數據子程序
- *********************/
- void Write_Max7219_byte(unsigned char temp)
- {
- unsigned char i;
- for(i=0;i<8;i++) //移位循環8次
- {
- CLK=0; //清零時鐘總線
- DIN=(bit)(temp&0x80); //每次取高字節亮
- temp=temp<<1; //左移移位
- CLK=1; //時鐘上升沿,發送高字節位
- }
- }
- /*****************************
- MAX7219寫數據子程序
- *************************/
- void Write_Max7219(unsigned char address,unsigned char dat)
- {
- LOAD=0; //拉低片選線,選中器件
- Write_Max7219_byte(address); //讀取高字節地址位
- Write_Max7219_byte(dat); //讀取高字節數據位
- LOAD=1; //讀取結束,上升沿鎖存數據
- }
- /*****************************
- MAX7219初始化子程序
- *************************/
- void Init_Max7219(void)
- {
- Write_Max7219(SHUT_DOWN,0x01); //開啟正常工作模式
- Write_Max7219(DISPLAY_TEST,0x00); //選中工作模式
- Write_Max7219(DECODE_MODE,0xff); //選用全譯碼模式
- Write_Max7219(SCAN_LIMIT,0x07); //8只LED全用
- Write_Max7219(INTENSITY,0x0a); //設置初始亮度
- }
- // 定時函數
- void DelayMsK(unsigned int number)
- {
- unsigned char temp;
- for(;number!=0;number--)
- {
- for(temp=112;temp!=0;temp--) ;
- }
- }
- // 開始總線
- void Start()
- {
- SDA=1;
- SCL=1;
- SDA=0;
- SCL=0;
- }
- // 結束總線
- void Stop()
- {
- SCL=0;
- SDA=0;
- SCL=1;
- SDA=1;
- }
- // 發 ACK0
- void NoAck()
- {
- SDA=1;
- SCL=1;
- SCL=0;
- }
- // 測試 ACK
- bit TestAck()
- {
- bit ErrorBit;
- SDA=1;
- SCL=1;
- ErrorBit=SDA;
- SCL=0;
- return(ErrorBit);
- }
- // 寫入 8 個 bit 到 24c02
- void Write8Bit(unsigned char input)
- {
- unsigned char temp;
- for(temp=8;temp!=0;temp--)
- {
- SDA=(bit)(input&0x80); //input&0x80 結果非零,轉換成 bit 即為 1。
- SCL=1;
- SCL=0;
- input=input<<1;
- }
- }
- void Write24c02(uchar ch,uchar address)
- {
- Start();// 發送起始脈沖
- Write8Bit(WriteDeviceAddress); // 發送從器件地址,且方式為寫。
- while(TestAck()); // 等待應答
- Write8Bit(address); // 發送要寫入數據的字節地址
- while(TestAck()); // 等待應答
- Write8Bit(ch); // 發送要寫的數據到被尋址的存儲單元。
- while(TestAck()); // 等待應答
- Stop();// 發送停止信號, 24C02開始內部數據的擦寫。 在內部擦寫過程中 24C02 不再應答主器件的任何請求。
- DelayMsK(10);
- }
- // 從 24c02 中讀出 8 個 bit
- uchar Read8Bit()
- {
- unsigned char temp,rbyte=0;
- for(temp=8;temp!=0;temp--)
- {
- SCL=1;
- rbyte=rbyte<<1;
- rbyte=rbyte|((unsigned char)(SDA));
- SCL=0;
- }
- return(rbyte);
- }
- // 選擇性讀操作,從 address 地址中讀出 1 個字節
- uchar Read24c02(uchar address)
- {
- uchar ch;
- // 偽寫操作
- Start();
- Write8Bit(WriteDeviceAddress); // 發送從器件地址,且方式為寫。
- while(TestAck()); // 等待應答
- Write8Bit(address); // 發送要讀的數據地址
- while(TestAck()); // 等待應答
- // 主器件重新發送起始信號和從器件地址此時 R/W 位置1
- Start();
- Write8Bit(ReadDeviceAddress); // 發送從器件地址,且方式為讀。
- while(TestAck()); // 等待應答
- ch=Read8Bit(); // 讀出 8bit
- NoAck();
- // 主機不應答
- Stop();
- // 主機產生停止信號
- return(ch);
- }
復制代碼
|