单片机控制AD603程序1602液晶改成4输出.docx
- 文档编号:10824263
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:23
- 大小:18.04KB
单片机控制AD603程序1602液晶改成4输出.docx
《单片机控制AD603程序1602液晶改成4输出.docx》由会员分享,可在线阅读,更多相关《单片机控制AD603程序1602液晶改成4输出.docx(23页珍藏版)》请在冰豆网上搜索。
单片机控制AD603程序1602液晶改成4输出
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definePCF85910x90//PCF8591地址
#defineDATAP0
#defineNOP()_nop_()/*定义空指令*/
#define_Nop()_nop_()/*定义空指令*/
//这三个引脚参考资料
/************
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitP2_2=P2^2;
/***********
sbitP2_3=P2^3;
sbitP2_4=P2^4;
sbitP3_0=P3^0;
***************/
sbitE=P0^2;//1602使能引脚
sbitRW=P0^1;//1602读写引脚
sbitRS=P0^0;//1602数据/命令选择引脚
sbitSDA=P3^6;//I2C数据
sbitSCL=P3^7;//I2C时钟
bitack;/*应答标志位*/
sbitKEY1=P3^2;
sbitKEY2=P3^3;
sbitKEY3=P3^4;
sbitKEY4=P3^5;
//数码管的段码编码
uchartable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//下一行的数组可以显示数值外,还可以显示数码管的点
uchartable_d[16]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
ucharcodeLED_W[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间大概为5US。
*输入:
无
*输出:
无
***********************************************************************/
voiddelay()
{
_nop_();
_nop_();
}
voiddelay_1ms(uinti)
{
uintx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
voidDelay(uintdel)//50ms
{
uinti,j;
for(i=0;i for(j=0;j<1827;j++); } /******************************************************************* 起动总线函数 函数原型: voidStart_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ voidStart_I2c() { SDA=1;/*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop();/*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0;/*发送起始信号*/ _Nop();/*起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0;/*钳住I2C总线,准备发送或接收数据*/ _Nop(); _Nop(); } /******************************************************************* 结束总线函数 函数原型: voidStop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/ voidStop_I2c() { SDA=0;/*发送结束条件的数据信号*/ _Nop();/*发送结束条件的时钟信号*/ SCL=1;/*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1;/*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); } /******************************************************************* 字节数据发送函数 函数原型: voidSendByte(UCHARc); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1;ack=0表示被控器无应答或损坏。 ********************************************************************/ voidSendByte(unsignedcharc) { unsignedcharBitCnt; for(BitCnt=0;BitCnt<8;BitCnt++)/*要传送的数据长度为8位*/ { if((c< elseSDA=0; _Nop(); SCL=1;/*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop();/*保证时钟高电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1;/*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; elseack=1;/*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); } /******************************************************************* 字节数据接收函数 函数原型: UCHARRcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 ********************************************************************/ unsignedcharRcvByte() { unsignedcharretc; unsignedcharBitCnt; retc=0; SDA=1;/*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0;/*置时钟线为低,准备接收数据位*/ _Nop(); _Nop();/*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop(); SCL=1;/*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1;/*读数据位,接收的数据位放入retc中*/ _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc); } /******************************************************************** 应答子函数 函数原型: voidAck_I2c(bita); 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ voidAck_I2c(bita) { if(a==0)SDA=0;/*在此发出应答或非应答信号*/ elseSDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop();/*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0;/*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); } ucharKEY(void) { if(KEY1==0||KEY2==0||KEY3==0||KEY4==0) { Delay (2); if(KEY1==0) { while (1) { if(KEY1==1) { Delay (2); if(KEY1==1) { break; } } } return1; } if(KEY2==0) { while (1) { if(KEY2==1) { Delay (2); if(KEY2==1) { break; } } } return2; } if(KEY3==0) { while (1) { if(KEY3==1) { Delay (2); if(KEY3==1) { break; } } } return3; } if(KEY4==0) { while (1) { if(KEY4==1) { Delay (2); if(KEY4==1) { break; } } } return4; } } return0; } /******************************************************************** *名称: bitBusy(void) *功能: 这个是一个读状态函数,读出函数是否处在忙状态 *输入: 输入的命令值 *输出: 无 ***********************************************************************/ voidBusy(void) { bitbusy_flag=1; DATA=0x80; RS=0; delay(); RW=1; delay(); E=1; //Delay (1); while (1) { busy_flag=(bit)(DATA&0x80); if(busy_flag==0) { break; } } E=0; } /******************************************************************** *名称: wcmd(uchardel) *功能: 1602命令函数 *输入: 输入的命令值 *输出: 无 ***********************************************************************/ voidwcmd(uchardel) { RS=0; delay(); RW=0; delay(); E=0; delay(); DATA&=0x0f;//清高四位 DATA|=del&0xf0;//写高四位 delay(); E=1; delay(); E=0; del=del<<4; DATA&=0x0f;//清高四位 DATA|=del&0xf0;//写低四位 delay(); E=1; delay(); E=0; } /******************************************************************** *名称: wdata(uchardel) *功能: 1602写数据函数 *输入: 需要写入1602的数据 *输出: 无 ***********************************************************************/ voidwdata(uchardel_1) { delay(); RS=1; delay(); RW=0; delay(); E=0; delay(); DATA&=0x0f; DATA|=del_1&0xf0; delay(); E=1; delay(); E=0; del_1=del_1<<4; DATA&=0x0f; DATA|=del_1&0xf0; delay(); E=1; delay(); E=0; } /******************************************************************** *名称: L1602_init() *功能: 1602初始化,请参考1602的资料 *输入: 无 *输出: 无 ***********************************************************************/ voidL1602_init(void) { delay_1ms(15); wcmd(0x28); delay_1ms(5); wcmd(0x28); delay_1ms(5); wcmd(0x28); wcmd(0x28); Busy(); wcmd(0x08); Busy(); wcmd(0x01); Busy(); wcmd(0x06); Busy(); wcmd(0x0c); } /******************************************************************** *名称: L1602_char(ucharhang,ucharlie,charsign) *功能: 改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下 L1602_char(1,5,'b') *输入: 行,列,需要输入1602的数据 *输出: 无 ***********************************************************************/ voidL1602_char(ucharhang,ucharlie,charsign) { uchara; if(hang==1) { a=0x80; } if(hang==2) { a=0xc0; } a=a+lie-1; Busy(); wcmd(a); Busy(); wdata(sign); } /******************************************************************** *名称: Main() *功能: 主函数 *输入: 无 *输出: 无 ***********************************************************************/ /******************************************************************* DAC变换,转化函数 *******************************************************************/ bitDACconversion(unsignedcharsla,unsignedcharc,unsignedcharVal) { Start_I2c();//启动总线 SendByte(sla);//发送器件地址 if(ack==0)return(0); SendByte(c);//发送控制字节 if(ack==0)return(0); SendByte(Val);//发送DAC的数值 if(ack==0)return(0); Stop_I2c();//结束总线 return (1); } voidLEDShow(uchartemp) { P1=0; P2=LED_W[1]; P1=table[(temp/10)%10]; delay_1ms (2); P1=0; P2=LED_W[0]; P1=table[temp%10]; delay_1ms (2); } voidLEDShow_1(uchartemp_1) { P1=0; P2=LED_W[2]; P1=0x40; delay_1ms (2); P1=0; P2=LED_W[1]; P1=table[(temp_1/10)%10]; delay_1ms (2); P1=0; P2=LED_W[0]; P1=table[temp_1%10]; delay_1ms (2); } voidLEDShow_2(uchartemp_2) { P1=0; P2=LED_W[6]; P1=table[(temp_2/100)%10]; delay_1ms (2); P1=0; P2=LED_W[5]; P1=table[(temp_2/10)%10]; delay_1ms (2); P1=0; P2=LED_W[4]; P1=table[temp_2%10]; delay_1ms (2); } voidLCDShow_3(doubletext3) { doubletext; text=text3*100; //Busy(); L1602_init(); //Busy(); L1602_char(2,1,((uint)text/100)%10+48); //Busy(); L1602_char(2,2,'.'); //Busy(); L1602_char(2,3,((uint)text/10)%10+48); //Busy(); L1602_char(2,4,((uint)text)%10+48); } /******************************************************************** *名称: Main() *功能: 实现按键控制LED的显示 *输入: 无 *输出: 无 ***********************************************************************/ voidMain(void) { chari=0,j=0,n; uchara,b,c;doublev=0; L1602_init(); while (1) { i=KEY(); if(i==1) { j++; } if(i==2) { j=j+10; } if(i==3) { j--; } if(i==4) { j=j-10; } if(j<31&j>-11) { if(j<0) { j=-j; LEDShow_1(j); b=(j/10)%10; c=j%10; Busy(); L1602_char(1,1,'-'); Busy(); L1602_char(1,2,b+48); Busy(); L1602_char(1,3,c+48); j=-j; } /********************* v=(j-10)*0.025+0.5; a=v*255; LEDShow_2(a); } *************************/ else { LEDShow(j); b=(j/10)%10; c=j%10; Busy(); L1602_init(); Busy(); L1602_char(1,2,b+48); Busy(); L1602_char(1,3,c+48); } } else { j=0; } v=(j-10)*0.025+0.5; a=v*255; LEDShow_2(a); DACconversion(PCF8591,0x40,a);//DAC数模转换 LCDShow_3(v); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 控制 AD603 程序 1602 液晶 改成 输出
![提示](https://static.bdocx.com/images/bang_tan.gif)