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

📄 lcd8x15d.h

📁 avr单片机编写的金鹏公司的8x15d液晶显示屏程序
💻 H
字号:
/*********************************************
*  函数库说明:金鹏8x15D触摸屏头文件
*  版本:      v0.0                                     
*  作者:      cht                                      
*  日期:      2008年02月14日                           
*  修改:      cht                                      
*  修改日期:  2008年02月19日                           
*                                                     
*  说明 完成D系列产品的基本功能 ,用中断方式处理触摸
**********************************************/



#ifndef lcd_8822p
#define lcd_8822p

#include <avr/interrupt.h>
#include <util/delay.h> 
#include <avr/wdt.h>
#include <avr/interrupt.h>


#define CPU_CRYSTAL (1.0) 

#define wait_us(us)  _delay_loop_2  ((uint16_t) ((us)*CPU_CRYSTAL/4))

#define LCD_DATA_PORT  PORTA  //用来传送命令和数据
#define lcd_rs         PD0
#define lcd_wr         PD1
#define lcd_rd         PD6
#define lcd_cs1        PD3
#define lcd_cs2        PD4
#define lcd_busy       PD5
#define lcd_int        PD2
#define lcd_rst        PD7

#define uchar        unsigned char
#define uint         unsigned int

uchar tabx[4]; //存从用于显示的触摸屏的X坐标
uchar taby[4]; //存储用于显示的触摸屏的Y坐标 (因为是10位AD转换,所以值为0——1023)
uchar tab3[]="touch !!";
uchar tab4[]="no touch";
uchar tab5[]="0000";
/*--------------------------------------
	函 数 声 明
----------------------------------------*/
void lcd_init(void);
void lcd_datawrite(uint8_t wrdata);
void lcd_regwrite(uint8_t regname,uint8_t regdata);
void lcd_regwr(uint8_t regnada) ;
void delay_nms(uint16_t n); 
void gotoxy(uint16_t x,uint16_t y);
void lcd_reset(void) ;
void lcd_clear(void);
void get_touch(void);
uchar touch_test(void) ;
uint16_t touch_y(void) ;
uint16_t touch_x(void);


/*--------------------------------------
	uint8_t LCD_reRead(uint8_t cmdReg)
 
说明:读取触摸屏寄存器中的数据
----------------------------------------*/

uint8_t LCD_reRead(uint8_t cmdReg) 
{
	uint8_t  reg_rddata;
	while(!(PIND&(1<<5)))
	{
	
	};                           // 判断RA8803 是否忙碌中 (低电平为忙)
	lcd_regwr(cmdReg);          // 写入缓存器的地址
	
	PORTA = 0xff;
	DDRA =0x00;                  //端口A为输入,且内部上拉电阻有效
	PORTD &= ~_BV(lcd_cs1);
	PORTD |=_BV(lcd_wr);
	PORTD &=~_BV(lcd_rs);
	PORTD &=~_BV(lcd_rd);
	reg_rddata = PINA;
	wait_us(10);
	PORTD |=_BV(lcd_rd);
	PORTD |=_BV(lcd_rs);
	PORTD |=_BV(lcd_cs1);
	DDRA =0xff;                   //端口A恢复为输出
	return  reg_rddata;           // 回传读取缓存器的数据
}

/*--------------------------------------
	void lcd_clear(void)
 
说明:清除LCD屏幕的所有显示

PS:实际应用中发现一旦清屏,所有寄存器的数据好像都会 
    消失,要进行再次初始化,不知是否是程续问题还是芯片缺陷
----------------------------------------*/

void lcd_clear(void) 
{                   
  uint8_t reg_rddata;
  lcd_regwrite(0xe0,0x00);
  reg_rddata = LCD_reRead(0xf0);
  //reg_rddata &=0xf7;
  reg_rddata |= 0x08;
  lcd_regwrite(0xf0,reg_rddata);

}  

/*--------------------------------------
	void lcd_reset(void) 
 
说明:触摸屏复位
----------------------------------------*/

void lcd_reset(void) 
{               
  PORTD = 0X00;
  delay_nms (120);            // delay 120ms 等待上电复位
  PORTD = 0xff;               // lcd_rs/wr/rd/cs1/cs2 normal - skeep high.
}


/*--------------------------------------
	void gotoxy(uint16_t x,uint16_t y) 
 
说明:设定当前显示坐标,
PS :如果是显示汉字x为0-14,Y为0-127
----------------------------------------*/
 
 void gotoxy(uint16_t x,uint16_t y) 
{                                
  lcd_regwrite(0x60,x); 
  lcd_regwrite(0x70,y); 
}


/*--------------------------------------
	void delay_nms(uint16_t n)  
 
说明: 延时n个毫秒
----------------------------------------*/

void delay_nms(uint16_t n)      
  {
  uint16_t i;
   for (i=0;i<n;i++)
   wait_us(4*250);
  }

/*--------------------------------------
	void lcd_regwrite(uint8_t regname,uint8_t regdata) 
 
说明: regname为要写入的寄存器,regdata为写入寄存器的值
----------------------------------------*/

