📄 lcd8x15d.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 + -