找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8857|回复: 8
收起左侧

单片机用正弦函数在lcd12864显示正弦波

  [复制链接]
ID:140725 发表于 2017-3-9 03:40 | 显示全部楼层 |阅读模式

一个51单片机程序使用正弦函数在lcd12864液晶屏上面显示正弦波

下面是完整代码下载:
正弦波.rar (1.47 KB, 下载次数: 169)



部分代码预览:
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #include "math.h"

  4. #define unchar unsigned char
  5. #define unint unsigned int
  6. #define dataPort P0
  7. #define Vmax 16
  8. #define freq 60

  9. sbit rs = P3^5;
  10. sbit rw = P3^6;
  11. sbit en = P3^4;

  12. float x,y;
  13. unchar code xian1[]={"峰值16V" };
  14. unchar code xian2[]={"频率60Hz" };

  15. void delayms(unsigned int n)
  16. {
  17. unsigned char i;
  18. for(;n>0;n--)
  19. for(i=0;i<100;i++);
  20. }

  21. void checkBusy(void)
  22. {
  23. rs=0;
  24. rw=1;
  25. en=1;
  26. dataPort=0xff;
  27. while(dataPort & 0x80);
  28. en=0;
  29. }

  30. void writeCommand(unsigned char cmd)
  31. {
  32. checkBusy();
  33. rs=0;
  34. rw=0;
  35. en=1;
  36. dataPort=cmd;
  37. _nop_();
  38. en=0;
  39. }

  40. void writeData(unsigned char adata)
  41. {
  42. checkBusy();
  43. rs=1;
  44. rw=0;
  45. en=1;
  46. dataPort=adata;
  47. _nop_();
  48. en=0;
  49. }

  50. unsigned char readData(void)
  51. {
  52. unsigned char RData;
  53. dataPort=0xff;
  54. checkBusy();
  55. rs=1;
  56. rw=1;
  57. en=0;
  58. en=1;
  59. RData=dataPort;
  60. en=0;
  61. return RData;
  62. }

  63. void ClrGDRAM(void)
  64. {
  65.         unsigned char x,y;
  66.         for(y=0;y<64;y++)
  67.             for(x=0;x<16;x++)
  68.             {
  69.                         writeCommand(0x34);
  70.             writeCommand(y+0x80);     //行地址  
  71.             writeCommand(x+0x80);     //列地址  
  72.             writeCommand(0x30);
  73.             writeData(0x00);
  74.             writeData(0x00);
  75.         }
  76.         //writeCommand(0x30);
  77. }

  78. void LcmInit(void)
  79. {
  80. writeCommand(0x30);
  81. delayms(50);
  82. writeCommand(0x01);
  83. delayms(50);
  84. writeCommand(0x06);
  85. delayms(50);
  86. writeCommand(0x0c);
  87. ClrGDRAM();
  88. //psb=1;
  89. }

  90. /***********************************************************
  91. 函数名:  drawPoint
  92. 函数说明:画点
  93. 传入参数:打点位置(x0,y0);color=1,点亮;color=0,擦除
  94. 传出参数:无
  95. 返回值:  无
  96. **********************************************************/
  97. void drawPoint(unsigned char x,unsigned char y,unsigned char color)
  98. {
  99. unsigned char row,collum,cbite;
  100. unsigned char tempH,tempL;
  101. writeCommand(0x34);
  102. writeCommand(0x36);
  103. collum=x>>4;
  104. cbite=x&0x0f;
  105. if(y<32)
  106.         row=y;
  107. else
  108.         {row=y-32;
  109.         collum+=8;
  110.         }
  111. writeCommand(0x80+row);
  112. writeCommand(0x80+collum);
  113. readData();
  114. tempH=readData();
  115. tempL=readData();
  116. writeCommand(0x80+row);
  117. writeCommand(0x80+collum);
  118. if (color)
  119. {
  120.          if(cbite<8)
  121.          {
  122.          tempH|=(1<<(7-cbite));
  123.          //tempL=(1<<(7-cbite));
  124.          }
  125.          else
  126.          {
  127.          //tempH=(1<<(15-cbite));
  128.          tempL|=(1<<(15-cbite));
  129.          }
  130. }
  131. else
  132. {
  133.            if(cbite<8)
  134.          {
  135.          tempH&=~(1<<(7-cbite));
  136.          //tempL=(1<<(7-cbite));
  137.          }
  138.          else
  139.          {
  140.          //tempH=(1<<(15-cbite));
  141.          tempL&=~(1<<(15-cbite));
  142.          }
  143. }
  144. writeData(tempH);
  145. writeData(tempL);
  146. writeCommand(0x30);
  147. }

  148. /***********************************************************
  149. 函数名:  drawRowLine
  150. 函数说明:画水平线
  151. 传入参数:(x0,y0),水平线的起点;(x1,y0)水平线的终点
  152.                                 color=1,点亮;color=0,擦除
  153. 传出参数:无
  154. 返回值:  无
  155. **********************************************************/
  156. void drawRowLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char color)
  157. {
  158.     unsigned char  temp;
  159.     if(x0>x1)                                 // 对x0、x1大小进行排列,以便画图
  160.     {
  161.         temp = x1;
  162.         x1 = x0;
  163.         x0 = temp;
  164.     }   
  165.     do
  166.     {
  167.         drawPoint(x0, y0, color);        // 逐点显示,描出垂直线
  168.         x0++;
  169.     }
  170.     while(x1>=x0);
  171. }

  172. /***********************************************************
  173. 函数名:  drawCollumLine
  174. 函数说明:画竖直线
  175. 传入参数:(x0,y0),竖直线的起点;(x0,y1)竖直线的终点;
  176.                         color=1,点亮;color=0,擦除
  177. 传出参数:无
  178. 返回值:  无
  179. ************************************************************/
  180. void drawCollumLine(unsigned char x0,unsigned char y0,unsigned char y1,unsigned char color)
  181. {
  182. unsigned char temp;
  183. if(y0>y1)
  184. {
  185.   temp=y0;
  186.   y0=y1;
  187.   y1=temp;
  188. }
  189. while (y0<=y1)
  190. {
  191. drawPoint(x0,y0,color);
  192. y0++;
  193. }
  194. }

  195. //在坐标(x,y)处显示字符串
  196. void LcmPrint(unsigned char x,unsigned char y,unsigned char *adata)
  197. {
  198. unsigned char address;
  199. unsigned char i=0;
  200. switch (y)
  201. {
  202.   case 0:address=0x80+x;break;
  203.   case 1:address=0x90+x;break;
  204.   case 2:address=0x88+x;break;
  205.   case 3:address=0x98+x;break;
  206.   default:break;
  207. }
  208. writeCommand(address);
  209. while(*(adata+i))
  210. {
  211.         writeData(*(adata+i));
  212.         i++;
  213. }
  214. }

  215. void main()
  216. {
  217.           x=y=0;
  218.         LcmInit();
  219.         drawRowLine(0,31,127,1);
  220.         drawCollumLine(0,0,63,1);
  221.         while(1)
  222.         {
  223.           for(x=0;x<128;x=x+0.05)
  224.           {
  225.            y=Vmax*sin(2*3.14*freq*x);
  226.            drawPoint(x,(y+31),1);       
  227.           }

  228.           LcmPrint(0,3,xian1);
  229.           LcmPrint(4,3,xian2);
  230.         }
  231. }
复制代码



评分

参与人数 1黑币 +10 收起 理由
YJGG + 10 赞一个!

查看全部评分

回复

使用道具 举报

ID:140183 发表于 2017-3-9 06:44 | 显示全部楼层
是示波器吗?没有图片。
回复

使用道具 举报

ID:151348 发表于 2017-3-9 10:53 | 显示全部楼层
不错,要是有注解和图片展示就更好了
回复

使用道具 举报

ID:216187 发表于 2017-6-30 22:15 | 显示全部楼层
谢谢,能正常显示正弦波了
回复

使用道具 举报

ID:301594 发表于 2018-4-19 09:52 | 显示全部楼层
这个显示不出来啊,
回复

使用道具 举报

ID:370123 发表于 2018-7-12 13:17 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:370123 发表于 2018-7-12 13:18 | 显示全部楼层
赞一个很给力
回复

使用道具 举报

ID:645619 发表于 2019-11-21 20:55 | 显示全部楼层
这个能用
回复

使用道具 举报

ID:575853 发表于 2020-1-10 08:34 | 显示全部楼层
用不了啊,显示的是阴影的方框
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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