找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4962|回复: 0
打印 上一主题 下一主题
收起左侧

MSP430做AD转换并在液晶12864上显示的程序,液晶上没有任何显示

[复制链接]
跳转到指定楼层
楼主
ID:50606 发表于 2013-5-28 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <msp430x14x.h>



  2. double data;//用来存储ADC12MEM中的数据

  3. unsigned int a,b,c=0; //用来存储将要显示在LCD上的各位数据



  4. //初始化时钟

  5. void initClock(void){

  6. BCSCTL1=RSEL2+RSEL1+RSEL0+DIVA_1;//XT2开启 LFXT1工作在低频模式 ACLK 2分频( 注释:原来的人没做分频,我担心频率过高) 最高的标称频率

  7. DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率

  8. do{

  9. IFG1&=~OFIFG;//清除振荡器失效标志

  10. for(unsigned int i=255;i>0;i--);

  11. }while(IFG1&OFIFG);//判断XT2是否起振

  12. BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频

  13. }

  14. //延时函数

  15. void delay(unsigned int m){

  16. for(unsigned int i=0;i<m;i++)

  17. _NOP();

  18. }





  19. //ADC12采样初始化,并打开中断子程序计算采样值的大小

  20. void initADC12(){



  21. P6SEL=0X01;//P6.0作为模拟输入

  22. ADC12IE=0X01; //开放中断ADC12IFG.0

  23. ADC12CTL0=ADC12ON+SHT0_4+REFON+REF2_5V;//打开ADC转换的核,采用内部参考电压2.5v;

  24. ADC12CTL1=SHP; //信号源内部触发

  25. ADC12CTL0 |=ENC; //开放使能

  26. _EINT();//开放系统总中断

  27. ADC12CTL0 |=ADC12SC; //开始转换,转换完成之后自动进入中断服务子程序



  28. }





  29. #pragma vector=ADC_VECTOR

  30. __interrupt void ADC12ISR(){

  31. data=ADC12MEM0*2.5/4095; //data为全局变量

  32. }

  33. //基本写入函数命令

  34. void Lcd_InsWrite(unsigned int i,char Instruction)

  35. {

  36. P4DIR=0XFF; // P4口设置成输出模式

  37. if(i==0)

  38. P3OUT=0x1F; // RS=0,R/W=0 写指令

  39. else P3OUT=0x9F; // RS=0,R/W=0 写数据

  40. P3OUT|=BIT5; //E=1 使能

  41. P4OUT=Instruction; //功能设定

  42. delay(3); //延时

  43. P3OUT&=~BIT5; //E=0:下降沿锁存数据

  44. }



  45. //LCD初始化函数

  46. //函数声明:采用MSP430端口p3.5-3.7连接LCD的E,RW,和RS端口;P4口用来传送数据

  47. void init_lcd(void)

  48. {

  49. P3DIR=0XE0; //P3.5-E,P3.6-R/W,P3.7-RS输出

  50. Lcd_InsWrite(0,0x38);//8位数据端口,2行显示,5*7点阵

  51. delay(400);

  52. Lcd_InsWrite(0,0x0c);//开启显示, 无光标

  53. delay(400);

  54. Lcd_InsWrite(0,0x06);//AC递增, 画面不动

  55. delay(400);

  56. Lcd_InsWrite(0,0x01);//清屏

  57. delay(400);

  58. }





  59. //将ADC转换后的值写入LCD

  60. void WriteData(){

  61. data*=100;

  62. int temp=(int)data;

  63. a=temp/100;//考虑到由于内部参考电压的限制,且仅考虑两位小数的情况

  64. b=(temp%100)/10;

  65. c=(temp%10);

  66. Lcd_InsWrite(1,a+0x30);

  67. Lcd_InsWrite(1,'.');

  68. Lcd_InsWrite(1,b+0x30);

  69. Lcd_InsWrite(1,c+0x30);

  70. }



  71. //主函数部分

  72. void main(){

  73. WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

  74. initClock();//初始化时钟

  75. initADC12();//ADC12采样初始化,并打开中断子程序计算采样值的大小

  76. init_lcd(); //lcd初始化

  77. Lcd_InsWrite(0,0x80); //显示在第一行

  78. WriteData(); //将采样值分别计算出对应位的输出

  79. }



复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表