⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ocmj15x20d.c

📁 KEILC RTX51tiny开发的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*本程序实现金鹏电子的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 + -