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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5914|回復: 1
收起左側

STM32控制液晶12864顯示開機畫面,多級菜單,配置ADC-DAC-DDS

[復制鏈接]
ID:130231 發表于 2017-5-10 15:49 | 顯示全部樓層 |閱讀模式
STM32控制液晶12864顯示開機畫面,多級菜單,配置ADC-DAC-DDS
STM32陶老師布置的(AD9851 20M晶振)
0.png

  1. /**
  2.   ******************************************************************************
  3.   * @file    lcd12864.c
  4.   * @author  ice8cry
  5.   * @version V3.5.0
  6.   * @date    17-August-2013
  7.   * @brief   lcd12864 driver and handler.
  8.   ******************************************************************************
  9.   * @use
  10.   *
  11.   * Display
  12.   *
  13.   ******************************************************************************
  14.   */

  15. #include "lcd12864.h"
  16. #include "stdio.h"
  17. #include "math.h"

  18. extern u8 Keyval;                          //鍵值
  19. extern u8 Keyflag;                          //按鍵標志

  20. double number = 0;                          //將矩陣鍵盤輸入的字符轉化成的數字

  21. static u8 w = 0;                          //字符串位
  22. static u8 lastw = 0;                  //字符串最后一位
  23. static u8 point = 0;                  //小數點位

  24. u8 const lcd_table[17] = {"0123456789.+-*/_ "};                //常用字符串
  25. u8 TAB[];                                          //圖片
  26. u8 intdata_table[10];                  //整數
  27. u8 decdata_table[10];                  //帶小數
  28. u8 init[10];                                   //數組還原
  29. u8 num_table[10];                      //輸入的字符串設為十位
  30. u8 clean[16] = {"                "};//清除數字,16個空格

  31. /**
  32.   * @brief  Configurate GPIO of LCD12864.
  33.   * @param  None.
  34.   * @retval None.
  35.   */   
  36. static void LCD_GPIO_Config(void)
  37. {
  38.         GPIO_InitTypeDef GPIO_InitStructure;
  39.         /*config the extiline(PE) clock and AFIO clock*/
  40.         RCC_APB2PeriphClockCmd( LCDPORT_RCC | RCC_APB2Periph_AFIO,ENABLE );
  41.         GPIO_InitStructure.GPIO_Pin = CS | SID | SCLK | RST ;        //用“|”設置多個引腳
  42.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽輸出
  43.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  44.         GPIO_Init(LCDPORT,&GPIO_InitStructure);
  45. }

  46. /**
  47.   * @brief  Delay nms.(粗略延時)
  48.   * @param  nms.
  49.   * @retval None.
  50.   */
  51. static void Delay_ms(u32 nms)
  52. {
  53.         u16 i,j;
  54.         for( i = 0;i < nms;i++ )
  55.                 for( j = 0;j < 1800;j++);
  56. }

  57. /**
  58.   * @brief  Send 1 byte.
  59.   * @param  zdata.
  60.   * @retval None.
  61.   */
  62. static void sendbyte(u8 zdata)
  63. {
  64.         u8 i;
  65.         for(i = 0; i < 8; i++)
  66.         {
  67.                 if((zdata << i) & 0x80)
  68.                 {
  69.                         SID_Set;
  70.                 }
  71.                 else
  72.                 {
  73.                         SID_Reset;
  74.                 }
  75.                 SCLK_Set;
  76.                 SCLK_Reset;
  77.         }
  78. }

  79. /**
  80.   * @brief  Write command.(串行方式)
  81.   * @param  cmd.
  82.   * @retval None.
  83.   */
  84. static void Write_Command(u8 cmd)
  85. {
  86.         CS_Set;
  87.         sendbyte(0xf8);
  88.         sendbyte(cmd & 0xf0);
  89.         sendbyte((cmd << 4) & 0xf0);
  90.         Delay_ms(5);       
  91. }

  92. /**
  93.   * @brief  Write data.(串行方式)
  94.   * @param  dat.
  95.   * @retval None.
  96.   */
  97. static void Write_Data(u8 dat)
  98. {
  99.         CS_Set;
  100.         sendbyte(0xfa);
  101.         sendbyte(dat & 0xf0);
  102.         sendbyte((dat << 4) & 0xf0);
  103.         Delay_ms(5);       
  104. }

  105. /**
  106.   * @brief  Init LCD.
  107.   * @param  None.
  108.   * @retval None.
  109.   */
  110. void LCD_Init(void)
  111. {
  112.         LCD_GPIO_Config();
  113.         RST_Reset;
  114.         Delay_ms(100);
  115.         RST_Set;
  116.         Delay_ms(500);
  117.         Delay_ms(5);
  118.         Write_Command(FunctionSetB);        //基本功能
  119.         Delay_ms(5);
  120.         Write_Command(DisplayOnCtrl);        //顯示狀態開關:整體顯示開,光標顯示關,光標顯示反白關
  121.         Delay_ms(5);       
  122.         Write_Command(EntryModeSet);        //啟始點設定:光標右移
  123.         Delay_ms(5);
  124.         Write_Command(ClearDisplay);        //清除顯示DDRAM
  125.         Delay_ms(5);
  126.         Write_Command(ClearAddress);        //地址歸零
  127.         Delay_ms(5);
  128. }

  129. /**
  130.   * @brief  Clear LCD.
  131.   * @param  None.
  132.   * @retval None.
  133.   */
  134. void LCD_Clear(void)
  135. {
  136.         Write_Command(ClearDisplay);       
  137. }

  138. /**
  139.   * @brief  LCD display position.
  140.   * @param  x,y.(第x行1:4,第y列1:8)
  141.   * @retval None.
  142.   */
  143. static void LCD_Pos(u8 x,u8 y)
  144. {       
  145.         u8 pos;
  146.         switch(x)
  147.         {
  148.                 case 1:x=0x80;break;
  149.                 case 2:x=0x90;break;
  150.                 case 3:x=0x88;break;
  151.                 case 4:x=0x98;break;
  152.         }
  153.         pos=x+y-1;
  154.         Write_Command(pos);
  155.         Delay_ms(5);       
  156. }

  157. /**
  158.   * @brief  Display char.
  159.   * @param  x,y,c.
  160.   * @retval None.
  161.   */
  162. void Display_Char(u8 x,u8 y,u8 c)
  163. {                       
  164.         LCD_Pos(x,y);
  165.         Write_Data(lcd_table[c]);               
  166. }

  167. /**
  168.   * @brief  Display String.
  169.   * @param  x,y,s.
  170.   * @retval None.
  171.   */
  172. void Display_String(u8 x,u8 y,u8 *s)
  173. {
  174.         LCD_Pos(x,y);
  175.         while(*s !='\0')
  176.     {
  177.                 Write_Data(*s);
  178.                 s++;
  179.                 Delay_ms(50);
  180.     }
  181. }

  182. /**
  183.   * @brief  Display Picture.
  184.   * @param  TAB.
  185.   * @retval None.
  186.   */
  187. void Display_Picture(u8 *TAB)
  188. {
  189.         int i,j;   
  190.            Write_Command(FunctionSetE);        //打開擴展指令集
  191.         //*******顯示上半屏內容設置
  192.            for(i=0;i<32;i++)              //
  193.            {
  194.              Write_Command(0x80 + i); //SET  垂直地址 VERTICAL ADD
  195.               Write_Command(0x80);       //SET  水平地址 HORIZONTAL ADD
  196.               for(j=0;j<16;j++)
  197.                {
  198.                 Write_Data(*TAB++);
  199.                }
  200.     }          
  201.         //*******顯示下半屏內容設置
  202.            for(i=0;i<32;i++)              //
  203.     {
  204.               Write_Command(0x80 + i); //SET 垂直地址 VERTICAL ADD
  205.               Write_Command(0x88);       //SET 水平地址 HORIZONTAL ADD
  206.               for(j=0;j<16;j++)
  207.                {
  208.                  Write_Data(*TAB++);
  209.        }
  210.     }
  211.         Write_Command(FuncDrawOn);          //打開繪圖顯示
  212.         Write_Command(FunctionSetB);          //回到基本指令集
  213. }
  214.                                
  215. /**
  216.   * @brief  Display number sent by keypad.
  217.   * @param  x,y.
  218.   * @retval None.
  219.   */
  220. void Display_Number(u8 x,u8 y)
  221. {
  222.         if( Keyflag == 1 && Keyval < 11 )                        //有按鍵按下并且是"0~9"或"."
  223.         {                                                                  
  224.                 num_table[w] = lcd_table[Keyval];        //num_table[]值改變并保存
  225.                 Display_String(x,y,num_table);
  226.                 if(Keyval == 10)                                                //記錄小數點的位置
  227.                 {
  228.                         point = w;
  229.                 }
  230.                 lastw = w;                                                                //記錄最后一位                       
  231.                 w++;       
  232.                 Keyflag = 0;                                                        //按鍵標志重置
  233.                 Keyval = 0;
  234.         }                                                       
  235. }

  236. /**
  237.   * @brief  Turn string to number.
  238.   * @param  None.
  239.   * @retval number.
  240.   */
  241. double Turn_Number(void)
  242. {
  243.         u8 m,n,p;
  244.         u32 integer = 0;     //整數部分
  245.         double decimals = 0;         //小數部分
  246.         /*整數*/
  247.         if(point == 0)
  248.         {
  249.                 for(m = 0;m <= lastw;m++)
  250.                 {
  251.                         integer = integer + (num_table[m] - 0x30) * pow(10,lastw - m);        //注意-0x30,字符轉數據
  252.                 }
  253.                 number = integer;
  254.         }
  255.         /*帶小數*/
  256.         else
  257.         {
  258.                 for(n = 0;n <= ( point - 1 );n++)
  259.                 {                                                    
  260.                         integer = integer + (num_table[n] - 0x30) * pow(10,point - n -1);       
  261.                 }
  262.                 for(p = point + 1;p <= lastw;p++)
  263.                 {
  264.                         decimals = decimals + ( num_table[p] - 0x30 ) * pow(0.1,p - point );       
  265.                 }
  266.                 number = integer + decimals;
  267.         }         
  268.         return number;
  269. }

  270. /**
  271.   * @brief  Display intdata.(顯示5位整數,xxxxx)
  272.   * @param  x,y,intdata.
  273.   * @retval None.
  274.   */
  275. void Display_intData(u8 x,u8 y,u16 intdata)
  276. {
  277.         u8 i;
  278.         if( intdata /10000 != 0)
  279.         {
  280.                 intdata_table[0] = intdata / 10000 + 0x30;
  281.                 intdata_table[1] = intdata % 10000 / 1000 + 0x30;
  282.                 intdata_table[2] = intdata % 1000 / 100 + 0x30;
  283.                 intdata_table[3] = intdata % 100 / 10 + 0x30;
  284.                 intdata_table[4] = intdata % 10 + 0x30;               
  285.         }
  286.         else if( intdata /1000 != 0)
  287.         {
  288.                 intdata_table[0] = intdata / 1000 + 0x30;
  289.                 intdata_table[1] = intdata % 1000 / 100 + 0x30;
  290.                 intdata_table[2] = intdata % 100 / 10 + 0x30;
  291.                 intdata_table[3] = intdata % 10  + 0x30;               
  292.         }
  293.         else if( intdata /100 != 0)
  294.         {
  295.                 intdata_table[0] = intdata / 100 + 0x30;
  296.                 intdata_table[1] = intdata % 100 / 10 + 0x30;
  297.                 intdata_table[2] = intdata % 10 + 0x30;
  298.         }
  299.         else if( intdata /10 != 0)
  300.         {
  301.                 intdata_table[0] = intdata / 10 + 0x30;
  302.                 intdata_table[1] = intdata % 10 + 0x30;
  303.         }
  304.         else
  305.         {
  306.                 intdata_table[0] = intdata % 10 + 0x30;       
  307.         }
  308.         Display_String(x,y,intdata_table);
  309.         for(i = 0;i < 10;i++)
  310.         {
  311.                 intdata_table[i] = init[i];
  312.         }
  313. }

  314. /**
  315.   * @brief  Display decdata.(顯示小數點后4位,xxxxx.xxxx)
  316.   * @param  x,y,decdata.
  317.   * @retval None.
  318.   */
  319. void Display_decData(u8 x,u8 y,float decdata)
  320. {
  321.         u32 int_decdata = (u32)(decdata);
  322.         u32 int_10000decdata = (u32)(decdata * 10000);
  323.         u8 i;
  324.         if( int_decdata /10000 != 0)
  325.         {
  326.                 decdata_table[0] = int_decdata / 10000 + 0x30 ;
  327.                 decdata_table[1] = int_decdata % 10000 / 1000 + 0x30;
  328.                 decdata_table[2] = int_decdata % 1000 / 100 + 0x30;
  329.                 decdata_table[3] = int_decdata % 100 / 10 + 0x30;
  330.                 decdata_table[4] = int_decdata % 10 + 0x30;
  331.                 decdata_table[5] = 0x2e;        //小數點
  332.                 decdata_table[6] = int_10000decdata % 10000 / 1000 + 0x30;
  333.                 decdata_table[7] = int_10000decdata % 1000 / 100 + 0x30;
  334.                 decdata_table[8] = int_10000decdata % 100 / 10 + 0x30;
  335.                 decdata_table[9] = int_10000decdata % 10 + 0x30;               
  336.         }
  337.         else if( int_decdata /1000 != 0)
  338.         {
  339.                 decdata_table[0] = int_decdata / 1000 + 0x30;
  340.                 decdata_table[1] = int_decdata %1000 / 100 + 0x30;
  341.                 decdata_table[2] = int_decdata %100 / 10 + 0x30;
  342.                 decdata_table[3] = int_decdata %10  + 0x30;       
  343.                 decdata_table[4] = 0x2e;        //小數點
  344.                 decdata_table[5] = int_10000decdata % 10000 / 1000 + 0x30;
  345.                 decdata_table[6] = int_10000decdata % 1000 / 100 + 0x30;
  346.                 decdata_table[7] = int_10000decdata % 100 / 10 + 0x30;
  347.                 decdata_table[8] = int_10000decdata % 10 + 0x30;
  348.         }
  349.         else if( int_decdata /100 != 0)
  350.         {
  351.                 decdata_table[0] = int_decdata / 100 + 0x30;
  352.                 decdata_table[1] = int_decdata %100 / 10 + 0x30;
  353.                 decdata_table[2] = int_decdata %10 + 0x30;
  354.                 decdata_table[3] = 0x2e;        //小數點
  355.                 decdata_table[4] = int_10000decdata % 10000 / 1000 + 0x30;
  356.                 decdata_table[5] = int_10000decdata % 1000 / 100 + 0x30;
  357.                 decdata_table[6] = int_10000decdata % 100 / 10 + 0x30;
  358.                 decdata_table[7] = int_10000decdata % 10 + 0x30;
  359.         }
  360.         else if( int_decdata /10 != 0)
  361.         {
  362.                 decdata_table[0] = int_decdata / 10 + 0x30;
  363.                 decdata_table[1] = int_decdata %10 + 0x30;
  364.                 decdata_table[2] = 0x2e;        //小數點
  365.                 decdata_table[3] = int_10000decdata % 10000 / 1000 + 0x30;
  366.                 decdata_table[4] = int_10000decdata % 1000 / 100 + 0x30;
  367.                 decdata_table[5] = int_10000decdata % 100 / 10 + 0x30;
  368.                 decdata_table[6] = int_10000decdata % 10 + 0x30;
  369.         }
  370.         else
  371.         {
  372.                 decdata_table[0] = int_decdata % 10 + 0x30;
  373.                 decdata_table[1] = 0x2e;        //小數點
  374.                 decdata_table[2] = int_10000decdata % 10000 / 1000 + 0x30;

  375. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

下載:
STM32控制液晶12864顯示開機畫面,多級菜單,配置ADC-DAC-DDS.rar (2.77 MB, 下載次數: 146)
回復

使用道具 舉報

ID:96552 發表于 2020-8-7 09:04 | 顯示全部樓層
工業控制板
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人做人人澡人人爽欧美 | 91久久网站| 国产成人免费在线观看 | 久久国产精品久久 | 爱草在线 | 中文字幕第一页在线 | 欧美一区免费 | 国产美女精品视频免费观看 | 99热碰 | 一区精品国产欧美在线 | 中文字幕一页二页 | 国产成人在线视频免费观看 | 国产精品我不卡 | 日韩在线精品 | 免费精品久久久久久中文字幕 | 日韩精品一区二区三区中文在线 | 免费在线看黄 | 华人黄网站大全 | 欧美日韩91 | 日韩午夜电影 | 96av麻豆蜜桃一区二区 | 午夜国产羞羞视频免费网站 | 天堂男人av | 欧美一级www片免费观看 | 国产一区二区影院 | www.色五月.com | 日韩一区中文字幕 | 日韩a级片| 国产精品久久久久久高潮 | 日韩久久网 | 综合伊人 | av资源中文在线 | 午夜91| 四虎成人免费视频 | 免费a网站 | 免费一级黄色录像 | 国产精品视频97 | 91精品国产综合久久精品 | 欧美日韩国产不卡 | 欧美成人高清 | 国产高清精品一区 |