LGM12641BS1R.rar
(2.5 KB, 下载次数: 53)
- /*
- 文件:LCD12864显示
- 作者:孙涛
- 备注:驱动内核为LGM12641BS1R和AMPIRE128X64
- */
- #include "LGM12641BS1R.h"
- #include <string.h>
- #include "DB.h"
- //函数:LCD_Delay()
- //描述:液晶延时
- //参数:T延时系数
- static void LCD_Delay(unsigned int T)
- {
- while(T--);
- }
- //函数:LCD_Check_Busy()
- //描述:忙检
- //参数:无
- static void LCD_Check_Busy(void)
- {
- unsigned char LCB_Busy_Flag = 0, i = 0;
- for(i=250; i>0; i--)
- {
- LCD_E_0; _nop_();_nop_();
- LCD_DI_0; _nop_();_nop_();
- LCD_RW_1; _nop_();_nop_();
- LCD_DB = 0xFF;
- LCD_E_1; _nop_();_nop_();
- LCD_Delay(LCD_Wait_Data);
- LCB_Busy_Flag = LCD_DB;
- LCD_E_0; _nop_();_nop_();
- if((LCB_Busy_Flag & 0x80) == 0) break; //BIT7:BUSY BIT5:ON/OFF BIT4:RESET
- }
- }
- //函数:LCD_Write()
- //描述:写数据,写命令
- //参数:Write_CorD 命令数据
- // L 左屏
- // R 右屏
- // Data 写入值
- static void LCD_Write(unsigned char Write_CorD, unsigned char L, unsigned char R, unsigned char Data)
- {
- LCD_Check_Busy();
- LCD_CS1 = R;LCD_CS2 = L;
- LCD_E_0;
- if(Write_CorD == 1) LCD_DI_1;
- else LCD_DI_0;
- LCD_RW_0; _nop_();_nop_();
- LCD_DB = Data; _nop_();_nop_();
- LCD_E_1; _nop_();_nop_();
- LCD_Delay(LCD_Wait_Data);
- LCD_E_0; _nop_();_nop_();
- }
- //函数:LCD_Setpage()
- //描述:设置页
- //参数:Page 页
- static void LCD_Setpage(unsigned char Page)
- {
- LCD_Write(LCD_Write_CMD,1,1,Page & 0x07 | Set_Page_CMD);
- }
- //函数:LCD_Setcolumn()
- //描述:设置行
- //参数:Column 列
- static void LCD_Setcolumn(unsigned char Column)
- {
- LCD_Write(LCD_Write_CMD,1,1,Column & 0x3F | Set_Column_CMD);
- }
- //函数:Set_Coordinate()
- //描述:设定显示坐标
- //参数:Page 页
- // Colunm 列
- static void Set_Coordinate(unsigned char Page, unsigned char Column)
- {
- LCD_Setpage(Page); LCD_Setcolumn(Column);
- }
- //函数:LCD_Row()
- //描述:设置行
- //参数:Row 行
- void LCD_Setrow(unsigned char Row)
- {
- LCD_Write(LCD_Write_CMD, 1, 1, Row & 0x3f | Set_Start_Row_CMD);
- }
- //函数:Display_ON()
- //描述:显示器开关
- //参数:OpenorDown 开关命令
- void Display_ON(unsigned char OpenorDown)
- {
- LCD_Write(LCD_Write_CMD,1,1,OpenorDown & 0x01 | Set_Display_ON_Down_CMD);
- }
- //函数:LCD_Reset()
- //描述:液晶复位
- //参数:无
- void LCD_Reset(void)
- {
- Reset = 0; LCD_Delay(20); Reset = 1; LCD_Delay(20);
- }
- //函数:LCD_Clear_Screen()
- //描述:液晶清屏
- //参数:无
- void LCD_Clear_Screen(void)
- {
- unsigned char page_temp, column_temp;
- for(page_temp = 0xb8; page_temp < 0xc0; page_temp++)
- {
- LCD_Write(LCD_Write_CMD,1,1,page_temp);
- LCD_Write(LCD_Write_CMD,1,1,0x40);
- for(column_temp = 0; column_temp < 64; column_temp++)
- {
- LCD_Write(LCD_Write_Data,1,1,0x00);
- }
- }
- }
- //函数:Disp_Half_Char()
- //描述:写半个字符
- //参数:Page 页
- // Column 列
- // Data 数据
- void Display_Half_Char(unsigned char Page, unsigned char Column, unsigned char Date)
- {
- if(Column<64)
- {
- Set_Coordinate(Page, Column);LCD_Write(LCD_Write_Data,0,1,Date);
- }
- else
- {
- Set_Coordinate(Page, Column-64);LCD_Write(LCD_Write_Data,1,0,Date);
- }
- }
- //函数:Display_Char()
- //描述:写半个字符
- //参数:Invert_Flag 黑白反选标志
- // Page 页
- // Column 列
- // Data 数据
- void Display_Char(unsigned char Invert_Flag, unsigned char Page,
- unsigned char Column, unsigned char Num)
- {
- unsigned char num_temp,date_temp;
- for(num_temp = 0; num_temp < 8; num_temp++)
- {
- date_temp = LGM_AMP_char[Num][2*num_temp];
- if(Invert_Flag)
- date_temp = 255 - date_temp;
- Display_Half_Char(Page * 2, Column * 8 + num_temp, date_temp);
- date_temp = LGM_AMP_char[Num][2*num_temp+1];
- if(Invert_Flag)
- date_temp = 255 - date_temp;
- Display_Half_Char(Page * 2 + 1, Column * 8 + num_temp, date_temp);
- }
- }
- //函数:Display_Ascii_Chinese()
- //描述:写半个字符
- //参数:Invert_Flag 黑白反选标志
- // Page 页
- // Column 列
- // p 数据
- unsigned char Display_Ascii_Chinese(unsigned char Invert_Flag, unsigned char Page,
- unsigned char Column, char *p)
- {
- unsigned char i = 0, j, z;
- unsigned char HZ_ku_length,CHAR_ku_length,display_length;
- char data_temp_0,data_temp_1;
- unsigned char display_data_buf = 0;
-
- HZ_ku_length = sizeof(HZ_16_16)/sizeof(HZ_16_16[0]);
- CHAR_ku_length = sizeof(CHAR_8_16)/sizeof(CHAR_8_16[0]);
- display_length = strlen(p);
-
- while(i < display_length)
- {
- data_temp_0 = p[i]; data_temp_1 = p[i+1];
- if(data_temp_0 >= 0)
- {
- for(j=0;j<CHAR_ku_length;j++)
- {
- if( (data_temp_0 == CHAR_8_16[j].Index)) break;
- }
- for(z = 0; z < 8; z++)
- {
- display_data_buf = CHAR_8_16[j].CHAR_Code[2*z];
- if(Invert_Flag) display_data_buf = 255 - display_data_buf;
- Display_Half_Char(Page * 2, Column*8 + z, display_data_buf);
- display_data_buf = CHAR_8_16[j].CHAR_Code[2*z+1];
- if(Invert_Flag) display_data_buf = 255 - display_data_buf;
- Display_Half_Char(Page * 2 + 1, Column*8 + z, display_data_buf);
- }
- Column+=1;
- }
- else
- {
- for(j=0;j<HZ_ku_length;j++)
- {
- if( (data_temp_0 == HZ_16_16[j].Index[0]) && (data_temp_1 == HZ_16_16[j].Index[1]) ) break;
- }
- for(z = 0; z < 16; z++)
- {
- display_data_buf = HZ_16_16[j].HZ_Code[2*z];
- if(Invert_Flag) display_data_buf = 255 - display_data_buf;
- Display_Half_Char(Page*2, Column*8 + z, display_data_buf);
- display_data_buf = HZ_16_16[j].HZ_Code[2*z+1];
- if(Invert_Flag) display_data_buf = 255 - display_data_buf;
- Display_Half_Char(Page*2+1, Column*8 + z, display_data_buf);
- }
- Column+=2; i++;
- }
- i++;
- }
- return display_length;
- }
- //函数:Disp_Picture()
- //描述:写半个字符
- //参数:Invert_Flag 黑白反选标志
- // Page 页
- // Column 列
- // Data 数据
- void Disp_Picture(unsigned char Invert_Flag)
- {
- unsigned int i;
- unsigned char date_temp;
- for(i=0;i<512;i++)
- {
- date_temp = tupian[2*i];
- if(Invert_Flag) date_temp = 255 - date_temp;
- Display_Half_Char(i%4*2, i/4, date_temp);
- date_temp = tupian[2*i + 1];
- if(Invert_Flag) date_temp = 255 - date_temp;
- Display_Half_Char(i%4*2+1, i/4, date_temp);
- }
- }
- //函数:LCD_Init()
- //描述:液晶初始化
- //参数:无
- void LCD_Init(void)
- {
- unsigned char column_temp, page_temp;
- LCD_Reset();
- Display_ON(0);
- for(page_temp=0; page_temp<8; page_temp++)
- {
- for(column_temp=0; column_temp<128; column_temp++)
- Display_Half_Char(column_temp, page_temp, 0);
- }
- Display_ON(1);
- LCD_Clear_Screen();
- }
复制代码- #include <at89x52.h>
- #include <intrins.h>
- #ifndef _LGM12641BS1R_H_
- #define _LGM12641BS1R_H_
- sbit LCD_DI = P2^0;
- sbit LCD_RW = P2^1;
- sbit LCD_E = P2^2;
- sbit LCD_CS1 = P2^3;
- sbit LCD_CS2 = P2^4;
- sbit Reset = P3^2;
- #define LCD_DI_1 LCD_DI = 1
- #define LCD_DI_0 LCD_DI = 0
- #define LCD_RW_1 LCD_RW = 1
- #define LCD_RW_0 LCD_RW = 0
- #define LCD_E_1 LCD_E = 1
- #define LCD_E_0 LCD_E = 0
- #define LCD_LED_1 LCD_LED = 1
- #define LCD_LED_0 LCD_LED = 0
- #define LCD_DB P0
- //数据建立延时
- #define LCD_Wait_Data 6
- //命令、数据
- #define LCD_Write_CMD 0
- #define LCD_Write_Data 1
- void LCD_Setrow(unsigned char Row);
- void Display_ON(unsigned char OpenorDown);
- void LCD_Reset(void);
- void LCD_Clear_Screen(void);
- void Display_Half_Char(unsigned char DHC_Page, unsigned char Column, unsigned char Date);
- void Disp_Picture(unsigned char Invert_Flag);
- void Display_Char(unsigned char Invert_Flag, unsigned char Page,
- unsigned char Column, unsigned char Num);
- unsigned char Display_Ascii_Chinese(unsigned char Invert_Flag, unsigned char Page,
- unsigned char Column, char *p);
- void LCD_Init(void);
- // 显示开关
- #define Set_Display_ON_Down_CMD 0x3E
- // 起始行
- #define Set_Start_Row_CMD 0xC0
- // 页设置
- #define Set_Page_CMD 0xB8
- // 列设置
- #define Set_Column_CMD 0x40
- #endif
复制代码
|