求大神帮我看下 我想做个实物 网上找了个基于MSP430G2211实现的风速测试仪
程序执行了#include"LCD_12864.h" 这里显示错误
新手求助啊·····
这是程序
#include
#include"LCD_12864.h"
Watchdog_Config(); //"看门狗"配置
Clocks_Config(); //时钟配置
GPIO_Config(); //GPIO配置,P1.0-液晶串行数据输出,P1.1-液晶时钟输出//P1.2上升沿中断使能
TimerA0_Config(); //"TimerA0"配置,产生1s定时中断
init_lcd (); //LCD配置
void FaultRoutine(void) //时钟故障,进入此"陷阱"
{
while(1); // 陷阱
}
void Watchdog_Config(void) //"看门狗"配置
{
WDTCTL=WDTPW+WDTHOLD;
}
void Clocks_Config(void) //时钟配置
{
if (CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
FaultRoutine(); //如果校准数据被擦除,则运行FaultRoutine()
BCSCTL1=CALBC1_1MHZ; //设定范围
//BCSCTL1&=~BIT6; //LFXT1 模式选择:低频模式(Low-frequencymode)
DCOCTL=CALDCO_1MHZ; // 设定DCO步长+调制
BCSCTL3|= LFXT1S_2; // LFXT1 = VLO = 12KHz
IFG1&=~OFIFG; //清除OSC故障标志(OSCFault flag)
BCSCTL2|=SELM_0+DIVM_3+DIVS_3; // DCO = 12MHz,MCLK = DCO/8,SMCLK //= DCO/8
}
void GPIO_Config(void) //I/O口配置
{
P1DIR|=BIT0+BIT1; //P1.0(SID)和P1.1(SCLK)输出
P1DIR&=~BIT2; //P1.2输入风扇输出脉冲
P1IES&=~BIT2; //上升沿中断
P1IE|=BIT2; //中断使能
}
void TimerA0_Config(void) //0.5Hz 5250 1Hz 10500
{
CCR0=10500-1; //每秒产生1次中断
TACTL|=TASSEL_1+MC_1; //时钟源:ACLK,计数模式:增计数
CCTL0|=CCIE; //模块0中断使能
}
_EINT(); //开总中断
void main()
{
Watchdog_Config(); //"看门狗"配置
Clocks_Config(); //时钟配置
GPIO_Config(); //GPIO配置,P1.0-液晶串行数据输出,P1.1-液晶时钟输出//P1.2上升沿中断使能
TimerA0_Config(); //"TimerA0"配置,产生1s定时中断
init_lcd (); //LCD配置
_EINT(); //开总中断
while(1);
}
#pragma vector=TIMERA0_VECTOR //定时中断向量声明
__interrupt voidTimer_A0(void) //Timer A0 1s定时中断服务程序
{
Speed=Num*30; //计算风扇每分钟转速(RPM),转速=1s内上升沿个数
//*60(1分钟60秒)/2(风扇转一圈输出2周期脉冲)
Num=0; //脉冲上升沿计数清0
LCD_Display(Speed); //风扇转速送液晶显示
//TACTL|=TACLR;
}
#pragma vector=PORT1_VECTOR //P1口中断源
__interrupt voidP1_ISR(void) //声明一个中断服务程序,名为P1_ISR
{
if(P1IFG&BIT2) //判断P1中断标志位第2位
{
Num+=1; //中断处理程序:来一个上升沿,计数值加1
}
P1IFG=0; //清除P1所有中断标志位
}
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define x1 0x80 //x1液晶屏上半屏的字 列起始地址
#define x2 0x88 //x2液晶屏下半屏的字 列起始地址
#define y 0x80 //y液晶屏点阵的行起始地址
#define comm 0 //comm代表命令
#define dat 1 //dat代表数据
#define LCD_SID_SET P1OUT|=BIT0
#define LCD_SID_RESET P1OUT&=~BIT0
#define LCD_SCLK_SET P1OUT|=BIT1
#define LCD_SCLK_RESET P1OUT&=~BIT1
void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);
const uchar display[]={
"当前转速是:" //显示的物理量
"0123456789 " //显示的数值
"RPM" //显示的物理量的单位
}; //本项目液晶显示内容
/*------------------初始化-----------------*/
void init_lcd (void)
{
//LCD_RST_SET;
wr_lcd (comm,0x30); //30---基本指令动作
wr_lcd (comm,0x01); //清屏,地址指针指向00H
delay(100); //执行时间:1.6ms
wr_lcd (comm,0x06); //光标的移动方向:显示向右移动,游标跟着移动
wr_lcd (comm,0x0c); //开显示,关游标
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
uchara,i,j;
delay(50);
a=content; //要写入的内容
LCD_SCLK_RESET;
LCD_SID_SET; //数据操作
for(i=0;i<5;i++) //延时
{
LCD_SCLK_SET;
LCD_SCLK_RESET;
}
LCD_SID_RESET; //写数据
LCD_SCLK_SET;
LCD_SCLK_RESET;
if(dat_comm) //dat_comm=0,写命令;dat_comm=1写数据
{
LCD_SID_SET; //data
}
else
{
LCD_SID_RESET; //command
}
LCD_SCLK_SET; //时钟上升沿,数据写入
LCD_SCLK_RESET;
LCD_SID_RESET; //写数据
LCD_SCLK_SET;
LCD_SCLK_RESET;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
if((a&0x80)==0x80) //判断该位是0还是1
{
LCD_SID_SET;
}
else
{
LCD_SID_RESET;
}
LCD_SCLK_SET;
LCD_SCLK_RESET;
a=a<<1; //输出一位,左移一位,1帧8位的数据移位8次
}
LCD_SID_RESET;
for(i=0;i<4;i++) //延时
{
LCD_SCLK_SET;
LCD_SCLK_RESET;
}
}
}
/*-----------------------------------*/
void delay (uint us) //延时时间us
{
while(us--);
}
void LCD_Display(uint value)
{
uchari,gewei ,shiwei ,baiwei ,qianwei ;
/*转速值分离*/
gewei=value%10; //个位
shiwei=value/10%10; //十位
baiwei=value/100%10; //百位
qianwei=value/1000; //千位
if(qianwei==0) //千位"消隐"处理
{
qianwei=10;
}
if(baiwei==0&&qianwei==10) //百位"消隐"处理
{
baiwei=10;
}
if(shiwei==0&&qianwei==10&&baiwei==10) //十位"消隐"处理
{
shiwei=10;
}
wr_lcd(comm,0x30); //基本指令集
wr_lcd(comm,0x80); //从第1行第1字开始显示
for(i=0;i<11;i++)
{
wr_lcd(dat,display); //"当前转速是:"
}
//wr_lcd(dat,0x3A); //冒号
wr_lcd(comm,0x93); //从第2行第4字开始显示
//wr_lcd(dat,0x30+qianwei);
//wr_lcd(dat,0x30+baiwei);
//wr_lcd(dat,0x30+shiwei);
//wr_lcd(dat,0x30+gewei);
//wr_lcd(dat,0x20); //冒号
//wr_lcd(dat,'R');
//wr_lcd(dat,'P');
//wr_lcd(dat,'M');
/*----------以下四个语句是关于转速值的分离----------*/
wr_lcd(dat,display[11+qianwei]); //显示千位
wr_lcd(dat,display[11+baiwei]); //显示百位
wr_lcd(dat,display[11+shiwei]); //显示十位
wr_lcd(dat,display[11+gewei]); //显示个位
for(i=0;i<4;i++)
{
wr_lcd(dat,display[21+i]); //显示单位"RPM(Revolutions Per Minute, //转/分)"
}
}
#include
typedef unsigned char uchar;
typedef unsigned int uint;
extern void init_lcd (void);
extern void chn_disp (constuchar *chn);
extern void chn_disp1 (constuchar *chn);
extern void img_disp (constuchar *img);
extern void img_disp1 (constuchar *img);
extern void lat_disp (uchar data1,uchar data2);
extern void con_disp (uchar data1,uchar data2,ucharx0,uchar y0,uchar xl,uchar yl);
extern void clrram (void);
extern void wr_lcd (uchar dat_comm,uchar content);
extern void delay (uint us);
extern void delay1 (uint ms);
extern void LCD_Display(uint value);
extern const uchar display[];