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

📄 hello.c

📁 COG-VP12864液晶屏驱动代码及对应RTC实例
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <uart.h>
#include <mhzk16_dis.h>


typedef unsigned    char        INT8U;
typedef unsigned    short       INT16U;
typedef unsigned    long        INT32U;
typedef unsigned    char*       PINT8U;
typedef unsigned    short*      PINT16U;
typedef unsigned    long*       PINT32U;

#define NULL    0
/***************************************************************************************
/                                                RTC
/********************************************************************************/
#define RTC_REGISTER_OFFSET     0xBFF08000

#define RTCCTL      (RTC_REGISTER_OFFSET + 0x000)   // RTC Control 

#define ALMCFG      (RTC_REGISTER_OFFSET + 0x002)   // ALARM Configuration 

#define ALMSEC      (RTC_REGISTER_OFFSET + 0x004)   // Alarm Second Data
#define ALMMIN      (RTC_REGISTER_OFFSET + 0x006)   // Alarm Minute Data
#define ALMHOUR     (RTC_REGISTER_OFFSET + 0x008)   // Alarm Hour Data 
#define ALMDATE     (RTC_REGISTER_OFFSET + 0x00a)   // Alarm Date Data 
#define ALMDAY      (RTC_REGISTER_OFFSET + 0x00c)   // Alarm Day of Week Data 
#define ALMMON      (RTC_REGISTER_OFFSET + 0x00e)   // Alarm Month Data 
#define ALMYEAR     (RTC_REGISTER_OFFSET + 0x010)   // Alarm Year Data 


#define RTCSEC      (RTC_REGISTER_OFFSET + 0x012)   // RTC Second
#define RTCMIN      (RTC_REGISTER_OFFSET + 0x014)   // RTC Minute 
#define RTCHOUR     (RTC_REGISTER_OFFSET + 0x016)   // RTC Hour 
#define RTCDATE     (RTC_REGISTER_OFFSET + 0x018)   // RTC Date 
#define RTCDAY      (RTC_REGISTER_OFFSET + 0x01a)   // RTC Day of Week 
#define RTCMON      (RTC_REGISTER_OFFSET + 0x01c)   // RTC Month 
#define RTCYEAR     (RTC_REGISTER_OFFSET + 0x01e)   // RTC Year Data

#define RTCIM       (RTC_REGISTER_OFFSET + 0x020)   // RTC Interrupt Mode
#define RTCSTA      (RTC_REGISTER_OFFSET + 0x022)   // RTC Status 

#define SECCNT      (RTC_REGISTER_OFFSET + 0x024)   // RTC "Second" Counter


#define WDTCTL      (RTC_REGISTER_OFFSET + 0x026)
#define WDTCNT      (RTC_REGISTER_OFFSET + 0x028)


/***********液晶显示器接口引脚定义**************/
#define LCD_E	       0x0100		
#define LCD_CS1        0x0200
#define LCD_RW         0x0400
#define LCD_CS2        0x0800
#define LCD_CS3        0x1000
#define LCD_DI         0x2000
//#define LCD_DATA       *(PINT16U)IOPDATAL	    //数据口	
		
/*
#define LcdSetE()      *(PINT16U)IOPDATAL |= LCD_E //位置位,输出1
#define LcdSetDI()     *(PINT16U)IOPDATAL |= LCD_DI
#define LcdSetRW()     *(PINT16U)IOPDATAL |= LCD_RW
                       
#define LcdClearE()    *(PINT16U)IOPDATAL &= ~LCD_E //位清零,输出0
#define LcdClearDI()   *(PINT16U)IOPDATAL &= ~LCD_DI
#define LcdClearRW()   *(PINT16U)IOPDATAL &= ~LCD_RW
                       
#define LcdSetCS1()    *(PINT16U)IOPDATAL |= LCD_CS1 //片选
#define LcdSetCS2()    *(PINT16U)IOPDATAL |= LCD_CS2
#define LcdSetCS3()    *(PINT16U)IOPDATAL |= LCD_CS3 
                       
#define LcdClearCS1()  *(PINT16U)IOPDATAL &= ~LCD_CS1 
#define LcdClearCS2()  *(PINT16U)IOPDATAL &= ~LCD_CS2
#define LcdClearCS3()  *(PINT16U)IOPDATAL &= ~LCD_CS3
*/

//#define LCD_BUSY	  0x0080	//LCM忙判断
//#define LcdReadStatus() *(PINT16U)(IOPDATAL) & LCD_BUSY


