📄 ocmj15x20d.c
字号:
/*本程序实现金鹏电子的OCMJ15X20D液晶模块的驱动显示功能
模块的默认控制芯片为8080系列
*/
#include <STDIO.H>
#include <STC12C5410AD.H>
#include<MATH.H>
#include<Key.H> //按键定义
/*LCM模块内部寄存器定义 */
#define WLCR 0x00
#define MISC 0x01
#define APSR 0x02
#define ADSR 0x03
#define WCCR 0x10
#define DWR 0x11
#define MAMR 0x12
#define DWRR 0x21
#define DWBR 0x31
#define DWLR 0x41
#define DWTR 0x51
#define AWRR 0x20
#define AWBR 0x30
#define AWLR 0x40
#define AWTR 0x50
#define CPXR 0x60
#define CPYR 0x70
#define BGCM 0x71
#define EDCM 0x72
#define BTR 0x80
#define SCCR 0x90
#define INTR 0xA0
#define KSCR 0xA1
#define KSDR 0xA2
#define KSER 0xA3
#define INTX 0xB0
#define INTY 0xB1
#define TPCR 0xC0
#define TPSR 0xC1
#define TPXR 0xC8
#define TPYR 0xC9
#define TPZR 0xCA
#define PNTR 0xE0
#define FNCR 0xF0
#define FVHT 0xF1
#define DWRR 0x21
#define DWBR 0x31
#define DWTR 0x51
#define CPXR 0x60
/*坐标Y轴 上下限定义和X轴上下限定义 */
/*对于液晶屏,其左上角为坐标原点,编程时需注意 */
#define zbYMax 20
#define zbYMin 214
#define zbXMax 29
#define zbXMin 8
sfr LedDATA=0xA0; //P2与液晶模块的数据接口相连
//P3与液晶模块的各控制位相连
sbit lcd_rs=P3^4; //H:存取DDRAM,L:存取缓存器
sbit lcd_wr=P0^2; //写入引脚,低电平有效
sbit lcd_rd=P0^3; //读入脚,低电平有效
sbit lcd_cs1=P0^1; //CS1为低和CS2为高时,模块处于置能状态,可接受指令反之不能
sbit lcd_cs2=P0^0;
sbit lcd_busy=P3^5; //用于 回应模块内部的执行和使用状况,可设成高或低电平触发
sbit lcd_INT=P3^7; //中断信号
//LCM初始化时需要赋值的寄存器
unsigned char lcmInitTabReg[39]={0x00,0x01,0x02,0x03,0x10,0x11,0x12,0x21,0x31,0x41,
0x51,0x20,0x30,0x40,0x50,0x60,0x61,0x70,0x71,0x72,
0x80,0x81,0x91,0x90,0xA0,0xA1,0xA2,0xA3,0xB0,0xB1,
0xC0,0xC1,0xC8,0xC9,0xCA,0xD0,0xE0,0xF0,0xF1};
//LCM初始化时寄存器中的值
unsigned char lcmInitTabDat[39]={0xC9,0xF2,0x10,0x80,0x6B,0x00,0x91,0x27,0xEF,0x00,
0x00,0x27,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,
0x01,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x27,0xEF,
0x00,0x0A,0x80,0x80,0x00,0x80,0x00,0xA0,0x0F};
//LCM中数字的内码分别对应0,1,2,3,4,5,6,7,8,9,.
unsigned char lcmNumCode[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2E};
//函数定义
void lcd_regwr(unsigned char regnada); //向LCM模块的缓存区(控制寄存器)写数据
void lcd_datawrite(unsigned char wrdata); //向LCM模块的DDRAM写数据
unsigned char lcd_regread(unsigned char regname); //读取LCM中寄存器的数据
void lcd_regwrite(unsigned char regname,unsigned char regdata); //向LCM模块写指令
void LCM__Initial(); //LCM模块初始化
void PORT_Initial(); //端口初始化
void LCM_Clr(); //液晶模块清屏
void dispInitial(); //初始化子程序
void LCM_WRZB(unsigned char LCM_X,unsigned char LCM_Y); //设定光标地址子程序
void Delay(unsigned char DelayTM); //延时子程序,延时 单位为ms
void drawOrign(); //在液晶模块中画坐标系子程序
unsigned char lcd_DDRread(unsigned char orginX,unsigned char orginY); //读取LCM中DDRAM的数据,输入坐标值
void drawPoint(unsigned char pointX,unsigned char pointY); //LCM描点子函数(对图层2操作)
void drawWave(); //画波形测试程序
void displayItemName();//显示采集数据的项目名称
void displayVoltage(float voltage); //显示采集电压
void displayFloat(float FloatVal,unsigned char orignX,unsigned orignY); //显示小数
void displayFloat2(float FloatVal,unsigned char orignX,unsigned orignY); //显示两位小数
void displayFloat4(float FloatVal,unsigned char orignX,unsigned orignY); //显示一位数和三位整数
void displaySignFloat(float FloatVal,unsigned char orignX,unsigned orignY); //显示带符号的浮点数(显示一位小数和三位整数)
void displayInteger(unsigned char IntVal,unsigned char orignX,unsigned orignY); //显示整数
unsigned char readKey(); //读取按键子程序
void displayArrow(unsigned char orignX,unsigned orignY); //显示光标
void displaySysSet(); //显示系统设定界面
void drawOrign(); //画出边框函数
void displayOk(unsigned char orignX,unsigned orignY); //显示'OK'
//函数实现
void lcd_regwr(unsigned char regnada)
{
while(lcd_busy == 1)
{;};
LedDATA = regnada;
lcd_cs1 =0; // chip enable.
lcd_cs2 =1;
lcd_rd = 1; //
lcd_rs = 0; // rs = 0;
lcd_wr = 0; // wr = 0;
;
lcd_wr = 1; // wr = 1;
lcd_rs = 1; // rs = 1;
lcd_cs1 =1; // chip disable.
LedDATA = 0xFF; //抗干扰措施,平时数据口处于高电平状态
}
//向LCM模块的DDRAM写数据
void lcd_datawrite(unsigned char wrdata)
{
while(lcd_busy == 1)
{;};
LedDATA = wrdata;
lcd_cs1 =0; // chip enable.
lcd_cs2 =1;
lcd_rd = 1; //
lcd_rs = 1; // rs = 1;
lcd_wr = 0; // wr = 0;
;
lcd_wr = 1; // wr = 1;
lcd_rs = 1; // rs = 1;
lcd_cs1 =1; // chip disable.
LedDATA = 0xFF; //抗干扰措施,平时数据口处于高电平状态
}
//读取LCM寄存器的数据
unsigned char lcd_regread(unsigned char regname)
{
unsigned char reg_rddata;
lcd_regwr(regname);
P2M0=0xFF; //P2端口设置为高阻抗输入模式
P2M1=0x00;
lcd_cs1 =0; // chip enable.
lcd_wr = 1; // wr = 1;
lcd_rs = 0; // rs = 0;
lcd_rd = 0; // rd = 0;
;
reg_rddata = LedDATA;
lcd_rd = 1; // rd = 1;
lcd_rs = 1; // rs = 1;
lcd_cs1 =1; // chip disable.
P2M0=0x00; //P2端口设置为强 推挽输出模式
P2M1=0xFF;
LedDATA = 0xFF; //抗干扰措施,平时数据口处于高电平状态
return reg_rddata;
}
//向LCM模块写指令
void lcd_regwrite(unsigned char regname,unsigned char regdata) //写资料到缓存器
{
lcd_regwr(regname);
lcd_regwr(regdata);
}
//LCM模块初始化
void LCM__Initial()
{
unsigned char i;
PORT_Initial();
//lcd_INT=0;
Delay(1);
for(i=0;i<39;i++)
{
lcd_regwrite(lcmInitTabReg[i],lcmInitTabDat[i]);
}
LCM_Clr(); //清屏
lcd_regwrite(MAMR,0xB2);//对图层2操作,
LCM_Clr(); //图层2清屏
}
//端口初始化
void PORT_Initial()
{
P2M0=0x00; //P2端口设置为强 推挽输出模式
P2M1=0xFF;
P0M0=(P0M0)&(0xF0); //根据需要设置P0端口 ,CS1(P0.1)、CS2(P0.0)、WR(P0.2)、RD(P0.3)设为输出
P0M1=(P0M1)|(0x0F);
P3M0=P3M0&(0xEF); //RS(P3.4)设置为输出
P3M1=P3M1|(0x10);
P3M0=P3M0|(0x20); //BUSY(P3.5)设置为输入
P3M1=P3M1&(0xDF);
P3M0=P3M0|(0x80); //INT(P3.7)设置为输入
P3M1=P3M1&(0x7F);
}
//液晶模块清屏
void LCM_Clr()
{
unsigned char TmpChar;
lcd_regwrite(PNTR,0x00);
TmpChar=lcd_regread(FNCR);
TmpChar=TmpChar|0x08;
lcd_regwrite(FNCR,TmpChar);
lcd_regwrite(WLCR,0xC5);
LCM_WRZB(0x00,0x00);
lcd_datawrite(0x00);
}
//设定光标地址子程序
void LCM_WRZB(unsigned char LCM_X,unsigned char LCM_Y)
{
lcd_regwrite(CPXR,LCM_X);
lcd_regwrite(CPYR,LCM_Y);
}
//延时子程序,延时 单位为ms
void Delay(unsigned char DelayTM)
{
unsigned int delay1; //1ms时间常数 (晶振为16MHz时为16000)
while(DelayTM!=0)
{
delay1=16000;
while(delay1!=0)
delay1--;
DelayTM--;
}
}
//显示初始化子程序
void dispInitial()
{
Delay(120);
CLK_DIV=0x00; //设置时钟分频寄存器 (不分频)
PORT_Initial(); //端口初始化
LCM__Initial(); //LCM模块初始化
}
//显示光标
void displayArrow(unsigned char orignX,unsigned orignY)
{
LCM_WRZB(orignX,orignY); //设定坐标
lcd_datawrite(0x10);
}
//按坐标清除显示
void clearDispData(unsigned char orignX,unsigned orignY)
{
LCM_WRZB(orignX,orignY); //设定坐标
lcd_datawrite(0x00);
}
//显示'OK'
void displayOk(unsigned char orignX,unsigned orignY)
{
LCM_WRZB(orignX,orignY); //设定坐标
lcd_datawrite(0x4F);
lcd_datawrite(0x4B);
}
//画出边框函数
void drawOrign()
{
unsigned char i;
lcd_regwrite(WLCR,0xC5); //设置LCD控制寄存器(WLCR-0x00)绘图模式
lcd_regwrite(MAMR,0xB1); //对图层1操作
//纵轴
for(i=zbYMax;i<zbYMin;i++)
{
LCM_WRZB(zbXMin-1,i);
lcd_datawrite(0x01);
}
//横轴
LCM_WRZB(zbXMin-1,zbYMin);
lcd_datawrite(0x01);
LCM_WRZB(zbXMin,zbYMin);
for(i=zbXMin;i<=zbXMax;i++)
lcd_datawrite(0xFF);
//上边框
LCM_WRZB(zbXMin,zbYMax);
for(i=zbXMin;i<=zbXMax;i++)
lcd_datawrite(0xFF);
LCM_WRZB(zbXMax,zbYMax);
lcd_datawrite(0xFF);
//右边框
for(i=zbYMax+1;i<zbYMin;i++)
{
LCM_WRZB(zbXMax,i);
lcd_datawrite(0x01);
}
}
//显示采集项目名称
void displayItemName()
{
lcd_regwrite(MAMR,0xB1); //对图层1操作
LCM_Clr(); //清屏
lcd_regwrite(WCCR,0x39); //设置光标控制寄存器(WCCR-0x10)
lcd_regwrite(WLCR,0xCD); //设置LCD控制寄存器(WLCR-0x00)文字模式
//lcd_regwrite(FNCR,0x00); //中文字型选择汉字
LCM_WRZB(0x08,0x20); //设定坐标
//lcd_regwrite(FVHT,0x50); //设定汉字高度,宽度
lcd_datawrite(0xBC);
lcd_datawrite(0xF5); //减
lcd_datawrite(0xB9);
lcd_datawrite(0xE2); // 光
lcd_datawrite(0xC2);
lcd_datawrite(0xCA); // 率
LCM_WRZB(0x08,0x50);
lcd_datawrite(0xBC);
lcd_datawrite(0xF5); //减
lcd_datawrite(0xB9);
lcd_datawrite(0xE2); //光
lcd_datawrite(0xCF);
lcd_datawrite(0xB5); //系
lcd_datawrite(0xCA);
lcd_datawrite(0xFD); //数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -