- #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);
- }
复制代码
|