⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 配合12864,549模数转换.txt

📁 上传一份自己写的关于 串行8位AD TLC549的读程序 自己写的
💻 TXT
字号:

#include <reg51.h>
#include <intrins.h>
#include <absacc.h>

#define write_cmd_addr_0 XBYTE[0x8fff]	   //写指令地址左
#define read_state_addr_0 XBYTE[0xafff]   // 读状态地址左
#define write_data_addr_0 XBYTE[0x9fff]   // 写数据地址左
#define read_data_addr_0 XBYTE[0xbfff]     //读数据地址左

#define write_cmd_addr_1 XBYTE[0x4fff]	   //写指令地址右
#define read_state_addr_1 XBYTE[0x6fff]   // 读状态地址右
#define write_data_addr_1 XBYTE[0x5fff]   // 写数据地址右
#define read_data_addr_1 XBYTE[0x7fff]    // 读数据地址右

#define Col_Add 0x40   //列地址
#define Page_Add 0xb8  //行地址
#define Start_line 0xc0   //起始行




//函数声明

void init(void);   //初始化函数
void delay_ms(unsigned int n);   // 毫秒级延时
void delay_10us(unsigned char n);   //微秒级延时
void busy_check(bit sel);  // 忙标志判断
void write_cmd(unsigned char command, bit sel);   //写命令  sel表示选左右屏  command

//命令字
void write_data(unsigned char mydata, bit sel);  // 写数据  sel表示左右屏
 //mydata数据  若用data则与关键字data重合,编译不通过
void clear_screen(void);  // 清屏
void Chinese_disp(unsigned char y,unsigned char x,unsigned char n,bit sel);  // 显示Chinese_character里的一个汉字
void display(void);  //调用Chinese_disp函数组成显示
void number_display(unsigned char y,unsigned char x,unsigned char n,bit sel);//显示数字字符


sbit ad_dat=P2^1;
sbit ad_clk=P2^2;
sbit ad_cs=P2^0;
unsigned char i,j,k; //ijk分别代表类似5.00中i=5,j=0,k=0

/*******************
字模,此字体下对应的
点阵为:宽x高=16x16
*******************/

unsigned char code Chinese_character[][32]=
{
  {0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
  0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00
   },//电

	{0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
   0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00
   },   //压

   {0x00,0x10,0x10,0x12,0x14,0x1C,0x10,0xF0,0x9F,0x10,0x10,0x10,0x10,0xF8,0x10,0x00,
  0x00,0x00,0x40,0x20,0x10,0x08,0x06,0x01,0x00,0x11,0x26,0x40,0x20,0x1F,0x00,0x00
   }  //为

};


/*************
   8x16
  数字字符
*************/
unsigned char code number[][16]=
{
  {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00
},    /*0*/

	{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00
},    /*1*/

  {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00
},    /*2*/

	{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00
},   /*3*/

	{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00
},                /*4*/

	{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00
},          /*5*/

	{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00

},         /*6*/

	{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
},         /*7*/

	{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00

},          /*8*/

	{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
},         /*9*/

  {0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00
},    /*V*/

	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00
}   /*.*/
};



  // 检测忙状态


void busy_check(bit sel)   //sel表示选左右屏   01表示左右
{
	unsigned char busy;
	if(sel)      // 根据选择的左右屏读状态
   {
	  while(busy&0x80)
	  {busy=read_state_addr_1;}
   }
  else
  	{while(busy&0x80)
	   {busy=read_state_addr_0;}
  		}
}



//写命令


void write_cmd(unsigned char command, bit sel)
{  if(sel)
	{
	 busy_check(1);                //先要等不忙了再写命令
	 write_cmd_addr_1=command;
  }
  else
  	{  busy_check(0);
	     write_cmd_addr_0=command;
  		}
}



 // 写数据



void write_data(unsigned char mydata,bit sel)
{if(sel)
	{busy_check(1);
	write_data_addr_1=mydata;    //先要等不忙了再写数据
  }
  else
  	{busy_check(0);
	   write_data_addr_0=mydata;
  		}
}



 // 清屏



void clear_screen(void)
{
	unsigned char i;
  unsigned char k;
	write_cmd(Col_Add,0);      //定位左屏启始为第0列
	  for(i=0;i<8;i++)
	 {
	 	 write_cmd(Page_Add+i,0);   //定位第i页
		 for(k=0;k<64;k++)
		 	{write_data(0x00,0);}    //写数据0x00,即空白
	 }


	 write_cmd(Col_Add,1);     //定位右屏启始为第0列
	  for(i=0;i<8;i++)
	 {
	 	 write_cmd(Page_Add+i,1);     //定位第i页
		 for(k=0;k<64;k++)
		 	{write_data(0x00,1);}     //写数据0x00,即空白
	 }

}



 // 显示汉字



 //y表示启始页码,x表示启始列,n表示数组Chinese_character代号,sel表左右屏
