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

📄 12864.h

📁 DA代码 经测试通过的c8051f020 DA代码 内有锯齿波, 正弦波, 三角波等产生的代码...
💻 H
字号:
#include"c8051f020.h"  
#include"math.h"  

//#include <absacc.h>
//#include <string.h>
//#include"common.c"

//12864字符液晶(带中文字库)
//并口:1 Vss   2 Vdd  3 N.C  4 RS  5 R/W  6  E  7~14 DB0~DB7  15 A(+)  16 A(-)
//串口:1 Vss   2 Vdd  3 N.C  4 En  5 data 6  clk 

#define clear   0x01  								//清屏幕,约1.6ms
#define home    0x02   								//光标回零(左上角)/
#define f_set   0x30  								//并行、基本指令
#define dis_on  0x0f 	 							//打开显示,光标,闪烁功能
#define in_mode 0x06  								//输入方式,地址增1,光标右移

void bit8_serial_input(uchar ix);
void blank(uchar x,uchar y,uchar z,bit repos);
//void delayms(uint count);
void dis_10num(uint num,bit flag);				   	//显示十进制数字	
void dis_16num(uint num,bit flag);				   	//显示十六进制数字
void dis_str(uchar x,uchar y,uchar*str);   			//显示多个汉字,也可以显示字母
void initial(void);							   		//初始化
void instruct(uchar dat);					   		//归  位
void setpos(uint xpos,uint ypos);			   		//光标设定
void write_abyte(uchar dat);			       		//dat为ASCII码

void write_word(uint w);					   		//写入汉字,输入为汉字对应的码
void welcome();
void menu();

sbit P_RS =P0^7;
sbit P_RW =P0^6;
sbit P_E  =P0^4;		   

bdata uchar ab;
sbit abit7=ab^7;


//////////////////////////////////////////////
/*-----------------------------把ix依次送入RW----------------------------*/
void bit8_serial_input(uchar ix)
{
	data uchar i,j,nc;
	P_E=0;    //clk=0;
	ab=ix;
	for(i=0;i<8;i++){
		P_RW=abit7;    //din=abit7;
		ab<<=1;
		P_E=1;
		for(j=0;j<10;j++)nc=0;
		P_E=0;
		}
}
/*-----------------------写入控制方式 ----------------------------------*/

void instruct(uchar dat)
{
	data uchar ch;
	P_RS=1;   //选通
	ch=0xf8;
	bit8_serial_input(ch);
	ch=dat&0xf0;
	bit8_serial_input(ch);
	ch=dat<<4;
	bit8_serial_input(ch);
	P_RS=0;  //结束作业
}
/*------------------------------------------------------------*/

void write_abyte(uchar dat)						 //input ASCII
{
	data uchar ch;
	P_RS=1;  //读数据--不选通
	ch=0xfa;  //RS=1 RW=0;
	bit8_serial_input(ch);
	ch=dat&0xf0;  //RS=1 RW=0;
	bit8_serial_input(ch);
	ch=dat<<4;
	bit8_serial_input(ch);
	P_RS=0;  //结束作业
}

/*------------------------------------------------------------------*/
/*
   写一个汉字到x,Y坐标处其中X为8列y为4行
*/
void  write_word(uint w)							 //a ch_word 
{
	data  uchar ch,cl;
	ch=w>>8;
	cl=w;
	write_abyte(ch);
	write_abyte(cl);
}

/*
显示字母数字在x,y处
*/
void dis_str(uchar x, uchar y, uchar *str)
{
	data uchar loc,*p;
	code uchar xline[5]={0,1,3,2,4};
	p=str;
	x=xline[x];
	instruct(home);
	loc=(16*(x-1)+y-1);
	if(loc&0x01){
	       loc/=2;
	       instruct(loc|0x80);
	       //ch=' ';   //字符串前加空格(0x20 )
	       write_abyte(' ');
	       }else{
	       loc/=2;
	       instruct(loc|0x80);
	       }
	while(*p){
	       write_abyte(*p++);
	       }
}

/*---------------------------------------------------------------------------*/
void setpos(uint xpos,uint ypos)
{
	 int i,j,x,y;
	 y=ypos;
	 if(xpos%4==1)x=1;
	 if(xpos%4==2)x=3;
	 if(xpos%4==3)x=2;
	 if(xpos%4==0)x=4;
	 instruct(0x03);
	 for(i=1;i<x;i++)
	 for(j=0;j<8;j++)	instruct(0x14);
	 for(i=1;i<y;i++)	instruct(0x14);

}
void blank(uchar x,uchar y,uchar z,bit repos)	   //从(x,y)位置开始,清出Z个空格,repos=1光标复原位,repos=0光标不复原位
{
	setpos(x,y);
	for(;z>0;z--)
	{
		write_abyte(' ');
	}
	if(repos==1) 	 setpos(x,y);
}

