📄 lcd.c
字号:
/* ==============================================================================
System Name: LCD
File Name: LCD.C
Description:LCD初始化及显示所需参数的名称及单位等不变量.
Originator: 刘平
Target dependency: x2407
=====================================================================================
History:
-------------------------------------------------------------------------------------
7-19-2006 Release Rev 1.0
================================================================================= */
#include <regs240x.h>
char table1[300]={
//变量字模库
0x00,0x81,0x81,0xFF,0x81,0x81,0x00,0x00,//I0
0x01,0x0F,0x30,0xC0,0x30,0x0F,0x01,0x00,//V1
0x00,0x82,0x82,0xFC,0x82,0x82,0x04,0x00,//r2
0x00,0x3C,0x4A,0x4A,0x4A,0x4A,0x2C,0x00,//e3
0x00,0x08,0x88,0xFE,0x89,0x89,0x03,0x00,//f4
0x00,0x01,0xFF,0x88,0x88,0x88,0x70,0x00,//b5
0x81,0xFF,0x81,0x81,0x81,0x42,0x3C,0x00,//D6
0x00,0x81,0xFF,0x91,0x11,0x11,0x0E,0x00,//p7
0x00,0x3E,0xC2,0x30,0x0E,0x30,0xC2,0x3E,//w8
0x00,0xFE,0x02,0x02,0xFE,0x02,0x02,0xFC,//m9
0x81,0xFF,0x89,0x08,0x08,0x89,0xFF,0x81,//H10
0x00,0x4C,0x92,0x92,0x92,0x92,0x64,0x00,//s11
0x00,0x08,0x08,0x7E,0x88,0x88,0x00,0x00,//t12
0x32,0x49,0x45,0x45,0x45,0x7E,0x40,0x00,//a13
0x00,0x81,0xFF,0x91,0x11,0x11,0x0E,0x00,//p14
};
char table2[]={
//数字字模库
0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,//0
0x00,0x00,0x00,0x82,0xFF,0x80,0x00,0x00,//1
0x00,0xC6,0xA1,0xA1,0x91,0x89,0xC6,0x00,//2
0x00,0x42,0x81,0x89,0x89,0x76,0x00,0x00,//3
0x00,0x30,0x28,0x24,0x22,0xFF,0x20,0x00,//4
0x00,0x4F,0x89,0x89,0x89,0x89,0x71,0x00,//5
0x00,0x7E,0x89,0x89,0x89,0x89,0x72,0x00,//6
0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,//7
0x00,0x76,0x89,0x89,0x89,0x89,0x76,0x00,//8
0x00,0x4E,0x91,0x91,0x91,0x91,0x7E,0x00,//9
};
void LCDIOinit()
{
MCRC=MCRC&0x0c3FF; // IOPF2,F3,F4,F5端口配置为一般的I/O功能
PFDATDIR=(PFDATDIR|0x03c00)&0x0ff23; // IOPF2,F3,F4,F5端口配置为输出
MCRA=MCRA&0x00c7; // 配置IOPA[3-5],IOPB[0-7]为一般I/O口功能
PADATDIR=0x0FF00; // IOPA[3-4]为输出,且全部为0
}
//读液晶显示器的状态子程序,形参E代表处理的液晶的边(E1或E2边)
void LCDSTA1(E)
int E;
{
int E1FLAG,i=0;
PBDATDIR=PBDATDIR&0x0000; //IOPB口为输入
if(E==1)
PADATDIR=0x0FF18; //E1=1
else PADATDIR=0x0FF20; //E2=1
PFDATDIR=(PFDATDIR|0x0008)&0xfffb; // LCD_RW = 1;
// LCD_DI = 0;
while(1)
{
PFDATDIR=PFDATDIR|0x0010; //LCD_E = 1;
for(i=0; i<2; i++){}
PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
E1FLAG=PBDATDIR&0x0080; // 读液晶状态
if(E1FLAG==0x0000)break; //若液晶空闲,则停止等待
}
}
//对液晶显示器发指令子程序,形参E代表处理的液晶的边(E1或E2)
void TRANS1(TRANS,E) //该函数采用形参和实参的方式传递数值,TRANS为一个形参
int TRANS,E;
{ int i=0;
LCDSTA1(E); //判断液晶是否为忙
PBDATDIR=PBDATDIR|0x0FF00; //IOPB口为输出
if(E==1) PADATDIR=0x0FF18; //E1=1,
else PADATDIR=0x0FF20; //E2=1,
PFDATDIR=(PFDATDIR&0x0FFf3)|0x0010; //LCD_RW = 0;
//LCD_DI = 0;
//LCD_E = 1;
PBDATDIR=(PBDATDIR&0x0FF00)|TRANS; //需要写入的命令字送入数据线
for(i=0; i<2; i++){}
PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
}
//对液晶显示器写数据子程序,注意在此子程序中列地址没有加1,需要用户在外对其进行操作,形参E代表处理的液晶的边(E1或E2)
void WRITE1(WRITE,Yaddress,E) //WRITE代表需要写入的数据,Yaddress代表需要的列地址
int WRITE,Yaddress,E;
{
int i=0;
TRANS1(Yaddress,E); //设置列地址
LCDSTA1(E); //查询液晶是否空闲
PBDATDIR=PBDATDIR|0x0FF00; //IOPB口为输出
if(E==1) PADATDIR=0x0FF18; //E1=1
else PADATDIR=0x0FF20; //E1=0,E2=1
PFDATDIR=(PFDATDIR|0x0014)&0x0fff7;// LCD_RW = 0;
//LCD_DI = 1;
//LCD_E = 1;
PBDATDIR=(PBDATDIR&0x0FF00)|WRITE; //写入数据
for(i=0; i<2; i++){}
PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
}
//开E1显示子程序,形参E代表处理的液晶的边(E1或E2)
void DISP1(E)
int E;
{
int E1FLAG,i=0;
while(1)
{
TRANS1(0x03F,E); //送出控制字
LCDSTA1(E); //判断液晶是否为忙
PBDATDIR=PBDATDIR&0x00ff; //IOPB口为输入
if(E==1) PADATDIR=0x0FF18; //E1=1
else PADATDIR=0x0FF20; //E1=0,E2=1
PFDATDIR=(PFDATDIR|0x0018)&0x0fffb;// LCD_RW = 1;
//LCD_DI = 0;
//LCD_E = 1;
for(i=0; i<2; i++){}
PFDATDIR=PFDATDIR&0x0ffef; //LCD_E = 0;
E1FLAG=PBDATDIR&0x0020; // 读液晶状态
if(E1FLAG==0x0000) break; //如果液晶被打开,则退出循环
}
}
//E1边清屏子程序,形参E代表处理的液晶的边(E1或E2)
void CLEAR1(int E)
{
int PAGENUM,Yaddress; //定义所需要的局部变量
for (PAGENUM=0x0B8; PAGENUM<=0x0BF; PAGENUM++)
{
TRANS1(PAGENUM,E); //设置相应的页地址
for(Yaddress=0x40; Yaddress<=0x7F; Yaddress++)
{
WRITE1(0x00,Yaddress,E); //向相应的列送0以清屏
}
}
}
//关E1显示子程序,形参E代表处理的液晶的边(E1或E2)
void DISOFF1(int E)
{
int E1FLAG,i=0;
while(1)
{
TRANS1(0x3E,E); //送出控制字
LCDSTA1(E); //判断液晶是否为空闲
PBDATDIR=PBDATDIR&0x00FF; //IOPB口为输入
if(E==1) PADATDIR=0x0FF18; //E1=1
else PADATDIR=0x0FF20; //E1=0
PFDATDIR=(PFDATDIR|0x0018)&0x0fffb;// LCD_RW = 1;
//LCD_DI = 0;
//LCD_E = 1;
for(i=0; i<2; i++){}
PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
E1FLAG=PBDATDIR&0x0020; // 读液晶状态
if(E1FLAG==0x0020) break; //如液晶关闭,则退出循环
}
}
//LCD的E1初始化子程序,形参E代表处理的液晶的边(E1或E2)
void LCD1INIT(int E)
{
DISOFF1(E); //关显示E1
TRANS1(0x0A4,E); //不静态显示驱动
TRANS1(0x0A9,E); //占空比为1/32
TRANS1(0x0E2,E); //复位
TRANS1(0x0A0,E); //ADC选择正常输出
CLEAR1(E); //清屏
DISP1(E); //开显示
}
//参数名和单位显示子程序,入口为存储字库的数组的首地址,页地址和起始列地址
// 和选中的E1或E2的边数
DISPLAY1(n,m,E,PAGADD,Yaddress)
int n,PAGADD,Yaddress,E; // 定义所需要的局部变量
{
int K;
char TEMP;
TRANS1(0x0C0,E); // 从第0行开始显示
TRANS1(PAGADD,E); // 送需要显示的页地址
n=n*m;
for(K=0;K<m;K++,Yaddress++)
{
TEMP=table1[K+n];
WRITE1(TEMP,Yaddress,E); // 送需要显示的数据字节
}
}
//参数值显示子程序,入口为存储数字字库的数组的首地址,页地址和起始列地址
// 和选中的E1或E2的边数
DISPLAY2(n,m,E,PAGADD,Yaddress)
int n,PAGADD,Yaddress,E; // 定义所需要的局部变量
{
int K;
char TEMP;
TRANS1(0x0C0,E); // 从第0行开始显示
TRANS1(PAGADD,E); // 送需要显示的页地址
n=n*m;
for(K=0;K<m;K++,Yaddress++)
{
TEMP=table2[K+n];
WRITE1(TEMP,Yaddress,E); // 送需要显示的数据字节
}
}
//LCD初始化程序
void LCD_INIT()
{
LCDIOinit();
LCD1INIT(1); // LCD的E1边初始化
LCD1INIT(2); // LCD的E2边初始化
//com=PFDATDIR;
}
//LCD显示程序
void LCD_disp1()
{
LCD_INIT();
//显示电流给定值Iref
DISPLAY1(0,8,1,0xB8,0x40);//I
DISPLAY1(2,8,1,0xB8,0x48);//r
DISPLAY1(3,8,1,0xB8,0x50);//e
DISPLAY1(4,8,1,0xB8,0x58);//f
//显示电流反馈值Ifb
DISPLAY1(0,8,2,0xB8,0x40);//I
DISPLAY1(4,8,2,0xB8,0x48);//f
DISPLAY1(5,8,2,0xB8,0x50);//b
//显示转速给定值Vref
DISPLAY1(1,8,1,0xBa,0x40);//V
DISPLAY1(2,8,1,0xBa,0x48);//r
DISPLAY1(3,8,1,0xBa,0x50);//e
DISPLAY1(4,8,1,0xBa,0x58);//f
//显示电流反馈值Ifb
DISPLAY1(1,8,2,0xBa,0x40);//V
DISPLAY1(4,8,2,0xBa,0x48);//f
DISPLAY1(5,8,2,0xBa,0x50);//b
//显示PWM频率fpwm
DISPLAY1(4,8,1,0xBc,0x40);//f
DISPLAY1(7,8,1,0xBc,0x48);//p
DISPLAY1(8,8,1,0xBc,0x50);//w
DISPLAY1(9,8,1,0xBc,0x58);//m
//显示PWM占空比Dpwm
DISPLAY1(6,8,2,0xBc,0x40);//D
DISPLAY1(7,8,2,0xBc,0x48);//p
DISPLAY1(8,8,2,0xBc,0x50);//w
DISPLAY1(9,8,2,0xBc,0x58);//m
//显示换向的状态,0~5中的一个.St
DISPLAY1(10,8,1,0xBe,0x40);//H
DISPLAY1(11,8,1,0xBe,0x48);//S
DISPLAY1(12,8,1,0xBe,0x50);//t
//显示霍尔换向表,6个Hmap
DISPLAY1(10,8,2,0xBe,0x40);//H
DISPLAY1(9,8,2,0xBe,0x48);//m
DISPLAY1(13,8,2,0xBe,0x50);//a
DISPLAY1(14,8,2,0xBe,0x58);//p
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -