www.pudn.com > TG12864.rar > jingsai.c
#include#include #include ////////////////////////////////////////////////////////////////////////////////// #define uchar unsigned char #define uint unsigned int #define ulong unsigned long //管脚及变量定义//////////////////////////////////////////////////////////////// //define ADS1100 begain #define GENERATE_STOP 0x54 /* 置位 STO, 复位 STA 、 SI */ #define RELEASE_BUS_ACK 0x44 /* 复位 STO,STA,SI 并置位 AA (ack) */ #define RELEASE_BUS_NOACK 0x40 /* 复位 STO,STA,SI 并置位 AA (noack) */ #define RELEASE_BUS_STA 0x64 /* 起动总线/重新起动总线, 置位 STA */ #define sla 0x90 #define wcr 0x1c uchar idata a[3]; uint idata output; uchar dat; //#define R 1 //define ADS1100 end //define dac begain sbit SS = P0^4; //define dac end //define LCD and key begain sbit A0 = P2^1; sbit CS = P2^4; sbit inc = P0^0; sbit dec = P0^1; sbit kinc = P0^2; sbit kdec = P0^3; uchar bdata oldkey; sbit old_inc =oldkey^1; sbit old_dec =oldkey^2; sbit old_kinc =oldkey^3; sbit old_kdec =oldkey^4; sbit key_kinc =oldkey^5; sbit key_kdec =oldkey^6; uchar bdata key; sbit key_inc =key^1; sbit key_dec =key^2; sbit sktemp =key^4; //sbit allowmenudis = key^7; sbit fast_inc =key^5; sbit fast_dec =key^6; //uchar count1; //uchar count2; uint Itemp; uint value=20; uint value1; //uint outdata; //long tempdat; //define LCD and key end //函数列表////////////////////////////////////////////////////////////////// //define funtion table begain void delay(uchar v); void dacspi (uchar i); void writedac(uint dat,bit dot); //define function table end //define LCD function table begain void wcode(uchar i); void wdata(uchar i); void clrsrc(void); void shownum(uchar lin,uchar col,uint num,uchar res); void showhz(uchar lin,uchar col,uint hzcode1); void dispnum(uchar lin,uchar col,uint val,uchar res); void showhex(uchar lin,uchar col,uint num,uchar res); void shownum(uchar lin,uchar col,uint num,uchar res); //define LCD function table end //ads1100 function table void GetBus(); void SendByte(uchar c); uchar ISendByte( uchar c); bit IRcvStrExt(void); //ads1100 function table code uchar numtable[10*16]= { /*-- 文字: 0 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, /*-- 文字: 1 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, /*-- 文字: 2 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, /*-- 文字: 3 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, /*-- 文字: 4 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, /*-- 文字: 5 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, /*-- 文字: 6 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, /*-- 文字: 7 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, /*-- 文字: 8 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, /*-- 文字: 9 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, }; code uchar hextable[3*16]= { /*-- 文字: m --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, /*-- 文字: A --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, /*-- 文字: : --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, }; code uchar hztable[6*32]= { /*-- 文字: 设 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00, 0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00, /*-- 文字: 定 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x20,0x18,0x07,0x08,0x10,0x20,0x7F,0x42,0x42,0x42,0x42,0x40,0x40,0x00,0x00, 0x00,0x10,0x0C,0xA4,0x24,0x24,0x25,0xE6,0x24,0x24,0x24,0x24,0x14,0x0C,0x04,0x00, /*-- 文字: 实 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0A,0x07,0x0A,0x12,0xE2,0x42,0x02,0x02,0x00, 0x00,0x10,0x0C,0x04,0x4C,0xB4,0x94,0x05,0xF6,0x04,0x04,0x04,0x14,0x0C,0x04,0x00, /*-- 文字: 际 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0xFF,0x00,0x02,0x04,0x13,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x02,0x1C,0x08,0x00, 0xFE,0x02,0x22,0x5A,0x86,0x20,0x20,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x20,0x00, /*-- 文字: 电 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00, 0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00, /*-- 文字: 流 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x04,0x04,0xFC,0x03,0x40,0x30,0x0F,0x00,0x00,0x7F,0x00,0x3F,0x40,0x40,0x70,0x00, 0x10,0x60,0x01,0x86,0x60,0x04,0x44,0x64,0x55,0x4E,0x44,0x64,0xC4,0x04,0x04,0x00, }; //LCD programme begain /*******************************通过spi写显示命令程序***********************************************/ //写控制命令到lcd void wcode (uchar i) //A0=0,CS=0 { SPCTL=0xdc; SPSTAT=0xc0; CS=1;//_nop_(); A0=0;//nop_(); CS=0;_nop_(); SPDAT=i; while(1) { if(SPSTAT&0x80) break; } CS=1;//_nop_(); //SPSTAT=0xc0; } /****************************通过spi写显示数据程序**********************************************/ //写显示数据到lcd //A0=1,CS=0 void wdata (uchar i) { SPCTL=0xdc; SPSTAT=0xc0; CS=1;//_nop_(); A0=1;//_nop_(); CS=0;_nop_(); SPDAT=i; while(1) { if(SPSTAT&0x80) break; } CS=1;//_nop_(); //SPSTAT=0xc0; } /*******************************显示器初试化程序*************************************/ //液晶屏初始化 void init_12864(void) { /*函数名为lcd_init 的LCM初始化子函数*/ wcode(0xae);//开显示屏//0x00关显示;0x01开显示////1 wcode(0xa1); //设置ADC 为正常0---64 ///8 wcode(0xa6);//设置正常的开关状态/////9 wcode(0x2f);//设置能量控制16 wcode(0x81);wcode(0x08);//Electronic volume control setting 18 wcode(0xa2);//设置lcd bias///////11 wcode(0xc8);///选择输出状态寄存器////15 wcode(0xa5);//全屏亮///10 //delay(4); ////// wcode(0xa4); //正常显示////// 10 wcode(0x40);//从第一行开始显示//////2 clrsrc();//清屏 /// wcode(0xaf);//开显示屏//0x00关显示;0x01开显示////1 } /*********************************显示器清屏程序***************************************/ void clrsrc(void) /* 清显示屏*/ { uchar i,j; uchar temp,temp_h,temp_l; for(i=0;i<8;i++) { wcode(0xB0|i); for(j=0;j<132;j++) { temp_l=j&0x0f; temp=(j&0xf0)>>4; temp_h=temp&0x0f; wcode(temp_h|0x10); wcode(temp_l|0x00); wdata(0x00); } } } /**********************************显示8*16数字程序****************************************/ void shownum(uchar lin,uchar col,uint num,uchar res)/*显示 16*8 点阵的数,每行可显示15个数字*/ { /*res为反显标志,res=0:正显;res=1:反显*/ uchar i,fxdat; uchar temp,temp_h,temp_l; uint numcode; numcode=num*16; lin=lin*2; temp_l=(col*8)&0x0f; temp=((col*8)&0xf0)>>4; temp_h=temp&0x0f; if(col>15) return; wcode(0xB0|lin+1); wcode(temp_h|0x10); wcode(temp_l|0x00); for(i=0;i<8;i++) { if(res==0) { wdata(numtable[numcode+i]); } else { fxdat=~numtable[numcode+i]; wdata(fxdat); } } wcode(0xB0|lin); wcode(temp_h|0x10); wcode(temp_l|0x00); for(i=0;i<8;i++) { if(res==0) { wdata(numtable[numcode+i+8]); } else { fxdat=~numtable[numcode+i+8]; wdata(fxdat); } } } /*********************************显示8*16数字程序*********************************************/ void showhex(uchar lin,uchar col,uint num,uchar res)/*显示 16*8 点阵的数,每行可显示15个数字*/ { /*res为反显标志,res=0:正显;res=1:反显*/ uchar i,fxdat; uchar temp,temp_h,temp_l; uint numcode; numcode=num*16; lin=lin*2; temp_l=(col*8)&0x0f; temp=((col*8)&0xf0)>>4; temp_h=temp&0x0f; if(col>15) return; wcode(0xB0|lin+1); wcode((temp_h)|0x10); wcode((temp_l+2)|0x00); for(i=0;i<8;i++) { if(res==0) { wdata(hextable[numcode+i]); } else { fxdat=~hextable[numcode+i]; wdata(fxdat); } } wcode(0xB0|lin); wcode((temp_h)|0x10); wcode((temp_l+2)|0x00); for(i=0;i<8;i++) { if(res==0) { wdata(hextable[numcode+i+8]); } else { fxdat=~hextable[numcode+i+8]; wdata(fxdat); } } } /**************************四位数显示程序******************************************/ void dispnum(uchar lin,uchar col,uint val,uchar res) {uint th,hu,ten,sig,temper0,temper1; if((val<10)&&(val>=0)) { sig=val; shownum(lin, col+3,sig,res); shownum(lin,col+2,0,res); shownum(lin,col+1,0,res); shownum(lin,col,0,res); } if((val<100)&&(val>=10)) { sig=val%10; ten=(val-val%10)/10; shownum(lin, col+3,sig,res); shownum(lin,col+2,ten,res); shownum(lin,col+1,0,res); shownum(lin,col,0,res); } if((val<1000)&&(val>=100)) { temper0=val%100; sig=temper0%10; ten=(temper0-temper0%10)/10; hu=(val-ten*10-temper0%10)/100; shownum(lin,col+3,sig,res); shownum(lin,col+2,ten,res); shownum(lin,col+1,hu,res); shownum(lin,col,0,res); } if((val<10000)&&(val>=1000)) { temper0=val%1000; temper1=temper0%100; sig=temper1%10; ten=(temper1-temper1%10)/10; hu=(temper0-ten*10-temper1%10)/100; th=(val-hu*100-ten*10-temper1%10)/1000; shownum(lin,col+3,sig,res); shownum(lin,col+2,ten,res); shownum(lin,col+1,hu,res); shownum(lin,col,th,res); } } /******************************显示16*16汉字程序***********************************/ void showhz(uchar lin,uchar col,uint hzcode1)/*显示16*16点阵的汉字,每行显示8个汉字,共显示4行8列汉字*/ { /*hzcode1为字模数组的每个汉字的首地址*/ uchar i; uchar temp,temp_h,temp_l; uint hzcode; hzcode=hzcode1*32; lin=lin*2; temp_l=(col*16+2)&0x0f; temp=((col*16)&0xf0)>>4; temp_h=temp&0x0f; if(col>8) return; wcode(0xB0|lin+1); wcode(temp_h|0x10); wcode((temp_l)|0x00); for(i=0;i<16;i++) { wdata(hztable[hzcode+i]); } wcode(0xB0|lin); wcode(temp_h|0x10); wcode((temp_l)|0x00); for(i=0;i<16;i++) { wdata(hztable[hzcode+i+16]); } } /******************************键盘扫描及处理程序***************************************/ ///keyscan programme begain void getkey(void) { sktemp=inc; if(old_inc&!sktemp){key_inc=1;} old_inc=sktemp; sktemp=dec; if(old_dec&!sktemp){key_dec=1;} old_dec=sktemp; sktemp=kinc; if(old_kinc&!sktemp){key_kinc=1;} old_kinc=sktemp; sktemp=kdec; if(old_kdec&!sktemp){key_kdec=1;} old_kdec=sktemp; if(key_inc==1) { key_inc=0; ++value; Itemp=2000; if(value>Itemp)value=2000; } if(key_dec==1) { key_dec=0; Itemp=20; if(value==Itemp)value=20; else --value; } if(key_kinc==1) { key_kinc=0; value=value+10; Itemp=2000; if(value>Itemp)value=2000; } if(key_kdec==1) { key_kdec=0; Itemp=20; if(value programme begain /********************延时子程序***********************************/ //void delay(uchar v) //{ // while(v!=0) v--; //} /*********************通过spi口写8位数据到TLV538***************************************/ void dacspi (uchar i) { //SPSTAT=0xc0; SPDAT=i; while(1) { if(SPSTAT&0x80) break; } SPSTAT=0xc0; } /*****************************写16位数据到TLV5638并输出电压******************************************/ void writedac(uint dat,bit dot) { uint temp; uchar temp1,temp2; SPCTL=0xd8; SPSTAT=0xc0; temp=dat; if (dot==1) { temp=temp|0xd000; } else { temp=temp|0xc000; } temp1=temp&0x00ff; temp=temp>>8; temp2=temp&0x00ff; SS=0; dacspi(temp2); dacspi(temp1); SS=1; } //dac programme end //ads1100 programme begain /******************************************************************* * 申请总线 * 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。 * I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。 *******************************************************************/ void GetBus() { I2SCLH = 25; /* 设置SCL高电平的PCLK周期数 */ I2SCLL = 25; /* 设置SCL低电平的PCLK周期数,6MHz时为100Kbit/S */ /* 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位。 */ I2CON = RELEASE_BUS_STA; while( SI==0 ); /* 等待起始位的发送 */ } /******************************************************************* * 发送数据函数 * 功能:用于向总线发送数据 * 入口参数:ACC 待发送的数据 *******************************************************************/ void SendByte(uchar c) { I2DAT = c; I2CON = RELEASE_BUS_ACK; /* 清除SI位等等 */ while( SI==0 ); /* 等待数据的发送 */ } /******************************************************************* * 向无子地址器件发送字节数据函数 * 功能:从启动总线到发送地址,数据,结束总线的全过程。 * 入口参数:sla 从器件地址 * c 待发送的数据 * 出口参数:返回1表示操作成功,否则操作有误。 ********************************************************************/ uchar ISendByte( uchar c) { GetBus(); /* 启动总线 */ SendByte(sla); /* 发送器件地址,并接收应答位 */ if( I2STAT!=0x18 ) /* 无从机应答则退出操作 */ { I2CON = GENERATE_STOP; return(0); } SendByte(c); /* 发送数据 */ if( I2STAT!=0x28 ) { I2CON = GENERATE_STOP; return(0); } I2CON = GENERATE_STOP; /* 结束总线 */ return(1); } /******************************************************************* * 向无子地址器件读取多字节数据函数 *功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。 *入口参数:sla 从器件地址 * s 读出的内容存储区的指针 * no 读no个字节。 *出口参数:函数返回1表示操作成功,否则操作有误。 ********************************************************************/ bit IRcvStrExt(void) { uchar i; GetBus(); /* 启动总线 */ SendByte(sla+1); if( I2STAT!=0x40 ) { I2CON = GENERATE_STOP; return(0); } for(i=0; i<2; i++) { I2CON = RELEASE_BUS_ACK; /* 接收一字节数据并发送应答位 */ while( SI==0 ); /* 等待接收数据 */ if( I2STAT!=0x50 ) { I2CON = GENERATE_STOP; return(0); } a[i] = I2DAT; /* 读取数据 */ } I2CON = RELEASE_BUS_NOACK; /* 接收最后一字节数据并发送非应答位 */ while( SI==0 ); a[2] = I2DAT; I2CON = GENERATE_STOP; /* 结束总线 */ output=(uint)a[0]; output=output<<8; output=output+a[1]; dat=a[2]; return(1); } /******************************TLV5638显示数据处理子程序***********************************/ void tacklenum(void) { // uint temp; // temp=output/512; // temp=temp*33; // temp=temp/64; // temp=temp*100; // value1=(uint)temp; ulong temp; temp=output*2; temp=temp/16; temp=temp*10; temp=temp/16; temp=temp*10; temp=temp/16; temp=temp*33; temp=temp/16; // temp=temp*100; value1=(uint)temp; // tempdat=value; // tempdat=2*(2*tempdat-19)-value1; // outdata=(uint)tempdat; dispnum(2,10,value1,0); } //ads1100 programme end /****************************主函数******************************/ void main(void) { uchar loop; P1M1=0x0c;P1M2=0x0c; P0M1=0x00;P0M2=0x00; //端口init P2M1=0x00;P2M2=0x00; init_12864(); //LCD init SS=1; //adc init writedac(0x0001,1); ISendByte(wcr); while(1) { dispmenu(); getkey(); //writedac(outdata,0); //writedac(2*(2*value-19)-value1,0); writedac(2*value-19-6,0); ISendByte(wcr|0x80); while(1) { ++loop; IRcvStrExt(); if(loop==5) break; if(a[2]==0x1c) break; } tacklenum(); } }