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

📄 hardware_hook.c

📁 MSP430F1611+LCD12864_st7920+Key刚完成调试.请有需要的朋下载!
💻 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 + -