/***********常用操作命令和参数定义**************/
#define DISPON	       0x3F    //显示开
#define DISPOFF	       0x3E    //显示关
#define DISPFIRST      0xC0    //从DDRAM的第一行  显示起始行
#define SETX           0xB8    //设置页X地址 低3位有效
#define SETY           0x40    //设置列Y地址 低6位有效

/*************显示分区边界位置****************/
#define MODL	       0x00    //左区开始   
#define MODM	       0x40    //左区和中区分界
#define MODR	       0x80    //中区和右区分界
#define LCMLIMIT       0xC0    //右区和显示区右边界

/***********************************************************************************/
/***********************************************************************************/
/***********************************************************************************/

#define GPIO_REGISTER_OFFSET         0xBFF40000  //(GPIO_BASE | 0xA0000000)
#define IOPMODL  (GPIO_REGISTER_OFFSET + 0x0000) // GPIO pin input/output select
#define IOPMODM  (GPIO_REGISTER_OFFSET + 0x0002) // 0 = Input;
#define IOPMODH  (GPIO_REGISTER_OFFSET + 0x0004) // 1 = Output 
                                                 

#define IOPDATAL (GPIO_REGISTER_OFFSET + 0x0006) // Data value register 
#define IOPDATAM (GPIO_REGISTER_OFFSET + 0x0008)
#define IOPDATAH (GPIO_REGISTER_OFFSET + 0x000a)


typedef struct
{
	unsigned LCDData:8;
	
	unsigned LCDEnable:1;
	unsigned LCDCS1:1;
	unsigned LCDRW:1;
	unsigned LCDCS2:1;
	unsigned LCDCS3:1;
	unsigned LCDDI:1;
	unsigned SCRSelect1:1;
	unsigned SCRDetect2:1;
	
	unsigned USBINT:1;
	unsigned PrtHead:8;
	unsigned CrI0:1;      
	unsigned CrI1:1;      
	unsigned CrPhaseA:1;  
	unsigned CrPhaseB:1;  
	unsigned PfI0:1;      
	unsigned PfI1:1;      
	unsigned PfPhaseA:1;  
	                      
	unsigned PfPhaseB:1;  
	unsigned HoPs:1;      
	unsigned PHot:1;      
	unsigned PEnd:1;      
	unsigned BMark:1;     
	unsigned MotorCtl:1;  
	unsigned LimitPulse:1;
	unsigned SCRSelect2:1;
	
	unsigned Pt6311Din:1;
	unsigned Pt6311Dout:1;
	unsigned Pt6311Stb:1;
	unsigned Pt6311Clk:1;
	unsigned SCRPwrEn2:1;
	unsigned I2CINTA:1;
	unsigned I2CSCL:1;
	unsigned I2CSDA:1;
	
	unsigned :16;
	
}GPIOMODE;


typedef struct
{
	unsigned :16;
	
	unsigned LCDData:8;
		
	unsigned LCDEnable:1;
	unsigned LCDCS1:1;
	unsigned LCDRW:1;
	unsigned LCDCS2:1;
	unsigned LCDCS3:1;
	unsigned LCDDI:1;
	unsigned SCRSelect1:1;
	unsigned SCRDetect2:1;
	
	unsigned USBINT:1;
	unsigned PrtHead:8;
	unsigned CrI0:1;      
	unsigned CrI1:1;      
	unsigned CrPhaseA:1;  
	unsigned CrPhaseB:1;  
	unsigned PfI0:1;      
	unsigned PfI1:1;      
	unsigned PfPhaseA:1;  
	                      
	unsigned PfPhaseB:1;  
	unsigned HoPs:1;      
	unsigned PHot:1;      
	unsigned PEnd:1;      
	unsigned BMark:1;     
	unsigned MotorCtl:1;  
	unsigned LimitPulse:1;
	unsigned SCRSelect2:1;
	
	unsigned Pt6311Din:1;
	unsigned Pt6311Dout:1;
	unsigned Pt6311Stb:1;
	unsigned Pt6311Clk:1;
	unsigned SCRPwrEn2:1;
	unsigned I2CINTA:1;
	unsigned I2CSCL:1;
	unsigned I2CSDA:1;
	
}GPIODATA;

struct SYSTEMTIME
        {
         unsigned short wYear;
         unsigned short wMonth;
         unsigned short wDayOfWeek;
         unsigned short wDay;
         unsigned short wHour;
         unsigned short wMinute;
         unsigned short wSecond;
         unsigned short wMilliseconds;
        };
        
