如下图所示:工程框架:
math.c
#include "reg52.h" #include "math.h" #define uchar unsigned char #define uint unsigned int
void draw(uchar x,uchar y);//画点函数 void clear_xy(uchar x,uchar y);///清点函数
/*画正弦波函数 */ void sin_lcd(void) { float x,y; for(x=0;x<128;x =0.15) { draw(x,y=20*sin(x*1/4) 32); } for(x=0;x<128;x =0.15) { clear_xy(x,y=20*sin(x*1/4) 32); } } /*画圆函数 */ void round(uchar x,uchar y,uchar r) { float angle; uchar dx,dy; for(angle=0;angle<3.14/4;angle =0.03)//0.03 { dx=r*sin(angle); dy=r*cos(angle); draw(x dx,y dy); draw(x-dx,y dy); draw(x dx,y-dy); draw(x-dx,y-dy); draw(x dy,y dx); draw(x-dy,y dx); draw(x dy,y-dx); draw(x-dy,y-dx); } } /*画椭圆函数 */ void ellipsoid(uchar x,uchar y,uchar a,uchar b) { float angle; uchar dx,dy; for(angle=0;angle<6.28;angle =0.06) { dx=a*sin(angle); dy=b*cos(angle); draw(x dx,y dy); draw(x dx,y-dy); draw(x-dx,y-dy); draw(x-dx,y dy); } } /*抛物线 */ void parabalo(float x) { for(;x<128;x =0.4) draw(x,x*x/256); } /*对数 */ void fan(float x) { for(;x<128;x =0.2) draw(x,30*log10(x)); } /**/ void nn(uchar x,uchar y,uchar R) { float angle,x0,y0,r1=15,r2=5; for(angle=0;angle<2*3.14*3;angle =0.03) { x0=(R-r1)*sin(angle)-r2*sin(R/r1*angle); y0=(R-r1)*cos(angle) r2*cos(R/r1*angle); draw(x x0,y y0); } } /* void beenline(float x,float y,float xe,float ye) { float dx,k; k=(ye-y)/(xe-x); dx=(xe-x)/128; for(;x<=xe;x =dx) { draw(x,k*x y); } } */ void Lin(uchar x1,uchar y1,uchar x2,uchar y2) { uint x=x1<<8,y=y1<<8; //高8位为坐标值,低8位为积分累加器 char dx=x2-x1,dy=y2-y1,mm,nn;
while( abs(dx)<64 && abs(dy)<64 && dx*dy!=0 ) {dx*=6;dy*=6;} ///调整插补速度 //2
while( (x>>8)!=x2 || (y>>8)!=y2) { draw(mm=x>>8,nn=y>>8); x =dx; y =dy; }
draw(x>>8,y>>8); //画终点 }
12864.c
#include"reg52.h" #include"math.h" #include"intrins.h" #include"function.h"
#define DB P0
sbit RS = P1^4; sbit RW = P1^5; sbit E = P1^6;
uchar code logo[] = {
/*-- 调入图像:I:\液晶屏BMP图\菜单.bmp --*/ /*-- 宽度x高度=128x64 --*/ 0x00,0x00,0x00,0x20,0x20,0x08,0x20,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x17,0xFC,0x13,0xF0,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0x20,0x50,0x08,0x12,0x20,0x24,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x4B,0xFC,0x40,0x08,0x02,0x20,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x48,0x20,0x47,0xC8,0x02,0x1C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x48,0x20,0x44,0x48,0xF4,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x79,0x20,0x44,0x48,0x1B,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x48,0xA0,0x47,0xC8,0x11,0x10,0x1F,0xE0,0x00,0x00,0x0,0x00,0x00,0x00, 0x10,0x00,0x48,0xA0,0x44,0x48,0x11,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x48,0x20,0x44,0x48,0x14,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x78,0x20,0x47,0xC8,0x18,0x40,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x60,0x48,0x20,0x40,0x08,0x10,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, 0x7C,0x60,0x40,0xA0,0x40,0x28,0x03,0x1C,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x40,0x10,0x0C,0x08,0xFF,0xFC,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,0x00,0x10,0x20,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1F,0xF8,0x3F,0xF8,0x13,0xF0,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x10,0x00,0x00,0x12,0x20,0x24,0x90,0x00,0x00,0x00,0x00,0x00,0x00, 0x3C,0x00,0x1F,0xF0,0x00,0x00,0x02,0x20,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0x10,0x10,0x00,0x08,0x02,0x1C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0x1F,0xF0,0x7F,0xFC,0xF4,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x10,0x10,0x01,0x00,0x1B,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x04,0x80,0x09,0x40,0x11,0x10,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x00,0x44,0x88,0x09,0x20,0x11,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x10,0x00,0x24,0x90,0x11,0x10,0x14,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x00,0x14,0xA0,0x21,0x08,0x18,0x40,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x60,0x14,0xC0,0x41,0x08,0x10,0xA0,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, 0x7E,0x60,0x04,0x88,0x05,0x00,0x03,0x1C,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xFF,0xFC,0x02,0x00,0x0C,0x08,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1C,0x40,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xF0,0x40,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3C,0x00,0x11,0x50,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0xFD,0x48,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0x11,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x32,0x44,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x00,0x3A,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x04,0x00,0x52,0x48,0x09,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x00,0x50,0x10,0x18,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x00,0x90,0x20,0x28,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x42,0x60,0x10,0x40,0xC9,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3C,0x60,0x11,0x80,0x0A,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x16,0x00,0x0C,0x08,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,0x20,0x08,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x17,0xFC,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x48,0x08,0x3C,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x00,0x42,0x08,0x41,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x00,0x5F,0xE8,0x41,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x00,0x42,0x08,0xF9,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0x00,0x4F,0xC8,0xA1,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x00,0x4A,0x48,0x21,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x00,0x4A,0x48,0xFD,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7E,0x00,0x4A,0x48,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x00,0x4A,0xC8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x08,0x60,0x42,0x08,0x28,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1E,0x60,0x42,0x28,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x10,0x20,0x20,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,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,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,
};
/************************************************************************************ 查忙函数 ************************************************************************************/ void busy(void)//RS=0;RW=1;wait=0闲;wait!=0忙 { uchar wait; RS = 0; RW = 1; E = 1; for(;;) { wait = DB; wait &= 0x80; if(wait == 0)break; } E = 0; }
/************************************************************************************ 写指令函数 ************************************************************************************/ void w_code(uchar c)//RS=0;RW=0;E下降沿 { busy(); RS = 0; RW = 0; DB = c; E = 1; E = 0; DB = 0xff; }
/************************************************************************************ 写数据函数 ************************************************************************************/ void w_data(uchar d)//RS=1;RW=0;E下降沿 { busy(); RS = 1; RW = 0; DB = d; E = 1; E = 0; DB = 0xff; }
/************************************************************************************ 读数据函数 ************************************************************************************/ uchar r_data(void)//RS=1;RW=1;E下降沿 { uchar rd_lcd; busy(); RS = 1; RW = 1; E = 1; rd_lcd = DB; E = 0; return rd_lcd; }
/************************************************************************************ 写DGRAM:x_lcd横坐标,y_lcd纵坐标 ************************************************************************************/ void address(uchar x_lcd,uchar y_lcd)// { w_code(y_lcd);//垂直坐标 w_code(x_lcd);//水平坐标 }
/************************************************************************************ 初始化液晶屏 0:字库 1:绘图 ************************************************************************************/ void lcd_rst(bit a) { if(a) { w_code(0x01);// 清屏 w_code(0x32);// 功能设置---8BIT控制界面,绘图显示ON w_code(0x36);// 功能设置---8BIT控制界面,扩充指令集 } else { w_code(0x30);// 功能设置---8BIT控制界面,基本指令集 w_code(0x0c);//显示打开,光标关,反白显示关 w_code(0x01);// 清除屏幕显示,将DDRAM的地址计数器归零 } }
/************************************************************************************ ---------------------------写整屏点阵数据 ---------------------------x :图像数据的起始地址 ************************************************************************************/
void write_lcd_full(uint x ) { uchar i,j,a; j = 0x80; //Y地址寄存器 for(a = 0;a < 32;a++) { w_code(j); j++; w_code(0x80);//X地址寄存器 for(i = 0;i < 16;i ++) { w_data(logo[x]); x++; } }
j = 0x80; //Y地址寄存器 for(a = 0;a < 32;a++) { w_code(j); j++; w_code(0x88);//X地址寄存器 for(i = 0;i < 16;i ++) { w_data(logo[x]); x++; } } }
main.c
#include"reg52.h" //#include"math.h" #include"stdlib.h" #include"function.h"
sbit RS = P1^4; sbit RW = P1^5; sbit E = P1^6;
#define DBUS P0 sbit clk_574_1 = P2^3; //sbit clk_574_2 = P1^3; //sbit lcd_rs = P1^4;
uint idac;
idata uchar GOUT[7]; idata float temp1; idata float dac_temp; idata float sheding_temp; idata float sheding_temp1; char code dx516[3] _at_ 0x003b;//这是为了仿真设置的(大虾仿真器)
/************************************************************************************ 把浮点数拆开存储指针型数据 输入浮点数,方式0:设定值,1:检测值 ************************************************************************************/ void chai(float x,bit y) { uint i; for(i = 0;i < 7;i ++) GOUT[i] = 0; if(y == 0) { i = x / 10; if(i == 0) GOUT[0] = ' '; else GOUT[0] = i + '0'; GOUT[1] = (int)x % 10 + '0'; x = x * 10; GOUT[3] = (int)x % 10 + '0';
x = x * 10; if(((int)x % 10) >= 5 )// 防止后面大于4的数被舍去 {GOUT[3] = GOUT[3] + 1;} else {;}
GOUT[4] = ' '; GOUT[5] = ' '; } else { i = x / 10; if(i == 0) GOUT[0] = ' '; else GOUT[0] = i + '0'; GOUT[1] = (int)x % 10 + '0'; x = x * 10; GOUT[3] = (int)x % 10 + '0'; x = x * 10; GOUT[4] = (int)x % 10 + '0'; x = (x * 10); GOUT[5] = (unsigned int)x % 10 + '0'; } GOUT[2] = '.'; GOUT[6] = '\0'; }
/************************************************************************************
//向LCM发送一个字符串,长度64字符之内。
************************************************************************************/ void lcm_w_word(uchar x,uchar y,uchar *str) { x = x+y; w_code(x); while(*str != '\0') { w_data(*str++); } *str = 0; } /************************************************************************************ 显示设定电压 ************************************************************************************/ void disp_sheding() { lcm_w_word(0x90,0x00,"设定:"); sheding_temp1 = sheding_temp + 0.0005;//------加0.0005修正有时显示.0999 chai(sheding_temp1,1); lcm_w_word(0x90,3,GOUT); w_code(0x96); w_data('V'); } /************************************************************************************ AD的16位整形数转换成浮点电压或电流值 ************************************************************************************/ float adjisuan_U(uint x) { temp1 = 11.990 / 0x5e1f; temp1 = x * temp1; return temp1; }
float adjisuan_I(uint x) // { temp1 = 0.899 / 0x253d; temp1 = (x * temp1)-0.005; return temp1; } /************************************************************************************ * *函数功能:输入浮点数 * ************************************************************************************/ float scanf_float(void) { static uchar i = 0; static uchar x[5] = {'0','0','0','0','0'}; static bit k = 1; uchar temp1,temp2; temp1 = key_sm(); temp2 = key_sm(); if((temp2 == 0xff) || (temp1 != temp2)) { k = 1; return(atof(x)); } else if(k) { k = 0; x[i] = temp1; i ++; if((temp1 == key_esc) || (i == 4)) { x[0] = '0'; x[1] = '0'; x[2] = '0'; x[3] = '0'; x[4] = '0'; i = 0; } return(atof(x)); } }
/************************************************************************************
扫描按键,并根据键值修改DAC的电压
************************************************************************************/ void key_dac() { uchar key_qiao; key_qiao = key_sm(); switch(key_sm()) { case key_shang:dac_temp = dac_temp + 1.0;break;//---按下上键电压加1V case key_xia :dac_temp = dac_temp - 1.0;break;//---按下下键电压减1 case key_zuo :dac_temp = dac_temp - 0.1;break;//---按下左键电压减0.1 case key_you :dac_temp = dac_temp + 0.1;break;//---按下右键电压加0.1 case key_0 :dac_temp = 0; break;//---按下0键电压归0 default: key_qiao = 0xff; } if(key_qiao != 0xff) // 10月1日 这里原来是0x00就读AD不正常 { RS = 1; RW = 0; //--------避免液晶屏干扰数据总线 if(dac_temp < 0){dac_temp = 0;} //----判断电压低于0大于30时把数据归0 if(dac_temp >= 30.10){dac_temp = 0;} sheding_temp = dac_temp ; disp_sheding(); idac = conver(dac_temp); dac(idac); delay(50000); } } /************************************************************************************ 主函数 ************************************************************************************/ main() { lcd_rst(0); rst_ad(); dac_temp = 0 ; RS = 1; RW = 0; //--------避免液晶屏干扰数据总线 dac(conver(dac_temp)); //吸合低压继电器并输出0V LED_ONOFF(1);// 打开背光源 set_7705_ch(0); read_AD_data(0x38); set_7705_ch(1); read_AD_data(0x39);
disp_sheding();//显示设定电压 while(1) { lcm_w_word(0x80,0x02,"稳压电源"); lcm_w_word(0x90,0x00,"设定:"); lcm_w_word(0x88,0x00,"电压:"); lcm_w_word(0x98,0x00,"电流:"); write_ad(0x10); write_ad(0x04); adjisuan_U(read_AD_data(0x38)); chai(temp1,1); lcm_w_word(0x88,3,GOUT); key_dac();
write_ad(0x11); write_ad(0x14); adjisuan_I(read_AD_data(0x39)); chai(temp1,1); lcm_w_word(0x98,3,GOUT); key_dac(); } }
DAC.C
#include"reg52.h" #include"function.h"
#define DBUS P0 sbit clk_574_1 = P2^3; //sbit clk_574_2 = P1^3; //sbit lcd_rs = P1^4; static uchar data_574; //74574输出数据 static uchar data_5741 = 0x10;//------------加了临时保存数据的寄存器才避免了DA操作时干扰背光
/************************************************************************************ DAC输出转换函数 ************************************************************************************/ void dac(uint c) { uint i; data_574 = data_5741;
data_574 &= 0xfe; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1;//574输出锁存数据,选通DAC 9月8日加上的,以前忘记了
for(i = 0x8000;i > 0;i >>= 1) { if((c & i) == 0) {data_574 &= 0xFB;}//数据输出为0还是1 //0xf7 else {data_574 |= 0x04;}//if和else后的大括号我后加的 DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; data_574 &= 0xFD; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; data_574 |= 0x02; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1;
} data_574 |= 0x01; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1;//574输出锁存数据,选通DAC
if(c <= 0x06c9) RL_ONOFF(0); //吸合低压继电器 0 ~ 15 else RL_ONOFF(1); //吸合高压继电器 15 ~ 30 }
/************************************************************************************ 继电器切换 1: 高压吸合 0: 低压吸合 ************************************************************************************/ void RL_ONOFF(bit i) { if(i==1) { data_574 |= 0x20; data_574 &= 0xbf; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; } else { data_574 |= 0x40; data_574 &= 0xdf; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; data_5741 = data_574; } }
/************************************************************************************ 蜂鸣器 1: 开 0: 关 ************************************************************************************/ void BELL_ONOFF(bit i) { if(i == 0) { data_574 |= 0x10; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; } else { data_574 &= 0xef; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; data_5741 = data_574; } } /************************************************************************************ 实际输出电压转换成DA输出值 ,返回整形数 ************************************************************************************/ uint conver(float x) { float temp; temp = 14.995 / 0x0745; temp = x / temp; return(uint)temp; }
/************************************************************************************ 控制背光开关 1:开 0:关 ************************************************************************************/ void LED_ONOFF(bit i) { if(i==1) { data_574 |= 0x80; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; } else { data_574 &= 0x7f; DBUS = data_574; clk_574_1 = 0; clk_574_1 = 1; } data_5741 = data_574; }
/************************************************************************************ 输出补偿调整 ************************************************************************************/ void change(void) { }
fun.c
#ifndef _FUNCTION_H_ #define _FUNCTION_H_ #define uchar unsigned char #define uint unsigned int #define ulong unsigned long
#define key_shang 0x18 #define key_xia 0x19 #define key_zuo 0x1b #define key_you 0x1a #define key_enter 0x2f #define key_1 0x31 #define key_2 0x32 #define key_3 0x33 #define key_4 0x34 #define key_5 0x35 #define key_6 0x36 #define key_7 0x37 #define key_8 0x38 #define key_9 0x39 #define key_esc 0x0c #define key_0 0x30 #define key_dian 0x2e
extern void busy(void);//查忙函数 extern void w_code(uchar c);//写指令函数 extern void w_data(uchar d);//写数据函数 extern uchar r_data(void);//读数据函数 extern void address(uchar x_lcd,uchar y_lcd);//写DGRAM:x_lcd横坐标,y_lcd纵坐标 extern void dac(uint c);//DAC数据转换函数 extern uint conver(float x);//实际输出电压转换成DA输出值 extern void LED_ONOFF(bit i);//控制LCD背光 extern void RL_ONOFF(bit i); // 控制继电器吸合 extern void BELL_ONOFF(bit i);//蜂鸣器控制 extern void lcd_rst(bit a); extern void rst_ad(); extern write_ad(uchar i); extern void delay(uint i); extern float adjisuan(uint x); extern uint read_AD_data(uchar y); extern void set_7705_ch(bit a); extern uchar key_sm(); extern void key_dac(); extern void write_lcd_full(uint x ); #endif
AD.C
#include"reg52.h" #include"function.h" #include "intrins.h"
/****************AD端口定义****************/ sbit AD_CLK = P3^2; sbit AD_RST = P3^3; sbit AD_DIN = P3^7; sbit AD_DOUT = P3^6; sbit AD_DRDY = P3^5; /************************************************************************************ 延时 ************************************************************************************/ void delay(uint i) { for(;i > 0;i--); } /************************************************************************************ 复位AD7705 ************************************************************************************/ void rst_ad() { AD_DRDY = 1; AD_CLK = 1; AD_DIN = 1; AD_DOUT = 1; AD_RST = 0; delay(300); AD_RST = 1; // 复位电路可以接5V电 delay(500); }
/************************************************************************************ 写1字节到AD7705 ************************************************************************************/ write_ad(uchar i) { uchar a; for(a = 8;a > 0;a--) { if((i & 0x80) == 0) {AD_DIN = 0;} else {AD_DIN = 1;} i <<= 1; AD_CLK = 0; _nop_(); _nop_(); _nop_(); AD_CLK = 1; } }
/************************************************************************************ 设置AD7705通道 * 0 为第一通道 * 1 为第二通道
//MD1(0) 工 作 模 式 //MD0(0) 工 作 模 式 //G2(0) 增益选择 0 0 0 0 1 1 1 1 //G1(0) 增益选择 0 0 1 1 0 0 1 1 //G0(0) 增益选择 0 1 0 1 0 1 0 1 // 1 2 4 8 16 32 64 128 //B/U(0) 单极性/双极性工作。“0”表示选择双极性操作,“1”表示选择单极性工作 //BUF(0) 缓冲器控制。“0”表示片内缓冲器短路,缓冲器短路后,电源电流降低 // 此位处于高电平时,缓冲器与模拟输入串联,输入端允许处理高阻抗源 //FSYNC(1) 滤波器同步 ************************************************************************************/
void set_7705_ch(bit a) { if(a == 0) { write_ad(0x20);//write_ad(0x20); write_ad(0x05); write_ad(0x10);//write_ad(0x10); write_ad(0x44);//write_ad(0x46);//设置40H 双极性方式 44H 单极性方式 } else { write_ad(0x20);//write_ad(0x20); write_ad(0x05); write_ad(0x10);//write_ad(0x10); write_ad(0x44);//write_ad(0x46);//设置40H 双极性方式 44H 单极性方式 } }
/************************************************************************************ 读1字节到AD7705 ************************************************************************************/ uchar read_ad() { uchar temp2; uchar a; for(a = 8;a > 0;a--) { AD_CLK = 0; _nop_(); _nop_(); _nop_(); AD_CLK = 1; _nop_(); _nop_(); _nop_(); temp2 <<= 1; if(AD_DOUT == 0) {temp2 &= 0xfe;} else {temp2 |= 0x01;} } return temp2; }
/************************************************************************************ 读AD7705转换后的数据 // 把DRDY位换为读内部寄存器状态位,显示不正常 ************************************************************************************/
uint read_AD_data(uchar y) { uint temp; uchar i; write_ad(y); while(AD_DRDY); for(i = 16;i > 0;i--) { AD_CLK = 0; _nop_(); _nop_(); _nop_(); AD_CLK = 1; _nop_(); _nop_(); _nop_(); temp <<= 1; if(AD_DOUT == 0) {temp &= 0xfffe;} else {temp |= 0x0001;} } return temp; }
KEY.C
#include "reg52.h" #include"function.h"
sbit clk_574_2 = P1^3; sbit lcd_rs = P1^4; sbit RS = P1^4; sbit RW = P1^5;
sbit key1 = P1^1; sbit key2 = P1^2;
uchar key_data;
#define DBUS P0 /************************************************************************************ *按键扫描 *返回键值 ************************************************************************************/ uchar key_sm() { RS = 1; RW = 0; //--------避免液晶屏干扰数据总线 key1 = 1; key2 = 1; //--------按键置高电平 key_data = 0xff; DBUS = 0xff; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_enter;} DBUS = 0xfe; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_9;} if(key2 == 0){key_data = key_dian;} DBUS = 0xfd; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_6;} if(key2 == 0){key_data = key_3;} DBUS = 0xfb; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_5;} if(key2 == 0){key_data = key_2;} DBUS = 0xf7; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_8;} if(key2 == 0){key_data = key_0;} DBUS = 0xef; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_4;} if(key2 == 0){key_data = key_1;} DBUS = 0xdf; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_7;} if(key2 == 0){key_data = key_esc;} DBUS = 0xbf; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_you;} if(key2 == 0){key_data = key_xia;} DBUS = 0x7f; clk_574_2 = 0; clk_574_2 = 1; if(key1 == 0){key_data = key_zuo;} if(key2 == 0){key_data = key_shang;}
return key_data; }