LCD12864.H頭文件如下
- /************************************************************
- 串行連接操作程序
- 對外函數列表:
- void LCD_Init( void ); //初始化
- void LCD_PutStr(unsigned char row,unsigned char col,unsigned char *puts); //寫入文本
- void LCD_PutBMP(unsigned char *puts); //寫入半屏圖片
- void Disp_Img(unsigned const char *img) //寫整屏圖片
- void LCD_ClearTXT( void ); //清除文本
- void LCD_ClearBMP( void ); //清除圖片
- ***********************************************************/
- #define uchar unsigned char
- #define uint unsigned int
- #define LCDNOP() NOP();NOP()
- //以下配置IO管腳
- //========================================================*/
- #define OUTLCDSCLK() DDRD |= (1<<6) //設置輸出
- #define SETLCDSCLK() PORTD |= (1<<6) //拉高
- #define CLRLCDSCLK() PORTD &=~(1<<6) //拉低
- #define SEL_CS() DDRD |=BIT(3);PORTD |=BIT(3) //片選拉高
- #define CLR_CS() DDRD |=BIT(3);PORTD &= ~BIT(3) //片選拉低
- #define OUTLCDSID() DDRD |= (1<<4) //設置輸出
- #define INLCDSID() DDRD &= ~(1 << 4); PORTD |= (1 << 4) //設置輸入
- #define SETLCDSID() PORTD |= (1 << 4) //拉高
- #define CLRLCDSID() PORTD &= ~(1 << 4) //拉低
- #define GETLCDSID() ((PIND & BIT(4)) >> 4) //讀IO值
- const unsigned char AC_TABLE[]={
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行漢字位置
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行漢字位置
- 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行漢字位置
- 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行漢字位置
- };
- unsigned char str2[]="歡迎光臨sonsan!!";
- unsigned char str1[]="黃河遠上白云間,一片孤城萬仞山。羌笛何須怨楊柳,春風不度玉門關。";
- //維捷登測試架專用延時函數
- void DelayKey(uint ms)
- {
- uint i;
- while(ms--)
- {
- for(i=1;i<(uint)(1*143-2);i++) //1為1MHZ
- ;
- }
- }
- //串口發送一個字節
- void LCD_WriteByte(unsigned char Dbyte)
- {
- unsigned char i;
- OUTLCDSCLK();
- OUTLCDSID();
- for(i=0;i<8;i++)
- {
- CLRLCDSCLK();
- Dbyte=Dbyte<<1; //左移一位
- if (SREG & 1)
- SETLCDSID();
- else
- CLRLCDSID();
- SETLCDSCLK();
- LCDNOP();
- CLRLCDSCLK();
- }
- return;
- }
- //串口接收一個字節
- //僅在讀取數據的時候用到
- //而讀出的數據是一次只能讀出4bit的
- unsigned char LCD_ReadByte(void)
- {
- unsigned char i,temp1,temp2;
- temp1=temp2=0;
- OUTLCDSCLK();
- INLCDSID();
- for(i=0;i<8;i++)
- {
- temp1=temp1<<1;
- CLRLCDSCLK();
- LCDNOP();
- SETLCDSCLK();
- LCDNOP();
- CLRLCDSCLK();
- if(GETLCDSID()) temp1++;
- }
- for(i=0;i<8;i++)
- {
- temp2=temp2<<1;
- CLRLCDSCLK();
- LCDNOP();
- SETLCDSCLK();
- LCDNOP();
- CLRLCDSCLK();
- if(GETLCDSID()) temp2++;
- }
- return ((0xf0&temp1)+(0x0f&temp2));
- }
- void LCD_CheckBusy( void )
- {
- LCDNOP();
- return;
- do LCD_WriteByte(0xfc); //11111,RW(1),RS(0),0
- while(0x80&LCD_ReadByte()); //BF(.7)=1 Busy
- }
- void LCD_WriteCmd( unsigned char Cbyte )
- {
- SEL_CS();
- LCD_CheckBusy();
- LCD_WriteByte(0xf8); //11111,RW(0),RS(0),0
- LCD_WriteByte(0xf0&Cbyte); //高四位
- DelayKey(5);
- LCD_WriteByte(0xf0&Cbyte<<4);//低四位(先執行<<)
- DelayKey(5);
- CLR_CS();
- }
- void LCD_WriteData( unsigned char Dbyte )
- {
- SEL_CS();
- LCD_CheckBusy();
- LCD_WriteByte(0xfa); //11111,RW(0),RS(1),0
- LCD_WriteByte(0xf0&Dbyte); //高四位
- DelayKey(5);
- LCD_WriteByte(0xf0&Dbyte<<4);//低四位(先執行<<)
- DelayKey(5);
- CLR_CS();
- }
- /*顯示屏單字符寫入函數*/
- /*void LCD_write_char(unsigned char x,unsigned char y,unsigned char *data) {
- switch (y)
- {
- case 0:
- LCD_WriteCmd(0x80 + x);
- break;
- case 1:
- LCD_WriteCmd(0x90 + x);
- break;
- case 2:
- LCD_WriteCmd(0x88 + x);
- break;
- case 3:
- LCD_WriteCmd(0x98 + x);
- break;
- default:
- break;
- }
- LCD_WriteData(*data);
- }*/
- /**********************************************************
- ;子程序名:void write_single(uchar y,uchar x,uchar *p)
- ;功 能:寫單個字符
- ;說 明:直接調用
- ;調 用:write_single(uchar y,uchar x,uchar *p)
- ;**********************************************************/
- void write_single(uchar y,uchar x,uchar *p)
- {
- switch (y)
- {
- case 1:LCD_WriteCmd(0x80+x-1);break;
- case 2:LCD_WriteCmd(0x90+x-1);break;
- case 3:LCD_WriteCmd(0x88+x-1);break;
- case 4:LCD_WriteCmd(0x98+x-1);break;
- default:break;
- }
- LCD_WriteData(*p);
- }
- unsigned char LCD_ReadData( void )
- {
- LCD_CheckBusy();
- LCD_WriteByte(0xfe); //11111,RW(1),RS(1),0
- return LCD_ReadByte();
- }
- void LCD_Init( void )
- {
- DelayKey(2);
- LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
- DelayKey(2);
- LCD_WriteCmd(0x30); //8BitMCU
- DelayKey(5);
- LCD_WriteCmd(0x0C); //顯示ON,游標OFF,游標位反白OFF
- DelayKey(5);
- LCD_WriteCmd(0x01); //清屏,AC歸0
- DelayKey(5);
- LCD_WriteCmd(0x02); // AC歸0,不改變DDRAM內容
- DelayKey(5);
- LCD_WriteCmd(0x06); //寫入時,游標右移動
- DelayKey(2);
- //LCD_WriteCmd(0x80);
- }
- //文本區清RAM函數
- void LCD_ClearTXT( void )
- {
- unsigned char i;
- LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
- DelayKey(5);
- LCD_WriteCmd(0x80); //AC歸起始位
- DelayKey(5);
- for(i=0;i<64;i++)
- LCD_WriteData(0x20);
- }
- //圖形區和文本區顯示在兩個不同的RAM區
- //圖形區清RAM函數
- void LCD_ClearBMP( void )
- {
- unsigned char i,j;
- LCD_WriteCmd(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
- LCD_WriteCmd(0x36); //繪圖ON,基本指令集里面36H不能開繪圖
- for(i=0;i<32;i++) //12864實際為256x32
- {
- LCD_WriteCmd(0x80|i); //行位置
- LCD_WriteCmd(0x80); //列位置
- for(j=0;j<32;j++) //256/8=32 byte
- LCD_WriteData(0);
- }
- }
- void LCD_PutStr(unsigned char row,unsigned char col,unsigned char *puts)
- {
- LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
- LCD_WriteCmd(AC_TABLE[8*row+col]); //起始位置
- while(*puts != '\0') //判斷字符串是否顯示完畢
- {
- if(col==8) //判斷換行
- { //若不判斷,則自動從第一行到第三行
- col=0;
- row++;
- }
- if(row==4) row=0; //一屏顯示完,回到屏左上角
- LCD_WriteCmd(AC_TABLE[8*row+col]);
- LCD_WriteData(*puts); //一個漢字要寫兩次
- puts++;
- if (*puts != '\0')
- {
- LCD_WriteData(*puts);
- puts++;
- }else{break;}
- col++;
- }
- }
- void LCD_PutBMP(unsigned const char *puts) //必須加const 只能寫上下半屏相同的圖片
- {
- unsigned int x=0;
- unsigned char i,j;
- LCD_WriteCmd(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
- LCD_WriteCmd(0x36); //繪圖ON,基本指令集里面36H不能開繪圖
- for(i=0;i<32;i++) //12864實際為256x32
- {
- LCD_WriteCmd(0x80|i); //行位置
- LCD_WriteCmd(0x80); //列位置
- for(j=0;j<32;j++) //256/8=32 byte
- { //列位置每行自動增加
- LCD_WriteData(puts[x]);
- x++;
- }
- }
- }
- void Disp_Img(unsigned const char *img) //寫整屏圖片
- { unsigned int j=0;
- unsigned char x,y,i;
- for(i=0;i<9;i+=8)
- for(y=0;y<32;y++)/*原來 為 y<26 ,上下兩個半屏不能正常對接顯示,導致顯示的圖片中間有空隙*/
- for(x=0;x<8;x++)
- { LCD_WriteCmd(0x36);//功能設置---8BIT控制界面,擴充指令集
- LCD_WriteCmd(y+0x80); //行地址
- LCD_WriteCmd(x+0x80+i); //列地址
- LCD_WriteCmd(0x30);
- LCD_WriteData(img[j++]);
- LCD_WriteData(img[j++]);
- }
-
- }
- //維捷登測試用點陣顯示
- void DisplayDots(unsigned char DotByte)
- {
- unsigned char i,j;
- LCD_WriteCmd(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
- LCD_WriteCmd(0x36); //繪圖ON,基本指令集里面36H不能開繪圖
- for(i=0;i<32;i++) //12864實際為256x32
- {
- LCD_WriteCmd(0x80|i); //行位置
- LCD_WriteCmd(0x80); //列位置
- for(j=0;j<32;j++) //256/8=32 byte
- { //列位置每行自動增加
- LCD_WriteData(DotByte);
- }
- DotByte=~DotByte;
- }
- }
- //********************************************************//
- //***** 轉換的文件:E:\!Program\!BmpSample\25632.bmp
- //***** 源圖形寬度 * 高度:256 * 32
- //***** 調整后寬度 * 高度:256 * 32
- //***** 字模格式:橫向取模,冗余模式,字節正序,正色取模,
- //***** 點陣轉換時間:2005/03/ 2 16:4:32
- //***** 位圖點陣占用1024字節
- //********************************************************//
- flash unsigned char bmp1[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xC0,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x04,0xE0,0x00,0x00,0x00,0x00,0x60,0x00,0x04,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x01,0x88,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x38,0xE0,0x00,0x00,0x39,0x00,0x00,0x00,
- 0x00,0x00,0x06,0x60,0x00,0x00,0x00,0x0C,0x1C,0xC0,0x00,0x00,0x04,0x80,0x00,0x00,
- 0x00,0x00,0x09,0x80,0x00,0x00,0x00,0x0C,0x30,0xC0,0x00,0x00,0x01,0xB0,0x00,0x00,
- 0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x08,0x7B,0x80,0x08,0x00,0x00,0x48,0x00,0x00,
- 0x00,0x00,0x58,0x00,0x01,0x86,0x00,0x00,0x03,0x80,0x0C,0x00,0x00,0x1E,0x00,0x00,
- 0x00,0x00,0x60,0x00,0x01,0x86,0x00,0x00,0x03,0x00,0x04,0x00,0x00,0x07,0x80,0x00,
- 0x00,0x00,0x80,0x00,0x01,0x86,0x00,0x00,0x03,0x00,0x04,0x00,0x00,0x07,0xC0,0x00,
- 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,
- 0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x78,0x00,
- 0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x78,0x00,
- 0x00,0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,
- 0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x07,0x00,0x1F,0x00,
- 0x01,0xE0,0x00,0xC7,0x80,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x00,0x07,0x00,
- 0x01,0xE0,0x00,0x19,0xC0,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x00,0x07,0x00,
- 0x03,0x80,0x00,0x8F,0x80,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x01,0xC0,
- 0x03,0x80,0x00,0x03,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,
- 0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,
- 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,
- 0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,
- 0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
- 0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
- 0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
- 0x1E,0x00,0x3E,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x38,0x00,0x7C,
- 0x1E,0x00,0x36,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x18,0x00,0x7C,
- 0x1E,0x00,0x1E,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x1C,0x00,0x7C,
- 0x1E,0x00,0x1C,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x78,
- 0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
- 0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
- 0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
- 0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,
- 0x07,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,
- 0x07,0x80,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,
- 0x07,0x80,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,
- 0x07,0xC0,0x00,0x70,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x07,0xC0,
- 0x03,0xE0,0x00,0xF8,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x0C,0x04,0x07,0xC0,
- 0x01,0xE0,0x00,0xF8,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x07,0xC0,
- 0x00,0xF0,0x08,0x78,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1F,0x80,
- 0x00,0xF8,0x20,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x1E,0x00,
- 0x00,0x3C,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,
- 0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,
- 0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x00,
- 0x00,0x0F,0xC0,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x07,0xF0,0x00,
- 0x00,0x07,0xE0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x0F,0xE0,0x00,
- 0x00,0x01,0xF8,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x1F,0x80,0x00,
- 0x00,0x00,0xFE,0x00,0x00,0x40,0x00,0x07,0x80,0x00,0x1E,0x00,0x00,0x7F,0x00,0x00,
- 0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x00,0x03,0xF8,0x00,0x00,
- 0x00,0x00,0x0F,0xE0,0x02,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,
- 0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x03,0x80,0x00,0x08,0x00,0x3F,0xC0,0x00,0x00,
- 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x03,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x07,0xFF,0x80,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xE0,0x3F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- #pragma data:data //設置回到數據存儲器區
復制代碼 |