晶振频率 22.1184MHz #include"reg52.h" #define open 0x3f #define close 0x3e #define row 0xc0 #define page 0xb8 #define line 0x40 #define OUT P1 sbit RESET=P3^4; sbit CS1=P3^2; sbit CS2=P3^3; sbit E=P3^7; sbit R_W=P3^5; sbit D_I=P3^6; sbit AD_CS=P2^3; sbit AD_CLK=P2^1; sbit AD_IO=P2^2; /// 智(0) 能(1) 肺(2) 活(3) 量(4) 测(5) 仪(6) 毫(7) 升(8) static code unsigned char word[][2][16]={ 0x10,0x14,0x13,0x92,0x7E,0x32,0x52,0x92,0x00,0x7C,0x44,0x44,0x44,0x7C,0x00,0x00, 0x00,0x01,0x01,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,/*"智",0*/ 0x10,0xB8,0x97,0x92,0x90,0x94,0xB8,0x10,0x00,0x7F,0x48,0x48,0x44,0x74,0x20,0x00, 0x00,0xFF,0x0A,0x0A,0x4A,0x8A,0x7F,0x00,0x00,0x3F,0x44,0x44,0x42,0x72,0x20,0x00,/*"能",1*/ 0x00,0x00,0xFE,0x12,0x12,0xFE,0x04,0xE4,0x24,0x24,0xFF,0x24,0x24,0xE4,0x04,0x00, 0x40,0x30,0x0F,0x21,0x41,0x3F,0x00,0x1F,0x00,0x00,0xFF,0x08,0x10,0x0F,0x00,0x00,/*"肺",2*/ 0x10,0x60,0x01,0xC6,0x30,0x20,0x24,0x24,0x24,0xFC,0x22,0x22,0x22,0x22,0x20,0x00, 0x04,0x04,0xFF,0x00,0x00,0x00,0xFE,0x42,0x42,0x43,0x42,0x42,0xFE,0x00,0x00,0x00,/*"活",3*/ 0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00, 0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,/*"量",4*/ 0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00, 0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,/*"测",5*/ 0x40,0x20,0xF0,0x0C,0x03,0x00,0x38,0xC0,0x01,0x0E,0x04,0xE0,0x1C,0x00,0x00,0x00, 0x00,0x00,0xFF,0x00,0x40,0x40,0x20,0x10,0x0B,0x04,0x0B,0x10,0x20,0x60,0x20,0x00,/*"仪",6*/ 0x00,0x82,0x82,0x82,0xBA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xBA,0x82,0x82,0x82,0x00, 0x00,0x01,0x20,0x28,0x2A,0x2A,0x2A,0x7E,0xAA,0xAA,0xAA,0xA8,0xA0,0x81,0xE0,0x00,/*"毫",7*/ 0x00,0x40,0x44,0x44,0x44,0xFE,0x42,0x42,0x40,0x40,0xFE,0x40,0x40,0x60,0x40,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,/*"升",8*/ }; /// static code unsigned char letter[][2][8]={ /字符为8*16格式 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/ 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/ 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/ 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/ 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/ 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/ 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/ 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/ 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*":",10*/ }; /// unsigned char writepage=0,writeline=0; unsigned char circlemax=3,circle=0; unsigned char temp; union thetime{unsigned long total; struct{unsigned char timeH1,timeH0,timeL1,timeL0;}time; }sum; union thenum {unsigned int total; struct{unsigned char numH,numL;}numHL; }num; void initUart(void); void delay(unsigned char); void wtitedata(unsigned char); void writeorder(unsigned char); void clear(void); void sendpc(unsigned int carnum,unsigned long time,unsigned char circle,unsigned char circlemax); void sendlcm(unsigned int carnum,unsigned long time,unsigned char circle,unsigned char circlemax); void delay(unsigned char ms) {unsigned char i; for(;ms>0;ms--) for(i=100;i>0;i--) ; } void writedata(unsigned char _data) { delay(0); E=0; R_W=0; D_I=1; E=1; OUT=_data; E=0; //delay(1); } void writeorder(unsigned char _order) { delay(0); E=0; R_W=0; D_I=0; E=1; OUT=_order; E=0; //delay(1); } //清屏 void clear(void) { unsigned char t,i,j,pg,l; t=1; CS1=0; CS2=1; do { for(i=0;i<8;i++) { pg=page|i; writeorder(pg); l=line|0x00; writeorder(l); for(j=0;j<128;j++) { writedata(0x00); } } CS1=1; CS2=0; }while(t--); } ///******************************/// void out_word(unsigned char _page,unsigned char _line,unsigned char word_num,unsigned char back) { unsigned char i,j,k,wordbyte,order; char m; m=_line; if(m>127) m=127; k=0; // if(m<64) { CS1=1; CS2=0; for(j=0;j<2;j++) { order=_page+j; if(order>7) break; order=page|order; writeorder(order); order=line|m; writeorder(order); for(i=0;i<16&&((m+i)<64);i++) {wordbyte=word[word_num][j][i]; if(back>0) wordbyte=~wordbyte; writedata(wordbyte); } k=i; } } if((m+k)>=64) { m=(m+k)-64; CS1=0; CS2=1; for(j=0;j<2;j++) { writepage=_page+j; if(writepage>7) break; order=page|writepage; writeorder(order); writeline=m; order=line|writeline; writeorder(order); for(i=k;i<16&&((m+i)<64);i++) {wordbyte=word[word_num][j][i]; if(back>0) wordbyte=~wordbyte; writedata(wordbyte); } } } } / / void out_letter(unsigned char _page,unsigned char _line,unsigned char letter_num,unsigned char back) { unsigned char i,j,k,letterbyte,order; char m; m=_line; if(m>127) m=127; k=0; if(m<64) { CS1=1; CS2=0; for(j=0;j<2;j++) { order=_page+j; if(order>7) break; order=page|order; writeorder(order); order=line|m; writeorder(order); for(i=0;i<8&&((m+i)<64);i++) {letterbyte=letter[letter_num][j][i]; if(back>0) letterbyte=~letterbyte; writedata(letterbyte); } k=i; } } if((m+k)>=64) { m=(m+k)-64; CS1=0; CS2=1; for(j=0;j<2;j++) { writepage=_page+j; if(writepage>7) break; order=page|writepage; writeorder(order); writeline=m; order=line|writeline; writeorder(order); for(i=k;i<8&&((m+i)<64);i++) {letterbyte=letter[letter_num][j][i]; if(back>0) letterbyte=~letterbyte; writedata(letterbyte); } } } } // void initUart(void) { TMOD|=0x20; SCON=0x50; TH1=0xfa; TL1=0xfa; TR1=1; ET1=1; } void uart(void) interrupt 4 //串口中断 { if(RI) { RI=0; temp=SBUF; } else if(TI) TI=0; } / 发数据到上位机 void sendpc(unsigned int carnum,unsigned long time,unsigned char circle,unsigned char circlemax) { num.total=carnum; sum.total=time; SBUF=0x00; 表示开始 delay(10); SBUF=num.numHL.numH; delay(10); SBUF=num.numHL.numL; delay(10); SBUF=sum.time.timeH1; delay(10); SBUF=sum.time.timeH0; delay(10); SBUF=sum.time.timeL1; delay(10); SBUF=sum.time.timeL0; delay(10); SBUF=circle; delay(10); SBUF=circlemax; delay(10); SBUF=0xFF;表示结束 delay(10); } / void sendlcm(unsigned int carnum,unsigned long time,unsigned char circle,unsigned char circlemax) { unsigned char temp,temp2; carnum=carnum%10000; temp=carnum/1000; out_letter(2,50,temp,0); carnum=carnum%1000; temp=carnum/100; out_letter(2,60,temp,0); carnum=carnum%100; temp=carnum/10; out_letter(2,70,temp,0); temp=carnum%10; out_letter(2,80,temp,0); time=time%1000000; temp=time/100000; out_letter(4,40,temp,0); time=time%100000; temp=time/10000; out_letter(4,48,temp,0); time=time%10000; temp=time/1000; out_letter(4,56,temp,0); time=time%1000; temp=time/100; out_letter(4,68,temp,0); time=time%100; temp=time/10; out_letter(4,76,temp,0); temp=time%10; out_letter(4,84,temp,0); temp2=circle%100; temp=temp2/10; out_letter(6,20,temp,0); temp=temp2%10; out_letter(6,28,temp,0); temp2=circlemax%100; temp=temp2/10; out_letter(6,92,temp,0); temp=temp2%10; out_letter(6,100,temp,0); } // unsigned char TLC549(void) { unsigned char x,i,temp; temp=0; x=0; AD_CLK=0; AD_CS=1; delay(100); AD_CS=0; for(i=0;i<8;i++) { x=x<<1; AD_CLK=1; AD_CLK=0; temp=AD_IO; temp=temp&0x01; x=x+temp; } return x; } void main(void) { unsigned char order,i,temp; unsigned char adsum; unsigned int sum; unsigned long v; initUart(); //开显示 delay(1); delay(250); writeorder(close); delay(250); CS1=0; CS2=1; writeorder(open); CS1=1; CS2=0; writeorder(open); clear(); order=row|0x00; writeorder(order); order=page|0x00; writeorder(order); delay(1); /****************/ 智能肺活量测量仪 out_word(1,0,0,0); out_word(1,16,1,0); out_word(1,32,2,0); out_word(1,48,3,0); out_word(1,64,4,0); out_word(1,80,5,0); out_word(1,96,4,0); out_word(1,112,6,0); 肺活量: 毫升 out_word(5,0,2,0); out_word(5,16,3,0); out_word(5,32,4,0); out_letter(5,48,10,0); out_word(5,96,7,0); out_word(5,112,8,0); / / // sum.total=0x4f3f2f1f; // num.total=359; // sendlcm(num.total,sum.total,circle,circlemax); // sendpc(num.total,sum.total,circle,circlemax); while(1) { sum=0; v=0; for(i=0;i<20;i++) { delay(1); adsum=TLC549(); sum=sum+adsum; } delay(200); sum=sum/20; if(sum>0x60) sum=sum-0x66; else sum=0; SBUF=sum; delay(20); sum=sum%10000; temp=sum/1000; out_letter(5,64,temp,0); sum=sum%1000; temp=sum/100; out_letter(5,72,temp,0); sum=sum%100; temp=sum/10; out_letter(5,80,temp,0); sum=sum%10; temp=sum; out_letter(5,88,temp,0); } while(1); }