#include #include "stdio.h" /* * 全局变量的定义和宏定义 */ unsigned int start,end; unsigned long int F = 0; unsigned char TA_overflow; unsigned int TA_i = 0; unsigned int port_i; unsigned char tab[]={"0123456789"}; unsigned char a[8]; unsigned char int_to_string[10]; unsigned char int_array[10]; #define uchar unsigned char #define uint unsigned int #define CS_0 P2OUT &= ~BIT0 //片选为低电平 #define CS_1 P2OUT |= BIT0 //片选为高电平 #define SID_0 P2OUT &= ~BIT1 //串行数据输入为0 #define SID_1 P2OUT |= BIT1 //串行数据输入为1 #define SCLK_0 P2OUT &= ~BIT2 //时钟线拉低 #define SCLK_1 P2OUT |= BIT2 //时钟线拉高 #define PSB_0 P2OUT &= ~BIT3 //出行输入 #define LCD_DIR_OUT P2DIR |= BIT0 + BIT1 + BIT2 + BIT3 //4个端口设置为输出 /******************************************************************** * 名称 : SendByte * 功能 : 发送数据 * 输入 : Dbyte * 输出 : 无 ***********************************************************************/ void SendByte(uchar Dbyte) { uchar i; LCD_DIR_OUT; for(i = 0;i < 8;i++) { if((Dbyte << i) & 0x80) { SID_1; } else { SID_0; } SCLK_0; _delay_cycles(2); SCLK_1; } } /******************************************************************** * 名称 : Write_Instruction * 功能 : 向LCD写指令 * 输入 : data * 输出 : 无 ***********************************************************************/ void Write_Instruction(uchar data) { LCD_DIR_OUT; CS_1; SendByte(0xf8); SendByte(data & 0xf0); SendByte((data << 4) & 0xf0); _delay_cycles(20); } /******************************************************************** * 名称 : Write_Data * 功能 :向LCD写入数据 * 输入 : data * 输出 : 无 ***********************************************************************/ void Write_Data(uchar data) { LCD_DIR_OUT; CS_1; SendByte(0xfa); SendByte(data & 0xf0); SendByte((data << 4) & 0xf0); _delay_cycles(20); } /******************************************************************** * 名称 : LCD12864_Delay() * 功能 : 初始化LCD12864 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void LCD_Init() { LCD_DIR_OUT; //设置输入方向为输出 PSB_0; //LCD为串行输入方式 Write_Instruction(0x30); //基本指令集 _delay_cycles(10000); Write_Instruction(0x02); //地址归位 _delay_cycles(10000); Write_Instruction(0x0c); //整体显示打开,游标关闭 _delay_cycles(10000); Write_Instruction(0x01); //清除显示 _delay_cycles(10000); Write_Instruction(0x06); //游标右移 _delay_cycles(10000); Write_Instruction(0x80); //设定显示的起始地址 _delay_cycles(10000); } /******************************************************************** * 名称 : Write_Pos * 功能 : 确定输入数据的位置 * 输入 : x,y * 输出 : 无 ***********************************************************************/ void Write_Pos(uchar x,uchar y) { uchar pos; if(x == 1) //第一行显示 x = 0x80; else if(x == 2) //第二行显示 x = 0x90; else if(x == 3) //第三行显示 x = 0x88; else if(x == 4) //第四行显示 x = 0x98; pos = x + y-1; Write_Instruction(pos);//显示地址 } /******************************************************************** * 名称 : Write_Word_To_12864 * 功能 : 在坐标x,y处写入数据 * 输入 : x,y,*word * 输出 : 无 ***********************************************************************/ void Write_Word_To_12864(uchar x,uchar y,uchar *word) { uchar i; LCD_Init(); Write_Pos(x,y); for(i = 0;*(word+i)!='\0';i++) { Write_Data(word); } } void ShowInit() { Write_Word_To_12864(1,1,"频率计:"); _delay_cycles(50000); Write_Pos(2,7); Write_Data('H'); Write_Data('z'); _delay_cycles(10000); } void ShowF() { Write_Pos(2,4); if(F >= 100000) { Write_Data(tab[F/100000]); Write_Data(tab[F%100000/10000]); Write_Data(tab[F%10000/1000]); Write_Data(tab[F%1000/100]); Write_Data(tab[F%100/10]); Write_Data(tab[F%10]); _delay_cycles(1000); } else if(F >= 10000) { Write_Data(tab[F/10000]); Write_Data(tab[F%10000/1000]); Write_Data(tab[F%1000/100]); Write_Data(tab[F%100/10]); Write_Data(tab[F%10]); _delay_cycles(1000); } else if(F >= 1000) { Write_Data(tab[F/1000]); Write_Data(tab[F%1000/100]); Write_Data(tab[F%100/10]); Write_Data(tab[F%10]); _delay_cycles(1000); } else if(F >= 100) { Write_Data(tab[F/100]); Write_Data(tab[F%100/10]); Write_Data(tab[F%10]); _delay_cycles(1000); } else if(F >= 10) { Write_Data(tab[F/10]); Write_Data(tab[F%10]); _delay_cycles(1000); } else { Write_Data(tab[F]); _delay_cycles(1000); } } /******************************************************************** * 名称 : Init_uart0 * 功能 : 初始化串口 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Init_uart0() { UCA0CTL1|=UCSWRST; //UCA0软件复位 //UCA0CTL0&=~UC7BIT;//字符长度为8 UCA0CTL1|=UCSSEL_2;//选择系统时钟:SMCLK UCA0BR0=0x6D; //波特率为9600 UCA0BR1=0; UCA0MCTL=0;//UCA0MCTL=UCBRS0; IE2=UCA0RXIE+UCA0TXIE;//开接收使能 UCA0CTL1&=~UCSWRST; P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能 P1SEL2|=BIT1+BIT2; } /******************************************************************** * 名称 : Uart0Sends * 功能 : 串口发送数据 * 输入 : *s * 输出 : 无 ***********************************************************************/ void Uart0SendsData(char *s) { while(*s!='\0') { UCA0TXBUF=*s; while((IFG2&UCA0TXIFG)==0); //查询发送是否结束 IFG2&=~UCA0TXIFG; //清除发送一标志位 s++; } } /******************************************************************** * 名称 : Init_In * 功能 :初始化外部终端 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Init_In() { P1DIR |= BIT6; P1DIR &= ~BIT3; P1IES |= BIT3; P1IE |= BIT3; P1IFG &= ~BIT3; _EINT(); } void Init_Timer() { TACCTL0 = CCIE; // CCR0 interrupt enabled TACCR0 = 1; TACTL = TASSEL_1 + MC_1 + TAIE + TACLR; //up mode } /******************************************************************** * 名称 : Int_To_String * 功能 :将一个int型数据转换为String型 * 输入 : now_f * 输出 : 无 ***********************************************************************/ void Int_To_String(unsigned long int now_f) { int j = 0; for(j = 0; ;j++) { int_array[j] = now_f % 10 + 48 ; now_f = now_f / 10; if(now_f == 0) break; } int i = j ; for(i = j , j = 0; i >= 0; i--,j++) { int_to_string[j] = int_array; } } void _delay_cycles(unsigned int x){ while(x--); } void main() { WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT7; // P1.0 output P1DIR |= BIT0; if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If calibration constants erased // do not load, trap CPU!! } //1Mhz BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */ LCD_Init(); Init_In(); Init_Timer(); Init_uart0(); ShowInit(); while(1) { ShowF(); } } #pragma vector=PORT1_VECTOR __interrupt void port_1() { if(P1IFG & BIT3) { P1OUT ^= BIT6; port_i++; if(port_i>=100) { port_i = 0; F =(unsigned long int)((1000000*100.0)/((TA_overflow*65536)+TAR)); TA_overflow = 0; TACTL |= TACLR; } } P1IFG &= ~BIT3; } // Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { P1OUT ^= BIT7; TA_i++; if(TA_i == 2000) {P1OUT ^= BIT0; TA_i = 0; Int_To_String(F); unsigned char *s = int_to_string; Uart0SendsData(s); Uart0SendsData("1000"); } } #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A1() { switch(TA0IV) { case 2:break; case 4:break; case 10:TA_overflow++;break; } } /******************************************************************** * 名称 : usart0_rx * 功能:串口中断入口 ***********************************************************************/ #pragma vector=USCIAB0RX_VECTOR __interrupt void usart0_rx(void) { while((IFG2&UCA0RXIFG)==0); //a=RXBUF0; //i++; a[0]=UCA0RXBUF; }不知道为什么按照电路图连接后lcd什么都没显示,是电路问题还是代码问题?求大神指教
|