|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
#include <msp430.h>
#define unchar unsigned char
#define uint unsigned int
uint date;
//定义数据类型
uint dispcount=0;
//中断计数
unchar times=0;
//定时器计数
uint disp=0;
//频率值
unchar str[3];
unchar *s;
#define CS P2DIR |= BIT2
#define CS_H P2OUT |= BIT2
#define CS_L P2OUT &= ~BIT2
#define SID P2DIR |= BIT3
#define SID_H P2OUT |= BIT3
#define SID_L P2OUT &= ~BIT3
#define SCLK P2DIR |= BIT4
#define SCLK_H P2OUT |= BIT4
#define SCLK_L P2OUT &= ~BIT4
#define RST P2OUT |= BIT5
#define RST_H P2OUT |= BIT5
#define RST_L P2OUT &= ~BIT5
void delay( uint t);
void sendbyte( unchar z);
void write_com( unchar cmd);
void write_data(unchar disp);
void init_lcd();
void diszfc( unchar *s);
void lcd_clear();
unchar * int2str(uint d);
void gotoxy(uint x,uint y)
;
void red() ;
void green() ;
void blue()
;
void init_clk();
void main(void)
{
WDTCTL = WDTPW | WDTHOLD;
// Stop watchdog timer
init_clk();
P1DIR |= BIT3 + BIT4 + BIT5 + BIT6;
TACTL = TASSEL_1 + ID0 + TACLR;//ACL = 32768 ,2分频
CCTL0 = CCIE;
CCR0 = 819;//819 * 2 / 32768 =50ms
TACTL |= MC0; //增计数
P1DIR &= ~BIT2;
P1SEL |= BIT2;
TACCTL1 |= CM_2 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,下降沿捕获
_EINT();
__bis_SR_register(LPM3_bits);
delay(200);
init_lcd();
lcd_clear();
while(1)
{
gotoxy(1,00); diszfc("R:"); red();
//调用红色通道并显示色彩值
gotoxy(1,02);
s = int2str(date); diszfc(s);
gotoxy(1,05); diszfc(" ");
gotoxy(1,07); diszfc("G:"); green();//调用绿色通道并显示色彩值
gotoxy(1,011); s = int2str(date); diszfc(s);
gotoxy(1,014); diszfc(" ");
gotoxy(2,00); diszfc("B:"); blue();
//调用蓝色通道并显示色彩值
gotoxy(2,02); s = int2str(date); diszfc(s);
gotoxy(2,05); diszfc(" ");
}
}
#pragma vector =TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
times ++;
if(times == 20)
{
disp = dispcount;
times = 0;
dispcount = 0;
}
#pragma vector =TIMERA1_VECTOR
__interrupt void TimerA1_ISR(void)
{
switch(TAIV) //向量查询
{ case 2: dispcount ++; //捕获中断
CCIFG1 = 0;
break;
default: break;
}
}
void delay( uint t)
{
uint i , j ;
for(i = 0; i < t ;i ++)
for (j = 0; j < 10; j++);
}
void init_clk()//时钟初始化
{
unchar i;
BCSCTL1 = 0X86 ; // XT2OFF , XTS = 0
do
{
IFG1 &= ~OFIFG;//清振荡器失效标志
for(i=0xff;i>0;i--);
}while((IFG1 & OFIFG)!=0);//若振荡器失效标志有效
BCSCTL2 = 0X00 ; // MCLK = DCOCLK, DIVM = 0,SMCLK = DCOCLK,DIVS = 0
}
/**************************************************
* RGB三种颜色通道选择模块
**************************************************/
void red() //红色通道
{
P1OUT |= BIT3; delay(1100);
date=disp/100;date=(255.0/153)*date;
//153是在纯白情况下测得的红色通道频率值
}
void green() //绿色通道
{
P1OUT |=BIT3 + BIT5 + BIT6; delay(1100);
date=disp/100;date=(255.0/145)*date;
//145是在纯白情况下测得的绿色通道频率值
}
void blue()
//蓝色通道
{
P1OUT |= BIT3 + BIT6; delay(1100);
date=disp/100;date=(255.0/183)*date;
//183是在纯白情况下测得的蓝色通道频率值
}
/**************************************************
整型数转化成字符串,以便LCD输出显示
**************************************************/
unchar * int2str(uint d)
{
if(d>=255)
{ d=255;
str[0]='0'+d/100;
str[1]='0'+d%100/10;
str[2]='0'+d%10;
}
else
{ str[0]='0'+d/100;
str[1]='0'+d%100/10;
str[2]='0'+d%10; }
return str;
}
/**************************************************
LCD显示模块
**************************************************/
void init_lcd() // 初始化lcd
{
RST_L; //前提是复位脚接P1.5口
delay(100);
RST_H;
P2DIR |= BIT6;
P2OUT &= ~(BIT6);
write_com(0x30); // lcd为两行显示8位数据线有效
write_com(0x0e); // 显示字符 关闭光标 0000 0111
write_com(0x06); // 输入方式设置 光标向右移动一位 ac-1
}
void sendbyte( unchar z)
{
uint i;
for(i = 0; i < 8; i ++)
{
if ((z<<i) & 0x80)
{
SID_H;
}
else
{
SID_L;
}
SCLK_L;
SCLK_H;
}
}
void write_com( unchar cmd) //写串口指令
{
CS_H;
sendbyte (0xf8); //输指令
sendbyte (cmd & 0xf0);
sendbyte ((cmd << 4) & 0xf0);
delay(2);
}
void write_data(unchar disp) //写数据
{
CS_H;
sendbyte(0xfa);//传数据
sendbyte(disp & 0xf0);
sendbyte((disp << 4) & 0xf0);
delay(2);
}
void diszfc( unchar *s) //显示字符串
{
while ( *s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
void lcd_clear()
{
write_com(0x01); //清屏指令
write_com(0x02); //光标归位 即光标置于左上位置
}
void gotoxy(uint x,uint y)
//定位 ,x为行,y为列
{
if(x==1)
write_com(0x80+y);
else
write_com(0xC0+y);
}
编译出现3个error
哪位大神能帮忙看看啊。。。 |
|