找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3585|回复: 2
打印 上一主题 下一主题
收起左侧

自己做的0-99的4位按键显示单片机程序 可控制加减与清零 2017蓝桥杯驱动

[复制链接]
跳转到指定楼层
楼主
这是我自己做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。
同时附带2017蓝桥杯驱动.zip。

部分源码预览:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. bit write = 0;        //一秒存储一次
  5. sbit A138 = P2^5;          //数码管动态显示
  6. sbit B138 = P2^6;
  7. sbit C138 = P2^7;
  8. sbit key1 = P3^0;          //4位按键
  9. sbit key2 = P3^1;
  10. sbit key3 = P3^2;
  11. sbit key4 = P3^3;
  12. sbit I2C_SCL = P2^0;  //II2c
  13. sbit I2C_SDA = P2^1;

  14. uchar duan[18] =                                                                          //共阳极数码管
  15. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  16. 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
  17. uchar wei[8] =                                                                                  //位选
  18. {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  19. void display1(uchar w,uchar d);
  20. void display(uchar num);
  21. void delay(uint a);

  22. void timerconfigration();         //定时器初始化

  23. void keyscan();                                 //按键扫描

  24. void I2C_Delay10us();
  25. void I2C_Start();
  26. void I2C_Stop();
  27. uchar I2C_SendByte(uchar dat, uchar ack);
  28. uchar I2C_ReadByte();

  29. void At24c02Write(unsigned char ,unsigned char );
  30. unsigned char At24c02Read(unsigned char );

  31. uchar count,sec;

  32. void main()
  33. {
  34.         sec = At24c02Read(2);                   //读存储内容
  35.         if(sec>99)
  36.                 sec = 0;
  37.         timerconfigration();        
  38.         while(1)
  39.         {
  40.                 keyscan();
  41.                 display(sec);
  42.                 if(write==1)
  43.                 {
  44.                         write = 0;
  45.                         At24c02Write(2,sec);   //存储
  46.                 }
  47.         }               
  48. }

  49. void delay(uint a)                                   //a ms 去抖10MS足以
  50. {
  51.         uchar b;
  52.         for (;a>0;a--)
  53.                 for (b=110;b>0;b--);        
  54. }

  55. void display1(uchar w,uchar d)
  56. {
  57.         A138 = 0;
  58.         B138 = 1;
  59.         C138 = 1;

  60.         P0 = wei[w];

  61.         A138 = 1;

  62.         P0 = duan[d];
  63.         delay(5);
  64.         P0 = 0xff;
  65. }

  66. void display(uchar num)
  67. {
  68.         display1(0,num/10);
  69.         display1(1,num%10);
  70. }

  71. void keyscan()
  72. {
  73.         if(key1==0)
  74.         {
  75.                 delay(10);
  76.                 if(key1==0)
  77.                 {
  78.                         sec++;
  79.                         if(sec==99)
  80.                                 sec = 0;
  81.                         write = 1;
  82.                         while(!key1);                                 
  83.                 }
  84.         }
  85.         if(key2==0)
  86.         {
  87.                 delay(10);
  88.                 if(key2==0)
  89.                 {
  90.                         if(sec==0)
  91.                                 sec = 99;
  92.                         else
  93.                                 sec--;
  94.                         write = 1;
  95.                         while(!key2);
  96.                 }
  97.         }
  98.         if(key3==0)
  99.         {
  100.                 delay(10);
  101.                 if(key3==0)
  102.                 {
  103.                         sec = 0;
  104.                         write = 1;
  105.                         while(!key3);
  106.                 }
  107.         }
  108.         if(key4==0)
  109.         {
  110.                 delay(10);
  111.                 if(key4==0)
  112.                 {
  113.                         while(!key4);
  114.                         TR0 = ~TR0;
  115.                 }
  116.         }
  117. }

  118. void timerconfigration()                                 //定时器
  119. {
  120.         TMOD = 0x01;
  121.         TH0 = (65535-46296)/256;
  122.         TL0 = (65535-46296)%256;
  123.         EA  = 1;
  124.         ET0 = 1;
  125. //        TR0 = 1;
  126. }

  127. void T0_time() interrupt 1
  128. {
  129.         TH0 = (65535-46296)/256;
  130.         TL0 = (65535-46296)%256;
  131.         count++;
  132.         if(count==20)
  133.         {
  134.                 count = 0;
  135.                 sec++;
  136.                 write = 1;
  137.                 if(sec==99)
  138.                         sec = 0;
  139.         }
  140. }

  141. void I2C_Delay10us()
  142. {
  143.         uchar a, b;
  144.         for(b=1; b>0; b--)
  145.         {
  146.                 for(a=2; a>0; a--);
  147.         }
  148. }
  149. /*******************************************************************************
  150. * 函 数 名         : I2C_Start()
  151. * 函数功能                   : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
  152. * 输    入         : 无
  153. * 输    出         : 无
  154. * 备    注         : 起始之后I2C_SDA和I2C_SCL都为0
  155. *******************************************************************************/

  156. void I2C_Start()
  157. {
  158.         I2C_SDA = 1;
  159.         I2C_Delay10us();
  160.         I2C_SCL = 1;
  161.         I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
  162.         I2C_SDA = 0;
  163.         I2C_Delay10us();//保持时间是>4us
  164.         I2C_SCL = 0;                        
  165.         I2C_Delay10us();               
  166. }
  167. /*******************************************************************************
  168. * 函 数 名           : I2C_Stop()
  169. * 函数功能                 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
  170. * 输    入           : 无
  171. * 输    出                  : 无
  172. * 备    注           : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
  173. *******************************************************************************/

  174. void I2C_Stop()
  175. {
  176.         I2C_SDA = 0;
  177.         I2C_Delay10us();
  178.         I2C_SCL = 1;
  179.         I2C_Delay10us();//建立时间大于4.7us
  180.         I2C_SDA = 1;
  181.         I2C_Delay10us();               
  182. }
  183. /*******************************************************************************
  184. * 函 数 名           : I2cSendByte(uchar num)
  185. * 函数功能                  : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
  186. *                    * 保持发送信号I2C_SDA保持稳定
  187. * 输    入           : num ,ack
  188. * 输    出                  : 0或1。发送成功返回1,发送失败返回0
  189. * 备    注           : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0
  190. *******************************************************************************/

  191. uchar I2C_SendByte(uchar dat, uchar ack)
  192. {
  193.         uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
  194.                         
  195.         for(a=0; a<8; a++)//要发送8位,从最高位开始
  196.         {
  197.                 I2C_SDA = dat >> 7;         //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
  198.                 dat = dat << 1;
  199.                 I2C_Delay10us();
  200.                 I2C_SCL = 1;
  201.                 I2C_Delay10us();//建立时间>4.7us
  202.                 I2C_SCL = 0;
  203.                 I2C_Delay10us();//时间大于4us               
  204.         }

  205.         I2C_SDA = 1;
  206.         I2C_Delay10us();
  207.         I2C_SCL = 1;
  208.         while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
  209.         {
  210.                 b++;
  211.                 if(b > 200)         //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
  212.                 {
  213.                         I2C_SCL = 0;
  214.                         I2C_Delay10us();
  215.                         return 0;
  216.                 }
  217.         }

  218.         I2C_SCL = 0;
  219.         I2C_Delay10us();
  220.          return 1;               
  221. }
  222. /*******************************************************************************
  223. * 函 数 名           : I2cReadByte()
  224. * 函数功能                     : 使用I2c读取一个字节
  225. * 输    入           : 无
  226. * 输    出                  : dat
  227. * 备    注           : 接收完一个字节I2C_SCL=0
  228. *******************************************************************************/

  229. uchar I2C_ReadByte()
  230. {
  231.         uchar a = 0,dat = 0;
  232.         I2C_SDA = 1;                        //起始和发送一个字节之后I2C_SCL都是0
  233.         I2C_Delay10us();
  234.         for(a=0; a<8; a++)//接收8个字节
  235.         {
  236.                 I2C_SCL = 1;
  237.                 I2C_Delay10us();
  238.                 dat <<= 1;
  239.                 dat |= I2C_SDA;
  240.                 I2C_Delay10us();
  241.                 I2C_SCL = 0;
  242.                 I2C_Delay10us();
  243.         }
  244.         return dat;               
  245. }

  246. /*******************************************************************************
  247. * 函 数 名         : void At24c02Write(unsigned char addr,unsigned char dat)
  248. * 函数功能                   : 往24c02的一个地址写入一个数据
  249. * 输    入         : 无
  250. * 输    出         : 无


  251. …………余下代码请下载附件…………
复制代码

下载:
4键控制数码管 存储.zip (36.12 KB, 下载次数: 16)
2017蓝桥杯驱动.zip (113.22 KB, 下载次数: 13)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:370943 发表于 2019-3-1 21:26 | 只看该作者
学习借鉴下,原来可以这样写的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表