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

📄 lcd12864.h

📁 用proteus仿真AVR单片机12864LCD,实现波形的实时显示。
💻 H
字号:
/**************************************************************************
  
                   		THE AMPIRE_12864 GRAPHIC LCD LIB
  
             		COPYRIGHT (c)   2007 BY zyg.
                       		--  ALL RIGHTS RESERVED  --
  
   File Name:       LCD12864.h
   Author:          zhuyiguo
   Created:         2007/4/27
   Finish:          2007/5/3
   Modified:		NO
   Revision: 		1.0
  
***************************************************************************/
#ifndef LCD_CHAR_1602_2007_4_27
#define LCD_CHAR_1602_2007_4_27
#include <iom16v.h>
#include <macros.h>
#include "LCD12864_DATA.h"

//*****************************************************************
//控制脚定义
#pragma data:data
#define CSC1_1 asm("sbi 0x15,0")
#define CSC1_0 asm("cbi 0x15,0")
#define CSC2_1 asm("sbi 0x15,1")
#define CSC2_0 asm("cbi 0x15,1")
#define RS_D asm("sbi 0x15,2")
#define RS_I asm("cbi 0x15,2")
#define	RW_R asm("sbi 0x15,3")
#define RW_W asm("cbi 0x15,3")
#define E_1 asm("sbi 0x15,4")
#define E_0 asm("cbi 0x15,4")
//****************************************************************
#define uchar unsigned char
#define uint unsigned int
const uchar *p_to_flash; //指向程序存储区的指针,用来指向字模表
uchar hanzi_flag=1,graphy_flag=0,graphy_num=0;
uchar enter=0,flash_flag=0;
uint adc_value;

//*****************************************************************
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x1F;
 PORTD = 0x00;
 DDRD  = 0xe0;
}

//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//*****************************
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xF3; //setup
 TCNT1L = 0xCB;
 //OCR1AH = 0x3D;
 //OCR1AL = 0x09;
 //OCR1BH = 0x3D;
 //OCR1BL = 0x09;
 //OCR1CH = $OCR1CH$;
 //OCR1CL = $OCR1CL$;
 //ICR1H  = 0x3D;
 //ICR1L  = 0x09;
 TCCR1A = 0x00;
 TCCR1B = 0x04; //start Timer
}

//ADC initialize
// Conversion time: 52uS
void adc_init(void)
{
 ADCSRA = 0x00; //disable adc
 ADMUX = 0x00; //select adc input 0
 ACSR  = 0x80;
 ADCSRA = 0xCD;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 watchdog_init();
 timer1_init();
 //adc_init();

 MCUCR = 0x00;
 GICR  = 0xc0;
 TIMSK = 0x04; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//******************************************************************
//延时函数
void delay_us(int time)//微妙级延时函数
{
 WDR();
 while(time--)
 {
  NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
 }
}
void delay_ms(int time)//毫秒级延时函数
{
  WDR();
 while(time--)
  {
   delay_us(1000);
  }
  WDR();
}
//********************************************************************
//读LCD12864状态字
unsigned char lcd_read_code(void)
{
 unsigned char code;
 DDRA=0x00;
 RS_I;
 NOP();
 RW_R;
 NOP();
 code=PINB;
 E_1;
 delay_us(1); 
 E_0;
 DDRA=0xff;
 return code;
  //WDR();
}

//*******************************************************************
//判断LCD是否为忙状态
void judgebusy(void)
{
 //unsigned char t;
 //t=lcd_read_code();
 while(((lcd_read_code())&0x80)==0x80)
 {
  //t=lcd_read_code();
  //if((t&0x80)!=0x80) break;
  WDR();
 }
}

//写显示数据*******************************************************************
void lcd_write_data(unsigned char data)
{
 WDR();
 DDRB=0xff;
 RS_D; 
 NOP(); 
 RW_W; 
 NOP();
 PORTB=data;
 E_1;          
 //judgebusy();
 delay_us(1); 
 E_0; 
 DDRB=0x00;
 WDR();
}

//写状态字********************************************************************
void lcd_write_code(unsigned char code)
{
 WDR();
 DDRB=0xff; 
 RS_I; 
 NOP();
 RW_W;
 NOP(); 
 PORTB=code;
 E_1;
 //judgebusy(); 
 delay_us(1);  
 E_0; 
 DDRB=0x00;
 WDR();
}

//**************************************************************
//写一个汉字
void dis_one_zi(uchar x_add,uchar y_add,const uchar *po_to_flash) 
               
{ 
  
  uchar i,row,column; 
  row=x_add*2+0xb8;
  column=(y_add<4?y_add:y_add-4)*16+0x40; //左右半屏判断, 
  if(y_add<4)
  {
    CSC2_1; 
  }
  if(!(y_add<4))
  {
    CSC1_1;
  } 
 
  lcd_write_code(row); 
  lcd_write_code(column); 
  for(i=0;i<32;i++)
  { 
    if(i==16) 
    { 
      lcd_write_code(row+1); 
	  lcd_write_code(column); 
    } 
    lcd_write_data(*po_to_flash++); 
  } 
  CSC1_0;//使列扫描无效
  CSC2_0; 
  WDR();
} 

//**************************************************************
//写一个字母

void dis_one_abc(uchar x_add,uchar y_add,const uchar *po_to_flash) 
{ 
  
  uchar i,row,column; 
  row=x_add*2+0xb8; 
  column=(y_add<8?y_add:y_add-8)*8+0x40; 
  if(y_add<8)
  {
    CSC2_1; 
  }
  if(!(y_add<8))
  {
    CSC1_1;
  }  
  lcd_write_code(row); 
  lcd_write_code(column); 
  for(i=0;i<16;i++)
  { 
  	if(i==8)
	{ 
	  lcd_write_code(row+1); 
	  lcd_write_code(column); 
	} 
	lcd_write_data(*po_to_flash++); 
  } 
  CSC1_0;
  CSC2_0;
  WDR(); 
} 

 //写数字K=0,显示前半个字 ******************************************
void dis_one_ban_zi(uchar x_add,uchar y_add,uchar k_add,const uchar *po_to_flash)
{ 
  
  uchar i,j,w,e; 
  if(k_add==0){e=0;} 
  if(k_add==1){e=8;} 
  j=x_add*2+0xb8; 
  w=(y_add<4?y_add:y_add-4)*16+0x40; //左右半屏判断 
  if(y_add<4)
  {
   	CSC2_1; 
  }
  if(!(y_add<4))
  {
   	CSC1_1;
  }  
  lcd_write_code(j); 
  lcd_write_code(w+e); 
  for(i=0;i<16;i++)//循环显示内容 
  { 
  	if(i==8) 
	{ 
	  lcd_write_code(j+1); 
	  lcd_write_code(w+e); 
	} 
	lcd_write_data(*po_to_flash++); 
  } 
  CSC1_0;
  CSC2_0;
  WDR(); 
} 
//*****************************************************************

void CLRLCD(void) //清屏 
{ 
  uchar n,m; 
  for(n=0;n<4;n++)
  { 
  	for(m=0;m<8;m++) 
  	{
	  p_to_flash=X26;
	  dis_one_zi(n,m,p_to_flash);
	  WDR();
	}
  } 
} 
//***********************************************************************
void lcd_init(void) //显示屏初始化 ,写入初始化命令字
{
   delay_ms(100); 
  
   lcd_write_code(0x3f); 
      
   lcd_write_code(0xc0);   
     
   lcd_write_code(0xb8);  
     
   lcd_write_code(0x40);  
  
   CLRLCD();//清屏 
} 
//**********************************************************************
//显示图形
void display_graphic(const uchar *po_to_flash)
{
  uchar i,row=0xb8,column=0x40,count=0; 
    
  for(;row<0xc0;row++)
  {
    WDR();
    CSC2_1;CSC1_0;
	lcd_write_code(row);
	lcd_write_code(column);
	for(i=0;i<64;i++)
	{	 
	  lcd_write_data(*po_to_flash++);	  
	}
	CSC2_0;CSC1_1;//显示右半页
	lcd_write_code(row);
	lcd_write_code(column);
	for(i=0;i<64;i++)
	{	 
	  lcd_write_data(*po_to_flash++);	  
	}	
	
  }
  WDR();
  CSC2_0;CSC1_0;  
}
//清一列子程序(在显示波形时用到)*******************************************************
void clear_column(uchar column)
{
   uchar i;
   uchar page=0xb8;   
   
   for(i=0;i<8;i++)
   {
      lcd_write_code(page++);
	  lcd_write_code(column);
	  lcd_write_data(0x00);	  
   }  
}


//显示波形******************************************************

void wave_display(void)
{
   uchar d[2]={'0','0'};
   uchar i,flag=0,cha_page,cha_dot,cha;
   uchar org_dot,page0,page1;
   uchar page,column=0x40;
   CSC2_1;CSC1_0;
   while(1)
   {
   	  WDR();
	  if(hanzi_flag==1) break;
	  d[1]=d[0];
	  page1=d[1]/8;
	  page=0xb8+(7-page1);
	  org_dot=d[1]%8;//显示上一次坐标中最上端的余值	
	  d[0]=(uchar)adc_value;
	  page0=d[0]/8;//本次的坐标值中,占用整页数;
	  cha_dot=d[0]%8;
	  
	  if(flag%2==0)
	  {CSC2_1;CSC1_0;}
	  else{CSC2_0;CSC1_1;}
	  clear_column(column);	  
	  if(page0>page1)//本次占的页数比上一次的多的情况下;
	  {	   	 
		 lcd_write_code(page);
		 lcd_write_code(column);
		 if(org_dot!=7)		//如果最上页是满显示的话,就跳过; 
		 {lcd_write_data(0xff>>(org_dot+1));}		 
		 	 		 
		 cha_page=page0-page1;			 
		 page--;
		 for(i=(cha_page-1);i>0;i--)
		 {		    
			lcd_write_code(page--);
			lcd_write_code(column);
			lcd_write_data(0xff);			
		 }
		 
		 lcd_write_code(page);//显示本次坐标中最上页的余值;
		 lcd_write_code(column);		 
		 {lcd_write_data(0xff<<(7-cha_dot));}		
		 CSC2_0;CSC1_0;		 
	  }
	  
	  if(page0<page1)//本次占的页数比上一次的少的情况下;
	  {
	     
		 lcd_write_code(page);//先显示上一次坐标中最上页的余值;
		 lcd_write_code(column);		 
		 lcd_write_data(0xff<<(7-org_dot));		 
	     cha_page=page1-page0;		 
		 page++;
		 for(i=(cha_page-1);i>0;i--)//显示所差的页数
		 {  			
			lcd_write_code(page++);
			lcd_write_code(column);
			lcd_write_data(0xff);			
		 }
		 lcd_write_code(page);
		 lcd_write_code(column);
		 if(cha_dot!=7)		
		 {lcd_write_data(0xff>>(cha_dot+1));}		 
		 CSC2_0;CSC1_0;
	  }
	  if(page0==page1)
	  {
	     	 	 
		 lcd_write_code(page);
		 lcd_write_code(column);
		 if(d[0]>d[1])//本次坐标比上一次大
		 {lcd_write_data((0xff<<(7-cha_dot))&(0xff>>(org_dot+1)));}
		 else if(d[0]<d[1])//本次坐标比上一次小
		 {lcd_write_data((0xff<<(7-org_dot))&(0xff>>(cha_dot+1)));}
		 else if(d[0]==d[1])//如果相等的话,就显示和上次相等;
		 {
		    lcd_write_data((0xff<<(7-org_dot))&(0xff>>org_dot));
			
		 }		 
		 CSC2_0;CSC1_0;		 
		 
	  }
	  column++;
	  if(column==0x80)
	  {column=0x40;
	   flag++;
	  }	  
	  WDR();
   }
   
}

//图片滚屏效果子程序:***********************************************

void scroll(const uchar *po_to_flash)
{
          unsigned char i,start;
		  while(1)
	  	  {
	   	   WDR();
		   if(hanzi_flag==1) break;//显示汉字标志位为1则跳出循环;
	   	   start=0xc0;	  	 
	   	   for(i=0;i<64;i++)
	   	   {
	       	  display_graphic(po_to_flash);//显示完一屏则起始行加1;
			  	       	  
      	   	  lcd_write_code(start);
	  	   	  start++;			  
	   	   }
	  	  }
		 /* while(hanzi_flag==0)//另外一种写法;
	  	  {
		   WDR();			   
	   	   start=0xc0;	  	   
	   	   for(i=0;i<64;i++)
	   	   {
	       	  p_to_flash=tu1;display_graphic(p_to_flash);	       	  	  
	  	   	   	   	  
      	   	  lcd_write_code(start); 
	  	   	  start++;			  
	   	   }		   
	  	  }*/
}


#endif

⌨️ 快捷键说明

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