void Chinese_disp(unsigned char y,unsigned char x,unsigned char n,bit sel)
{   unsigned char xx,i;
    unsigned char j;


	if (sel)
	{
	  for(i=0;i<2;i++)
	  {  write_cmd(Page_Add+y+i,1);
		   write_cmd(Col_Add+x,1);
		    for(j=0;j<16;j++)
		    {  write_data(Chinese_character[n][16*i+j],1);   }
	  }
  }
  else
  {
  	    for(i=0;i<2;i++)
	     { sel=0;
	     	 write_cmd(Page_Add+y+i,0);
		     write_cmd(Col_Add+x,0);
	     	 for(j=0;j<16;j++)     //写了一个数据,x自动回加1
	   	   {
	   	   	 xx=x+j;


	   	   	 //切记此处用==,若用=就成了赋值语句了,谨记


	   	   	 if(xx==64)    //判断是否超过64列
	   	   	 {
	   	   	 	sel=1;

	   	   	 	write_cmd(Page_Add+y+i,1);
		        write_cmd(Col_Add,1);

		        }
		       else

		       {write_data(Chinese_character[n][16*i+j],sel);}

	   	   }
        }
   }
  }



//显示数字0-9
 //y表示启始页码,x表示启始列,n表示数组number代号,sel表左右屏
void number_display(unsigned char y,unsigned char x,unsigned char n,bit sel)
{   unsigned char xx,i;
    unsigned char j;


	if (sel)
	{
	  for(i=0;i<2;i++)
	  {  write_cmd(Page_Add+y+i,1);
		   write_cmd(Col_Add+x,1);
		    for(j=0;j<8;j++)
		    {  write_data(number[n][8*i+j],1);   }
	  }
  }
  else
  {
  	    for(i=0;i<2;i++)
	     { sel=0;
	     	 write_cmd(Page_Add+y+i,0);
		     write_cmd(Col_Add+x,0);
	     	 for(j=0;j<8;j++)     //写了一个数据,x自动回加1
	   	   {
	   	   	 xx=x+j;


	   	   	 //切记此处用==,若用=就成了赋值语句了,谨记


	   	   	 if(xx==64)    //判断是否超过64列
	   	   	 {
	   	   	 	sel=1;  //超过64列则从右屏起始地址开始写

	   	   	 	write_cmd(Page_Add+y+i,1);
		        write_cmd(Col_Add,1);    //定义开始在第0列

		        }

		       write_data(number[n][8*i+j],sel);

	   	   }
        }
   }
  }




void delay_10us(unsigned char n)    // 微秒级延时
{do
	{_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();

		}while(--n);
	}

void delay_ms(unsigned int n)   // 毫秒级延时
{
	do delay_10us(131);
	while(--n);
	}


void init(void)   //12864初始化
{
	delay_ms(200);   //延时,给12864时间接受数据
	write_cmd(0xc0,0);    //设定左屏start_line
	delay_ms(5);
	write_cmd(0x3f,0); //   开显示,0x3f开,0x3e关

  delay_ms(200);    //与左屏一样对右屏
	write_cmd(0xc0,1);
	delay_ms(5);
	write_cmd(0x3f,1);

	}

unsigned char ad_ctr()
{
unsigned char data i,j,k;
      ad_dat=1;         
      ad_clk=0;      //clock线在cs有效前须为低电平,根据549工作时序图知
      ad_cs=0;       //片选cs,低电平有效
       for(i=0;i<8;i++)
       {
        j=j<<1;         //高位在前,低位在后
        k=ad_dat;		//共移出8位数据
        ad_clk=1;      //制造一个下降沿使下一位到输出寄存
        ad_clk=0;
	      j=j+k;
       }
       ad_cs=1;
	  return j;			//返回转换结果
}



void ad_deal()                //ad结果处理
{       unsigned int data ad;
	   ad=ad_ctr();   /*读两次,因为第一次读到的是上一次转换的数据,所以读两次*/
		 ad=2*ad_ctr();    /*5.05v对应8位,即256个数,近似认为1个数代表0.02 v*/
		 i=ad/100;         
		 ad=ad%100;      //分别求i,j,k
		 j=ad/10;
		 ad=ad%10;
		 k=ad;
		 }



	void display(void)    //显示函数
{
	Chinese_disp(0,16,0,0);    
  Chinese_disp(0,32,1,0);         
  Chinese_disp(0,48,2,0);
  number_display(2,16,i,0);     
  number_display(2,24,11,0);
  number_display(2,32,j,0);
  number_display(2,40,k,0);
  number_display(2,48,10,0);
}




//主程序
void main(void)
{   
	  init();
 	  clear_screen();
	   _nop_();

     while(1)
     { ad_deal();     //实时处理,主程序中不断采样
     	 display();

     	}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -