找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机新萌制作简易示波器(TLC2543+12864显示)不知道哪里出了问题

[复制链接]
跳转到指定楼层
楼主
有大佬愿意帮忙看看么谢谢
板子是 普中科技的  51单片机板
ad 用的tlc2543cn   
用12864显示  
输入正弦破    和矩形波 有图片   

制作出来的实物图如下:


单片机源程序如下:
  1. #include <reg52.h>

  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char


  5. uchar xdata read_data[127];
  6. uchar q=1;

  7. sbit RS=P2^6;         //液晶屏io
  8. sbit RW=P2^5;
  9. sbit E=P2^7;
  10. sbit PSB=P2^4;
  11. sbit RST=P1^0;


  12. sbit CLOCK=P1^7;      //ad io

  13. sbit D_IN=P1^6;
  14. sbit D_OUT=P1^4;
  15. sbit _CS=P1^3;


  16. void delay_12864(uint ys)
  17. {
  18. while(ys--);
  19. }
  20. void delay(uchar n)
  21. {
  22. uchar i;
  23. for(i=0;i<n;i++)
  24. {
  25.     _nop_();
  26. }
  27. }
  28. uint read2543(uchar port)    //tlc2543 配置
  29. uint ad=0,i;
  30. CLOCK=0;
  31. _CS=0;
  32. port<<=4;
  33. for(i=0;i<12;i++)
  34. {
  35.    if(D_OUT)ad|=0x01;
  36.    D_IN=(bit)(port&0x80);
  37. //   delay_12864(100);
  38.    CLOCK=1;
  39.    delay(3);
  40.    CLOCK=0;
  41.    delay(3);
  42.    port<<=1;
  43.    ad<<=1;
  44. }
  45. _CS=1;
  46. ad>>=1;
  47. return(ad);
  48. }



  49. void lcd_busy()
  50. {
  51. RS=0;
  52. RW=1;
  53. P0=0xff;
  54. E=1;
  55. // delay_12864(1);
  56. while((P0&0x80)==0x80);
  57. E=0;
  58. }
  59. void wrtcom_12864(uchar dat)
  60. {
  61. lcd_busy();
  62. RS=0;
  63. RW=0;
  64. E=0;
  65. // delay_12864(1);
  66. E=1;
  67. P0=dat;
  68. E=0;  
  69. }
  70. void wrtdat_12864(uchar date1)
  71. {
  72. lcd_busy();
  73. RS=1;
  74. RW=0;
  75. E=0;
  76. // delay_12864(1);
  77. E=1;
  78. P0=date1;
  79. E=0;  
  80. }
  81. uchar reddat_12864()
  82. {
  83. uchar a;
  84. lcd_busy();
  85. RS=1;
  86. RW=1;
  87. E=0;
  88. // delay_12864(1);
  89. E=1;
  90. a=P0;
  91. E=0;
  92. // delay_12864(5);
  93.    
  94. return a;
  95. }


  96. void initial_12864()    // 初始化
  97. {
  98. PSB=1;
  99. RST=1;
  100. wrtcom_12864(0x30);
  101. // delay5ms();   
  102. wrtcom_12864(0x0c);
  103. // delay5ms();  
  104. wrtcom_12864(0x01);
  105. // delay5ms();   
  106. }



  107. void clnGDR_12864(void)     //清屏
  108. {
  109. unsigned char j,k;
  110. wrtcom_12864(0x34);
  111. for( j = 0 ; j < 32 ; j++ )
  112. {
  113.   wrtcom_12864(0x80 + j) ;     
  114.   wrtcom_12864(0x80) ;
  115.   for( k = 0 ; k < 32 ; k++ )
  116.   {
  117.    wrtdat_12864( 0x00 );
  118.   }
  119. }
  120. }



  121. void drawdot_12864(unsigned char y,unsigned char x,unsigned char type)   //  液晶显示
  122. {
  123. unsigned char X,Y,k;
  124. unsigned char DH,DL;
  125. if(y >= 0 && y<= 63 && x >= 0 && x <= 127)
  126. {
  127.   if(y < 32)
  128.   {         
  129.    X = 0x80 + (x >> 4);
  130.    Y = 0x80 + y;
  131.   }
  132.   else
  133.   {
  134.    X = 0x88 + (x >> 4);
  135.    Y = 0x80 + (y - 32);
  136.   }
  137. wrtcom_12864(0x34);
  138. wrtcom_12864(Y);
  139. wrtcom_12864(X);  
  140. DH = reddat_12864();
  141. DH = reddat_12864();
  142. DL = reddat_12864();
  143. k = x % 16;
  144. switch(type)
  145. {      
  146.   case 0:
  147.   if(k < 8)
  148.   {   
  149.    DH &= ~(0x01 << (7 - k));
  150.   }
  151.   else
  152.   {     
  153.    DL &= ~(0x01 << (7 - (k % 8)));
  154.   }
  155.   break;
  156.   case 1:
  157.   if(k < 8)
  158.   {
  159.    DH |= (0x01 << (7 - k));
  160.   }
  161.   else
  162.   {
  163.    DL |= (0x01 << (7 - (k % 8)));
  164.   }
  165.   break;
  166.   case 2:
  167.   if(k < 8)
  168.   {
  169.    DH ^= (0x01 << (7 - k));
  170.   }else
  171.   {
  172.    DL ^= (0x01 << (7 - (k % 8)));
  173.   }
  174.   break;
  175.   default:
  176.   break;
  177. }
  178. wrtcom_12864(Y);
  179. wrtcom_12864(X);
  180. wrtdat_12864(DH);
  181. wrtdat_12864(DL);
  182. // wrtcom_12864(0x30);
  183. wrtcom_12864(0x36);
  184. }
  185. }



  186. void Read_xpt()      //ad 信号 处理
  187. {
  188. uchar a,i,b,e=0,c=0,d=0;
  189. for(a=0;a<127;a++)
  190. {
  191.   b=read2543(0);
  192.   for(i=0;i<12;i++)
  193.   {
  194.    e=b&(0x001<<i);
  195.    if(e>0)
  196.    {
  197.     switch(i)
  198.     {
  199.      case 0 : c=0; break;
  200.      case 1 : c=1; break;
  201.      case 2 : c=2; break;
  202.      case 3 : c=3;  break;
  203.      case 4 : c=4;  break;
  204.      case 5 : c=5;  break;
  205.      case 6 : c=6;  break;
  206.      case 7 : c=7;  break;
  207.      case 8 : c=8;  break;
  208.      case 9 : c=9;  break;
  209.      case 10 : c=10;  break;
  210.      case 11 : c=11;  break;
  211.     }
  212.    }
  213.    else
  214.    {
  215.     c=0;
  216.    }
  217.    d=c+d;
  218.   }
  219.   read_data[a]=d;
  220.   d=0;
  221. }
  222. }


  223. void qujian(uchar i)      //液晶屏位置选择
  224. {
  225. uchar a,b;
  226. a=i/10;
  227. b=i%10;
  228. if(a==0)
  229. {
  230.   switch(b)
  231.   {
  232.    case(0): drawdot_12864(54,q,1);  break;
  233.    case(1): drawdot_12864(53,q,1);  break;
  234.    case(2): drawdot_12864(52,q,1);  break;
  235.    case(3): drawdot_12864(51,q,1);  break;
  236.    case(4): drawdot_12864(50,q,1);  break;
  237.    case(5): drawdot_12864(49,q,1);  break;
  238.    case(6): drawdot_12864(48,q,1);  break;
  239.    case(7): drawdot_12864(47,q,1);  break;
  240.    case(8): drawdot_12864(46,q,1);  break;
  241.    case(9): drawdot_12864(45,q,1);  break;
  242.   }
  243. }
  244. if(a==1)
  245. {
  246.   switch(b)
  247.   {
  248.    case(0): drawdot_12864(44,q,1);  break;
  249.    case(1): drawdot_12864(43,q,1);  break;
  250.    case(2): drawdot_12864(42,q,1);  break;
  251.    case(3): drawdot_12864(41,q,1);  break;
  252.    case(4): drawdot_12864(40,q,1);  break;
  253.    case(5): drawdot_12864(39,q,1);  break;
  254.    case(6): drawdot_12864(38,q,1);  break;
  255.    case(7): drawdot_12864(37,q,1);  break;
  256.    case(8): drawdot_12864(36,q,1);  break;
  257.    case(9): drawdot_12864(35,q,1);  break;
  258.   }
  259. }
  260. if(a==2)
  261. {
  262.   switch(b)
  263.   {
  264.    case(0): drawdot_12864(34,q,1);  break;
  265.    case(1): drawdot_12864(33,q,1);  break;
  266.    case(2): drawdot_12864(32,q,1);  break;
  267.    case(3): drawdot_12864(31,q,1);  break;
  268.    case(4): drawdot_12864(30,q,1);  break;
  269.    case(5): drawdot_12864(29,q,1);  break;
  270.    case(6): drawdot_12864(28,q,1);  break;
  271.    case(7): drawdot_12864(27,q,1);  break;
  272.    case(8): drawdot_12864(26,q,1);  break;
  273.    case(9): drawdot_12864(25,q,1);  break;
  274.   }
  275. }
  276. if(a==3)
  277. {
  278.   switch(b)
  279.   {
  280.    case(0): drawdot_12864(24,q,1);  break;
  281.    case(1): drawdot_12864(23,q,1);  break;
  282.    case(2): drawdot_12864(22,q,1);  break;
  283.    case(3): drawdot_12864(21,q,1);  break;
  284.    case(4): drawdot_12864(20,q,1);  break;
  285.    case(5): drawdot_12864(19,q,1);  break;
  286.    case(6): drawdot_12864(18,q,1);  break;
  287.    case(7): drawdot_12864(17,q,1);  break;
  288.    case(8): drawdot_12864(16,q,1);  break;
  289.    case(9): drawdot_12864(15,q,1);  break;
  290.   }
  291. }
  292. if(a==4)
  293. {
  294.   switch(b)
  295.   {
  296.    case(0): drawdot_12864(14,q,1);  break;
  297.    case(1): drawdot_12864(13,q,1);  break;
  298.    case(2): drawdot_12864(12,q,1);  break;
  299.    case(3): drawdot_12864(11,q,1);  break;
  300.    case(4): drawdot_12864(10,q,1);  break;
  301.    case(5): drawdot_12864(9,q,1);  break;
  302.    case(6): drawdot_12864(8,q,1);  break;
  303.    case(7): drawdot_12864(7,q,1);  break;
  304.    case(8): drawdot_12864(6,q,1);  break;
  305.    case(9): drawdot_12864(5,q,1);  break;
  306.   }
  307. }
  308. delay_12864(1000);
  309. }



  310. void main(void)
  311. {
  312. uchar i1,i2,i3;
  313. uchar u;
  314. // delay_12864(10);
  315. initial_12864();
  316. clnGDR_12864();


  317. for(i1=0;i1<128;i1++)    // 显示   x轴
  318.   drawdot_12864(32,i1,1);
  319. for(i2=0;i2<64;i2++)     // 显示   y轴
  320.   drawdot_12864(i2,0,1);


  321. while(1)
  322. {
  323.   Read_xpt();         
  324.   for(i3=0;i3<127;i3++)
  325.   {
  326.    delay_12864(100);
  327.    qujian(read_data[i3]);
  328.    q++;
  329.    if(q>127)
  330.     q=1;
  331.    wrtcom_12864(0x36);
  332.    for(u=0;u<50;u++);
  333.   }
  334.   clnGDR_12864();
  335. }
  336. }
复制代码



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

使用道具 举报

沙发
ID:303383 发表于 2018-10-16 14:19 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:384206 发表于 2018-10-16 19:28 | 只看该作者
小猫猫爱吃鱼 发表于 2018-10-16 14:19
这个应该是你单片机显示函数代码有问题

显示代码 没有错    是描点程序不适合这样显示么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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