//本程序是基于51单片机的,可由矩阵键盘设置TLC5615 ad芯片要输出的电压值, //并由1602液晶屏显示输入的电压值. //完整代码下载: http://www.51hei.com/f/TLC56151602.rar //此程序测试成功,51hei版权所有,如果需要应用到你的项目中只需更改端口即可 #include "reg51.h" #include"intrins.h" //_nop_();延时函数用 #define uchar unsigned char #define uint unsigned int sbit CLK=P2^5; //三线控制 sbit DIN=P2^4; sbit CS=P2^6; sbit rs=P0^0;//命令/数据选择 sbit rw=P0^1;//读写口 sbit e=P0^2; //锁存控制 uchar data dis1[15]={"output volt is:"}; //显示两行 uchar data dis2[13]={".V"}; float vout;//系统输出电压 int shuzi;//给da数字量 int ge,shifen,baifen;//定义个位十分位百分位 unsigned int Data[10] = {0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039}; //延时函数 delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<120;j++); } //键盘扫描函数 saomiao ( ) { unsigned char X,Y,Z; P3=0x0f; //对P3置数进行行扫描 if(P3!=0x0f) //判断是否有键按下 {delay(40); //延时去抖动,一般为5ms~10ms(由于机械触点的弹性作用,按键在闭合时不会马上稳定地接通, //而在闭合瞬间伴随有一连串的抖动,键抖动会引起一次按键被误读多次) if(P3!=0x0f) //确认按键按下 { X=P3; //保存行扫描时有键按下时状态 P3=0xf0; //列扫描 Y=P3; //保存列扫描时有键按下时状态 Z=X|Y; //取出键值 return(Z); } // 取值转换 void fa5615(uint ad) { uchar i; CS=0;//CS拉低,开始送转换数值; _nop_(); for(i=0;i<16;i++) { if((ad&0x8000)!=0) {DIN=1;} else {DIN=0;} CLK=1; _nop_();_nop_(); CLK=0; ad=ad<<1 _nop_();_nop_(); } CLK=0; _nop_();_nop_(); CS=1; } //向LCD写一命令 wcode(uchar t) { rs=0;//写的是命令 rw=0;//写状态 e=1; P1=t; delay(7); e=0;//数据的锁定 } //向LCD写数据 wdata(uchar t) { rs=1;//写的是数据 rw=0;//写状态 e=1; P1=t; delay(7); e=0;//数据的锁定 } //功能:LCD显示第一行 xian1() { uchar i; wcode(0x81); //设置第一行显示地址 for(i=0;i<15;i++) { wdata(dis1[i]); } } //************************************************************************************ //功能:LCD显示第二行 //************************************************************************************ xian2() { uchar i; wcode(0xc0); //设置第二行显示地址 for(i=0;i<13;i++) { wdata(dis2[i]); } } //功能:LCD 初始化 InitLCD //************************************************************************************ InitLCD() { wcode(0x01); //清屏 wcode(0x06); //输入方式控制 wcode(0x0e); //显示开关控制 wcode(0x38); //功能设定:设置16x2显示,5x7显示,8位数据接口 } //功能:数据分离和显示并给数据送DA输出 fenxiaoout(float Vo) { ge=Vo*100/100;//分离得到个位值 shifen=Vo*100; shifen=shifen%100/10;//十分位 baifen=Vo*100; baifen=baifen%100%10;//百分位 wcoad(0xc4);//设置个位显示地址 wdata(Data[ge]);//显示个位 wcode(0xc5);//设置第二行中小数点的显示地址 wdata(dis2[0]);//显示小数点 wcode(0xc6); //设置分位的显示地址 wdata(Data[shifen]);//显示十分位 wdata(Data[baifen]);//显示百分位 wcode(0xca); //设置单位伏特V的显示地址 wdata(dis2[1]); //显示单位伏特"V" shuzi=(vout/4.92)*1024*4; fa5615(shuzi); } //解码函数 uchar chuli(uchar tt) { switch(tt) { case 0xee: { vout=vout+1.0; if(vout>4.5)vout=2.0; fenxianout(vout); return(0); break; } case 0xde: { vout=vout-1.0; if(vout<0) vout=2.0; fenxianout(vout); return(1); break; } case 0xbe: { vout=vout+0.1; if(vout>4.5)vout=2.0; fenxianout(vout); return(2); break; } case 0x7e: { vout=vout-0.1; if(vout<0) vout=2.0; fenxianout(vout); return(3); break; } default:{return(0x10);break;} } } main() { uchar kk=0xff;//键盘扫描返回码11111111 InitLCD(); //初始化1602 vout=2.00; fenxianout(vout); xian1(); //显示第一行 while(1) { kk=saomiao(); //扫描键盘 chuli(kk); //按键处理 } }