這是我自己做的一個0-99的4位按鍵顯示,可分別控制其加減,與清零。同時利用定時器,讓其自動跑。同時附帶IIc,關機自動存儲,已跑的數(shù)據(jù)。內(nèi)含數(shù)碼管顯示代碼,定時器代碼,IIc代碼。
同時附帶2017藍橋杯驅動.zip。
部分源碼預覽:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- bit write = 0; //一秒存儲一次
- sbit A138 = P2^5; //數(shù)碼管動態(tài)顯示
- 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] = //共陽極數(shù)碼管
- {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); //讀存儲內(nèi)容
- 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--);
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2C_Start()
- * 函數(shù)功能 : 起始信號:在I2C_SCL時鐘信號在高電平期間I2C_SDA信號產(chǎn)生一個下降沿
- * 輸 入 : 無
- * 輸 出 : 無
- * 備 注 : 起始之后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();
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2C_Stop()
- * 函數(shù)功能 : 終止信號:在I2C_SCL時鐘信號高電平期間I2C_SDA信號產(chǎn)生一個上升沿
- * 輸 入 : 無
- * 輸 出 : 無
- * 備 注 : 結束之后保持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();
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2cSendByte(uchar num)
- * 函數(shù)功能 : 通過I2C發(fā)送一個字節(jié)。在I2C_SCL時鐘信號高電平期間,
- * * 保持發(fā)送信號I2C_SDA保持穩(wěn)定
- * 輸 入 : num ,ack
- * 輸 出 : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
- * 備 注 : 發(fā)送完一個字節(jié)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++)//要發(fā)送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沒有應答發(fā)送失敗,或者為非應答,表示接收結束
- {
- I2C_SCL = 0;
- I2C_Delay10us();
- return 0;
- }
- }
- I2C_SCL = 0;
- I2C_Delay10us();
- return 1;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : I2cReadByte()
- * 函數(shù)功能 : 使用I2c讀取一個字節(jié)
- * 輸 入 : 無
- * 輸 出 : dat
- * 備 注 : 接收完一個字節(jié)I2C_SCL=0
- *******************************************************************************/
- uchar I2C_ReadByte()
- {
- uchar a = 0,dat = 0;
- I2C_SDA = 1; //起始和發(fā)送一個字節(jié)之后I2C_SCL都是0
- I2C_Delay10us();
- for(a=0; a<8; a++)//接收8個字節(jié)
- {
- I2C_SCL = 1;
- I2C_Delay10us();
- dat <<= 1;
- dat |= I2C_SDA;
- I2C_Delay10us();
- I2C_SCL = 0;
- I2C_Delay10us();
- }
- return dat;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void At24c02Write(unsigned char addr,unsigned char dat)
- * 函數(shù)功能 : 往24c02的一個地址寫入一個數(shù)據(jù)
- * 輸 入 : 無
- * 輸 出 : 無
- …………余下代碼請下載附件…………
復制代碼
0.png (42.91 KB, 下載次數(shù): 64)
下載附件
2017-3-20 03:39 上傳
下載:
4鍵控制數(shù)碼管 存儲.zip
(36.12 KB, 下載次數(shù): 16)
2017-3-19 19:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2017藍橋杯驅動.zip
(113.22 KB, 下載次數(shù): 13)
2017-3-19 19:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|