📄 lcd_disp.c
字号:
#include "spce061v004.h"
#define lcd_data_read 0x0030 //数据读
#define lcd_data_read_en 0x0070 //数据读使能
#define lcd_data_write 0x0020 //数据写
#define lcd_data_write_en 0x0060 //数据写使能
#define lcd_comm_write 0x0000 //写命令
#define lcd_comm_write_en 0x0040 //写命令使能
#define lcd_status_read 0x0010 //状态读
#define lcd_status_read_en 0x0050 //状态读使能
//=========================================================================================
/*函数名称:LCD_DISP
//功能:LCD显示
//参数1.(unsigned int *PTR)32个要显示的数据
// 2. flash(16位)0--15,表示第几位闪烁
// 16--31 表示第2行的闪烁
// 安排是从左到右,从上到下
// 如果不需要闪烁的话,flash的值只要大于31即可,通常32就可以搞定,^_^
*/
//=========================================================================================
void initial_lcd();
unsigned int read_busy();
unsigned int *point,flash;
unsigned int busy; //判断LCD是否忙,
void lcd_disp(unsigned int *point,unsigned int flash)
{
unsigned int i; //决定用于显示哪一位
unsigned int bitdisp;
unsigned int disptemp;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x8000|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x8000|lcd_comm_write; //设置开始显示的位置,第一行第一位
for(i=0;i<16;i++)
{
disptemp=point[i];
disptemp=disptemp<<8;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write;
}
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xc000|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xc000|lcd_comm_write; //设置开始显示的位置,第2行第一位
for(i=16;i<32;i++)
{
disptemp=point[i];
disptemp=disptemp<<8;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write;
}
if(flash<=15)
{
bitdisp=flash<<8;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0x8000+bitdisp)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0x8000+bitdisp)|lcd_comm_write;
}
if((flash>=16)&&(flash<=31))
{
bitdisp=(flash-16)<<8;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0xc000+bitdisp)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0xc000+bitdisp)|lcd_comm_write;
}
}
//=========================================================================================
//函数initial_lcd()用于初始化LCD
//硬件连接方法:notice
//IOB7--15负责输出数据
//RS IOB5
//E IOB6
//RW IOB4
//=========================================================================================
void initial_lcd()
{
*P_IOB_Dir=(*P_IOB_Dir&0x008f)|0xff70; //设置IOB为低电平输出口
*P_IOB_Attrib=(*P_IOB_Attrib&0x008f)|0xff70;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0000;
busy=read_busy(); //busy!=0为忙,否则为不忙
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
} //等待LCD
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x3800|lcd_comm_write_en;//系统设置 8位 两行,5*7点阵
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x3800|lcd_comm_write;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0d00|lcd_comm_write_en; //显示,不显示光标,启用闪烁
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0d00|lcd_comm_write;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0100|lcd_comm_write_en; //清屏
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0100|lcd_comm_write;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0200|lcd_comm_write_en; //回到第一行第一列
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0200|lcd_comm_write;
busy=read_busy();
while(busy)
{
busy=read_busy(); //busy!=0为忙,否则为不忙
}
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0600|lcd_comm_write_en; //显示地址模式加1
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0600|lcd_comm_write;
}
//=========================================================================================
//
//=========================================================================================
unsigned int read_busy()
{
unsigned temp;
*P_IOB_Dir=(*P_IOB_Dir&0x008f)|0x0070; //将高8位改为输入口去读取BUSY信号
*P_IOB_Attrib=(*P_IOB_Attrib&0x008f)|0x0070;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xff00|lcd_status_read;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xff00|lcd_status_read_en;
temp=*P_IOB_Data;
temp&=0x8000;
*P_IOB_Dir=(*P_IOB_Dir&0x008f)|0xff70; //恢复原先的低电平输出口
*P_IOB_Attrib=(*P_IOB_Attrib&0x008f)|0xff70;
*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0000;
return temp;
}
/*
void main()
{
unsigned int f[]={0x0020,0x0020,0x0020,0x0049,0x0020,0x0020,0x004c,0x006f,
0x0076,0x0065,0x0020,0x0059,0x006f,0x0075,0x0021,0x0020,
0x0020,0x0020,0x0020,0x0049,0x0020,0x0020,0x004c,0x006f,
0x0076,0x0065,0x0020,0x0059,0x006f,0x0075,0x0021,0x0020};
initial_lcd();
// lcd_disp(f,0);
// lcd_disp(f,15);
// lcd_disp(f,16);
// lcd_disp(f,31);
lcd_disp(f,32);
}
*/ //测试用程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -