📄 main.c
字号:
#include "config.h"
#define LCD_DI 0x1<<20 // 定义LCM12864的RS控制线
#define LCD_RW 0x1<<21 // 定义LCM12864的RW控制线
#define LCD_E 0x1<<22 // 定义LCM12864的E控制线
#define LCD_CS1 0x1<<23 // 定义LCM12864的CS1控制线
#define LCD_CS2 0x1<<24 // 定义LCM12864的CS2控制线
#define LCD_RESET 0x1<<25 // 定义LCM12864的RESET控制线
#define LCD_LEDK 0x1<<26 // 定义LCM12864的LEDK(BLK)控制线
#define LCD_DB7_DB0 0xFF<<8
#define LCD_DISP_ON 0x3f
#define LCD_DISP_OFF 0x3e
#define LCD_START_ROW 0xc0 //显示起始行0,可以用LCM12864_START_ROW+x设置起始行。(x<64)
#define LCD_PAGE_START_ADDR 0xb8 // 页起始地址,可以用LCM12864_PAGE_START_ADDR+x设置当前页。(x<8)
#define LCD_COL_START_ADDR 0x40 //列起始地址,可以用LCM12864_COL_START_ADDR+x设置当前列。(x<64)
#define LCD_STATUS_BUSY 0x80 // LCM12864忙状态屏蔽码
#define LCD_STATUS_DISP_OFF 0x20 // LCM12864显示关闭状态屏蔽码
#define LCD_STATUS_REST 0x10 // LCM12864复位状态屏蔽码
uint8 huan1[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
/********************************************************************************************
* 函数名称:Delay()
* 功 能:软件延时
* 入口参数:count 延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0;i < 125; i++);
}
}
/********************************************************************************************
* 函数名称:LCM12864_TestBusy()
* 功 能:LCM12864测忙函数
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCD_TestBusy(void)
{
IO0SET=LCD_RW;
IO0CLR=LCD_DI;
IO0SET=LCD_E;
Delay(1);
while(((IO0PIN&LCD_DB7_DB0)>>8) & LCD_STATUS_BUSY);
}
//写命令
//*********************************************************************************************/
void wcodel(uint8 code)
{
IO0CLR=LCD_RW;
IO0CLR=LCD_DI;
IO0SET=code<<8;
IO0CLR=((~code)<<8)&LCD_DB7_DB0;
IO0SET=LCD_E;
Delay(1);
IO0CLR=LCD_E;
}
/********************************************************************************************
写数据
*********************************************************************************************/
void wdata1(uint8 data)
{
IO0CLR=LCD_RW;
IO0SET=LCD_DI;
IO0SET=data<<8;
IO0CLR=((~data)<<8)&LCD_DB7_DB0;
IO0SET=LCD_E;
Delay(1);
IO0CLR=LCD_E;
}
/********************************************************************************************
空读一次 从LCD读一字节数据
*********************************************************************************************/
uint8 Readwdata1(void)
{ uint8 data;
IO0SET=LCD_RW;
IO0SET=LCD_DI;
IO0SET=LCD_E;
/* 按LCM12864数据手册,先空读一次 */
data = (IO0PIN&LCD_DB7_DB0)>>8;
LCD_TestBusy();
/* 按LCM12864数据手册,再读一次 */
data = (IO0PIN&LCD_DB7_DB0)>>8;
LCD_TestBusy();
IO0CLR=LCD_E;
return data;
}
/********************************************************************************************
向LCD指定点写一字节数据。
*********************************************************************************************/
void Write1_x_y(uint8 x,uint8 y,uint8 data)
{
/* 参数过滤 */
x = x&0x7f;
y = y&0x3f;
IO0CLR=LCD_CS1;
IO0CLR=LCD_CS2;
if(x<64)
{
IO0SET=LCD_CS1;
}
else
{
IO0SET=LCD_CS2;
x = x-64;
}
wcodel(LCD_COL_START_ADDR+x); // 设置当前列地址,即x坐标
wcodel(LCD_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
wdata1(data);
}
/********************************************************************************************
从LCD指定点上读取一字数据
*********************************************************************************************/
uint8 Read1_x_y(uint8 x,uint8 y)
{
uint8 data;
/* 参数过滤 */
x = x&0x7f;
y = y&0x3f;
IO0CLR=LCD_CS1;
IO0CLR=LCD_CS2;
if(x<64)
{
IO0SET=LCD_CS1;
}
else
{
IO0SET=LCD_CS2;
x = x-64;
}
wcodel(LCD_COL_START_ADDR+x); // 设置当前列地址,即x坐标
wcodel(LCD_PAGE_START_ADDR+y); // 设置当前页地址,即y坐标
data=Readwdata1();
return data;
}
/********************************************************************************************
LCD初始化
*********************************************************************************************/
void LCD_Init(void)
{
IO0CLR=LCD_RESET;
IO0SET=LCD_RESET;
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_DISP_OFF);
wcodel(LCD_PAGE_START_ADDR+0);
wcodel(LCD_START_ROW+0);
wcodel(LCD_COL_START_ADDR+0);
wcodel(LCD_DISP_ON);
//IO0SET=LCD_LEDK;
//IO0CLR=LCD_LEDK;
}
/********************************************************************************************
向LCD填充数据
*********************************************************************************************/
void LCD_Fill_Screen(uint8 LCD_FillData)
{
uint8 x,y;
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_START_ROW+0);
for(x=0;x<8;x++)
{
wcodel(LCD_PAGE_START_ADDR+x);
wcodel(LCD_COL_START_ADDR);
for(y=0;y<64;y++)
wdata1(LCD_FillData);
}
IO0CLR=LCD_CS2;
}
/********************************************************************************************
* 函数名称:LCM12864_Clear_Screen()
* 功 能:LCM12864清屏
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCD_Clear_Screen(void)
{
LCD_Fill_Screen(0x55);
}
/********************************************************************************************
在LCD的指定点上显示16*16点阵汉字
*********************************************************************************************/
void LCD_Disp_Chinese_16_16(uint8 LCD_page,uint8 LCD_col, uint8 *Chinese_16_16)
{
uint8 j=0,i=0;
for(j=0;j<2;j++)
{
wcodel(LCD_PAGE_START_ADDR+LCD_page+j);
wcodel(LCD_COL_START_ADDR+LCD_col);
for(i=0;i<16;i++)
wdata1(Chinese_16_16[16*j+i]);
}
}
/********************************************************************************************
* 函数名称:LCM12864_Frame()
* 功 能:在LCM12864上显示最大尺寸的边框
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCM12864_Frame(void)
{
uint8 i;
IO0SET=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_PAGE_START_ADDR+0);
wcodel(LCD_COL_START_ADDR+0);
for(i=0;i<64;i++) wdata1(0x01);
wcodel(LCD_PAGE_START_ADDR+7);
wcodel(LCD_COL_START_ADDR+0);
for(i=0;i<64;i++){
wdata1(0x80);
}
for(i=0;i<8;i++)
{
IO0CLR=LCD_CS1;
IO0SET=LCD_CS2;
wcodel(LCD_PAGE_START_ADDR+i);
wcodel(LCD_COL_START_ADDR+63);
wdata1(0xff);
IO0SET=LCD_CS1;
IO0CLR=LCD_CS2;
wcodel(LCD_PAGE_START_ADDR+i);
wcodel(LCD_COL_START_ADDR+0);
wdata1(0xff);
}
}
/********************************************************************************************
* 函数名称:main()
* 功 能:LCD12864液晶模块驱动演示。
******************************************************************************************/
int main(void)
{
PINSEL0=0;
PINSEL1=0;
IO0DIR=~0;
LCD_Init(); // LCM12864初始化
LCD_Clear_Screen();
while(1)
{
LCD_Init();
IO0SET=LCD_CS1;
IO0CLR=LCD_CS2;
LCD_Disp_Chinese_16_16(1,0,huan1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -