您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于AT89S52LCD12864仪器仪表的键盘显示模拟系统
//名称:仪器仪表的键盘显示模拟系统////晶振:12Mhz////编写:韦宏谋////日期:2011.1.9//#includereg52.h#includeintrins.h#defineucunsignedchar#defineuiunsignedint#definenop()_nop_()#defineDBP0//12864D0-D7输出I/O口bitclr_flag=0;//清屏标志1bitclr_flag2=0;//清屏标志2sbitRS=P2^7;sbitRW=P2^6;sbitEN=P2^5;sbitPSB=P2^4;sbitRST=P2^2;sbitseg_on=P2^0;//数码管状态控制charweek=0;//星期变量charhour=0,min=0,sec=0,date=1,month=1,year=11;//预置的时间和日期uckey_flag=0;//键盘标志uckey=0;//键盘变量ucdeda=0;//时钟变量ucstring[]=0123456789;ucaa=0x80,bb=0x90,cc=0x88,dd=0x98;//12864的DDRAM地址uccodebmp[],bmp1[],bmp2[],zk[],seg_code[];//图片、字符voidconv();//时钟走时单元函数声明//------------------------------------------////延时函数1////------------------------------------------//voiddelay(uit){uci,j;do{j=2;do{(i=165);do{nop();//n个nop}while(--i);}while(--j);}while(--t);}//可精确到1ms,计算公式:t总={[3j+(n+2)ij+3]t+5}T,T为晶振周期//------------------------------------------////延时函数2////------------------------------------------//voiddelay1(uicount){uci,j;for(i=0;icount;i++)for(j=0;j30;j++);}//------------------------------------------////定时器T0初始化////------------------------------------------//voidinit_timer(){TMOD=0x01;TH0=(65536-50000)/256;//加载高位TL0=(65536-50000)%256;//加载低位IE=0x82;//启用定时器T0中断产生TR0=1;//启动定时器T0开始计时}//------------------------------------------////5ms定时中断程序////------------------------------------------//voidT0_srv(void)interrupt1using1{TH0=(65536-50000)/256;//定时器计时初始值TL0=(65536-50000)%256;deda++;//计数单元递增conv();}//------------------------------------------////各月份天数计算函数////------------------------------------------//voidinter_month(){switch(month){case1:case3:case5:case7:case8:case10:case12:{if(date=32){date=1;month++;}if(date=0)date=31;}break;//若是大月,则有31天case4:case6:case9:case11:{if(date=31){date=1;month++;}if(date=0)date=30;}break;//若是小月,则有30天case2:{if(year%4==0){if(date=30){date=1;month++;}if(date=0)date=29;}//闰年二月有29天else{if(date=29){date=1;month++;}if(date=0)date=28;}}break;//平年二月28天default:break;}}//------------------------------------------////时间、日期走时单元////------------------------------------------//voidconv(){if(deda==20){deda=0;sec++;//秒加1if(sec=60){sec=0;min++;if(min=60){min=0;hour++;if(hour=24){hour=0;date++;week++;if(week=7)week=0;inter_month();if(month=13){month=1;year++;if(year=100)year=0;}}}}}}//------------------------------------------////判断12864忙位////------------------------------------------//voidcheck(){RS=0;RW=1;delay1(1);EN=1;DB=0xff;while((DB&0x80)==0x80);EN=0;}//------------------------------------------////写指令////------------------------------------------//voidw_com(uccom){check();RS=0;RW=0;EN=1;DB=com;delay1(1);EN=0;delay1(1);//给EN高脉冲}//------------------------------------------////写数据////------------------------------------------//voidw_data(intdat){check();RS=1;RW=0;EN=1;DB=dat;delay1(1);EN=0;delay1(1);//给EN高脉冲}//------------------------------------------////写字符////------------------------------------------//voidw_hz(ucx,ucy,uccode*s){check();switch(x){case1:w_com(aa|y);break;case2:w_com(bb|y);break;case3:w_com(cc|y);break;case4:w_com(dd|y);break;}while(*s0){w_data(*s);s++;delay(1);}}//------------------------------------------////自定义字符代码////------------------------------------------//voidcgram(){inti;w_com(0x30);w_com(0x40);for(i=0;i16;i++){w_data(zk[i*2]);w_data(zk[i*2+1]);}}//------------------------------------------////12864清屏////------------------------------------------//voidclrscreen(){if(clr_flag==0){w_com(0x01);delay(1);clr_flag=1;}}//------------------------------------------////清屏2////------------------------------------------//voidclrscreen2()//供调整日期和时间时调用{if(clr_flag2==0){w_com(0x01);delay(1);clr_flag2=1;}}//------------------------------------------////写数据入GDRAM////------------------------------------------//voidw_gdram(ucdat){uci,j,k;ucx=0x80;//GDRAM水平地址ucy=0x80;//GDRAM垂直地址for(i=0;i2;i++){for(j=0;j32;j++){for(k=0;k8;k++){w_com(0x36);//设置为8位MPU接口,扩充指令集w_com(y+j);//垂直地址Yw_com(x+k);//水平地址Xw_com(0x30);w_data(dat);w_data(dat);}}x=0x88;//写下半屏幕}w_com(0x36);//打开绘图模式w_com(0x30);//恢复基本指令集,关闭绘图模式}//------------------------------------------////画满屏图片////------------------------------------------//voiddisp_img(uc*img){uci,j,k;ucx=0x80;//GDRAM水平地址ucy=0x80;//GDRAM垂直地址for(i=0;i2;i++){for(j=0;j32;j++){for(k=0;k8;k++){w_com(0x36);//设置为8位MPU接口,扩充指令集w_com(y+j);//垂直地址Yw_com(x+k);//水平地址Xw_com(0x30);w_data(*img++);w_data(*img++);}}x=0x88;//写下半屏幕}w_com(0x36);//打开绘图模式w_com(0x30);//恢复基本指令集,关闭绘图模式}//------------------------------------------////初始化12864////------------------------------------------//voidinit_lcd(){delay(45);//延时45ms//PSB=1;//8位并行口RST=1;//复位操作delay(1);RST=0;delay(1);RST=1;delay(1);//w_com(0x38);delay(5);//显示模式设置//w_com(0x38);delay(5);w_com(0x30);delay(5);//选择基本指令集w_com(0x30);delay(5);//选择8bit数据流w_com(0x0c);delay(5);//显示开及光标设置w_com(0x01);delay(5);//显示清屏w_com(0x06);delay(5);//显示光标移动设置}//------------------------------------------////键盘扫描程序////------------------------------------------//uckeyscan()//键盘扫描函数,使用行列反转扫描法{uccord_h,cord_l;//行列值中间变量P3=0x0f;//行线输出全为0cord_h=P3&0x0
本文标题:基于AT89S52LCD12864仪器仪表的键盘显示模拟系统
链接地址:https://www.777doc.com/doc-2568770 .html