实验(十一)按键-LCD1602综合实验

一.实验目的、内容、仪器

实验目的:1.了解单片机串口接收与发送方法

                    2.1602的显示原理

                    3.了解单片机串口中断服务函数用法

实验内容:模拟病房呼叫系统

  1. led-1602显示  请求数:0
  2. 1~8号按键代表病人编号,9号按键代表应答(每次只能应答一个请求)
  3. 第三行显示当前病人编号,最先请求的编号在左,中间空格;有按键按下后,刷新显示,先按下的请求键,优先级高,优先被应答

 二.程序流程图

 

 三.代码实现

#include <reg52.h>   //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义    变量范围0~255
#define uint  unsigned int     //无符号整型 宏定义    变量范围0~65535
uchar code table_num[]="0123456789abcdefg";
sbit rs=P2^7;     //寄存器选择信号 H:数据寄存器      L:指令寄存器
sbit rw=P2^6;     //寄存器选择信号 H:数据寄存器      L:指令寄存器
sbit e =P2^5;     //片选信号   下降沿触发
sbit beep = P2^4;
sbit key_quxiao = P2^0;      //取消键
uchar i;
bit flag_300ms ;    //300ms的标志位
sbit led1 = P1^0;   //第1号病房指示灯
sbit led2 = P1^1;   //第2号病房指示灯
sbit led3 = P1^2;   //第3号病房指示灯
sbit led4 = P1^3;   //第4号病房指示灯
sbit led5 = P1^4;   //第5号病房指示灯
sbit led6 = P1^5;   //第6号病房指示灯
sbit led7 = P1^6;   //第7号病房指示灯
sbit led8 = P1^7;   //第8号病房指示灯
uchar dis_lcd[8];   //8个病房数据显示的缓冲区
uchar br_geshu;     //报警病人数
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i
for(j=0;j<120;j++);
}
/***********************
延时函数
************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************
lcd1602写命令函数
************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602写数据函数************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************
lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0')  break;
write_data(*p);
p++;
}
}
/***********************
lcd1602上显示这字符函数************************/
void write_string_ge(uchar hang,uchar add,uchar *p,uchar ge)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
for(i=0;i
write_data(*p++);
}
/***********************
lcd1602初始化设置
************************/
void init_1602()     //lcd1602初始化设置
{
write_com(0x38);    //
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0," bingfang hujiao ");
write_string(2,0,"  wu bingren    ");
}
/*********************
定时器0初始化
******************/
void time0_init()
{
EA  = 1;           //开总中断
TMOD = 0X01;      //定时器0、工作方式1
ET0 = 1;          //开定时器0中断
TR0 = 1;          //允许定时器0定时
}
/********************独立按键程序*****************/
uchar key_can;     //按键值
void key()     //独立按键程序
{
if((P3 & 0xff) != 0xff)        //按键按下
{
delay_1ms(1);             //按键消抖动
if((P3 & 0xff) != 0xff)
{                        //确认是按键按下
switch(P3 & 0xff)
{
case 0xfe:  key_can = 1;  break;     //得到按键值
case 0xfd:  key_can = 2;  break;     //得到按键值
case 0xfb:  key_can = 3;  break;     //得到按键值
case 0xf7:  key_can = 4;  break;     //得到按键值
case 0xef:  key_can = 5;  break;     //得到按键值
case 0xdf:  key_can = 6;  break;     //得到按键值
case 0xbf:  key_can = 7;  break;     //得到按键值
case 0x7f:  key_can = 8;  break;     //得到按键值
}
}
}
}
void key_qx()     //取消按键程序
{
key_quxiao = 1;                     //对应的按键IO口输出为1
if(key_quxiao == 0)        //按键按下
{
delay_1ms(1);             //按键消抖动
if((key_quxiao == 0))
{                        //确认是按键按下
key_can = 9;
}
}
}
/**********************
按键处理函数
************************/
void key_with()
{
uchar i;
if(key_can <= 8)
{
if(key_can == 1)
led1 = 1;      //1号病房灯亮
if(key_can == 2)
led2 = 1;      //2号病房灯亮
if(key_can == 3)
led3 = 1;      //3号病房灯亮
if(key_can == 4)
led4 = 1;      //4号病房灯亮
if(key_can == 5)
led5 = 1;      //5号病房灯亮
if(key_can == 6)
led6 = 1;      //6号病房灯亮
if(key_can == 7)
led7 = 1;      //7号病房灯亮
if(key_can == 8)
led8 = 1;      //8号病房灯亮
if(br_geshu < 8)
{
if(br_geshu == 0)     //第一次清除显示屏
write_string(2,0,"               ");
br_geshu ++;               //呼叫病人的人数加1
dis_lcd[0] = table_num[key_can] ;    //把病人的号码保存起来
for(i=7;i>0;i--)
dis_lcd[i] = dis_lcd[i-1] ;     //把病人的数据向后移一位
write_string_ge(2,0,dis_lcd,br_geshu);     //显示出来
}
}
if(key_can == 9)   //取消键的处理
{
if(br_geshu > 0)
{
if(dis_lcd[br_geshu] == '1')
led1 = 0;      //1号病房灯灭
if(dis_lcd[br_geshu] == '2')
led2 = 0;      //2号病房灯灭
if(dis_lcd[br_geshu] == '3')
led3 = 0;      //3号病房灯灭
if(dis_lcd[br_geshu] == '4')
led4 = 0;      //4号病房灯灭
if(dis_lcd[br_geshu] == '5')
led5 = 0;      //5号病房灯灭
if(dis_lcd[br_geshu] == '6')
led6 = 0;      //6号病房灯灭
if(dis_lcd[br_geshu] == '7')
led7 = 0;      //7号病房灯灭
if(dis_lcd[br_geshu] == '8')
led8 = 0;      //8号病房灯灭
dis_lcd[br_geshu] = ' ';
br_geshu --;               //呼叫病人的人数减1
write_string_ge(2,0,dis_lcd,br_geshu);
if(br_geshu == 0)     //取消到最后一次清显示屏
{
write_string(2,0,"  wu bingren    ");
}
}
}
}
/*****************主函数********************/
void main()
{
time0_init();         //初始化定时器
init_1602();         //lcd1602初始化
while(1)
{
key();     //独立按键程序
key_qx();     //取消按键程序
key_with();
if(flag_300ms == 1)
{
flag_300ms = 0;
if(br_geshu > 0)
beep = ~beep;   //蜂鸣器报警
else
beep = 1;       //取消报警
}
}
}
/**************
定时器0中断程序
*****************/
void time0() interrupt 1
{
uchar value;
TH0 = 0X3C;
TL0 = 0XB0;       //50ms
value ++;
if(value >= 6)             //300ms
{
value = 0;
flag_300ms = 1;
}
}

 四.实验步骤

(1)建立keil工程,选择单片机型号

(2)给工程创建源码文件,并以.c结尾,添加文件到源组里

(3)生成hex文件,点击魔术棒,在output中勾选Create HRX_File

(4)对代码进行编译,调试debug,点击USE,在下拉菜单里选中“Proteus VSM Monitor 一 51 ”进行设置

(5)将程序导入到单片机中运行,双击单片机,选择生成的hex文件

(6)在keil中启动调试,开始运行。

五.结果及讨论

病房呼叫系统是住院病人及其家属在需要医务人员帮助时,请求值班护士进行护理的重要呼叫工具,它主要用于协助医院里的病人在病床上方便地呼叫值班人员,可以快速的将病人的请求传送给值班人员,是提高医院的病房护理水平的必备设备之一。随着社会节奏的不断加快,医院行业的竞争越来越激烈,对经济效益的追逐成为很多私立医院的生存第一要位,提升服务水平和服务质量迫在眉睫,陪护问题一直是医患矛盾的主要体现,也是长期以来困扰广大医务服务者的大问题,使用病房呼叫系统,方便患者迅速而快捷的找到医生,以节约患者的珍贵时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值