logo资料库

基于单片机的病房呼叫系统.docx

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
//EDM12864B DRIVE// /************************************** PAGEADD 为页地址起使 TIERADD 为行地址起使 DIS_STARTADD 为开始命令 CTABLE 为汉字字库数组 ETABLE 为英文字库数组 ***************************************/ #include #define uchar unsigned char #define uint unsigned int #define High 1 #define Low 0 #define _nop {} #define PAGEADD 0xb8 #define TIERADD 0x40 #define DIS_STARADD 0xc0 uint key_value; sbit DI=P3^4; sbit E=P3^2; sbit CS1=P3^1; sbit CS2=P3^0; sbit RW=P3^3; sbit k1=P1^2; sbit k2=P1^3; sbit k3=P1^4; sbit k4=P1^5; sbit beep=P1^7; sbit k5=P1^6; //uchar ntable[]={61,49,57,60,19,49,62,49,60,63,55,2,0,0,6,22,56, //63,68,61,49,57,60,17,51,63,61};//email:analog2006@hotmail.com //uchar data voltage_display[8]; bit flag; uchar num; //标志位 /**************************** 中文字符表 显示"欢迎使用液晶模块" *****************************/ uchar code table2[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x60,0x00,0xFC,0x04,0x24,0x24,0x24, 0x25,0xE6,0x24,0x24,0x34,0xA6,0x04,0x00, 0x04,0x42,0x31,0x0F,0x00,0xFF,0x01,0x11, 0x09,0x07,0x09,0x51,0x81,0x7F,0x01,0x00,//病(0) 0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x45, 0xFE,0x44,0x44,0x44,0x64,0x46,0x04,0x00, 0x40,0x30,0x0F,0x20,0x10,0x08,0x04,0x03, 0xFF,0x01,0x02,0x04,0x18,0x30,0x10,0x00,//床(1) 0x00,0xFC,0x04,0x04,0xFE,0x04,0x14,0x64, 0x04,0xFC,0x44,0x22,0x33,0x82,0x00,0x00, 0x00,0x1F,0x08,0x08,0x1F,0x01,0x01,0x41, 0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x00,//呼(2) 0x00,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00, 0xFC,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, 0x00,0x1F,0x08,0x08,0x08,0x1F,0x00,0x00, 0x1F,0x08,0x08,0x04,0x04,0xFF,0x00,0x00,//叫(3) 0x00,0x02,0x22,0x22,0x32,0x2E,0xA2,0x62, 0x22,0x22,0x91,0x09,0x01,0x00,0x00,0x00, 0x00,0x00,0x42,0x22,0x1A,0x43,0x82,0x7E, 0x02,0x02,0x0A,0x13,0x66,0x00,0x00,0x00,//系(4) 0x20,0x30,0xAC,0x63,0x30,0x88,0xC8,0xA8, 0x99,0x8E,0x88,0xA8,0xCC,0x88,0x00,0x00, 0x22,0x67,0x22,0x12,0x92,0x40,0x30,0x0F, 0x00,0x00,0x3F,0x40,0x40,0x41,0x70,0x00,//统(5) 0x80,0x80,0x80,0xBE,0xA2,0xA2,0xA2,0xA2, 0xA2,0xA2,0xA2,0xBF,0x82,0xC0,0x80,0x00, 0x00,0x00,0x00,0x04,0x06,0x05,0x04,0x04, 0x44,0x84,0x44,0x3E,0x04,0x00,0x00,0x00,//号(6) 0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x45, 0xFE,0x44,0x44,0x44,0x64,0x46,0x04,0x00, 0x40,0x30,0x0F,0x20,0x10,0x08,0x04,0x03, 0xFF,0x01,0x02,0x04,0x18,0x30,0x10,0x00,//床(7) 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//一(7) 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x00, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,//二(7) 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84, 0x84,0x84,0x84,0xC4,0x86,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,//三(7) 0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04, 0x04,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00, 0x00,0x7F,0x20,0x28,0x24,0x23,0x20,0x20, 0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,//四(7) 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE, 0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3B, 0x3B,0x10,0x00,0x00,0x00,0x00,0x00,0x00 //!(7) }; /******************************** 显示用的延时函数 延时长度有参数 n 决定 *********************************/ Delay_nms(uchar n) { uchar a; for(;n>0;n--) { for(a=0;a<100;a++) { _nop; _nop; _nop; _nop; }; }; } /***************************************** DEM12864B 状态检测,从 EDM12864B 读出数 据检测标志位 BF ******************************************/ void LCD_Busy() { uchar busy; E=Low; DI=Low;
RW=High; while(1) { E=High; _nop; _nop; busy=P2;//读状态标志寄存器 _nop; E=Low; if((busy&0x90)==0)//检测 BF 和 RES 位,两者都为零时表示可进行写入 break; }; } /********************************* 写指令 **********************************/ void WRCommand_L(uchar command) { CS1=High; CS2=Low; LCD_Busy(); DI=Low; _nop; RW=Low; _nop; E=High; _nop; P2=command; _nop; E=Low; _nop; } void WRCommand_R(uchar command) { CS1=Low; CS2=High; LCD_Busy(); DI=Low; _nop; RW=Low; _nop;
E=High; _nop; P2=command; _nop; E=Low; _nop; } /*********************************** 写一个字节的显示数据 ************************************/ void WRdata_L(uchar ucdata) { } CS1=High; CS2=Low; LCD_Busy(); DI=High; _nop; RW=Low; _nop; E=High; _nop; P2=ucdata; _nop; E=Low; _nop; void WRdata_R(uchar ucdata) { CS1=Low; CS2=High; LCD_Busy(); DI=High; _nop; RW=Low; _nop; E=High; _nop; P2=ucdata; _nop; E=Low;
_nop; } /**************************************************** 字符为 16*16 显示,分为两个部分写入 32 个字节 前 16 个字节写入第一页(16*8),后 16 个字节写入 第二页(16*8) 左侧写入"欢迎",右侧写入"使用" *****************************************************/ C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp) { uchar k; C_Pagenum=PAGEADD|C_Pagenum; C_Tiernum=TIERADD|C_Tiernum; WRCommand_L(C_Pagenum); WRCommand_L(C_Tiernum); for(k=0;k<16;k++) { WRdata_L(table2[C_Temp*32+k]); }; C_Pagenum=C_Pagenum+1; WRCommand_L(C_Pagenum); WRCommand_L(C_Tiernum); for(k=0;k<16;k++) { } WRdata_L(table2[C_Temp*32+k+16]); }; C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp) { uchar k; C_Pagenum=PAGEADD|C_Pagenum; C_Tiernum=TIERADD|C_Tiernum; WRCommand_R(C_Pagenum); WRCommand_R(C_Tiernum); for(k=0;k<16;k++) { WRdata_R(table2[C_Temp*32+k]); }; C_Pagenum=C_Pagenum+1; WRCommand_R(C_Pagenum); WRCommand_R(C_Tiernum);
for(k=0;k<16;k++) { WRdata_R(table2[C_Temp*32+k+16]); }; } /********************************* 清除所有显示 RAM 内容 **********************************/ CLR_DisplayRAM() //清除显示 { uchar C_page,i,k; for(i=0;i<8;i++) { C_page=PAGEADD|i;//清除起始页为 0 WRCommand_L(C_page);//清除起始页写入 WRCommand_L(TIERADD);//清除起始行地址写入 WRCommand_R(C_page); WRCommand_R(TIERADD); for(k=0;k<64;k++) WRdata_L(0x00); WRdata_R(0x00);//lcm 的 ram 自动加一,只许循环 64 次即可 }; { }; } /********************************* 初始化 设置启使行 **********************************/ void Init_LCD(void) { CLR_DisplayRAM();//清除所有显示寄存器 WRCommand_L(DIS_STARADD); WRCommand_R(DIS_STARADD);//设置显示起始行地址 WRCommand_L(0x3f); WRCommand_R(0x3f);//开显示 } void key() { if(k1==0) //判断有无按键按下
{ Delay_nms(10); if(k1==0) { while(!k1); num=1; } } if(k2==0) { Delay_nms(10); if(k2==0) { while(!k2); num=2; } //判断有无按键按下 } { } { if(k3==0) //判断有无按键按下 Delay_nms(10); if(k3==0) { while(!k3); num=3; } if(k4==0) //判断有无按键按下 Delay_nms(10); if(k4==0) { while(!k4); num=4; } } if(k5==0) { Delay_nms(10); if(k5==0) { while(!k5); num=0; } } //判断有无按键按下
分享到:
收藏