/******************************************************************************************
/******************************************************************************************
/               RTC设置程序
/*****************************************************************************************/
void RTC_SET(unsigned long rtc, unsigned short data)
{
	*(unsigned short*)rtc = data;
}

void RTC_SetBIT(unsigned long rtc, unsigned short data)
{
	*(unsigned short*)rtc |= data;
}

void RTC_CLEARBIT(unsigned long rtc, unsigned short data)
{
	*(unsigned short*)rtc &= ~data;
}

unsigned short RTC_READ(unsigned long rtc)
{
	return *(unsigned short*)rtc;
}

void GETTIME(struct SYSTEMTIME *lpst)
{
    unsigned short tmp;
    tmp = RTC_READ(RTCYEAR);
    lpst->wYear = ((tmp & 0xf000) >> 12)*1000 + ((tmp & 0xf00) >> 8)*100 + ((tmp & 0xf0) >> 4)*10 + (tmp & 0xf);
    
    tmp = RTC_READ(RTCMON);
    lpst->wMonth = ((tmp & 0x10) >> 4)*10 + (tmp & 0xf);
    
    tmp = RTC_READ(RTCDAY);
    lpst->wDayOfWeek = tmp & 0x7;
    
    tmp = RTC_READ(RTCDATE);
    lpst->wDay = ((tmp & 0x30) >> 4)*10 + (tmp & 0xf);
    
    tmp = RTC_READ(RTCHOUR);
    lpst->wHour = ((tmp & 0x30) >> 4)*10 + (tmp & 0xf);
    
    tmp = RTC_READ(RTCMIN);
    lpst->wMinute = ((tmp & 0x70) >> 4)*10 + (tmp & 0xf);    
    
    tmp = RTC_READ(RTCSEC);
    lpst->wSecond = ((tmp & 0x70) >> 4)*10 + (tmp & 0xf);     
    
    tmp = RTC_READ(SECCNT);
    lpst->wMilliseconds = (tmp * 1000)/0x4000;
    
}


void SetTime(struct SYSTEMTIME *lpst)
{
	unsigned short tmp;
	
	
	RTC_SET(RTCCTL,0x4);

	tmp = lpst->wYear;
	RTC_SET(RTCYEAR, ((tmp/1000)%10)*0x1000 + ((tmp/100)%10)*0x100 + ((tmp/10)%10)*0x10 + tmp%10);
	
	tmp = lpst->wMonth;
	RTC_SET(RTCMON, ((tmp/10)%10)*0x10 + tmp%10);
	
	tmp = lpst->wDayOfWeek;
	RTC_SET(RTCDAY, tmp%10);
	
	tmp = lpst->wDay;
	RTC_SET(RTCDATE, ((tmp/10)%10)*0x10 + tmp%10);
	
	tmp = lpst->wHour;
	RTC_SET(RTCHOUR, ((tmp/10)%10)*0x10 + tmp%10);
	
	tmp = lpst->wMinute;
	RTC_SET(RTCMIN, ((tmp/10)%10)*0x10 + tmp%10);
	
	tmp = lpst->wSecond;
	RTC_SET(RTCSEC, ((tmp/10)%10)*0x10 + tmp%10);

	RTC_SET(RTCCTL,0x1);
}



GPIOMODE   *LCDIOMOD = (GPIOMODE *)(IOPMODL); 
GPIODATA   *LCDIODATA = (GPIODATA *)(IOPMODH);

/******************************************************
函数名称:LcdPortInit
函数功能:GPIO[15:0]初始化
传入参数:无
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
void LcdPortInit(void)
{
	*(PINT16U)IOPMODL  = 0xFFFF;	      	//1111 1111 1111 1111
}

void TimeDelay(INT32U i)
{
	while(i--);
}

/******************************************************
函数名称:WaitCom
函数功能:公用busy等待
传入参数:无
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
void WaitCom(void)
{
        INT16U tmp;
  
        *(PINT16U)IOPDATAL = 0xDEFF;     //1101 1110 1111 1111  读状态,E信号上升
        TimeDelay(4);                    //
        *(PINT16U)IOPDATAL = 0xDFFF;     //1101 1111 1111 1111    
        while(1){
            tmp = *(PINT16U)IOPDATAL;    
            if((tmp & 0x0080) == 0)      //0000 0000 1000 0000  BUSY位为0时 跳出循环     
	        break;
        }

        *(PINT16U)IOPDATAL = 0xDEFF;     
        TimeDelay(100);
}
/******************************************************
函数名称:WrCmdL
函数功能:命令输出到左区控制口
传入参数:cdata
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
void WrCmdL(INT8U cdata)
{
        *(PINT16U)IOPDATAL = 0xD900 | cdata;    //1101 1001 0000 0000
        LCDIODATA->LCDEnable = 0 ;
}


/******************************************************
函数名称:WrCmdM
函数功能:命令输出到中区控制口
传入参数:cdata
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
void WrCmdM(INT8U cdata)                                     
{
        *(PINT16U)IOPDATAL = 0xD300 | cdata;     //1101 0011 0000 0000
        LCDIODATA->LCDEnable = 0 ;         		
}


/******************************************************
函数名称:WrCmdR
函数功能:命令输出到右区控制口
传入参数:cdata
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
void WrCmdR(INT8U cdata)                                            
{
        *(PINT16U)IOPDATAL = 0xCB00 | cdata;      //1100 1011 0000 0000
        LCDIODATA->LCDEnable = 0 ;    
}


/******************************************************
函数名称:LocateXY
函数功能:根据设定的坐标数据,定位LCM上的下一个操作单元位置
传入参数:row,col
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
/***************************************************/
/**/
/***************************************************/
void LocateXY(PINT8U row,PINT8U col)
{	
	INT8U row_tmp;
	INT8U col_tmp;


	row_tmp = *row & 0x07 | SETX;			//与上一个数是为了防止给出数过大,影响到指令的输出 0000 0000 0000 0111
        col_tmp = *col & 0x3F | SETY;   // 0000 0000 0011 1111

        if(*col < 0x40){        // left
		TimeDelay(100);
		
            	*(PINT16U)IOPDATAL = 0xD900 | row_tmp;   //1101 1001 0000 0000 在左板显示 行
            	LCDIODATA->LCDEnable = 0 ;

		TimeDelay(100);
            	*(PINT16U)IOPDATAL = 0xD900 | col_tmp;   //
            	LCDIODATA->LCDEnable = 0 ;
	} else if (*col < 0x80){    //middle

		TimeDelay(100);
            	*(PINT16U)IOPDATAL = 0xD300 | row_tmp;   
            	LCDIODATA->LCDEnable = 0 ;

		TimeDelay(100);
		*(PINT16U)IOPDATAL = 0xD300 | col_tmp;
		LCDIODATA->LCDEnable = 0 ;
	} else {

		TimeDelay(100);
		*(PINT16U)IOPDATAL = 0xCB00 | row_tmp;
		LCDIODATA->LCDEnable = 0 ;

		TimeDelay(100);
		*(PINT16U)IOPDATAL = 0xCB00 | col_tmp;
		LCDIODATA->LCDEnable = 0 ;
		}

}


/******************************************************
函数名称:Wrdata
函数功能:数据写输出
传入参数:row,col,data
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
/***************************************************/
/*                                       */
/***************************************************/
void WrData(PINT8U row,PINT8U col,INT8U data)
{
	LocateXY(row,col);

	TimeDelay(100);

	if(*col < 0x40){

		*(PINT16U)(IOPDATAL) = 0xF900 | data;	//给CS1写数据 1111 1001 0000 0000    R/W:0  D/I:1
		LCDIODATA->LCDEnable = 0 ;            
        } else if (*col < 0x80){

		*(PINT16U)(IOPDATAL) = 0xF300 | data;	//给CS2写数据 1111 0011 0000 0000
		LCDIODATA->LCDEnable = 0 ;
        } else {

		*(PINT16U)(IOPDATAL) = 0xEB00 | data;	//给CS3写数据 1110 1011 0000 0000
		LCDIODATA->LCDEnable = 0 ;
        }
}
/******************************************************
函数名称:ClrScreen
函数功能:清屏,全屏幕清零
传入参数:无
返 回 值:无
建立时间:2005.07.29
修改时间:
建 立 人:Carl
修 改 人:
其它说明:
******************************************************/
void lcd_clear(void)
{
	INT8U row,col;
	for(row = 0; row < 8; row++)
	    for(col = 0; col < LCMLIMIT; col++)
	        WrData(&row,&col,0x00);	
}
/******************************************************
函数名称:ClrScreen0
函数功能:清屏,具体清
传入参数:row,col,width
返 回 值:无
建立时间:2006.04.20
修改时间:
建 立 人:Satellite
修 改 人:
其它说明:row -- 行(0~3) col -- 起始列(0~192) width --清屏的宽度(0~192)
******************************************************/
void ClrScreen0(INT8U row,INT8U col,INT8U width)
{
	INT8U	i,j,k;
	k = col ;
	row = 2*row;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -