📄 hardware_hook.c
字号:
//#include"F:\msp430\msp430\msp430\uCOS430\includes.h"
#include "Hardware_Hook.h"
#include <msp430x16x.h>
//OS_EVENT *UartMutex;
unsigned char uartbuf=0;
/*
*************************************************************************
* IO口初始化
* 键盘,液晶,蜂鸣器,等简单设备的IO口初始化
*************************************************************************
*/
void Ioport_Init(void)
{
P4SEL=0;
P5SEL=0x0f;
P4DIR=0xff;
P5DIR=0xfF;
P4OUT=0xff;
P5OUT=0x7f;
P1DIR &=~(BIT4+BIT5+BIT6+BIT7);
P1SEL &=~(BIT4+BIT5+BIT6+BIT7);
//#ifndef KEYSCAN
P1IE |=BIT4+BIT5+BIT6+BIT7;
//#endif
}
/*
*************************************************************************
* LED显示
*显示值等于输入值
*************************************************************************
*/
void Leddisplay(unsigned char val)
{
P4OUT=val;
return;
}
/*
*************************************************************************
* 蜂鸣器显示
*输入值为非零值时鸣叫
*************************************************************************
*/
void FMQdisplay(unsigned char enable)
{
if(enable)
P5OUT &=~BIT7;
else
P5OUT |=BIT7;
return;
}
/*
*************************************************************************
* 键盘扫描
*返回键值在低4位
*************************************************************************
*/
#ifdef KEYSCAN
unsigned char KEY_scan(void)//键盘扫描
{
unsigned char a;
a=~P1IN;
a>>=4;
return(a);
}
#endif
/*
*************************************************************************
* 系统始终初始化
*
*************************************************************************
*/
void SystemClock_Init(void) // 初始化系统时钟
{
unsigned char i;
//WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
BCSCTL1=0x00;//Set 430 clk 开启XT2,DOC的标称频率为最低 且不分频;XT1为低速晶体(32.768K)
BCSCTL2=SELM_2+SELS;//选择MCLK SCLK的时钟源为高速时钟 不分频,均为8M
//BCSCTL2|=DIVM_3+DIVS_3;
do
{
IFG1&=~OFIFG;
for(i=0xff;i>0;i--);
}
while ((IFG1&OFIFG)!=0);
//P5DIR=BIT4+BIT5+BIT6;
//P5SEL|=BIT4+BIT5+BIT6;//将MCLK SCLK ACLK分别输出至P5.4 5 6口
}
/*
*************************************************************************
* 时间定时器初始化
*
*************************************************************************
*/
void Init_TimerB(void)
{
//选择ACLK,清除TAR
TBCTL =TBSSEL0 +TBCLR;
//TBCCRO允许中断
TBCCTL0= CCIE;
//时间间隔为1s
TBCCR0=32768;
//增计数模式
TBCTL |=MC0;
return;
}
/*
void SystemTime_Init(void)
{
TACTL=TASSEL0+TACLR;//ACLK,清TAR
CCTL0=CCIE; //CCR0中断允许
CCR0=32768; //设定中断间隔为1s
TACTL|=MC0; //Timer_A为增计数模式
}
SystimeTag Systime={2007,1,1,0,0,0,1};
*/
SystimeTag *TimeGet(void)
{
return &Systime;
}
/*
*************************************************************************
* ADC12初始化
*
*************************************************************************
*/
void ADC12_Init(void)//ADC12初始化
{
ADC12CTL1 = SHS_0+SHP + CONSEQ_1+ADC12SSEL_2+ADC12DIV_0+CSTARTADD_0; // ADC12SC trig.,序列通道单次转换模式;ADC12内核时钟源选择为MCLK 2分频(ADC12CLK=4M) 选择ADC12SC为采样输入信号源 SAMPCON来自采样定时器
ADC12MCTL0 = SREF_1 + INCH_1; // 选择通道1, 正参考电压为内部参考电压(2.5V),负参考为AVSS
ADC12MCTL1 = SREF_1 + INCH_2+EOS; // 选择通道2, 正参考电压为内部参考电压(2.5V),负参考为AVSS
ADC12IE = 0x02; // 使用的是转换存储器0 所以Enable ADC12IFG.1
ADC12CTL0 = SHT0_2 + REFON +REF2_5V +ADC12ON +MSC;//+ REF2_5V; // config ADC12:内部参考电压值选择内部2.5V参考电压;参考电压发生器关打开;ADC12内核打开;能用ENC和ADC12SC的上升沿启动一次序列转换 采样周期为16个ADC12CLK周期
// TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0)
// CCR0=1000; //设置计数周期
//CCR1=100;
// TACTL = TASSEL_2 + MC_1; // 定时器A时钟源选择MCLK, 为增计数模式
//while (!(0x01 & ADC12IFG)); // First conversion?
P6SEL=0XFF;
}
/*
*************************************************************************
*
*
*************************************************************************
*/
void Uart_Init(void) //串口初始化
{
// INT8U err;
//UCTL1|=SWRST;
UCTL1&=~SWRST;
UCTL1 = CHAR; // 8-bit 字符 无校验 1位停止位 UART模式 无反馈 线路空闲多机模式
/*******************波特率为1200*******************/
/* UTCTL1=SSEL0; //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同
UBR01 = 0x1B; // 波特率设置寄存器 波特率为1200
UBR11 = 0x00; // // 波特率设置寄存器
UMCTL1 = 0x11; //波特率 调整寄存器
*/
/**************************************/
/*******************波特率为2400*******************/
/* UTCTL1=SSEL0; //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同
UBR01 = 0x0D; // 波特率设置寄存器 波特率为2400
UBR11 = 0x00; // // 波特率设置寄存器
UMCTL1 = 0x6D; //波特率 调整寄存器
*/
/**************************************/
/*******************波特率为9600*******************/
UTCTL1=SSEL0; //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同
UBR01 = 0x03; // 波特率设置寄存器
UBR11 = 0x00; // // 波特率设置寄存器
UMCTL1 = 0x4A; //波特率 调整寄存器
/**************************************/
/*******************波特率为19200*******************
UTCTL1=SSEL0+SSEL1; //选择SMCLK为波特率发生器时钟源(8M), UCLKI与UCLK极性相同
UBR01 = 0xA0; // 波特率设置寄存器 8M 下波特率为19200
UBR11 = 0x01; // // 波特率设置寄存器
UMCTL1 = 0x6d; //波特率 调整寄存器
**************************************/
/*******************波特率为115200*******************
UTCTL1=SSEL0+SSEL1; //选择SMCLK为波特率发生器时钟源(8M), UCLKI与UCLK极性相同
UBR01 = 0x45; // 波特率设置寄存器 SMCLK为8M下波特率为115200
UBR11 = 0x00; // // 波特率设置寄存器
UMCTL1 = 0x55; //波特率 调整寄存器
**************************************/
ME2|= UTXE1 + URXE1; // 使能 USART1 TXD/RXD
IE2|= URXIE1;//+UTXIE1; // 使能 USART1 接收和发送 中断
P3SEL |= BIT6+BIT7; // P3.6,7 = USART1 TXD/RXD 选择第二功能
//-------------------------------------------------------
// OSMutexCreate(1,&err); //创建串口互斥信号量
}
void Uart_SendInteg(unsigned int data)//发送一个整数,发送完毕返回
{
unsigned char i;
i=data>>8;
TXBUF1=i;
while((UTCTL1&0X01)==0);
i=data%256;
TXBUF1=i;
while((UTCTL1&0X01)==0);
}
void Uart_SendChar(unsigned char data)//发送一个字符,发送完毕返回
{
//OS_ENTER_CRITICAL();
TXBUF1=data;
while((UTCTL1&0X01)==0);
//OS_EXIT_CRITICAL();
return;
}
#pragma vector=USART1RX_VECTOR //接收中断向量表的位置
__interrupt void UART1RX(void)
{
//LcdWriteOneChar(U1RXBUF);//在当前位置显示一个字符
// OSIntEnter();
uartbuf=U1RXBUF;
// OSIntExit();
}
unsigned char Uart_GetChar(unsigned int timeout)//
{
while(!(U1IFG & URXIFG1));
U1IFG|=~URXIFG1;
return U1RXBUF;
}
/*============================================================================================
*LCD
============================================================================================*/
void LCD_WriteINS(unsigned char instruction)//写指令
{
// LCD_ChekStat();
while(LCD_ReadINS() & BIT7);
P2DIR=0XFF;//输出模式
P5OUT &=~(BIT5+BIT4);//RW->0;RS->0, //写指令
P5OUT |=BIT6;//E->1,
P2OUT = instruction;
_NOP();
_NOP();
P5OUT &=~(BIT6);//E->0;写出去
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
P5OUT |=BIT5;
P5OUT &=~(BIT4); // RS->0, RW=1;
P2DIR=0X00;
}
void LCD_WriteDAT(unsigned char wdata)//写数据
{
// LCD_ChekStat();
while(LCD_ReadINS() & BIT7);
P2DIR=0XFF;
P5OUT &=~(BIT5);//RW->0,写指令
P5OUT |=BIT6+BIT4;//E->1,RS->1;
P2OUT = wdata;
_NOP();
_NOP();
P5OUT &=~(BIT6);//E->0;写出去
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
P5OUT |=BIT5;
P5OUT &=~(BIT4); //E->0, RS->0, RW=1;
P2DIR=0X00;
}
unsigned char LCD_ReadDAT(void)
{
unsigned char a;
// LCD_ChekStat();
while(LCD_ReadINS() & BIT7);
P2DIR=0X00;
P5OUT |=BIT6+BIT5;// E->1, RW=1;
_NOP();
P5OUT |=BIT4;//RS->1,
_NOP();
_NOP();
_NOP();
_NOP();
a=P2IN;
_NOP();
P5OUT &=~(BIT4);//RS->0
P5OUT &=~(BIT6);//E->0
return a;
}
unsigned char LCD_ReadINS(void)
{
unsigned char a;
P2DIR=0X00;
P5OUT |=BIT6+BIT5;//E->1, RW=1;
_NOP();
_NOP();
_NOP();
_NOP();
P5OUT &=~(BIT4);//RS->0
_NOP();
_NOP();
_NOP();
_NOP();
a=P2IN;
_NOP();
P5OUT &=~(BIT6);//E->0
return a;
}
void LCD_ChekStat(void)
{
unsigned char temp=BIT7;
unsigned int timeout=60000;
while(temp && timeout){
temp=LCD_ReadINS() & BIT7;
timeout--;
}
}
void LCD_RESET(void)
{
unsigned int i=60000;//40ms
P5OUT &=~(BIT7);
while(i--);
P5OUT|=BIT7;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -