STM32控制液晶12864顯示開機畫面,多級菜單,配置ADC-DAC-DDS
STM32陶老師布置的(AD9851 20M晶振)
- /**
- ******************************************************************************
- * @file lcd12864.c
- * @author ice8cry
- * @version V3.5.0
- * @date 17-August-2013
- * @brief lcd12864 driver and handler.
- ******************************************************************************
- * @use
- *
- * Display
- *
- ******************************************************************************
- */
- #include "lcd12864.h"
- #include "stdio.h"
- #include "math.h"
- extern u8 Keyval; //鍵值
- extern u8 Keyflag; //按鍵標志
- double number = 0; //將矩陣鍵盤輸入的字符轉化成的數字
- static u8 w = 0; //字符串位
- static u8 lastw = 0; //字符串最后一位
- static u8 point = 0; //小數點位
- u8 const lcd_table[17] = {"0123456789.+-*/_ "}; //常用字符串
- u8 TAB[]; //圖片
- u8 intdata_table[10]; //整數
- u8 decdata_table[10]; //帶小數
- u8 init[10]; //數組還原
- u8 num_table[10]; //輸入的字符串設為十位
- u8 clean[16] = {" "};//清除數字,16個空格
- /**
- * @brief Configurate GPIO of LCD12864.
- * @param None.
- * @retval None.
- */
- static void LCD_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /*config the extiline(PE) clock and AFIO clock*/
- RCC_APB2PeriphClockCmd( LCDPORT_RCC | RCC_APB2Periph_AFIO,ENABLE );
- GPIO_InitStructure.GPIO_Pin = CS | SID | SCLK | RST ; //用“|”設置多個引腳
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(LCDPORT,&GPIO_InitStructure);
- }
- /**
- * @brief Delay nms.(粗略延時)
- * @param nms.
- * @retval None.
- */
- static void Delay_ms(u32 nms)
- {
- u16 i,j;
- for( i = 0;i < nms;i++ )
- for( j = 0;j < 1800;j++);
- }
- /**
- * @brief Send 1 byte.
- * @param zdata.
- * @retval None.
- */
- static void sendbyte(u8 zdata)
- {
- u8 i;
- for(i = 0; i < 8; i++)
- {
- if((zdata << i) & 0x80)
- {
- SID_Set;
- }
- else
- {
- SID_Reset;
- }
- SCLK_Set;
- SCLK_Reset;
- }
- }
- /**
- * @brief Write command.(串行方式)
- * @param cmd.
- * @retval None.
- */
- static void Write_Command(u8 cmd)
- {
- CS_Set;
- sendbyte(0xf8);
- sendbyte(cmd & 0xf0);
- sendbyte((cmd << 4) & 0xf0);
- Delay_ms(5);
- }
- /**
- * @brief Write data.(串行方式)
- * @param dat.
- * @retval None.
- */
- static void Write_Data(u8 dat)
- {
- CS_Set;
- sendbyte(0xfa);
- sendbyte(dat & 0xf0);
- sendbyte((dat << 4) & 0xf0);
- Delay_ms(5);
- }
- /**
- * @brief Init LCD.
- * @param None.
- * @retval None.
- */
- void LCD_Init(void)
- {
- LCD_GPIO_Config();
- RST_Reset;
- Delay_ms(100);
- RST_Set;
- Delay_ms(500);
- Delay_ms(5);
- Write_Command(FunctionSetB); //基本功能
- Delay_ms(5);
- Write_Command(DisplayOnCtrl); //顯示狀態開關:整體顯示開,光標顯示關,光標顯示反白關
- Delay_ms(5);
- Write_Command(EntryModeSet); //啟始點設定:光標右移
- Delay_ms(5);
- Write_Command(ClearDisplay); //清除顯示DDRAM
- Delay_ms(5);
- Write_Command(ClearAddress); //地址歸零
- Delay_ms(5);
- }
- /**
- * @brief Clear LCD.
- * @param None.
- * @retval None.
- */
- void LCD_Clear(void)
- {
- Write_Command(ClearDisplay);
- }
- /**
- * @brief LCD display position.
- * @param x,y.(第x行1:4,第y列1:8)
- * @retval None.
- */
- static void LCD_Pos(u8 x,u8 y)
- {
- u8 pos;
- switch(x)
- {
- case 1:x=0x80;break;
- case 2:x=0x90;break;
- case 3:x=0x88;break;
- case 4:x=0x98;break;
- }
- pos=x+y-1;
- Write_Command(pos);
- Delay_ms(5);
- }
- /**
- * @brief Display char.
- * @param x,y,c.
- * @retval None.
- */
- void Display_Char(u8 x,u8 y,u8 c)
- {
- LCD_Pos(x,y);
- Write_Data(lcd_table[c]);
- }
- /**
- * @brief Display String.
- * @param x,y,s.
- * @retval None.
- */
- void Display_String(u8 x,u8 y,u8 *s)
- {
- LCD_Pos(x,y);
- while(*s !='\0')
- {
- Write_Data(*s);
- s++;
- Delay_ms(50);
- }
- }
- /**
- * @brief Display Picture.
- * @param TAB.
- * @retval None.
- */
- void Display_Picture(u8 *TAB)
- {
- int i,j;
- Write_Command(FunctionSetE); //打開擴展指令集
- //*******顯示上半屏內容設置
- for(i=0;i<32;i++) //
- {
- Write_Command(0x80 + i); //SET 垂直地址 VERTICAL ADD
- Write_Command(0x80); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<16;j++)
- {
- Write_Data(*TAB++);
- }
- }
- //*******顯示下半屏內容設置
- for(i=0;i<32;i++) //
- {
- Write_Command(0x80 + i); //SET 垂直地址 VERTICAL ADD
- Write_Command(0x88); //SET 水平地址 HORIZONTAL ADD
- for(j=0;j<16;j++)
- {
- Write_Data(*TAB++);
- }
- }
- Write_Command(FuncDrawOn); //打開繪圖顯示
- Write_Command(FunctionSetB); //回到基本指令集
- }
-
- /**
- * @brief Display number sent by keypad.
- * @param x,y.
- * @retval None.
- */
- void Display_Number(u8 x,u8 y)
- {
- if( Keyflag == 1 && Keyval < 11 ) //有按鍵按下并且是"0~9"或"."
- {
- num_table[w] = lcd_table[Keyval]; //num_table[]值改變并保存
- Display_String(x,y,num_table);
- if(Keyval == 10) //記錄小數點的位置
- {
- point = w;
- }
- lastw = w; //記錄最后一位
- w++;
- Keyflag = 0; //按鍵標志重置
- Keyval = 0;
- }
- }
- /**
- * @brief Turn string to number.
- * @param None.
- * @retval number.
- */
- double Turn_Number(void)
- {
- u8 m,n,p;
- u32 integer = 0; //整數部分
- double decimals = 0; //小數部分
- /*整數*/
- if(point == 0)
- {
- for(m = 0;m <= lastw;m++)
- {
- integer = integer + (num_table[m] - 0x30) * pow(10,lastw - m); //注意-0x30,字符轉數據
- }
- number = integer;
- }
- /*帶小數*/
- else
- {
- for(n = 0;n <= ( point - 1 );n++)
- {
- integer = integer + (num_table[n] - 0x30) * pow(10,point - n -1);
- }
- for(p = point + 1;p <= lastw;p++)
- {
- decimals = decimals + ( num_table[p] - 0x30 ) * pow(0.1,p - point );
- }
- number = integer + decimals;
- }
- return number;
- }
- /**
- * @brief Display intdata.(顯示5位整數,xxxxx)
- * @param x,y,intdata.
- * @retval None.
- */
- void Display_intData(u8 x,u8 y,u16 intdata)
- {
- u8 i;
- if( intdata /10000 != 0)
- {
- intdata_table[0] = intdata / 10000 + 0x30;
- intdata_table[1] = intdata % 10000 / 1000 + 0x30;
- intdata_table[2] = intdata % 1000 / 100 + 0x30;
- intdata_table[3] = intdata % 100 / 10 + 0x30;
- intdata_table[4] = intdata % 10 + 0x30;
- }
- else if( intdata /1000 != 0)
- {
- intdata_table[0] = intdata / 1000 + 0x30;
- intdata_table[1] = intdata % 1000 / 100 + 0x30;
- intdata_table[2] = intdata % 100 / 10 + 0x30;
- intdata_table[3] = intdata % 10 + 0x30;
- }
- else if( intdata /100 != 0)
- {
- intdata_table[0] = intdata / 100 + 0x30;
- intdata_table[1] = intdata % 100 / 10 + 0x30;
- intdata_table[2] = intdata % 10 + 0x30;
- }
- else if( intdata /10 != 0)
- {
- intdata_table[0] = intdata / 10 + 0x30;
- intdata_table[1] = intdata % 10 + 0x30;
- }
- else
- {
- intdata_table[0] = intdata % 10 + 0x30;
- }
- Display_String(x,y,intdata_table);
- for(i = 0;i < 10;i++)
- {
- intdata_table[i] = init[i];
- }
- }
- /**
- * @brief Display decdata.(顯示小數點后4位,xxxxx.xxxx)
- * @param x,y,decdata.
- * @retval None.
- */
- void Display_decData(u8 x,u8 y,float decdata)
- {
- u32 int_decdata = (u32)(decdata);
- u32 int_10000decdata = (u32)(decdata * 10000);
- u8 i;
- if( int_decdata /10000 != 0)
- {
- decdata_table[0] = int_decdata / 10000 + 0x30 ;
- decdata_table[1] = int_decdata % 10000 / 1000 + 0x30;
- decdata_table[2] = int_decdata % 1000 / 100 + 0x30;
- decdata_table[3] = int_decdata % 100 / 10 + 0x30;
- decdata_table[4] = int_decdata % 10 + 0x30;
- decdata_table[5] = 0x2e; //小數點
- decdata_table[6] = int_10000decdata % 10000 / 1000 + 0x30;
- decdata_table[7] = int_10000decdata % 1000 / 100 + 0x30;
- decdata_table[8] = int_10000decdata % 100 / 10 + 0x30;
- decdata_table[9] = int_10000decdata % 10 + 0x30;
- }
- else if( int_decdata /1000 != 0)
- {
- decdata_table[0] = int_decdata / 1000 + 0x30;
- decdata_table[1] = int_decdata %1000 / 100 + 0x30;
- decdata_table[2] = int_decdata %100 / 10 + 0x30;
- decdata_table[3] = int_decdata %10 + 0x30;
- decdata_table[4] = 0x2e; //小數點
- decdata_table[5] = int_10000decdata % 10000 / 1000 + 0x30;
- decdata_table[6] = int_10000decdata % 1000 / 100 + 0x30;
- decdata_table[7] = int_10000decdata % 100 / 10 + 0x30;
- decdata_table[8] = int_10000decdata % 10 + 0x30;
- }
- else if( int_decdata /100 != 0)
- {
- decdata_table[0] = int_decdata / 100 + 0x30;
- decdata_table[1] = int_decdata %100 / 10 + 0x30;
- decdata_table[2] = int_decdata %10 + 0x30;
- decdata_table[3] = 0x2e; //小數點
- decdata_table[4] = int_10000decdata % 10000 / 1000 + 0x30;
- decdata_table[5] = int_10000decdata % 1000 / 100 + 0x30;
- decdata_table[6] = int_10000decdata % 100 / 10 + 0x30;
- decdata_table[7] = int_10000decdata % 10 + 0x30;
- }
- else if( int_decdata /10 != 0)
- {
- decdata_table[0] = int_decdata / 10 + 0x30;
- decdata_table[1] = int_decdata %10 + 0x30;
- decdata_table[2] = 0x2e; //小數點
- decdata_table[3] = int_10000decdata % 10000 / 1000 + 0x30;
- decdata_table[4] = int_10000decdata % 1000 / 100 + 0x30;
- decdata_table[5] = int_10000decdata % 100 / 10 + 0x30;
- decdata_table[6] = int_10000decdata % 10 + 0x30;
- }
- else
- {
- decdata_table[0] = int_decdata % 10 + 0x30;
- decdata_table[1] = 0x2e; //小數點
- decdata_table[2] = int_10000decdata % 10000 / 1000 + 0x30;
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
下載:
STM32控制液晶12864顯示開機畫面,多級菜單,配置ADC-DAC-DDS.rar
(2.77 MB, 下載次數: 146)
2017-5-10 15:49 上傳
點擊文件名下載附件
|