void lcd_regwrite(uint8_t regname,uint8_t regdata)
{
	lcd_regwr(regname);
	wait_us(200);
	lcd_regwr(regdata);
}

/*--------------------------------------
	void lcd_regwr(uint8_t regnada)
 
说明: 写命令到寄存器
----------------------------------------*/

void lcd_regwr(uint8_t regnada) //写命令到寄存器
{

	PORTA= regnada;
	PORTD &= ~_BV(lcd_cs1);
	PORTD |=_BV(lcd_rd);
	PORTD &=~_BV(lcd_rs);
	PORTD &=~_BV(lcd_wr);
	wait_us(10);
	PORTD |=_BV(lcd_wr);
	PORTD |=_BV(lcd_rs);
	PORTD |=_BV(lcd_cs1);

}

/*--------------------------------------
	void lcd_datawrite(uint8_t wrdata)
 
说明: 写数据到DDRAM 
----------------------------------------*/

void lcd_datawrite(uint8_t wrdata) //写数据到DDRAM 
{ 

	while(!(PIND&(1<<5)))
	//while(PIND&(1<<5))
	{
	};
	
	PORTA = wrdata; 
	PORTD &= ~_BV(lcd_cs1);
	PORTD |=_BV(lcd_rd);
	PORTD |=_BV(lcd_rs);
	PORTD &=~_BV(lcd_wr);
	wait_us(10);
	PORTD |= _BV(lcd_wr);
	PORTD |=_BV(lcd_rs);
	PORTD |=_BV(lcd_cs1);
}

/*--------------------------------------
	void lcd_init(void)
 
说明: 触摸屏初始化

PS:[00]如按照例程的设置为“c9” 屏幕被关闭根本无法显示
    [A0],[c1]都有检测触摸屏是否被触摸的状态位,不知该用那个
	例程中[A0]的设置为“11” ,看不懂
	---------------------------------------*/

void lcd_init(void)
{

    
		lcd_regwrite(0x00,0xcd);
        //lcd_regwrite(0x01,0x42); //设置频率和INT及BUSY信号的触发电平 
		lcd_regwrite(0x01,0x40);
        lcd_regwrite(0x02,0x10);   
        lcd_regwrite(0x03,0x80);  
        lcd_regwrite(0x10,0x2b);          
        lcd_regwrite(0x11,0x00);  
        lcd_regwrite(0x12,0x91);            
		lcd_regwrite(0x20,0x1d); // active window right register(awrr)
        lcd_regwrite(0x30,0x7f); // active window bottom register(awbr)
        lcd_regwrite(0x40,0x00); // active window left register(awlr)
        lcd_regwrite(0x50,0x00);
        
		lcd_regwrite(0x21,0x1d); 
        lcd_regwrite(0x31,0x7f); 
        lcd_regwrite(0x41,0x00); 
        lcd_regwrite(0x51,0x00);
		
		lcd_regwrite(0x71,0x00); 
        lcd_regwrite(0x72,0x7f);  
        lcd_regwrite(0x80,0xaa);  
        lcd_regwrite(0x81,0x04);         
       // lcd_regwrite(0x90,0x1e);  //(8MHZx8)/(240x128x70)=29.7=30  240x128 即为8X15D ,
		                           //70为刷新率,8为数据总线为八位并口,8MHZ为LCD晶振频率
        
		lcd_regwrite(0x90,0x0a);
		//lcd_regwrite(0xa0,0x04);  //中断设置和中断状态,前4位为状态,后4位为设置        
        lcd_regwrite(0xa0,0x11);
		lcd_regwrite(0xa1,0x00);
		lcd_regwrite(0xa2,0x00);
		lcd_regwrite(0xa3,0x00);
		
		
		lcd_regwrite(0xb0,0x1d); 
        lcd_regwrite(0xb1,0x7f);

		
		//lcd_regwrite(0xc0,0xdf);
		//lcd_regwrite(0xc0,0x00);
		lcd_regwrite(0xc1,0x36);
		lcd_regwrite(0xc8,0x80);
		lcd_regwrite(0xc9,0x80);
		lcd_regwrite(0xca,0x00);                   
        lcd_regwrite(0xd0,0x80);
		
		lcd_regwrite(0xe0,0x00);	
        lcd_regwrite(0xf0,0xa0);   
        lcd_regwrite(0xf1,0x0f);
		
 
}


/*--------------------------------------
	void lcd_character(uchar *cha,uint8_t count)
 
说明: cha为指向uchar类型数组的指针,count为要显示的字符个数

PS:  字符为一个字节,汉字为两个字节
----------------------------------------*/

void lcd_character(uchar *cha,uint8_t count)
{                                   
  uint8_t i;
  for(i=0;i<count;i++)
  {
    lcd_datawrite(*cha);
    ++cha;
  }
}

/*--------------------------------------
	uchar touch_test(void) 
 
说明: 测试是否触摸屏真的被按下
----------------------------------------*/