//----------------- 显示16进制数字------------------
void dis_16num(uint num,bit flag)	  //flag=1 显示0   
{
	 /*uchar num4,num3,num2,num1;//uchar hex;
	 num4=num/4096;
	 num3=(num-num4*4096)/256;
	 num2=(num-num4*4096-num3*256)/16;
	 num1=(num-num4*4096-num3*256-num2*16);
	
	 if(num4<=9)num4=num4+'0'; else num4=(num4-10)+'A';
	 write_abyte(num4);
	  if(num3<=9)num3=num3+'0'; else num3=(num3-10)+'A';
	 write_abyte(num3);
	  if(num2<=9)num2=num2+'0'; else num2=(num2-10)+'A';
	 write_abyte(num2);
	  if(num1<=9)num1=num1+'0'; else num1=(num1-10)+'A';
	 write_abyte(num1);   */
   uchar snum[5];uchar i;int temp=0;//bit flag=0;  //检验到第一个非零的数
   for(i=0;i<5;i++)
   {
    snum[i]=(num-temp)/(pow(16,4-i));
	temp+=snum[i]*(pow(16,(4-i)));
	P_RS=1;   //选通
    bit8_serial_input(0xf8);
	if(flag|snum[i]!=0|i==4) {
	                     if(snum[i]<=9)  snum[i]=snum[i]+'0'; 
						 else 			 snum[i]=(snum[i]-10)+'A';
						 write_abyte(snum[i]);
						 flag=1;
						 }

	P_RS=0;
   }
   return;
 
}
void dis_10num(uint num,bit flag)					   //flag=0 不显示出高位0
{
      uchar numm,num1000,num100,num10,num1;            //bit flag=0;//uchar hex;
   	  //uint  num=number/2;								   //除以二显示
   	   
	   numm   = num/10000;
	   num1000=(num-numm*10000)/1000;
	   num100 =(num-numm*10000-num1000*1000)/100;
	   num10  =(num-numm*10000-num1000*1000-num100*100)/10;
	   num1   =(num-numm*10000-num1000*1000-num100*100-num10*10)/1;
	
	   P_RS=1;   //选通
	   bit8_serial_input(0xf8);
	   if(flag|numm!=0)     {numm=numm+'0';       write_abyte(numm);    flag=1;}
	   if(flag|num1000!=0)  {num1000=num1000+'0'; write_abyte(num1000); flag=1;}
	   if(flag|num100!=0)   {num100=num100+'0';   write_abyte(num100);  flag=1;}
	   if(flag|num10!=0)    {num10=num10+'0';     write_abyte(num10);   flag=1;}
	   num1=num1+'0';                             write_abyte(num1);
	   P_RS=0;   //选通	 

}
//---------------------对液晶显示屏初始化--------------------------------
void initial(void)
{
	data uchar i,j;
	P_RS=0;           				//串行--不选通
	//P_PSB=0;
	P_E=0;   						//串行方式
	instruct(f_set);    //0x30;     //8位并行接口 基本指令

	for(i=0;i<30;i++){}
	//for(i=0;i<250;i++){}
	//for(i=0;i<250;i++){}
	//instruct(dis_on);     //0x0f);     //开启屏幕 光标 闪烁
	for(i=0;i<30;i++){}
	instruct(clear);     //0x01);     //清屏幕 clear

	for(j=0;j<10;j++){
	   for(i=0;i<250;i++){}
	   }

	instruct(in_mode);     //0x06);    //光标右移、地址增1 方式
	for(i=0;i<30;i++){}
	instruct(home);

}
void welcome()
{
	instruct(0x0c);
	////////////////				////////////				//液晶显示
	dis_str(1,1,   "20--07年全国电赛\0"); 	delayms(1); 
	dis_str(2,1,   "    南  邮      \0");   delayms(1);
	dis_str(3,1,   "NJ Uni. of P&T  \0"); 	delayms(1); 
	dis_str(4,1,   "Press Any Key...\0"); 	delayms(1);  		//多余被截
	//instruct(0x03);                          				    //位置归位,初始化
	
}
void menu()
{
	////////////////				////////////				//液晶显示
	dis_str(1,1,   "    DDS         \0"); 	delayms(1); 
	dis_str(2,1,   "fmax: 50MHz          		\0");   delayms(1);
	dis_str(3,1,   "                \0"); 	delayms(1); 
	dis_str(4,1,   "频率:        kHz\0"); 	delayms(1); 
	//instruct(0x03);                          				    //位置归位,初始化
	
}

⌨️ 快捷键说明

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