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

📄 text1.c

📁 单片机控制的AD对正弦波信号采样后用12864的液晶显示出来
💻 C
字号:
					   						  				 /***********************************************
TCM12864J液晶显示屏驱动程序
驱动芯片:KS0107
MCU:AT89S52

日期:08-09-05

P11--RS		RS=1,表示DB7~DB0 为显示数据
			RS=0”,表示DB7~DB0 为显示指令数据
P12--RW		R/W=1”,E=“H”,数据被读到DB7~DB0
			R/W=0”,E=“H→L”, DB7~DB0 的数据被写到IR 或DR
P13--E		使能信号:	R/W=“L”,E 信号下降沿锁存DB7~DB0
						R/W=“H”,E=“H” DRAM数据读到DB7~DB0
P14--CSA	H:选择芯片(右半屏)信号
P15--CSB	H:选择芯片(左半屏)信号
P0---DB0~7
***********************************************/

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

sbit P0_0 = P0^0;
sbit P0_1= P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;


sbit p_RS = P1^1;
sbit p_RW = P1^2;
sbit p_E = P1^3;
sbit p_CSA = P1^4;
sbit p_CSB = P1^5;
sbit EOC = P1^0;
sbit ST = P2^6;
sbit OE = P2^7;
 unsigned char  ad_value; 
   unsigned char   data_value; 
#define DATA P3

	

void DelayMs(unsigned int count1);
void lcd_busy(void);
void lcd_init(void);
void lcd_setxy(unsigned char x,unsigned char y);
unsigned  char lcd_AD(void)	;


void lcd_clear(void);
void lcd_writepoint(unsigned char i,unsigned char j);
unsigned char lcd_readdata(unsigned char x,unsigned char y);
		 
void main(void)									//主函数
{
	int y=0;
	unsigned char data1,data2; 
   	   
    lcd_init();
    lcd_clear();
	
	while(1)   
	{
	lcd_AD();
	  {	
	      ad_value=0x00;
		if(data_value&0x80) ad_value=ad_value+0x01;
		if(data_value&0x40) ad_value=ad_value+0x02;
		if(data_value&0x20) ad_value=ad_value+0x04;
		if(data_value&0x10) ad_value=ad_value+0x08;
		if(data_value&0x08) ad_value=ad_value+0x10;
		if(data_value&0x04) ad_value=ad_value+0x20;
		if(data_value&0x02) ad_value=ad_value+0x40;
		if(data_value&0x01) ad_value=ad_value+0x80;	 
		 }
			
		data1= ad_value;
           
    	data2=data1>>2;
		lcd_writepoint(data2,y);  
		 	DelayMs(25) ;
		y++;
		 
        if(y>=128) {  lcd_clear();   y=0;	 }
	
	
	
	}	
 
}	

	/*******************延迟***************/

void DelayMs(unsigned int count1)
{
	while (count1--)
	{
		unsigned char count2 = 0;
		for (; count2<30; count2++);
	}
}					
		 /**************************************AD转换函数******************/


 

unsigned  char lcd_AD(void)	
{	
	unsigned char   data_AD; 
	
	P2 = 0xc2;
	ST=0;
    

	ST=1;
	ST=0;

	while(EOC ==0)	;
	OE=1;	 
	data_value=P0;
		  
	_nop_();
	   	_nop_();  
			_nop_();

	_nop_();
	OE=0;
	return data_value;

}
/***********************************************
查询LCD是否忙碌,如果忙碌,则等待,直到不忙碌,
跳出该函数,顺序执行下面程序
************************************************/
void lcd_busy(void)
{
	p_RS=0;						//CMD
	p_RW=1;						//READ
	while(1)
	{
		p_E=1;
		if(DATA<0x80)break;		//BUSY(DB7) = 0
		p_E=0;
	}
	p_E=0;
}

/**********************************************
初始化
***********************************************/
void lcd_init(void)
{
	//开显示
	p_RS=0;						//CMD
	p_RW=0;						//Write
	DATA=0x3f;					//Display ON
	
	p_CSA=1;
	p_CSB=0;

	p_E=1;
	p_E=0;

	p_CSA=0;
	p_CSB=1;

	p_E=1;
	p_E=0;

	//0行显示
	lcd_busy();
	
	//P15=0;

	DATA=0xc0;		//0行开始
	
	p_CSA=1;
	p_CSB=0;

	p_E=1;
	p_E=0;

	p_CSA=0;
	p_CSB=1;

	p_E=1;
	p_E=0;
}

/**********************************************
设置行值和列值
***********************************************/
void lcd_setxy(unsigned char x,unsigned char y)
{
	if(y<64)
	{
		//写行地址left
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=1;
		p_CSB=0;

		DATA=0xb8|x;
	
		p_E=1;
		p_E=0;

		//写列地址left
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=1;
		p_CSB=0;

		DATA=0x40|y;

		p_E=1;
		p_E=0;
	}
	else
	{
		//y=y-64;
		//写行地址right
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=0;
		p_CSB=1;
	
		DATA=0xb8|x;
	
		p_E=1;
		p_E=0;

		//写列地址right
		lcd_busy();
		p_RS=0;
		p_RW=0;

		p_CSA=0;
		p_CSB=1;

		DATA=0x40|y;

		p_E=1;
		p_E=0;

	}
}

/**********************************************
画点i(0-63),j(0-127)
***********************************************/
void lcd_writepoint(unsigned char i,unsigned char j)
{
	unsigned char x,y,data_t=0x00;
	y=j;

	if(i>=0&&i<=7)
	{
		x=0;
		data_t=(0x01<<i);
	}
	else if(i>=8&&i<=15)
	{
		x=1;
		data_t=(0x01<<(i-8));
	}
	else if(i>=16&&i<=23)
	{
		x=2;
		data_t=(0x01<<(i-16));
	}
	else if(i>=24&&i<=31)
	{
		x=3;
		data_t=(0x01<<(i-24));
	}
	else if(i>=32&&i<=39)
	{
		x=4;
		data_t=(0x01<<(i-32));
	}
	else if(i>=40&&i<=47)
	{
		x=5;
		data_t=(0x01<<(i-40));
	}
	else if(i>=48&&i<=55)
	{
		x=6;
		data_t=(0x01<<(i-48));
	}
	else if(i>=56&&i<=63)
	{
		x=7;
		data_t=(0x01<<(i-56));
	}
	lcd_busy();
	lcd_setxy(x,y);

	p_RS=1;
	p_RW=0;

	if(y<64)
	{
		p_CSA=1;
		p_CSB=0;
	}
	else
	{
		p_CSA=0;
		p_CSB=1;
	}
	DATA=data_t;
	
	p_E=1;
	p_E=0;
}

/**********************************************
写数据,给所有单元都写入0
***********************************************/
void lcd_writedata(unsigned char x,unsigned char y)
{
	lcd_busy();
	lcd_setxy(x,y);		//set x,y address

	p_RS=1;				//write data
	p_RW=0;				//write

	if(y<64)
	{
		p_CSA=1;
		p_CSB=0;
	}
	else
	{
		p_CSA=0;
		p_CSB=1;
	}
	DATA=0x00;

	p_E=1;
	p_E=0;
}



/**********************************************
清屏
***********************************************/
void lcd_clear(void)
{
	unsigned char i,j;
	for(i=0;i<8;i++)
		for(j=0;j<128;j++)
			lcd_writedata(i,j);
}





⌨️ 快捷键说明

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