📄 hello.c
字号:
#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 + -