- 我自己的感觉,首先是ADC没有成功。。。但是LCD显示的也不对啊。
- 接口定义如下:
- //sbit CS=P1^0; //接口定义sbit SCLK=P1^2;sbit STD=P1^1;//
- #include
- #define uchar unsigned char
- #define uint unsigned int
- double data;//用来存储ADC12MEM中的数据
- char a,b,c=0; //用来存储将要显示在LCD上的各位数据
- //初始化时钟
- void initClock(void){
- BCSCTL1=RSEL2+RSEL1+RSEL0+DIVA_1;//XT2开启 LFXT1工作在低频模式 ACLK 2分频( 注释:原来的人没做分频,我担心频率过高) 最高的标称频率
- DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
- do{
- IFG1&=~OFIFG;//清除振荡器失效标志
- for(unsigned int i=255;i>0;i--);
- }while(IFG1&OFIFG);//判断XT2是否起振
- BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
- }
- //延时函数
- void delay(unsigned int m){
- for(unsigned int i=0;i
- _NOP();
- }
- void Lcd_InsWrite(uchar type,uchar transdata) //串行通信传输函数 ,transdata为要写入的数据或指令
- {
- uchar firsttype=0xf8; //firsttype为第一字节,用来判断是写数据还是写指令。默认是写指令
- uchar temp;
- uchar i,j=3;
-
- if(type) //判断是是写数据还是写指令,0为写指令,1为写数据
- firsttype=firsttype|0x02; //如果要写数据,则把第一字节的第二位至高
- P1OUT|=BIT0; //给CS高电平开始写入操作
- P1OUT&=~BIT2; //给SCLK时钟脉冲,在每个上升沿把数据写入到LCD
- while(j>0) //把写数据指令方式和要写入的数据发送给LCD
- {
- if(j==3) temp=firsttype; //确认要写入第一字节数据,及数据指令判断
- else if(j==2) temp=transdata&0xf0;//确认要写入第二字节数据
- else temp=(transdata<<4)&0xf0; //确认要写入第三字节数据
- for(i=8;i>0;i--) //把要写入的数据每个位由STD发送到LCD,写入
- {
- if(temp&0x80) P1OUT|=BIT1; //写入第一字节,及最高字节
- else P1OUT&=~BIT1;
- P1OUT|=BIT2; //给SCLK一个上升沿,写入一位
- temp<<=1; //把数据指令左移一位,开始写入下一位数据
- P1OUT&=~BIT2; //给SCLK一个低电平,确保下一次写入数据正常
- }
- delay(1); //做简单的延时
- j--; //准备写入下一字节数据
- }
- P1OUT&=~BIT0; //写入数据指令完毕,给STD和CS低电平
- P1OUT&=~BIT1;
- }
- //ADC12采样初始化,并打开中断子程序计算采样值的大小
- void initADC12(){
- P6SEL=0X01;//P6.0作为模拟输入
- ADC12IE=0X01; //开放中断ADC12IFG.0
- ADC12CTL0=ADC12ON+SHT0_4+REFON+REF2_5V;//打开ADC转换的核,采用内部参考电压2.5v;
- ADC12CTL1=SHP; //信号源内部触发
- ADC12MCTL0=SREF_1;//使用内部2.5V作为参考电压
- ADC12CTL0 |=ENC; //开放使能
- for (;;)
- {
- ADC12CTL0 |= ADC12SC; // Sampling open
- _BIS_SR( GIE); //关闭CPU打开总中断
- }
- }
- #pragma vector=ADC_VECTOR
- __interrupt void ADC12ISR(){
- data=ADC12MEM0*2.5/4095; //data为全局变量
- Lcd_InsWrite(0,0x02);//DDRAM地址归位
- }
- //LCD初始化函数
- //函数声明:采用MSP430端口p3.5-3.7连接LCD的E,RW,和RS端口;P4口用来传送数据
- void init_lcd(void)
- {
- Lcd_InsWrite(0,0x30); //基本指令
- delay(400);
- Lcd_InsWrite(0,0x01); //清除显示
- delay(400);
- Lcd_InsWrite(0,0x0e);
- // 显示状态设定:整体显示,游标on,游标位置反白
- Lcd_InsWrite(0,0x02);//DDRAM地址归位
- delay(400);
- }
- //将ADC转换后的值写入LCD
- void WriteData(){
- data*=100;
- int temp=(int)data;
- a=temp/100;//考虑到由于内部参考电压的限制,且仅考虑两位小数的情况
- b=(temp%100)/10;
- c=(temp%10);
- Lcd_InsWrite(1,a+0x30);
- Lcd_InsWrite(1,'.');
- Lcd_InsWrite(1,b+0x30);
- Lcd_InsWrite(1,c+0x30);
- delay(400);
- }
- //主函数部分
- void main(){
- double temp=0.0;
- WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
- initClock();//初始化时钟
- initADC12();//ADC12采样初始化,并打开中断子程序计算采样值的大小
- init_lcd(); //lcd初始化
- while(1){
- if(data!=temp){
- temp=data;
- Lcd_InsWrite(0,0x80);//确定显示位置
- WriteData(); //将采样值分别计算出对应位的输出
- }
- }
- }
复制代码
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
现在的问题是Lcd_InsWrite(0,0x02); 这个表示光标回到原点,不擦除DDRAM的值,我把这个修改成Lcd_InsWrite(0,0x01);就是擦除DDRAM的值,我觉得在这个位置使用这两种都可以啊,因为都是要空头开始重新开始写入的;但是在实际操作中后者不行,请问什么原因?
- while(1)
- {
- ADC12CTL0 |= ADC12SC; // Sampling open
- _BIS_SR(CPUOFF + GIE); // LPM0, ADC12_ISR will force exit
- if(temp!=data)
- {
- temp=data;
- Lcd_InsWrite(0,0x02);
- WriteData();
- }
- }
复制代码一周热门 更多>