完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
#include
#include #define uchar unsigned char #define uint unsigned int ***it set_key =P3^2; //设置按钮 ***it jia_key =P1^7; //加按钮 ***it jian_key=P1^6; //减按钮 ***it sda=P2^3; //I2C 数据传送位 ***it scl=P2^4; //I2C 时钟传送位 ***it rs=P3^5; //12864RS控制位 ***it rw=P3^4; //12864RW控制位 ***it e =P4^0; //12864E 控制位 ***it RES=P4^6; /********** 数据部分 ***********/ #define IIC_READ 0x1D //定义读指令 #define IIC_WRITE 0x1D //定义写指令 uchar set_key_sign; //是否在设置状态标志 uchar delaysign; //视觉停留标志 uchar xposivalue; //x正方向满格显示g值 uchar xnegavalue; //x反方向满格显示g值 uchar yposivalue; //y正方向满格显示g值 uchar ynegavalue; //y反方向满格显示g值 //11111111 11111110 11111100 --- 10000000 00000000 led_ma[i]:i为亮灯数量 uchar led_ma[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; uchar xposiupstate; //x正方向上8个LED显示状态 uchar xposidownstate; //x正方向下8个LED显示状态 uchar xnegaupstate; //x反方向上8个LED显示状态 uchar xnegadownstate; //x反方向下8个LED显示状态 uchar yupstate; //y方向上8个LED显示状态 uchar ydownstate; //y方向下8个LED显示状态 uchar xposilightnum; //x正方向亮灯数量(1——16) uchar xnegalightnum; //x反方向亮灯数量(1——16) uchar yposilightnum; //y正方向亮灯数量(1——8) uchar ynegalightnum; //x正方向亮灯数量(1——8) uchar ack_sign; //I2C 应答标志 uchar table1[16]=" hello! X= 0.00"; //1602显示数据 uchar table2[16]=" Y= 0.00 Z= 0.00"; uchar table3[16]="No acceleration!"; uchar table4[10]="0123456789"; uchar table5[8] ="Warning!"; uchar table7[16]="value: X=0.50 "; /**************************************************************************/ /************ 各延时程序 **************/ /**************************************************************************/ void iic_delay() //5us延时 { _nop_(); _nop_(); _nop_(); _nop_(); } void delay() //消除按键抖动 { unsigned int i; for(i=0;i<20000;i++); } void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } void delay_50ms(uchar t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /*------------------------------------------------ 检测忙位 ------------------------------------------------*/ void Check_Busy() { rs=0; rw=1; e=1; P0=0xff; while((P0&0x80)==0x80);//忙则等待 e=0; } /************************************************************************/ /************** 12864显示部分 *****************/ /************************************************************************/ void write_com(uchar com) //函数功能:写指令 { Check_Busy(); rs=0; rw=0; e=1; P0=com; // delay_50us(5); e=0; // delay_50us(5); } void write_date(uchar dat) //函数功能:写数据 { Check_Busy(); rs=1; rw=0; e=1; P0=dat; // delay_50us(5); e=0; // delay_50us(5); } void init12864(void) //函数功能:初始化12864 { delayms(40); //大于40MS的延时程序 // PSB=1; //设置为8BIT并口工作模式 delayms(1); //延时 RES=0; //复位 delayms(1); //延时 RES=1; //复位置高 delayms(1); Write_com(0,0x30); //选择基本指令集 delayms(1); //延时大于100us Write_com(0,0x30); //选择8bit数据流 delayms(1); //延时大于37us Write_com(0,0x0c); //开显示(无游标、不反白) delayms(1); //延时大于100us Write_com(0,0x01); //清除显示,并且设定地址指针为00H delayms(1); //延时大于10ms Write_com(0,0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动 delayms(1); //延时大于100us } /*********************************************************************/ /************** I2C通信部分 ***************/ /*********************************************************************/ void iic_start() //函数功能:I2C通信开始 { sda=1; iic_delay(); scl=1; iic_delay(); sda=0; iic_delay(); } void iic_stop() //函数功能:I2C通信停止 { sda=0; iic_delay(); scl=1; iic_delay(); sda=1; iic_delay(); } void iic_ack() //函数功能:I2C通信查应答位 { sda=1; scl=1; iic_delay(); ack_sign=sda; scl=0; } void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节 { uchar i,temp,temp1; temp1=wdata; for(i=0;i<8;i++) { scl = 0; iic_delay(); temp=temp1; temp=temp&0x80; if(temp==0x80) sda=1; else sda=0; iic_delay(); scl=1; iic_delay(); scl=0; iic_delay(); temp1=temp1<<1; } } char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节 { uchar x; char data_data; for(x=0;x<8;x++) { data_data=data_data<<1; sda=1; iic_delay(); scl=0; iic_delay(); scl=1; iic_delay(); if(sda==1) data_data|=0x01; //else // data_data&=0xfe; } return data_data; } void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据 { uchar t; t=(IIC_WRITE<<1); iic_start(); iic_write_byte(t); iic_ack(); iic_write_byte(byte_add); iic_ack(); iic_write_byte(wdata); iic_ack(); iic_stop(); } char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据 { uchar t; char x; t=(IIC_WRITE<<1); iic_start(); iic_write_byte(t); iic_ack(); iic_write_byte(byte_add); iic_ack(); t=((IIC_READ<<1)|0x01); iic_start(); iic_write_byte(t); iic_ack(); x=iic_read_byte(); iic_ack(); iic_stop(); return x; } /************************************************************************/ /************* LCD显示阵列部分 **************/ /************************************************************************/ void led_send(unsigned char t) //函数功能:8051单片机串行通信发送 { SBUF=t; while(!TI); TI=0; } void led_show() //函数功能:LED面板显示输出 { led_send(xnegaupstate); led_send(xnegadownstate); led_send(xposiupstate); led_send(xposidownstate); led_send(yupstate ); led_send(ydownstate); } void led_init() //函数功能:初始化LED面板 { SCON=0x00; xposiupstate =led_ma[0]; xposidownstate=led_ma[1]; xnegaupstate =led_ma[0]; xnegadownstate=led_ma[1]; yupstate =led_ma[1]; ydownstate =led_ma[0]; led_show(); } void led_xposizhi() //函数功能:获取x正方向显示数据 { if(xposilightnum<8) { if(xposilightnum==0)xposilightnum=1; xposiupstate =led_ma[0]; xposidownstate=led_ma[xposilightnum]; } else { if(xposilightnum>16)xposilightnum=16; xposiupstate =led_ma[xposilightnum-8]; xposidownstate=led_ma[8]; } } void led_xnegazhi() //函数功能:获取x负方向显示数据 { if(xnegalightnum<8) { if(xnegalightnum==0)xnegalightnum=1; xnegaupstate =led_ma[0]; xnegadownstate=led_ma[xnegalightnum]; } else { if(xnegalightnum>16)xnegalightnum=16; xnegaupstate =led_ma[xnegalightnum-8]; xnegadownstate=led_ma[8]; } } void led_yposizhi() //函数功能:获取y正方向显示数据 { if(yposilightnum<8) { if(yposilightnum==0)yposilightnum=1; yupstate =led_ma[yposilightnum]; } else yupstate=led_ma[8]; } void led_ynegazhi() //函数功能:获取y反方向显示数据 { switch(ynegalightnum) { case 0:ydownstate=0xff;break; case 1:ydownstate=0x7f;break; case 2:ydownstate=0x3f;break; case 3:ydownstate=0x1f;break; case 4:ydownstate=0x0f;break; case 5:ydownstate=0x07;break; case 6:ydownstate=0x03;break; case 7:ydownstate=0x01;break; case 8:ydownstate=0x00;break; default:ydownstate=0x00;break; } } void self_test7455() //函数功能:检测7455有没有插好 { // 如果没有插好,1602将会显示 uchar j; // “No acceleration!" char t; delay_50us(10); iic_write(0x16,0x05); delay_50us(20); t=iic_read(0x16); if(t!=0x05) { write_com(0x80); for(j=0;j<16;j++) { write_date(table3[j]); delay_50us(10); } while(1); } else { write_com(0x80); for(j=0;j<16;j++) { write_date(table1[j]); delay_50us(10); } write_com(0x80+0x40); for(j=0;j<16;j++) { write_date(table2[j]); delay_50us(10); } } } void change_topvalue(uchar x) //函数功能:修改LED面板显示对应的最大g值 { uchar x1,x2,x3; x1=(x/100); x2=(x%100)/10; x3=(x%100)%10; write_com(0xcb); write_date(table4[x1]); delay_50us(10); write_com(0xcd); write_date(table4[x2]); delay_50us(10); write_date(table4[x3]); delay_50us(10); } void sendx() //函数功能:向1602发送x轴测量数据 { uchar x1,x2,x3,xsign; char x; x=iic_read(0x06); if((x&0x80)==0x00) { xsign=0x2b; //+ if(x>64) { x=(((int)(x*200)/127)-100); //转变为加速度值 x1=(x/100); x2=(x%100)/10; x3=(x%100)%10; delaysign=1; xposilightnum=x/(xposivalue/16); } else { x1=0;x2=0;x3=0; delaysign=0; } } else { xsign=0x2d; //- x=x-0x01; x=~x; if(x>64) { x=(((int)(x*200)/127)-100); x1=(x/100); x2=(x%100)/10; x3=(x%100)%10; delaysign=1; xnegalightnum=x/(xnegavalue/16); } else { x1=0;x2=0;x3=0; delaysign=0; } } write_com(0x8B); write_date(xsign); delay_50us(10); write_com(0x8C); write_date(table4[x1]); delay_50us(10); write_com(0x8E); write_date(table4[x2]); delay_50us(10); write_com(0x8F); write_date(table4[x3]); delay_50us(20); } void sendy() //函数功能:向1602发送y轴测量数据 { uchar y1,y2,y3,ysign; char y; y=iic_read(0x07); if((y&0x80)==0x00) { ysign=0x2b; //+ if(y>66) { y=(((int)(y*200)/127)-100); //转变为加速度值 y1=(y/100); y2=(y%100)/10; y3=(y%100)%10; delaysign=1; yposilightnum=y/(yposivalue/8); } else { y1=0;y2=0;y3=0; delaysign=0; } } else { ysign=0x2d; //- y=y-0x01; y=~y; if(y>66) { y=(((int)(y*200)/127)-100); //转变为加速度值 y1=(y/100); y2=(y%100)/10; y3=(y%100)%10; delaysign=1; ynegalightnum=y/(ynegavalue/8); } else { y1=0;y2=0;y3=0; delaysign=0; } } write_com(0xC3); write_date(ysign); delay_50us(10); write_com(0xC4); write_date(table4[y1]); delay_50us(10); write_com(0xC6); write_date(table4[y2]); delay_50us(10); write_com(0xC7); write_date(table4[y3]); delay_50us(20); } void sendz() //函数功能:向1602发送z轴测量数据 { uchar z1,z2,z3,zsign; char z; z=iic_read(0x08); if((z&0x80)==0x00) { zsign=0x2b; //+ if(z>68) { z=(((int)((z-3)*200)/127)-100); //转变为加速度值 z1=(z/100); z2=(z%100)/10; z3=(z%100)%10; delaysign=1; } else { z1=0;z2=0;z3=0; delaysign=0; } } else { zsign=0x2d; //- z=z-0x01; z=~z; if(z>62) { z=(((int)(z*200)/127)-100); //转变为加速度值 z1=(z/100); z2=(z%100)/10; z3=(z%100)%10; delaysign=1; } else { z1=0;z2=0;z3=0; delaysign=0; } } write_com(0xCB); write_date(zsign); delay_50us(10); write_com(0xCC); write_date(table4[z1]); delay_50us(10); write_com(0xCE); write_date(table4[z2]); delay_50us(10); write_com(0xCF); write_date(table4[z3]); delay_50us(20); } /******************************************************************/ /************** 按键检测部分 **************/ /******************************************************************/ void key_check() { uchar i,j; i=1; key:if(!set_key) { delay(); if(!set_key) { set_key_sign=1; switch(i) { case 1: write_com(0x80); write_date(0x50);//P delay_50us(10); write_date(0x6c);//l delay_50us(10); write_date(0x65);//e delay_50us(10); write_date(0x61);//a delay_50us(10); write_date(0x73);//s delay_50us(10); write_date(0x65);//e delay_50us(10); write_date(0x20);//空 delay_50us(10); write_date(0x69);//i delay_50us(10); write_date(0x6f);//n delay_50us(10); write_date(0x70);//p delay_50us(10); write_date(0x75);//u delay_50us(10); write_date(0x74);//t delay_50us(10); write_date(0x20);//空 delay_50us(10); write_date(0x58);//X delay_50us(10); write_date(0x2b);//+ delay_50us(10); write_date(0x20);//空 delay_50us(10); write_com(0xc0); for(j=0;j<16;j++) { write_date(table7[j]); delay_50us(10); } change_topvalue(xposivalue); i++; break; case 2: write_com(0x8e); write_date(0x2d); //输出负号 delay_50us(10); change_topvalue(xnegavalue); i++; break; case 3: write_com(0x8d); write_date(0x59); //输出Y delay_50us(10); write_date(0x2b); //输出+ delay_50us(10); write_com(0xc9); write_date(0x59); //输出Y delay_50us(10); change_topvalue(yposivalue); i++; break; case 4: write_com(0x8e); write_date(0x2d); //输出负号 change_topvalue(ynegavalue); i++; break; case 5: i=1; set_key_sign=0; write_com(0x80); for(j=0;j<8;j++) { write_date(table5[j]); delay_50us(10); } write_com(0x88); for(j=8;j<16;j++) { write_date(table1[j]); delay_50us(10); } write_com(0xc0); for(j=0;j<16;j++) { write_date(table2[j]); delay_50us(10); } break; default:break; } } } if(set_key_sign) { if(!jia_key) { delay(); if(!jia_key) { switch(i-1) { case 1: if(xposivalue!=100) { xposivalue++; change_topvalue(xposivalue); } break; case 2: if(xnegavalue!=100) { xnegavalue++; change_topvalue(xnegavalue); } break; case 3: if(yposivalue!=100) { yposivalue++; change_topvalue(yposivalue); } break; case 4: if(ynegavalue!=100) { ynegavalue++; change_topvalue(ynegavalue); } break; default:break; } } } if(!jian_key) { delay(); if(!jian_key) { switch(i-1) { case 1: if(xposivalue!=0) { xposivalue--; change_topvalue(xposivalue); } break; case 2: if(xnegavalue!=0) { xnegavalue--; change_topvalue(xnegavalue); } break; case 3: if(yposivalue!=0) { yposivalue--; change_topvalue(yposivalue); } break; case 4: if(ynegavalue!=0) { ynegavalue--; change_topvalue(ynegavalue); } break; default:break; } } } } if(set_key_sign)goto key; } /***********************************************************/ /**************** 主函数 ****************/ /***********************************************************/ void data_init() { set_key_sign=0; xposivalue=50; xnegavalue=50; yposivalue=50; ynegavalue=50; } void main() { uchar j; led_init(); init1602(); self_test7455(); data_init(); iic_write(0x10,0x32);//校正X值 iic_write(0x12,0x62);//校正Y值 delay_50ms(20); write_com(0x80); for(j=0;j<8;j++) { write_date(table5[j]); delay_50us(10); } while(1) { key_check(); sendx(); if(delaysign) { led_xposizhi(); led_xnegazhi(); led_show(); delay_50ms(4); led_init(); xposilightnum=1; xnegalightnum=1; } sendy(); if(delaysign) { led_yposizhi(); led_ynegazhi(); led_show(); delay_50ms(4); led_init(); ynegalightnum=0; yposilightnum=1; } led_init(); sendz(); if(delaysign)delay_50ms(4); } } /***** 完 .*****/ 错误提示:JIAODU.C(154): error C267: 'Write_com': requires ANSI-style prototype 做不出来了,求高手转换成液晶12864显示程序 |
|
相关推荐
3个回答
|
|
|
|
|
|
|
|
|
|
|
|
感谢楼主分享~~~
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 06:59 , Processed in 0.619702 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3490