找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机病房呼叫系统代码

[复制链接]
跳转到指定楼层
楼主
ID:992390 发表于 2021-12-14 20:22 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"        //头文件
typedef unsigned char u8;
typedef unsigned int u16;

sbit beep=P3^7;     //蜂鸣器对应的IO口
sbit LSA=P2^2;     //138译码器A口输入
sbit LSB=P2^3;     //138译码器B口输入
sbit LSC=P2^4;     //138译码器C口输入
sbit K1=P3^1;     //独立按键K1,用于模拟护士的"响应"操作

#define GPIO_KEY P1     //定义P1口,用于矩阵按键扫描
#define GPIO_DIG P0     //定义P0口,用于数码管显示

u8 KeyValue;         //全局变量病房号

u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管0-9的数字显示

void delay(u16 i)     //延时子程序
{
       while(i--);
}
void KeyDown()        //矩阵按键扫描子程序
{
    /* 由于开发板的矩阵按键是4*4,按键扫描先是列扫描,设置为每一列的第一行,然后再行扫描,如果是第一行就保持原值,若是第2行,与第1行相差4
    ,则在原值的基础上再加4,得到最终结果,依次类推第3、4行    */
    u8 a=0;
       GPIO_KEY=0x0f;           //高4位置0,低4位置1,进行列扫描
    if(GPIO_KEY!=0x0f)      //有按键按下
    {
      delay(1000);          //消除按键抖动
      if(GPIO_KEY!=0x0f)   //再次检测是否有按键按下
      {
        GPIO_KEY=0x0f;      //高4位置0,低4位置1,列扫描
        switch(GPIO_KEY)
        {
          case(0x07):KeyValue=1;break;    //检测到第1列有按键按下,令KeyValue=1
          case(0x0b):KeyValue=2;break;    //检测到第2列有按键按下,令KeyValue=2
          case(0x0d):KeyValue=3;break;    //检测到第3列有按键按下,令KeyValue=3
          case(0x0e):KeyValue=4;break;    //检测到第4列有按键按下,令KeyValue=4      
        }
       GPIO_KEY=0xf0;       //高4位置1,低4位置0,行扫描
       switch(GPIO_KEY)            
        {
        
          case(0x70):KeyValue=KeyValue;break;      //检测到第1行有按键按下,则令KeyValue=KeyValue
          case(0xb0):KeyValue=KeyValue+4;break;      //检测到第2行有按键按下,则令KeyValue=KeyValue+4
          case(0xd0):KeyValue=KeyValue+8;break;      //检测到第3行有按键按下,则令KeyValue=KeyValue+8
          case(0xe0):KeyValue=KeyValue+12;break;  //检测到第4行有按键按下,则令KeyValue=KeyValue+12         
        }
        while((a<50)&&(GPIO_KEY!=0xf0))     //按键消抖
        {
          delay(1000);
          a++;
        }
      }
    }
}

void main()
{
     
     while(1)      //死循环,令系统一直工作
       {        
         KeyDown();       //调用矩阵按键扫描子程序
        
         if((KeyValue>0)&&(KeyValue<10))    //扫描得到的结果小于10时
         {
           LSA=0;
           LSB=0;
           LSC=0;       //输入138译码器,选中/Y0,第一个数码管(个位)
           GPIO_DIG=smg[KeyValue];     //显示数值,即病房号
           delay(1000);                 //延时
           beep=~beep;                 
           delay(100);                   //给蜂鸣器一个脉冲,使其工作,进行呼叫
         }
         
        if((KeyValue>=10))        //扫描得到的结果大于等于10时
        {
           LSA=0;        //数码管动态显示结果
           LSB=0;
           LSC=0;       //输入138译码器,选中/Y0,第一个数码管(个位)
           GPIO_DIG=smg[KeyValue%10];  //得到结果与10相除,取余数,即个位数
           delay(100);
           GPIO_DIG=0x00;     //消除残影

           LSA=1;
           LSB=0;
           LSC=0;          //输入138译码器,选中/Y1,第二个数码管(十位)
           GPIO_DIG=smg[KeyValue/10];     //得到结果与10相除,取商,即十位数
           delay(100);
           GPIO_DIG=0x00;       //消除残影

           delay(1000);
           beep=~beep;
           delay(100);           //给蜂鸣器一个脉冲,使其工作,进行呼叫
        }
         if(K1==0)               //独立按键K1按下,即护士"响应"
        {
           delay(1000);           //消除按键抖动
           if(K1==0)
           {
             KeyValue=0;        //确定K1按下,护士"响应",使数码管显示数值置零,恢复初始状态   
           }
           while(!K1);            //按键松开,进行系统重置操作
           LSA=1;                //恢复开始状态
           LSB=1;
           LSC=1;
           GPIO_DIG=smg[KeyValue];     //选中最后一个数码管置0,表示初始状态
        }                  
       }
}


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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