标题:
自己做的0-99的4位按键显示单片机程序 可控制加减与清零 2017蓝桥杯驱动
[打印本页]
作者:
30296956
时间:
2017-3-19 19:14
标题:
自己做的0-99的4位按键显示单片机程序 可控制加减与清零 2017蓝桥杯驱动
这是我自己做的一个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的一个地址写入一个数据
* 输 入 : 无
* 输 出 : 无
…………余下代码请下载附件…………
复制代码
0.png
(42.91 KB, 下载次数: 64)
下载附件
2017-3-20 03:39 上传
下载:
4键控制数码管 存储.zip
(36.12 KB, 下载次数: 16)
2017-3-19 19:13 上传
点击文件名下载附件
下载积分: 黑币 -5
2017蓝桥杯驱动.zip
(113.22 KB, 下载次数: 13)
2017-3-19 19:14 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
挖掘机在垃圾也
时间:
2019-3-1 21:26
学习借鉴下,原来可以这样写的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1