?? 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 + -