LCD_EN = 0 ; _nop_() ; _nop_() ; P0 = cmd ; delayNOP() ; LCD_EN = 1 ; delayNOP() ; LCD_EN = 0 ; }
/*******************************************************************/ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/ void lcd_wdat(uchar dat)
{ while(lcd_busy()) ; LCD_RS = 1 ; LCD_RW = 0 ; LCD_EN = 0 ; P0 = dat ; delayNOP() ; LCD_EN = 1 ; delayNOP() ; LCD_EN = 0 ; }
/* LCD初始化设定 */ /*******************************************************************/ void lcd_init() {
delay1(15) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容 lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据 delay1(5) ;
lcd_wcmd(0x38) ; delay1(5) ;
lcd_wcmd(0x38) ; delay1(5) ;
36
lcd_wcmd(0x0c) ; //显示开,关光标 delay1(5) ;
lcd_wcmd(0x06) ; //移动光标 delay1(5) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容 delay1(5) ; }
/* 设定显示位置 */
/*******************************************************************/ void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量 }
///数据位分离
void sbitseparate(uchar a,uchar b,uchar c,uchar d) {
shuju_sbit[0]=a;
shuju_sbit[1]=b/10; //房号 shuju_sbit[2]=b; shuju_sbit[3]=c/10; //次数 shuju_sbit[4]=c; shuju_sbit[5]=d; }
///显示数据
void display(flag) { sbitseparate(shuju[flag][0],shuju[flag][1],shuju[flag][2],shuju[flag][3]);
lcd_pos(0x03) ;
lcd_wdat(shuju_sbit[0]+'0') ; //组号 lcd_pos(0x05) ;
lcd_wdat(shuju_sbit[1]+0x30) ; // 房号 lcd_pos(0x06) ;
lcd_wdat(shuju_sbit[2]+0x30) ; // lcd_pos(0x08) ;
lcd_wdat(shuju_sbit[3]+0x30) ; //呼叫次数 lcd_pos(0x09) ;
lcd_wdat(shuju_sbit[4]+0x30) ; // lcd_pos(0x0B) ;
37
lcd_wdat(shuju_sbit[5]+0x30) ; // 是否应答 }
void fasong() {
Led=0; P2=0x00; EA=0; //保证数据发送完
P2=shuju[flag-1][1]&0x0f; //要是这样就把sendd变为0了,没有电源就不能发送了
sendd=1;
delay10ms(10);//延时100ms sendd=0; EA=1; Led=1; }
//数据初使化 void data_init() {
TCON = 0x00;
IT0=1; //负边沿触发 IE = 0x00; EA=1; EX0=1; flag=1; Led=1; sendd=0;
Ok_Menu (); }
void jieshou_dat() {
uchar a,b,c,d; Led=0; temp=P1&0x0f; delay10ms(50); Led=1;
a=(temp<<3)&0x08; //数据位的第四位和第一位反了,第二位和第三位反了
38
b=(temp<<1)&0x04; c=(temp>>1)&0x02; d=(temp>>3)&0x01; temp=a|b|c|d; }
//************************************** // INT0中断
//************************************** void int00(void) interrupt 0 { EX0=0; jieshou_dat(); data_chuli(); //有信号则进行对信号的处理 // display(flag-1); EX0=1; }
/********************************************** 对于有呼叫的时候对信号的处理
**************************************************/ void data_chuli() {
uchar i,j;
if((0x00==temp)||(0x0f==temp)) //防干扰 goto abc; jieshou=1; if(0==shuju[0][0]) { for(i=1;i<9;i++) shuju[i-1][0]=shuju[i-1][0]+1; } for(i=1;i<8;i++) //i从1到7变化 temp为收到的数据 对了 { if(shuju[i-1][1]==temp) //判断呼叫的地址是否与已有的地址相同 即房号 ////////////////////////////////
39
{ flag=i; //保存地址相同的数组的标号 flag2=1; } } if(flag2==1) //有地址相同就呼叫加一 { shuju[flag-1][2]=shuju[flag-1][2]+1; //呼叫次数加1 shuju[flag-1][3]=0; //对应答进行清零 flag2=0; //标志清零 } else //如果房号没有,数据往后移 { for(i=8;i>1;i--) //数据转移 for(j=1;j<4;j++) shuju[i-1][j]=shuju[i-2][j]; // for(i=1;i<4;i++) //测试用的移入数据,实际用时是传过来的数据(房号) // shuju[1][1]=temp; // 存入房号 flag=1; //当前显示呼叫的病房的信息 shuju[0][1]=temp; //存入房号 ///////////////////////////////////////////////// shuju[0][2]=0x01; //呼叫次数存入1 不用对应答清零,初始化时就是0x00了 } abc: ; }
/*************************************************** // 语音部分的程序 //
**************************************************/
//============================================================ //函数名称:void delay25ms() //函数功能:延迟25ms //日期:2007.03.31
//============================================================ void delay25ms()
40