//本程序是基于51單片機的,可由矩陣鍵盤設(shè)置TLC5615 ad芯片要輸出的電壓值, //并由1602液晶屏顯示輸入的電壓值. //完整代碼下載: http://www.zg4o1577.cn/f/TLC56151602.rar //此程序測試成功,51hei版權(quán)所有,如果需要應(yīng)用到你的項目中只需更改端口即可 #include "reg51.h" #include"intrins.h" //_nop_();延時函數(shù)用 #define uchar unsigned char #define uint unsigned int sbit CLK=P2^5; //三線控制 sbit DIN=P2^4; sbit CS=P2^6; sbit rs=P0^0;//命令/數(shù)據(jù)選擇 sbit rw=P0^1;//讀寫口 sbit e=P0^2; //鎖存控制 uchar data dis1[15]={"output volt is:"}; //顯示兩行 uchar data dis2[13]={".V"}; float vout;//系統(tǒng)輸出電壓 int shuzi;//給da數(shù)字量 int ge,shifen,baifen;//定義個位十分位百分位 unsigned int Data[10] = {0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039}; //延時函數(shù) delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<120;j++); } //鍵盤掃描函數(shù) saomiao ( ) { unsigned char X,Y,Z; P3=0x0f; //對P3置數(shù)進行行掃描 if(P3!=0x0f) //判斷是否有鍵按下 {delay(40); //延時去抖動,一般為5ms~10ms(由于機械觸點的彈性作用,按鍵在閉合時不會馬上穩(wěn)定地接通, //而在閉合瞬間伴隨有一連串的抖動,鍵抖動會引起一次按鍵被誤讀多次) if(P3!=0x0f) //確認按鍵按下 { X=P3; //保存行掃描時有鍵按下時狀態(tài) P3=0xf0; //列掃描 Y=P3; //保存列掃描時有鍵按下時狀態(tài) Z=X|Y; //取出鍵值 return(Z); } // 取值轉(zhuǎn)換 void fa5615(uint ad) { uchar i; CS=0;//CS拉低,開始送轉(zhuǎn)換數(shù)值; _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;//寫狀態(tài) e=1; P1=t; delay(7); e=0;//數(shù)據(jù)的鎖定 } //向LCD寫數(shù)據(jù) wdata(uchar t) { rs=1;//寫的是數(shù)據(jù) rw=0;//寫狀態(tài) e=1; P1=t; delay(7); e=0;//數(shù)據(jù)的鎖定 } //功能:LCD顯示第一行 xian1() { uchar i; wcode(0x81); //設(shè)置第一行顯示地址 for(i=0;i<15;i++) { wdata(dis1[i]); } } //************************************************************************************ //功能:LCD顯示第二行 //************************************************************************************ xian2() { uchar i; wcode(0xc0); //設(shè)置第二行顯示地址 for(i=0;i<13;i++) { wdata(dis2[i]); } } //功能:LCD 初始化 InitLCD //************************************************************************************ InitLCD() { wcode(0x01); //清屏 wcode(0x06); //輸入方式控制 wcode(0x0e); //顯示開關(guān)控制 wcode(0x38); //功能設(shè)定:設(shè)置16x2顯示,5x7顯示,8位數(shù)據(jù)接口 } //功能:數(shù)據(jù)分離和顯示并給數(shù)據(jù)送DA輸出 fenxiaoout(float Vo) { ge=Vo*100/100;//分離得到個位值 shifen=Vo*100; shifen=shifen%100/10;//十分位 baifen=Vo*100; baifen=baifen%100%10;//百分位 wcoad(0xc4);//設(shè)置個位顯示地址 wdata(Data[ge]);//顯示個位 wcode(0xc5);//設(shè)置第二行中小數(shù)點的顯示地址 wdata(dis2[0]);//顯示小數(shù)點 wcode(0xc6); //設(shè)置分位的顯示地址 wdata(Data[shifen]);//顯示十分位 wdata(Data[baifen]);//顯示百分位 wcode(0xca); //設(shè)置單位伏特V的顯示地址 wdata(dis2[1]); //顯示單位伏特"V" shuzi=(vout/4.92)*1024*4; fa5615(shuzi); } //解碼函數(shù) 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); //按鍵處理 } }