在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3870|回复: 0

[资料] 51单片机用12864显示正弦波

[复制链接]
发表于 2013-7-31 02:33:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x




  1. #include <stc12c5a.h>
  2. #include <intrins.h>
  3. #include <math.h>
  4. //------------定义接口-------------//
  5. sbit RS=P2^2 ;
  6. sbit RW=P2^3 ;
  7. sbit E=P2^4;
  8. sbit PSB= P2^5;   //H=并口; L="串口";
  9. //sbit P34=P3^4;
  10. //sbit P35=P3^5;
  11. //sbit P36=P3^6;
  12. #define Lcd_Bus P0
  13. // P0 接 LCM
  14. #define uchar unsigned char
  15. #define FIRST_ADDR 0

  16. uchar T=0,y=32,x=32;
  17. //定义字符/汉字显示起始位置
  18. /*------------------检查忙位-----------------------------*/
  19. void chk_busy()
  20. {
  21.     RS=0 ;
  22.     RW=1 ;
  23.     E=1 ;
  24.     Lcd_Bus=0xff ;
  25.     while((Lcd_Bus&0x80)==0x80);
  26.     E=0 ;
  27. }
  28. /*------------------延时子程序-----------------------------*/
  29. void delay(unsigned int t)
  30. {
  31.     unsigned int i,j ;
  32.     for(i=0;i<t;i++)
  33.     for(j=0;j<10;j++);
  34. }

  35. /*------------------写命令到LCD------------------------------*/
  36. void write_com(unsigned char cmdcode)
  37. {
  38.     chk_busy();
  39.     RS=0 ;
  40.     RW=0 ;
  41.     E=1 ;
  42.     Lcd_Bus=cmdcode ;
  43.     delay(5);
  44.     //------------------在数据写入的时候加入适当的延时
  45.     E=0 ;
  46.     delay(5);
  47. }

  48. /*-------------------写数据到LCD----------------------------*/
  49. void write_data(unsigned char Dispdata)
  50. {
  51.     chk_busy();
  52.     RS=1 ;
  53.     RW=0 ;
  54.     E=1 ;
  55.     Lcd_Bus=Dispdata ;
  56.     delay(5);
  57.     //------------------在数据写入的时候加入适当的延时
  58.     E=0 ;
  59.     delay(5);
  60. }
  61. /*------------------初始化LCD屏--------------------------*/
  62. void lcdreset()
  63. {
  64.     PSB = 1;
  65.     delay(2000);
  66.     write_com(0x30);
  67.     delay(10);
  68.     //选择基本指令集
  69.     write_com(0x30);
  70.     //选择8bit数据流
  71.     delay(5);
  72.     write_com(0x0c);
  73.     //开显示(无游标、不反白)
  74.     delay(10);
  75.     write_com(0x01);
  76.     //清除显示,并且设定地址指针为00H
  77.     delay(500);
  78.     write_com(0x06);
  79.     //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
  80.     delay(0);
  81. }
  82. /*------------------显示字符串--------------------------*/
  83. void hzkdis(unsigned char code*s)
  84. {
  85.     while(*s>0)
  86.     {
  87.         write_data(*s);
  88.         s++;
  89.         delay(50);
  90.     }
  91. }
  92. /*------------------首屏显示--------------------------*/
  93. void ceshi()
  94. {
  95.     write_com(0x01);
  96.     //清除显示,并且设定地址指针为00H
  97.     delay(5);
  98.    
  99.     write_com(0x80);
  100.     //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
  101.     hzkdis("贵阳学院");
  102.    
  103.     write_com(0x90);
  104.     //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
  105.     hzkdis("电子与通信工程");
  106.    
  107.     write_com(0x88);
  108.     //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
  109.     hzkdis("电子信息工程");
  110.    
  111.     write_com(0x98);
  112.     //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
  113.     hzkdis("波形测试程序");
  114. }
  115. //------------------清整个GDRAM空间----------------------------
  116. void clrgdram()
  117. {
  118.     unsigned char x,y ;
  119.     for(y=0;y<64;y++)
  120.     for(x=0;x<16;x++)
  121.     {
  122.         write_com(0x34);
  123.         write_com(y+0x80);
  124.         //行地址
  125.         write_com(x+0x80);
  126.         //列地址
  127.         write_com(0x30);
  128.         write_data(0x00);
  129.         write_data(0x00);
  130.     }
  131. }
  132. //------------------------------------------------------------
  133. void clrscreen()
  134. {
  135.     write_com(0x01);
  136.     delay(10);
  137. }
  138. unsigned char ReadByte(void)
  139. {
  140.     unsigned char byReturnValue ;
  141.     chk_busy();
  142.     Lcd_Bus=0xff ;
  143.     RS=1 ;
  144.     RW=1 ;
  145.     E=0 ;
  146.     E=1 ;
  147.     byReturnValue=Lcd_Bus ;
  148.     E=0 ;
  149.    
  150.     return byReturnValue ;
  151. }

  152. /*增加画点子程序
  153. 函数功能:在坐标为(x,y)点画一个点
  154. 参数意义?
  155. X:12864屏幕的横坐标,范围是0到128(从左到右)
  156. Y:12864的纵坐标,范围是0到64(从上到下)
  157. Color:为1的时候表示为黑点
  158. */
  159. void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
  160. {
  161.     unsigned char Row,Tier,Tier_bit ;
  162.     unsigned char ReadOldH,ReadOldL ;
  163.     write_com(0x34);
  164.     write_com(0x36);
  165.     Tier=X>>4 ;
  166.     Tier_bit=X&0x0f ;
  167.     if(Y<32)
  168.     {
  169.         Row=Y ;
  170.     }
  171.     else
  172.     {
  173.         Row=Y-32 ;
  174.         Tier+=8 ;
  175.     }
  176.     write_com(Row+0x80);
  177.     write_com(Tier+0x80);
  178.     ReadByte();
  179.     ReadOldH=ReadByte();
  180.     ReadOldL=ReadByte();
  181.     write_com(Row+0x80);
  182.     write_com(Tier+0x80);
  183.     if(Tier_bit<8)
  184.     {
  185.         switch(Color)
  186.         {
  187.             case 0 :
  188.             ReadOldH&=(~(0x01<<(7-Tier_bit)));
  189.             break ;
  190.             case 1 :
  191.             ReadOldH|=(0x01<<(7-Tier_bit));
  192.             break ;
  193.             case 2 :
  194.             ReadOldH^=(0x01<<(7-Tier_bit));
  195.             break ;
  196.             default :
  197.             break ;
  198.         }
  199.         write_data(ReadOldH);
  200.         write_data(ReadOldL);
  201.     }
  202.     else
  203.     {
  204.         switch(Color)
  205.         {
  206.             case 0 :
  207.             ReadOldL&=(~(0x01<<(15-Tier_bit)));
  208.             break ;
  209.             case 1 :
  210.             ReadOldL|=(0x01<<(15-Tier_bit));
  211.             break ;
  212.             case 2 :
  213.             ReadOldL^=(0x01<<(15-Tier_bit));
  214.             break ;
  215.             default :
  216.             break ;
  217.         }
  218.         write_data(ReadOldH);
  219.         write_data(ReadOldL);
  220.     }
  221.     write_com(0x30);
  222. }
  223. void main(void)
  224. {
  225.     uchar i,j,colour=1;
  226.         ET0=1;
  227.         EA=1;
  228.         TMOD=0X11;
  229.         TR0=1;
  230.         TH0=(65536-100)/256;
  231.         TL0=(65536-100)%256;
  232.     RW=0 ;
  233.     lcdreset();
  234.     ceshi();
  235.     clrgdram();
  236.     delay(2000);
  237.     clrscreen();
  238. while(1)
  239. {
  240.     for(i=127;i>0;i--)
  241.     {
  242.          j=y-x*sin(2*i*3.14/(64+T));  //y纵向参数,可以上下调节波形位置
  243.          DrawPoint(i,j,colour);           //T调节周期,x调节幅度
  244.     }
  245.                 //T+=4;       
  246.                 //clrgdram();
  247.             delay(6000);
  248.                 //clrscreen();
  249.                
  250. }
  251.     while(1);
  252. }

  253. void key() interrupt 1
  254. {
  255.         TH0=(65536-100)/256;
  256.         TL0=(65536-100)%256;
  257.         if(P34==0)
  258.         {        delay(20);
  259.                 if(P34==0)
  260.                 {
  261.                         clrgdram();
  262.                         T+=4;
  263.                         if(T>200)
  264.                                 T=0;
  265.                 }
  266.         }
  267.        
  268.         if(P35==0)
  269.         {        delay(20);
  270.                 if(P35==0)
  271.                 {
  272.                         clrgdram();
  273.                         x-=4;
  274.                         if(x<0)
  275.                                 x=32;
  276.                 }
  277.         }
  278.        
  279.        
  280.         if(P36==0)
  281.         {        delay(20);
  282.                 if(P36==0)
  283.                 {
  284.                         clrgdram();
  285.                         y-=4;
  286.                         if(y<0)
  287.                                 y=32;
  288.                 }
  289.         }                       
  290. }




复制代码

波形.zip

54.9 KB, 下载次数: 6 , 下载积分: 资产 -2 信元, 下载支出 2 信元

51单片机用12864显示正弦波

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

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 02:12 , Processed in 0.024584 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表