这是我自己做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。
同时附带2017蓝桥杯驱动.zip。
部分源码预览:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- bit write = 0; //一秒存储一次
- sbit A138 = P2^5; //数码管动态显示
- sbit B138 = P2^6;
- sbit C138 = P2^7;
- sbit key1 = P3^0; //4位按键
- sbit key2 = P3^1;
- sbit key3 = P3^2;
- sbit key4 = P3^3;
- sbit I2C_SCL = P2^0; //II2c
- sbit I2C_SDA = P2^1;
- uchar duan[18] = //共阳极数码管
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
- uchar wei[8] = //位选
- {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- void display1(uchar w,uchar d);
- void display(uchar num);
- void delay(uint a);
- void timerconfigration(); //定时器初始化
- void keyscan(); //按键扫描
- void I2C_Delay10us();
- void I2C_Start();
- void I2C_Stop();
- uchar I2C_SendByte(uchar dat, uchar ack);
- uchar I2C_ReadByte();
- void At24c02Write(unsigned char ,unsigned char );
- unsigned char At24c02Read(unsigned char );
- uchar count,sec;
- void main()
- {
- sec = At24c02Read(2); //读存储内容
- if(sec>99)
- sec = 0;
- timerconfigration();
- while(1)
- {
- keyscan();
- display(sec);
- if(write==1)
- {
- write = 0;
- At24c02Write(2,sec); //存储
- }
- }
- }
- void delay(uint a) //a ms 去抖10MS足以
- {
- uchar b;
- for (;a>0;a--)
- for (b=110;b>0;b--);
- }
- void display1(uchar w,uchar d)
- {
- A138 = 0;
- B138 = 1;
- C138 = 1;
- P0 = wei[w];
- A138 = 1;
- P0 = duan[d];
- delay(5);
- P0 = 0xff;
- }
- void display(uchar num)
- {
- display1(0,num/10);
- display1(1,num%10);
- }
- void keyscan()
- {
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
- sec++;
- if(sec==99)
- sec = 0;
- write = 1;
- while(!key1);
- }
- }
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- if(sec==0)
- sec = 99;
- else
- sec--;
- write = 1;
- while(!key2);
- }
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- sec = 0;
- write = 1;
- while(!key3);
- }
- }
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
- while(!key4);
- TR0 = ~TR0;
- }
- }
- }
- void timerconfigration() //定时器
- {
- TMOD = 0x01;
- TH0 = (65535-46296)/256;
- TL0 = (65535-46296)%256;
- EA = 1;
- ET0 = 1;
- // TR0 = 1;
- }
- void T0_time() interrupt 1
- {
- TH0 = (65535-46296)/256;
- TL0 = (65535-46296)%256;
- count++;
- if(count==20)
- {
- count = 0;
- sec++;
- write = 1;
- if(sec==99)
- sec = 0;
- }
- }
- void I2C_Delay10us()
- {
- uchar a, b;
- for(b=1; b>0; b--)
- {
- for(a=2; a>0; a--);
- }
- }
- /*******************************************************************************
- * 函 数 名 : I2C_Start()
- * 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
- * 输 入 : 无
- * 输 出 : 无
- * 备 注 : 起始之后I2C_SDA和I2C_SCL都为0
- *******************************************************************************/
- void I2C_Start()
- {
- I2C_SDA = 1;
- I2C_Delay10us();
- I2C_SCL = 1;
- I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
- I2C_SDA = 0;
- I2C_Delay10us();//保持时间是>4us
- I2C_SCL = 0;
- I2C_Delay10us();
- }
- /*******************************************************************************
- * 函 数 名 : I2C_Stop()
- * 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
- * 输 入 : 无
- * 输 出 : 无
- * 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
- *******************************************************************************/
- void I2C_Stop()
- {
- I2C_SDA = 0;
- I2C_Delay10us();
- I2C_SCL = 1;
- I2C_Delay10us();//建立时间大于4.7us
- I2C_SDA = 1;
- I2C_Delay10us();
- }
- /*******************************************************************************
- * 函 数 名 : I2cSendByte(uchar num)
- * 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
- * * 保持发送信号I2C_SDA保持稳定
- * 输 入 : num ,ack
- * 输 出 : 0或1。发送成功返回1,发送失败返回0
- * 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0
- *******************************************************************************/
- uchar I2C_SendByte(uchar dat, uchar ack)
- {
- uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
-
- for(a=0; a<8; a++)//要发送8位,从最高位开始
- {
- I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
- dat = dat << 1;
- I2C_Delay10us();
- I2C_SCL = 1;
- I2C_Delay10us();//建立时间>4.7us
- I2C_SCL = 0;
- I2C_Delay10us();//时间大于4us
- }
- I2C_SDA = 1;
- I2C_Delay10us();
- I2C_SCL = 1;
- while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
- {
- b++;
- if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
- {
- I2C_SCL = 0;
- I2C_Delay10us();
- return 0;
- }
- }
- I2C_SCL = 0;
- I2C_Delay10us();
- return 1;
- }
- /*******************************************************************************
- * 函 数 名 : I2cReadByte()
- * 函数功能 : 使用I2c读取一个字节
- * 输 入 : 无
- * 输 出 : dat
- * 备 注 : 接收完一个字节I2C_SCL=0
- *******************************************************************************/
- uchar I2C_ReadByte()
- {
- uchar a = 0,dat = 0;
- I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0
- I2C_Delay10us();
- for(a=0; a<8; a++)//接收8个字节
- {
- I2C_SCL = 1;
- I2C_Delay10us();
- dat <<= 1;
- dat |= I2C_SDA;
- I2C_Delay10us();
- I2C_SCL = 0;
- I2C_Delay10us();
- }
- return dat;
- }
- /*******************************************************************************
- * 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat)
- * 函数功能 : 往24c02的一个地址写入一个数据
- * 输 入 : 无
- * 输 出 : 无
- …………余下代码请下载附件…………
复制代码
下载:
4键控制数码管 存储.zip
(36.12 KB, 下载次数: 16)
2017蓝桥杯驱动.zip
(113.22 KB, 下载次数: 13)
|