久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

作者: 51黑小牛    時間: 2016-4-10 21:16
標題: 在LCD12864上顯示正弦曲線—按鍵可調(diào)頻率和幅度以及顯示文字,動態(tài)圖片仿真
51單片機控制的12864顯示,有文字,圖片,動態(tài)圖片,以及PROTUES仿真等非常全面

以上壓縮包所有內(nèi)容下載: LCD12864.zip (13.61 MB, 下載次數(shù): 235)

部分程序預(yù)覽:
  1. /***
  2. 程序:LCD12864顯示圖形
  3. 內(nèi)容:在12864上顯示正弦曲線——按鍵可調(diào)頻率和幅度
  4. 學習板: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ù)制代碼




作者: wc86110    時間: 2016-4-10 21:52
非示波器,是網(wǎng)友練練手的一個好題材。
作者: cjming    時間: 2017-7-24 10:28
波形出來了,很適合學習
作者: xb123456    時間: 2017-11-21 13:00

波形出來了,很適合學習
作者: xb123456    時間: 2017-11-21 13:01
學習學習 謝謝樓主!!!
作者: ghjhbvj    時間: 2017-12-3 15:33
波形顯示每一個點都控制嗎
作者: zichuy    時間: 2017-12-24 11:52
哇感謝樓主,作業(yè)剛好要用到
作者: TREEtree    時間: 2018-5-18 15:55
QAQ壓縮包下到一半就停了這是怎么回事啊
作者: TREEtree    時間: 2018-5-18 16:17
換了個網(wǎng)下下來了_(:з」∠)_感謝樓主分享!很實用!
作者: 有一天    時間: 2018-5-18 19:37
51能用嗎?
作者: zxyhaha    時間: 2018-11-9 10:03
波形出不來啊樓主,能教教我嗎

作者: 酸葡萄    時間: 2019-5-13 18:15
ZB。h文件是什么啊

作者: OnePassenger    時間: 2020-5-9 17:17
為什么我無字庫顯示無法仿真
作者: OnePassenger    時間: 2020-5-9 17:46
這個無字庫顯示的我燒的是樓主給得hex文件,但在proteus上卻仿真不出來,相關(guān)引腳的電平和樓主的有出入,這是什么原因呢?
作者: 一路的花田    時間: 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
........
........
作者: yyzf998    時間: 2020-6-19 08:21
不錯的思路,學習了!謝謝!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲乱码一区二区三区在线观看 | 在线观看av免费 | 亚洲欧美综合精品久久成人 | 国产精品久久久久久久久久久久 | 亚洲福利网 | 在线久草 | 中文字幕亚洲视频 | 日韩在线免费视频 | 国产四虎| 国产视频1区2区 | 久在线| 国产精品免费福利 | 国产一级片在线观看视频 | 午夜免费视频 | 成人在线一区二区 | 中文字幕视频在线观看 | 97国产精品视频 | 久久久久久久久久爱 | 久久大陆 | a毛片| 日韩久久久久久 | 啪啪免费 | 男女视频91| 国产免费一区二区三区 | 亚洲色欲色欲www | 久久尤物免费一区二区三区 | 欧美成人免费在线 | 综合另类 | 日韩国产一区二区三区 | 国产免费一区 | 久久久精品亚洲 | 久久黄色网| 国产视频精品在线 | 亚洲国产高清高潮精品美女 | 中文字幕在线精品 | 黄色毛片在线看 | 亚洲欧美在线视频 | 久久久久久亚洲精品不卡 | 91久久国产综合久久91精品网站 | www.亚洲国产精品 | 国产欧美精品一区 |