欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10846|回復(fù): 15
收起左側(cè)

在LCD12864上顯示正弦曲線—按鍵可調(diào)頻率和幅度以及顯示文字,動態(tài)圖片仿真

  [復(fù)制鏈接]
ID:113276 發(fā)表于 2016-4-10 21:16 | 顯示全部樓層 |閱讀模式
51單片機控制的12864顯示,有文字,圖片,動態(tài)圖片,以及PROTUES仿真等非常全面
0.png 1.png 2.png 3.png
以上壓縮包所有內(nèi)容下載: LCD12864.zip (13.61 MB, 下載次數(shù): 235)

部分程序預(yù)覽:
  1. /***
  2. 程序:LCD12864顯示圖形
  3. 內(nèi)容:在12864上顯示正弦曲線——按鍵可調(diào)頻率和幅度
  4. 學(xué)習板:HOT-51
  5. 軟件:keil uVision3
  6. 液晶:QY12864HZ1
  7. 作者:大海橡樹
  8. 整理日期:2010-12-08
  9. 修改:無


  10. 備注:有什么錯誤的地方,歡迎網(wǎng)友們到空間留言

  11.                                         O(∩_∩)O~


  12. *****/
  13. #include<AT89X52.h>
  14. #include<math.h>
  15. #include"ZB.h"
  16. #define uchar unsigned char
  17. #define uint  unsigned int

  18. #define LCD_databus P0 //LCD數(shù)據(jù)總線連接P0口

  19. sbit RS=P2^5;
  20. sbit RW=P2^6;
  21. sbit EN=P2^7;//LCD12864三個控制位

  22. sbit DQ=P2^3;//DS18B20數(shù)據(jù)線
  23. sbit KEY1=P3^2;
  24. sbit KEY2=P3^3;
  25. sbit KEY3=P3^4;
  26. uchar key_value;

  27. uchar HZ1[]="周期";
  28. uchar HZ2[]="幅度";
  29. void delay(uint i)        //延時函數(shù)
  30. {
  31.         while(--i);
  32. }
  33. void Read_busy()        //LCD12864忙檢測
  34. {
  35.         RS=0;
  36.         RW=1;
  37.         EN=1;
  38.         LCD_databus=0xFF;
  39.         while(LCD_databus & 0x80);        //判斷最高位,1---busy,0---Nobusy
  40.         EN=0;
  41. }

  42. void write_LCD_command(uchar value)//寫指令
  43. {
  44.         RS=0;
  45.         RW=0;
  46.         EN=1;
  47.         LCD_databus=value;
  48.         delay(7);
  49.         EN=0;
  50. }

  51. void write_LCD_data(uchar value)//寫數(shù)據(jù)
  52. {
  53.         RS=1;
  54.         RW=0;
  55.         EN=1;
  56.         LCD_databus=value;
  57.         delay(7);
  58.         EN=0;
  59. }

  60. void init_LCD()                //初始化LCD
  61. {
  62.         write_LCD_command(0x30);        //8位數(shù),基本指令
  63.         delay(100);
  64.         write_LCD_command(0x30);
  65.         delay(37);
  66.         write_LCD_command(0x0C);        //開顯示,不顯示光標,光標不閃爍
  67.         delay(100);
  68.         write_LCD_command(0x01);        //清屏指令
  69.         delay(100);
  70.         write_LCD_command(0x06);        //沒寫入數(shù)據(jù),地址指針加1
  71. }

  72. void Clear_GDRAM()                //清楚GDRAM
  73. {
  74.         uchar x,y;
  75.         for(y=0;y<64;y++)
  76.         {
  77.                 for(x=0;x<16;x++)
  78.                 {
  79.                         write_LCD_command(0x34);
  80.                         write_LCD_command(y+0x80);        //先送垂直地址
  81.                         write_LCD_command(x+0x80);        //后送水平地址
  82.                         write_LCD_command(0x30);        //基本指令
  83.                         write_LCD_data(0x00);                //寫入數(shù)據(jù)0
  84.                         write_LCD_data(0x00);
  85.                 }
  86.         }
  87. }

  88. uchar ReadByte()        //讀LCD
  89. {
  90.         uchar Read_value;
  91.         Read_busy();
  92.         RS=1;
  93.         RW=1;
  94.         EN=0;
  95.         EN=1;
  96.         Read_value=LCD_databus;       
  97.         EN=0;
  98.        
  99.         return Read_value;
  100. }

  101. void display_BMP(uchar *address)//顯示圖片
  102. {
  103.         uchar i,j;
  104.         for(i=16;i<32;i++)
  105.         {
  106.                 write_LCD_command(0x80+i);        //先送垂直地址
  107.                 write_LCD_command(0x80);        //再送水平地址
  108.                 for(j=0;j<16;j++)
  109.                 {
  110.                         write_LCD_data(*address);//寫入數(shù)據(jù)
  111.                         address++;
  112.                 }
  113.         }
  114.        
  115.         for(i=0;i<32;i++)
  116.         {
  117.                 write_LCD_command(0x80+i);//先送垂直地址
  118.                 write_LCD_command(0x88);        //再送水平地址
  119.                 for(j=0;j<16;j++)
  120.                 {
  121.                         write_LCD_data(*address);
  122.                         address++;
  123.                 }
  124.         }
  125.        
  126. }

  127. void Draw_dots(uchar x,uchar y,uchar color)
  128. {
  129.         uchar ROW,xlabel,xlabel_bit;
  130.         uchar Read_H,Read_L;                 //讀LCD中的數(shù)據(jù)
  131.         write_LCD_command(0x34);        //擴充指令
  132.         write_LCD_command(0x36);        //打開繪圖指令
  133.         xlabel=x>>4;                                //取16*16首地址
  134.         xlabel_bit=x & 0x0F;                //計算該點在16位數(shù)據(jù)的第幾位       
  135.         if(y<32)                                        //如果是上半屏,上下半屏y都是0--31
  136.         {
  137.                 ROW=y;
  138.         }
  139.         else                                                //顯示的是下半屏
  140.         {
  141.                 ROW=y-32;
  142.                 xlabel+=8;                           //規(guī)定顯示在下半屏
  143.         }
  144.         write_LCD_command(ROW+0x80); //送入垂直地址
  145.         write_LCD_command(xlabel+0x80);//再送入水平地址
  146.         ReadByte();        //讀取當前GDRAM數(shù)據(jù)前腰進行一次空讀,接下來就可以讀出數(shù)據(jù)了
  147.         Read_H=ReadByte(); //讀高8位
  148.         Read_L=ReadByte(); //讀低8位
  149.        
  150.         write_LCD_command(ROW+0x80);         //送入垂直地址
  151.         write_LCD_command(xlabel+0x80);        //再送入水平地址
  152.        
  153.         if(xlabel_bit<8)
  154.         {
  155.                 switch(color)
  156.                 {
  157.                         case 0:Read_H &= (~(0x01<<(7-xlabel_bit)));//若變白
  158.                         break;
  159.                         case 1:Read_H |= (0x01<<(7-xlabel_bit));//若涂黑
  160.                         break;
  161.                         case 2:Read_H ^= (0x01<<(7-xlabel_bit));//若反轉(zhuǎn)
  162.                         break;       
  163.                         default:break;
  164.                 }
  165.                 write_LCD_data(Read_H);//將數(shù)據(jù)寫入GDRAM
  166.                 write_LCD_data(Read_L);//先寫高位,再寫低位(地址指針順序)
  167.         }
  168.         else
  169.         {
  170.                 switch(color)//color設(shè)置
  171.                 {
  172.                         case 0: Read_L &= (~(0x01<<(15-xlabel_bit)));//若變白
  173.                         break;
  174.                         case 1: Read_L |= (0x01<<(15-xlabel_bit));//若涂黑
  175.                         break;
  176.                         case 2: Read_L ^= (0x01<<(15-xlabel_bit));//若反轉(zhuǎn)
  177.                         break;
  178.                         default:break;
  179.                 }
  180.                 write_LCD_data(Read_H);
  181.                 write_LCD_data(Read_L);//寫入數(shù)據(jù)
  182.         }
  183.        
  184.         write_LCD_command(0x30);//回到普通模式
  185. }

  186. void main()
  187. {
  188.         uchar i,j;
  189.         uchar num;
  190.         uchar w=10,A=6;
  191.         init_LCD();
  192.         Clear_GDRAM();
  193.         write_LCD_command(0x36);
  194.         display_BMP(ZB);
  195.         while(1)
  196.         {
  197.                 write_LCD_command(0x30);
  198.                 write_LCD_command(0x80);
  199.                 write_LCD_data('T');
  200.                 write_LCD_data(':');
  201.                 write_LCD_data(2*w/100+0x30);
  202.                 write_LCD_data(2*w%100/10+0x30);
  203.                 write_LCD_data(2*w%10+0x30);

  204.                 write_LCD_command(0x83);
  205.                 write_LCD_data('A');
  206.                 write_LCD_data(':');
  207.                 write_LCD_data(A/10+0x30);
  208.                 write_LCD_data(A%10+0x30);
  209.                 write_LCD_command(0x36);
  210.                 for(i=13;i<128;i++)
  211.                 {
  212.                         j=35-A*sin((i-13)*3.14/w);
  213.                         Draw_dots(i,j,1);
  214.                         delay(400);
  215.                 }
  216. /**********以下為按鍵掃描函數(shù)**************/
  217.                 if(KEY1==0)                        //模式鍵按下
  218.                 {
  219.                         delay(2000);
  220.                         if(KEY1==0)
  221.                         {
  222.                                 while(!KEY1);
  223.                                 key_value++;
  224.                                 if(key_value>2)
  225.                                         key_value=0;
  226.                         }
  227.                 }
  228.                 if(key_value==1)                         //若選擇的是周期模式
  229.                 {
  230.                         write_LCD_command(0x30);
  231.                         write_LCD_command(0x86);
  232.                         for(num=0;num<4;num++)
  233.                         {
  234.                                 write_LCD_data(HZ1[num]);         //顯示"周期"漢字
  235.                         }
  236.                         if(KEY2==0)                                                //加鍵按下時
  237.                         {
  238.                                 delay(1500);
  239.                                 if(KEY2==0)
  240.                                 {
  241.                                         while(!KEY2);
  242.                                         w=w+5;                                        //w加
  243.                                         if(w==65)
  244.                                                 w=10;
  245.                                         Clear_GDRAM();
  246.                                         write_LCD_command(0x36);//重新顯示圖形
  247.                                         display_BMP(ZB);       
  248.                                 }          
  249.                         }
  250.                         if(KEY3==0)
  251.                         {
  252.                                 delay(2000);
  253.                                 if(KEY3==0)
  254.                                 {
  255.                                         while(!KEY3);
  256.                                         if(w>=10)
  257.                                                 w=w-5;
  258.                                         Clear_GDRAM();
  259.                                         write_LCD_command(0x36);
  260.                                         display_BMP(ZB);                //重新顯示圖形
  261.                                 }
  262.                         }       
  263.                 }

  264.                 if(key_value==2)                                //若選擇的是幅度模式
  265.                 {
  266.                         write_LCD_command(0x30);
  267.                         write_LCD_command(0x86);
  268.                         for(num=0;num<4;num++)
  269.                         {
  270.                                 write_LCD_data(HZ2[num]);  
  271.                         }
  272.                         if(KEY2==0)
  273.                         {
  274.                                 delay(1500);
  275.                                 if(KEY2==0)
  276.                                 {
  277.                                         while(!KEY2);
  278.                                         A=A+2;
  279.                                         if(A==22)
  280.                                                 A=8;
  281.                                         Clear_GDRAM();
  282.                                         write_LCD_command(0x36);
  283.                                         display_BMP(ZB);       
  284.                                 }          
  285.                         }
  286.                         if(KEY3==0)
  287.                         {
  288.                                 delay(2000);
  289.                                 if(KEY3==0)
  290.                                 {
  291.                                         while(!KEY3);
  292.                                         if(A>=6)
  293.                                                 A=A-2;
  294.                                         Clear_GDRAM();
  295.                                         write_LCD_command(0x36);
  296.                                         display_BMP(ZB);
  297.                                 }
  298.                         }       
  299.                 }
  300.         }       
  301. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:96682 發(fā)表于 2016-4-10 21:52 | 顯示全部樓層
非示波器,是網(wǎng)友練練手的一個好題材。
回復(fù)

使用道具 舉報

ID:221708 發(fā)表于 2017-7-24 10:28 | 顯示全部樓層
波形出來了,很適合學(xué)習
回復(fù)

使用道具 舉報

ID:251848 發(fā)表于 2017-11-21 13:00 | 顯示全部樓層

波形出來了,很適合學(xué)習
回復(fù)

使用道具 舉報

ID:251848 發(fā)表于 2017-11-21 13:01 | 顯示全部樓層
學(xué)習學(xué)習 謝謝樓主!!!
回復(fù)

使用道具 舉報

ID:256814 發(fā)表于 2017-12-3 15:33 | 顯示全部樓層
波形顯示每一個點都控制嗎
回復(fù)

使用道具 舉報

ID:265974 發(fā)表于 2017-12-24 11:52 | 顯示全部樓層
哇感謝樓主,作業(yè)剛好要用到
回復(fù)

使用道具 舉報

ID:326407 發(fā)表于 2018-5-18 15:55 | 顯示全部樓層
QAQ壓縮包下到一半就停了這是怎么回事啊
回復(fù)

使用道具 舉報

ID:326407 發(fā)表于 2018-5-18 16:17 | 顯示全部樓層
換了個網(wǎng)下下來了_(:з」∠)_感謝樓主分享!很實用!
回復(fù)

使用道具 舉報

ID:290716 發(fā)表于 2018-5-18 19:37 | 顯示全部樓層
51能用嗎?
回復(fù)

使用道具 舉報

ID:356773 發(fā)表于 2018-11-9 10:03 | 顯示全部樓層
波形出不來啊樓主,能教教我嗎
回復(fù)

使用道具 舉報

ID:537018 發(fā)表于 2019-5-13 18:15 | 顯示全部樓層
ZB。h文件是什么啊
回復(fù)

使用道具 舉報

ID:739573 發(fā)表于 2020-5-9 17:17 | 顯示全部樓層
為什么我無字庫顯示無法仿真
回復(fù)

使用道具 舉報

ID:739573 發(fā)表于 2020-5-9 17:46 | 顯示全部樓層
這個無字庫顯示的我燒的是樓主給得hex文件,但在proteus上卻仿真不出來,相關(guān)引腳的電平和樓主的有出入,這是什么原因呢?
回復(fù)

使用道具 舉報

ID:650426 發(fā)表于 2020-5-10 00:41 | 顯示全部樓層
可以keil uVision4的編譯嗎?我一直編譯不行,是我哪里出錯了嗎
就是一直顯示這樣的:
Build target 'Target 1'
assembling STARTUP.A51...
compiling main.c...
main.c(7): warning C318: can't open file 'AT89C52.h'
MAIN.C(16): error C202: 'P2': undefined identifier
MAIN.C(17): error C202: 'P2': undefined identifier
........
........
回復(fù)

使用道具 舉報

ID:688460 發(fā)表于 2020-6-19 08:21 | 顯示全部樓層
不錯的思路,學(xué)習了!謝謝!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表