找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的单片机病床呼叫设计源代码

[复制链接]
跳转到指定楼层
楼主
ID:706535 发表于 2020-3-11 21:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include<math.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit rs=P3^4;
  6. sbit rw=P3^5;
  7. sbit e=P3^6;
  8. sbit xiangying=P3^3;
  9. sbit beep=P3^7;


  10. uchar deng=0;                 //表示有哪几个按下,也用来显示灯
  11. uchar lcd[10]={0};    //用来按下标记顺序
  12. uchar i=0;

  13. /********************************************************************
  14. * 名称 : delay_uint()
  15. * 功能 : 小延时。
  16. * 输入 : 无
  17. * 输出 : 无
  18. ***********************************************************************/
  19. void delay_uint(uint q)
  20. {
  21.         while(q--);
  22. }

  23. /********************************************************************
  24. * 名称 : write_com(uchar com)
  25. * 功能 : 1602命令函数
  26. * 输入 : 输入的命令值
  27. * 输出 : 无
  28. ***********************************************************************/
  29. void write_com(uchar com)
  30. {
  31.         e=0;
  32.         rs=0;
  33.         rw=0;
  34.         P0=com;
  35.         delay_uint(25);
  36.         e=1;
  37.         delay_uint(100);
  38.         e=0;
  39. }

  40. /********************************************************************
  41. * 名称 : write_data(uchar dat)
  42. * 功能 : 1602写数据函数
  43. * 输入 : 需要写入1602的数据
  44. * 输出 : 无
  45. ***********************************************************************/
  46. void write_data(uchar dat)
  47. {
  48.         e=0;
  49.         rs=1;
  50.         rw=0;
  51.         P0=dat;
  52.         delay_uint(25);
  53.         e=1;
  54.         delay_uint(100);
  55.         e=0;        
  56. }

  57. /********************************************************************
  58. * 名称 : write_string(uchar hang,uchar add,uchar *p)
  59. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  60.                   write_string(1,5,"ab cd ef");
  61. * 输入 : 行,列,需要输入1602的数据
  62. * 输出 : 无
  63. ***********************************************************************/
  64. void write_string(uchar hang,uchar add,uchar *p)
  65. {
  66.         if(hang==1)   
  67.                 write_com(0x80+add);
  68.         else
  69.                 write_com(0x80+0x40+add);
  70.         while(1)
  71.         {
  72.                 if(*p == '\0')  break;
  73.                 write_data(*p);
  74.                 p++;
  75.         }        
  76. }


  77. /***********************lcd1602上显示两位十进制数************************/
  78. void write_onenumber(uchar hang,uchar add,uint date)
  79. {
  80.         if(hang==1)   
  81.                 write_com(0x80+add);
  82.         else
  83.                 write_com(0x80+0x40+add);
  84.         write_data(0x30+date);        
  85. }

  86. /***********************lcd1602初始化设置************************/
  87. void init_1602()
  88. {
  89.         write_com(0x38);        
  90.         write_com(0x0c);
  91.         write_com(0x06);
  92.         write_string(1,0,"Bingfang  Hujiao");

  93.         delay_uint(1000);
  94. }


  95. void delay1ms(int c)   // 范围0~65535        消抖
  96. {
  97.   unsigned char a,b;
  98.   for(;c>0;c--)
  99.   {
  100.     for(b=199;b>0;b--)
  101.         for(a=1;a>0;a--);
  102.   }
  103. }

  104. void get()   //获取数字的函数
  105. {
  106. switch (~P2)
  107. {
  108.      case 0x01:  lcd[i]=1;  break;
  109.          case 0x02:  lcd[i]=2;  break;
  110.          case 0x04:  lcd[i]=3;  break;
  111.          case 0x08:  lcd[i]=4;  break;
  112.          case 0x10:  lcd[i]=5;  break;
  113.          case 0x20:  lcd[i]=6;  break;
  114.          case 0x40:  lcd[i]=7;  break;
  115.          case 0x80:  lcd[i]=8;  break;
  116. }
  117. }


  118. void scanning(void)         //按键扫描
  119. {
  120.    uchar j=0;
  121.    if(P2!=0xff)  //判断是P3端有按键按下
  122.    {
  123.                 if(deng!=(deng|(~P2)))  //判断是否已经按过的按键,是继续
  124.                 {
  125.                         get();   //获取数字,并存进数组
  126.                         i++;        
  127.                         deng=deng|(~P2);   //得到按键的位数,并让灯亮
  128.                         P1=deng;
  129.                         delay1ms(6);   //消抖
  130.                 }
  131.    }

  132.    if(xiangying==0)          //消除部分
  133.    {  
  134.     deng=deng&(~(1<<(lcd[0]-1)));   //让首位的灯灭
  135.     P1=deng;                 
  136.                         for(j=0;j<i+1;j++)   //多一位把右边的数清零
  137.                 {
  138.                  lcd[j]=lcd[j+1];
  139.                 }
  140.           i--;
  141.           delay1ms(6);   //消抖
  142.                  while(xiangying==0);   //等待按键抬起,未按键消抖,可能出现多次清除
  143.    }


  144.    for(j=0;j<i;j++)           //LCD显示
  145.    {
  146.            write_onenumber(0,2*j,lcd[j]);                //显示
  147.    }
  148.          for(j=i;j<8;j++)           //LCD显示,其他为填空白
  149.    {
  150.     write_string(0,2*j," ");   
  151.    }


  152.    if(deng!=0x00)        //蜂鸣器
  153.     beep=0;
  154.    else
  155.      beep=1;

  156. }



  157. void main()
  158. {
  159. beep=1;
  160. P1=0x00;
  161. init_1602();
  162.   while(1)
  163.   {
  164.      scanning();
  165.   }
  166. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2020-3-12 12:38 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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