本帖最后由 nngd 于 2021-5-2 08:44 编辑
调试的时候SPI的通信口的SCLK有波形,DIN、CS全是低电平,恳求大佬指导一下
下面是单片机程序:
- #include <reg51.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define DATA_LCD P2
- sbit KEY1 = P0^0;
- sbit KEY2 = P0^1;
- sbit KEY3 = P0^2;
- sbit KEY4 = P0^3;
- sbit RS = P0^5;
- sbit RW = P0^6;
- sbit E = P0^7;
- sbit DOUT = P1^1;
- sbit DIN = P1^2;
- sbit SCLK = P1^3;
- sbit CS = P1^4;
- sbit RST = P3^2;
- sbit SIG = P3^3;
- /*********************1ms延时****************************************************************/
- void delay_1ms(uint x)
- {
- uint i,j;
- for(i=1;i<x;i++)
- for(j=1;j<110;j++);
- }
- /**********************LCD判忙******************************************************************/
- void check_BF(void)
- {
- P2=0xff;
- E=0;
- RS=0;
- RW=1;
- E=1;
- E=0;
- RS=1;
- RW=0;
- }
- /**********************LCD写指令******************************************************************/
- void write_cmd(uchar com)
- {
- check_BF();
- E=0;
- RS=0;
- RW=0;
- DATA_LCD=com;
- delay_1ms(2);
- E=1;
- delay_1ms(2);
- E=0;
- RS=1;
- RW=1;
- }
- /*********************LCD初始化*************************************************************/
- void Init_LCD(void)
- {
- write_cmd(0x38); //ÏÔê¾Ä£ê½éèÖà éèÖÃ8λ¸ñê½£¬2DD5X7
- write_cmd(0x08); //Tune off screen
- write_cmd(0x01); //ÏÔê¾ÇåÆá
- write_cmd(0x06); //ÏÔê¾1a±êòƶˉéèÖÃ
- write_cmd(0x0c); //ÏÔ꾿a¼°1a±êéèÖÃ
- }
- /**********************LCD写数据*******************************************************************/
- void write_data(uchar chardata)
- {
- check_BF();
- E=0;
- RS=1;
- RW=0;
- DATA_LCD=chardata;
- delay_1ms(2);
- E=1;
- delay_1ms(2);
- E=0;
- RS=0;
- RW=1;
- }
- /**********************LCD定位*******************************************************************/
- void set_xy(uchar x,uchar y)
- {
- uchar add;
- if(x==0)
- add=0x80+y;
- else
- if(x==1)
- add=0xc0+y;
- else
- if(x==2)
- add=0x90+y;
- else
- if(x==3)
- add=0xd0+y;
- write_cmd(add);
- }
- /**********************LCD显示***********************************************************************/
- void displayL(uchar x,uchar y,uchar *s)
- {
- set_xy(x,y);
- while(*s)
- {
- DATA_LCD=*s;
- write_data(*s);
- s++;
- }
- }
- /********1us延时********/
- void delay()
- {
-
- _nop_();
-
- }
- /**********ATTT7022读操作************/
- unsigned long int RSpi(uchar Com)
- {
- uchar n,h;
- unsigned long int d=0;
- CS=1;
- SCLK=0;
- CS=0;
- for(n=7;n>=0;n--)
- {
- SCLK=1;
- if(Com&0x80)
- DIN=1;
- else
- DIN=0;
- Com<<=1;
- SCLK=0;
- }
- delay();delay();delay();
- for(n=23;n>=0;n--)
- {
- SCLK=1;
- if(DOUT&0x01)
- h=1;
- else
- h=0;
- d=(d<<1)|h;
- SCLK=0;
- }
- CS=1;
- return d;
- }
- /***************ATT7022写操作**************/
- void WSpi(uchar Com,unsigned long int d)
- {
- uchar n;
- CS=1;
- SCLK=0;
- CS=0;
- for(n=7;n>=0;n--)
- {
- SCLK=1;
- if(Com&0x80)
- DIN=1;
- else
- DIN=0;
- Com<<=1;
- SCLK=0;
- }
- for(n=23;n>=0;n--)
- {
- SCLK=1;
- if(d&0x800000)
- DIN=1;
- else
- DIN=0;
- d<<=1;
- SCLK=0;
- }
- CS=1;
- }
- /****************显示电压电流功率因数*************************************************************/
- unsigned long int displayUAF(uchar a,uchar x,uchar y,uchar z)
- {
- unsigned long int U,A,F,h;
- uchar UAF[19]=" : V . A 0. ";
- UAF[0]=a;
- U=RSpi(x)/8192;
- A=RSpi(y)/8192*100;
- h=RSpi(z);
- if(h>8388608)
- h=h-16777216;
- else
- h=h;
- F=h/8388608*100;
- UAF[3]=U/100+0x30;
- UAF[4]=U%100/10+0x30;
- UAF[5]=U%10+0x30;
- UAF[8]=A/1000+0x30;
- UAF[9]=A%1000/100+0x30;
- UAF[11]=A%100/10+0x30;
- UAF[12]=A%10+0x30;
- UAF[17]=F/10+0x30;
- UAF[18]=F%10+0x30;
- return(UAF[19]);
- }
- /*****************显示无功 有功 视在功率************************************************************/
- unsigned long int displaySPQ(uchar a,uchar x,uchar y,uchar z)
- {
- unsigned long int S,S1,P,P1,Q,Q1;
- uchar SPQ[22]=" : vA W Var";
- SPQ[0]=a;
- S1=RSpi(x);
- if(S1>8388608)
- S1=S1-16777216;
- else
- S1=S1;
- S=S1/256;
- if(RSpi(y)>8388608)
- P1=RSpi(y)-16777216;
- else
- P1=RSpi(y);
- P=P1/256;
- if(RSpi(z)>8388608)
- Q1=RSpi(z)-16777216;
- else
- Q1=RSpi(z);
- Q=Q1/256;
- SPQ[2]=S/1000+0x30;
- SPQ[3]=S%1000/100+0x30;
- SPQ[4]=S%1000%100/10+0x30;
- SPQ[5]=S%10+0x30;
- SPQ[9]=P/1000+0x30;
- SPQ[10]=P%1000/100+0x30;
- SPQ[11]=P%1000%100/10+0x30;
- SPQ[11]=P%10+0x30;
- SPQ[15]=Q/1000+0x30;
- SPQ[16]=Q%1000/100+0x30;
- SPQ[17]=Q%1000%100/10+0x30;
- SPQ[18]=Q%10+0x30;
- return(SPQ[22]);
- }
-
- /*****ATT7022初始化 校表*****/
- void check()
- {
- RST=0;
- delay_1ms(1);
- RST=1;
- delay_1ms(1000);
- WSpi(0xC3,0x000000);
- WSpi(0xC9,0x000000);
-
- WSpi(0x20,0x000022);
-
- WSpi(0x1E,0x000000);
-
- WSpi(0x02,0x000000);
- WSpi(0x03,0x000000);
- WSpi(0x04,0x000000);
- WSpi(0x05,0x000000);
-
- WSpi(0x86,0x12293737);
- WSpi(0x89,0x12293737);
-
- WSpi(0x87,0x9277740);
- WSpi(0x8A,0x9277740);
-
- WSpi(0x88,0x9438312);
- WSpi(0x8B,0x9538312);
-
- WSpi(0x0C,0);
- WSpi(0x0D,0);
- WSpi(0x0E,0);
- WSpi(0x0F,0);
- WSpi(0x10,0);
-
- WSpi(0x11,0);
- WSpi(0x12,0);
- WSpi(0x13,0);
- WSpi(0x14,0);
- WSpi(0x15,0);
-
- WSpi(0x16,0);
- WSpi(0x17,0);
- WSpi(0x18,0);
- WSpi(0x19,0);
- WSpi(0x1A,0);
-
- WSpi(0x9B,15689803);
- WSpi(0x9C,1006951);
- WSpi(0x9D,71697);
- WSpi(0xA6,8880843);
- WSpi(0xA7,8476057);
- WSpi(0xA8,8503241);
-
- WSpi(0x2C,0x000003);
- WSpi(0xB0,0x5678);
- WSpi(0xAE,0x3584);
- WSpi(0xC9,0x000001);
- WSpi(0xC6,0x000011);
- }
- /*********主函数**************/
- void main()
- {
- Init_LCD();
- check();
- while(1)
- {
- if(KEY1==0)
- {
- displayL(0,0,displayUAF(65,0x0D,0x10,0x14));
- displayL(1,0,displayUAF(66,0x0E,0x11,0x15));
- displayL(2,0,displayUAF(67,0x0F,0x12,0x16));
- }
- if(KEY2==0)
- {
- displayL(0,0,displaySPQ(65,0x09,0x01,0x05));
- displayL(1,0,displaySPQ(66,0x0A,0x02,0x06));
- displayL(2,0,displaySPQ(67,0x0B,0x03,0x07));
- }
- }
- }
复制代码
下面是原理图:
|