uchar touch_test(void) 
{
  uchar reg_rddata,reg_rddata1;
  
  reg_rddata = LCD_reRead(0xc0);
  reg_rddata &= 0xf8;
  reg_rddata |= 0x08;
  lcd_regwrite(0xc0,reg_rddata);
 
  delay_nms (6);
  
  reg_rddata1 = LCD_reRead(0xc1);
  reg_rddata &= 0xf7;
 lcd_regwrite(0xc0,reg_rddata);
 
  return(reg_rddata1);
  
} 

/*--------------------------------------
	uint16_t touch_x(void)
 
说明: 读取X坐标
----------------------------------------*/

uint touch_x(void)
{
  uchar reg_rddata,touchxl;
 uint touchx;
  
  reg_rddata = LCD_reRead(0xc0);
  reg_rddata &= 0xf3;
  reg_rddata |= 0x03;
  lcd_regwrite(0xc0,reg_rddata);
  delay_nms (6);
  
  touchx = LCD_reRead(0xc8);         //TPXR
  touchxl = (LCD_reRead(0xca)&0xc0); //TPZR
  touchx = (touchx<<2)|(touchxl>>6);
  return(touchx);
  
  
}


/*--------------------------------------
	uint16_t touch_y(void)
 
说明: 读取Y坐标
----------------------------------------*/


uint touch_y(void) 
{
  uchar reg_rddata,touchyl;
  uint touchy;
  
  reg_rddata = LCD_reRead(0xc0);
  reg_rddata &= 0xfc;
  reg_rddata |= 0x0c;
  lcd_regwrite(0xc0,reg_rddata);
  delay_nms (6);
  
  touchy = LCD_reRead(0xc9);         //TPYR
  touchyl = (LCD_reRead(0xca)&0x0c); //TPZR
  touchy = (touchy<<2)|(touchyl>>2);
  return(touchy);
}

/*--------------------------------------
	void get_touch(void) 
 
说明: 处理触摸中断
----------------------------------------*/

void get_touch(void) 
{
   uchar reg_rddata,i;
  uint touchx,touchy;
  
  lcd_regwrite(0xc0,0xc0);  //TOUCH ON
  delay_nms (6);
  
  if((touch_test() & 0x40))
  {
    while(!(LCD_reRead(0xc1) & 0x80));
    touchy = touch_y();
    touchx = touch_x();
    
    tabx[0] = touchx/1000;
    tabx[1] = (touchx%1000)/100;
    tabx[2] = ((touchx%1000)%100)/10;
    tabx[3] = ((touchx%1000)%100)%10;
    
    taby[0] = touchy/1000;
    taby[1] = (touchy%1000)/100;
    taby[2] = ((touchy%1000)%100)/10;
    taby[3] = ((touchy%1000)%100)%10;
    
    reg_rddata = LCD_reRead(0x10);
    reg_rddata |= 0x10;
    lcd_regwrite(0x10,reg_rddata);
        
    gotoxy(0,0x00);
    for(i=0;i<4;i++)
    {
      lcd_datawrite(tabx[i]+0x30);
    }
    
    gotoxy(5,0x00);
    for(i=0;i<4;i++)
    {
      lcd_datawrite(taby[i]+0x30);
    }
    reg_rddata = LCD_reRead(0x10);
    reg_rddata &= 0xef;
    lcd_regwrite(0x10,reg_rddata);
  }
    
  lcd_regwrite(0xc0,0x00);  //TOUCH OFF
  lcd_regwrite(0xc0,0x00);

	gotoxy(2,0x16);
	lcd_character(tab3,8);
	
	delay_nms(2000);
	gotoxy(0,0x00);
    for(i=0;i<4;i++)
    {
      lcd_datawrite('0');
    }
	gotoxy(5,0x00);
    for(i=0;i<4;i++)
    {
      lcd_datawrite('0');
    }
	gotoxy(2,0x16);
	lcd_character(tab4,8);
}

/*-------------------------------------------------------
void Display_graphi(uchar g ,uint16_t x,uint16_t y,uint16_t row ,uint16_t col,uchar f)

说明:用来显示点阵图形,g为指向数组的指针,x为显示的横坐标,y为纵坐标
	  row为图形的高(像素),col为图形的宽(字节),f标志着正常显示还是反显(0:正常、1:反显)
---------------------------------------------------------*/
void Display_graphi(uchar *g ,uint16_t x,uint16_t y,uint16_t row ,uint16_t col,uchar f)
{
	uint16_t i,j;
	
	
	if ((col<30)&&(row<240)&&(y<240)&&(x<320))
	{
		gotoxy(x,y);
		for (i=0;i<row;i++)
		{
			for(j=0;j<col;j++)
			{
				
				if (f==0)
				{	
					lcd_datawrite(*g);
				}
				else
				{	
					
					lcd_datawrite(0xff-*g);
				};
				++g;
			}
			gotoxy(x,y+i);
		}
	}
}

#endif

⌨️ 快捷键说明

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