**************************************************************************************************/
這是12864的程序,這個程序比較看不懂,麻煩進行簡單的顯示嘛
原理圖如下:
FY2PN[~XTRUEQ(X3~M]{WWK.png (207.12 KB, 下載次數: 57)
下載附件
2017-11-8 20:40 上傳
- #include"FYD12864.h"
- /*************************************************************************************************/
- void Delay_nus(unsigned int nTime)
- {
- unsigned long j;
- while(nTime--)
- {
- j=12;
- while(j--);
- }
- }
- /*************************************************************************************************/
- void LCD12864_Init(void) //初始化LCD12864
- {
- //----------------------------------------------------------------------
- Delay_nus(200);
- SET_LCD12864_CS;
- //----------------------------------------------------------------------
- LCD2864Write_char(0, 0x01); //清除屏幕顯示,將DDRAM的地址計數器清零
- Delay_nus(200);
- LCD2864Write_char(0, 0x30); //8BIT控制界面,基本指令集
- Delay_nus(200);
- LCD2864Write_char(0, 0X0C);
- Delay_nus(200);
- LCD2864Write_char(0, 0x01); // 清除屏幕顯示,將DDRAM的地址計數器清零
- Delay_nus(200);
- LCD2864Write_char(0, 0x06); // DDRAM的地址計數器(AC)加1
- Delay_nus(200);
- //----------------------------------------------------------------------
- LCD12864_Clear();
- }
- /*************************************************************************************************/
- /*************************************************************************************************/
- void Send_byte(unsigned char bbyte) //發送一個字節
- {
- unsigned char i;
- for(i = 0; i < 8; i++)
- {
- if((bbyte & 0x80) == 0x80) //取出最高位
- {
- SET_LCD12864_STD;
- }
- else
- {
- CLR_LCD12864_STD;
- }
- SET_LCD12864_SCLK;
- CLR_LCD12864_SCLK;
- bbyte <<= 1; //左移
- }
- }
- void LCD2864Write_char(unsigned char Mode, unsigned char ddata) //寫指令或數據
- {
- unsigned char CMD_data, Hdata, Ldata;
- if(Mode == 0X00)
- CMD_data = 0xf8; //寫指令
- else
- CMD_data = 0xfa; //寫數據
- Hdata = ddata & 0xf0; //取高四位
- Ldata = (ddata << 4) & 0xf0; //取低四位
- Send_byte(CMD_data); //發送起始信號
- Delay_nus(10); //延時是必須的
- Send_byte(Hdata); //發送高四位
- Delay_nus(10); //延時是必須的
- Send_byte(Ldata); //發送低四位
- Delay_nus(10); //延時是必須的
- }
- /*************************************************************************************************/
- /*************************************************************************************************/
- void LCD12864_Clear(void) //清屏函數
- {
- // LCD2864Write_char(0,0x01);
- LCD12864_lineclr(1);
- LCD12864_lineclr(2);
- LCD12864_lineclr(3);
- LCD12864_lineclr(4);
- }
- void LCD12864_dispClear(void) //清屏函數
- {
- // LCD2864Write_char(0,0x01);
- LCD12864_lineclr(2);
- LCD12864_lineclr(3);
- LCD12864_lineclr(4);
- }
- /*************************************************************************************************/
- void LCD12864_RE_0_1(void) //文字模式,指令集由0變為1
- {
- LCD2864Write_char(0, 0x30);
- Delay_nus(50);
- LCD2864Write_char(0, 0x34);
- Delay_nus(50);
- LCD2864Write_char(0, 0x36);
- Delay_nus(50);
- }
- //此函數如果在文本模式,可以不要,如果同時顯示圖和顯示字就要及時更換指令集,實現具體是什么操作
- void LCD12864_RE_1_0(void) //圖形模式,指令集由1變為0
- {
- LCD2864Write_char(0, 0x36);
- Delay_nus(50);
- LCD2864Write_char(0, 0x32);
- Delay_nus(50);
- }
-
- /*************************************************************************************************/
- void LCD12864_SetAddr(unsigned char VerticalAddr, unsigned char HorizontalAddr) //設定地址
- {
- VerticalAddr &= 0x1F;
- HorizontalAddr &= 0xFF;
- LCD2864Write_char(0,VerticalAddr | 0x80);
- Delay_nus(100);
- LCD2864Write_char(0,HorizontalAddr | 0x80);
- Delay_nus(100);
- }
- void LCD12864_Write_String(uint8_t hang, uint8_t lie, char *StringBuf)
- {
- uint8_t address, i = 0;
- switch(hang)
- {
- case 1:
- address = 0x80;
- break;
- case 2:
- address = 0x90;
- break;
- case 3:
- address = 0x88;
- break;
- case 4:
- address = 0x98;
- break;
- default:
- address = 0x80;
- }
- LCD2864Write_char(0, address + lie);
- for(i = 0; i < 16; i++)
- {
- LCD2864Write_char(1, *StringBuf);
- StringBuf++;
- }
- }
- void LCD12864_DispString2(uint8_t hang, uint8_t lie, char *StringBuf, uint8_t LEN)
- {
- uint8_t address, i = 0;
- switch(hang)
- {
- case 1:
- address = 0x80;
- break;
- case 2:
- address = 0x90;
- break;
- case 3:
- address = 0x88;
- break;
- case 4:
- address = 0x98;
- break;
- default:
- address = 0x80;
- }
- LCD2864Write_char(0, address + lie);
- for(i = 0; i < LEN; i++)
- {
- LCD2864Write_char(1, *StringBuf);
- StringBuf++;
- }
- }
- void LCD12864_DispString3(uint8_t hang, uint8_t lie, const char *StringBuf, uint8_t LEN)
- {
- uint8_t address, i = 0;
- switch(hang)
- {
- case 1:
- address = 0x80;
- break;
- case 2:
- address = 0x90;
- break;
- case 3:
- address = 0x88;
- break;
- case 4:
- address = 0x98;
- break;
- default:
- address = 0x80;
- }
- LCD2864Write_char(0, address + lie);
- for(i = 0; i < LEN; i++)
- {
- LCD2864Write_char(1, *StringBuf);
- StringBuf++;
- }
- }
- void LCD12864_DispString4(uint8_t hang, uint8_t lie, const char *StringBuf, uint8_t LEN)
- {
- uint8_t address, i = 0;
- switch(hang)
- {
- case 1:
- address = 0x80;
- break;
- case 2:
- address = 0x90;
- break;
- case 3:
- address = 0x88;
- break;
- case 4:
- address = 0x98;
- break;
- default:
- address = 0x80;
- }
- LCD2864Write_char(0, address + lie);
- for(i = 0; i < LEN; i++)
- {
- LCD2864Write_char(1, *StringBuf);
- StringBuf++;
- }
- }
-
- /*********************************************************************************************************
- ** 函數名稱: Lcd_lineclr()
- ** 功能描述: 清除一行的顯示
- ** 輸 入: unsigned char row 要清除顯示的行
- ** 輸 出:
- ** 全局變量: 無
- ** 調用模塊: 無
- ** 說明:
- ** 注意:
- *******************************************************************************************************/
- void LCD12864_lineclr(unsigned char row)
- {
- unsigned char i;
- switch(row)
- {
- case 1:
- {
- LCD2864Write_char(0, 0x80);
- for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
- break;
- }
- case 2:
- {
- LCD2864Write_char(0, 0x90);
- for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
- break;
- }
- case 3:
- {
- LCD2864Write_char(0, 0x88);
- for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
- break;
- }
- case 4:
- {
- LCD2864Write_char(0, 0x98);
- for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
- break;
- }
- default:
- break;
- }
- }
-
- /*************************************************************************************************
- ** END FILE
- **************************************************************************************************/
- **************************************************************************************************/
- #ifndef __FYD12864_H__
- #define __FYD12864_H__
- /*************************************************************/
- #include<stc15.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include<intrins.h>
-
-
- #define uint8_t unsigned char
- #define uint16_t unsigned int
-
- /*************************************************************************************************/
- #define LCD12864_RS_PIN P20 //RS
- #define LCD12864_RW_PIN P21 //RW
- #define LCD12864_RD_PIN P22 //RD-EN
- /*************************************************************************************************/
- //PSB接GND----是串行模式
- //PSB接VCC----是并行模式
- #define SET_LCD12864_CS LCD12864_RS_PIN=1;
- #define CLR_LCD12864_CS LCD12864_RS_PIN=0;
- #define SET_LCD12864_STD LCD12864_RW_PIN=1;
- #define CLR_LCD12864_STD LCD12864_RW_PIN=0;
- #define SET_LCD12864_SCLK LCD12864_RD_PIN=1;
- #define CLR_LCD12864_SCLK LCD12864_RD_PIN=0;
- /*************************************************************************************************/
- //定義7920LCD控制命令 基本命令
- #define Lcd_Clear 0x01 //清除顯示
- #define Lcd_Adress_Rest 0x02 //地址歸0
- #define Lcd_Set_Entrance_Point 0x04 //設定光標移動方向并指定整體顯示是否移動,offset 0x04/0x05/0x06/0x07
- #define Lcd_Display_Status 0x08 //顯示狀態(整體顯示,整體不顯示,光標閃爍,光標不閃爍),offset 0x08/0x0C/0x0D/0x0E/0x0F
- #define Lcd_Display_Shift 0x10 //光標或顯示移位控制 offset 10H/14H/18H/1CH
- #define Lcd_Set_Function_Basic 0x30 //基本指令集
- #define Lcd_Set_Function_Extend 0x34 //擴展指令集
- #define Lcd_Set_Cgram 0x40 //設定CGRAM 地址 offset 0x00-0x3f
- #define Lcd_Set_Ddram 0x80 //設定DDRAM 地址
- //定義7920LCD控制命令 擴充命令
- #define Lcd_Wait_Mode 0x01 //待命模式 進入待命模式,執行其它命令都可終止待命模式
- #define Lcd_Enable_Iram 0x02 //sr=0 允許設定CGRAM 地址(基本指令)
- #define Lcd_Enable_Vectical_Roll 0x03 //sr=1 允許輸入卷動地址
- #define Lcd_Iram_Address 0x40 //sr=1:offset 0x00~0x3
- #define Lcd_Back_White 0x04 //offset 0~3 反白選擇
- #define Lcd_Enter_Sleep_Mode 0x08
- #define Lcd_Escape_Sleep_Mode 0x0c
- #define Lcd_Dram_On 0x36
- #define Lcd_Dram_Off 0x34
- #define Lcd_Set_Gdram 0x80 //offset 0x00~0x7f
- extern void LCD12864_Init(void); //初始化LCD12864
- extern void LCD2864Write_char(unsigned char Mode, unsigned char ddata); //寫指令或數據
- extern void LCD12864_Clear(void); //清屏函數
- extern void LCD12864_dispClear(void); //清屏函數
-
- extern void LCD12864_RE_0_1(void); //文字模式,指令集由0變為1
- //此函數如果在文本模式,可以不要,如果同時顯示圖和顯示字就要及時更換指令集,實現具體是什么操作
- extern void LCD12864_RE_1_0(void); //圖形模式,指令集由1變為0
- extern void LCD12864_SetAddr(unsigned char VerticalAddr, unsigned char HorizontalAddr);
- extern void LCD12864_Write_String(uint8_t hang, uint8_t lie, char *StringBuf);
- extern void LCD12864_DispString2(uint8_t hang, uint8_t lie, char *StringBuf, uint8_t LEN);
- extern void LCD12864_DispString3(uint8_t hang, uint8_t lie, const char *StringBuf, uint8_t LEN) ;
- extern void Disp_img(const unsigned char *img); //圖形方式12864顯示,字模221--橫向取膜
- extern void LCD12864_lineclr(unsigned char row);
- extern void Lcd_linedisp(unsigned char *p, unsigned char row);
- extern void LCDDisp_HEX(uint8_t hang, uint8_t lie, unsigned char HEX_num[], unsigned char cnt); //顯示十六進制數
- #endif
- /*****************************************************************/
- //** END FILE
- /*****************************************************************/
復制代碼
|