1. 程式人生 > >STM32 驅動液晶LCD12864

STM32 驅動液晶LCD12864

#include "led.h"
#undef APP_DE
#include "hawk.h"
液晶採用晶聯訊電子的JLX19264G-260

#define FEEDDOG() GPIOC->ODR^= GPIO_Pin_0




//LCD IO初始化
void LCD_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);//使能PB,埠時鐘

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11;//LED_BK,LED_RS
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);//根據設定引數初始化GPIOA.8.11
 GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_11); //PA.8 輸出高




 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
 GPIO_Init(GPIOC, &GPIO_InitStructure); 
 GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); 


 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//LED0-->PA.8 埠配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
 GPIO_Init(GPIOD, &GPIO_InitStructure);//根據設定引數初始化GPIOA.8
 //GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//PA.8 輸出高


 initial_lcd();
 clear_screen();
}


/******************************************************
函式功能:高低位元組互換
************************************************/
u8 change_data(u8 temp)
{
 u8 temp1,i;
 temp1=0;
 for(i=0;i<8;i++)
 {
if((temp&0x01)==0x01)
{
temp1=temp1|0x01;

if(i<7)
{
    temp1=temp1<<1;
    temp= temp >>1;
}
 }
 return temp1;
}




//寫命令 ok
void transfer_command(u8 DATA)
{
 u16 DATA1;
 
 DATA=change_data(DATA);
 DATA1=(u16)(DATA);
 DATA1=DATA1<<8;
 DATA1=DATA1&0xff00;
 LED_CS=0;
 LED_RS=0;
 LED_WR=0;
 LED_EN=0;
 //delay_ms(1);
 GPIOD->ODR=GPIOD->ODR|DATA1;
 LED_EN=1;
 //delay_ms(1);
 LED_EN=0;
 GPIOD->ODR=GPIOD->ODR&(~DATA1);
 //delay_ms(1);
 LED_CS=1;
}
//寫資料
void transfer_data(u8 DATA)
{
 u16 DATA1;

 DATA=change_data(DATA);
 DATA1=(u16)(DATA);
 DATA1=DATA1<<8;
 DATA1=DATA1&0xff00;
 LED_CS=0;
 LED_RS=1;
 LED_WR=0;
 LED_EN=0;
 //delay_ms(1);
 GPIOD->ODR=GPIOD->ODR|DATA1;
 LED_EN=1;
 //delay_ms(1);
 LED_EN=0;
 GPIOD->ODR=GPIOD->ODR&(~DATA1);
 //delay_ms(1);
 LED_CS=1;
}


//設定地址
void lcd_address(u8 page,u8 column)
{
column=column-1;  //我們平常所說的第1列,在LCD驅動IC裡是第0列。所以在這裡減去1.
page=page-1;
transfer_command(0xb0+page);   //設定頁地址。每頁是8行。一個畫面的64行被分成8個頁。我們平常所說的第1頁,在LCD驅動IC裡是第0頁,所以在這裡減去1
transfer_command(((column>>4)&0x0f)+0x10);//設定列地址的高4位
transfer_command(column&0x0f);//設定列地址的低4位
}




//初始化
void initial_lcd(void)
{
 LED_RST=0;     //低電平復位
 delay_ms(500);
 LED_RST=1;     //復位完畢
 delay_ms(500);
 transfer_command(0xe2); //軟復位
 delay_ms(500);
 transfer_command(0x2f);  //開啟內部升壓
 delay_ms(500);
 
 transfer_command(0x81);//微調對比度
 transfer_command(0x55);//微調對比度的值,可以設定範圍0x00~0xff
 transfer_command(0xeb);//1/9偏壓比
 transfer_command(0xc4);//行列掃描順序,從上到下0xc2
 transfer_command(0xaf);//開顯示
}




//全屏清屏
void clear_screen(void)
{
 u8 i,j;
 for(i=0;i<8;i++)
 {
  lcd_address(1+i,1);
  for(j=0;j<192;j++)
  {
   transfer_data(0x00);
   FEEDDOG();
  }
 }
}


//繪圖19264
void display_graphic_192x64(u8 *dp)
{
 u8 i,j;
 for(i=0;i<8;i++)
 {
  lcd_address(i+1,1);
  for(j=0;j<192;j++)
  {
   FEEDDOG();
   transfer_data(*dp);
   dp++;
  }
 }
}
//顯示16x16點陣影象、漢字、生僻字或16x16點陣的其他圖示
void display_graphic_16x16(u8 page,u8 *dp)
{
 u8 k;
 for(k=1;k<=192;k++)
 {
FEEDDOG();
lcd_address(page,k);
transfer_data(*dp);//寫資料到LCD,每寫完一個8位的資料後列地址自動加1
dp++;
}
}


void display(u8 line)
{
 display_graphic_16x16(2*line+1,show_buff[0]);
 display_graphic_16x16(2*line+2,show_buff[1]);
}


void led_printf(char *buff)
{
 u8 i,j;
 u8 u8Char;
 u16 u16Char;
 u16Char = 0;
 u8Char = 0;
 for(i = 0;i<24;i++)
 {
  if((buff[i] & 0x80) != 0x80) //半形
  {
   u8Char = buff[i];
   u8Char = u8Char - 0x20;
   memcpy(&show_buff[0][i*8],&ascii_table_8x16[u8Char][0],8);
   memcpy(&show_buff[1][i*8],&ascii_table_8x16[u8Char][8],8);
   u16Char = 0;
  }
  else                        //全形
  {
   if(u16Char == 0)
   {
    u16Char = buff[i];
    u16Char = u16Char << 8;
   }
   else
   {
    u16Char = u16Char | (u16)(buff[i]);
    for(j=0;j<=HZ_NO;j++)
    {
     if(HZ_Lookup[j] == u16Char) break;
    }
    u8Char = j;
    memcpy(&show_buff[0][(i-1)*8],&HZ_table_16x16[u8Char][0],8);
    memcpy(&show_buff[0][(i-1)*8+8],&HZ_table_16x16[u8Char][8],8);
    memcpy(&show_buff[1][(i-1)*8],&HZ_table_16x16[u8Char][16],8);
    memcpy(&show_buff[1][(i-1)*8+8],&HZ_table_16x16[u8Char][24],8);
u16Char = 0;
   }
  }
 }
}


//資料反顯
void changge_showbuff(void)
{
 u8 i;
 for(i=0;i<192;i++)
 {
  show_buff[0][i]=~show_buff[0][i];
show_buff[1][i]=~show_buff[1][i];
 }
}

相關推薦

STM32 驅動液晶LCD12864

#include "led.h" #undef APP_DE #include "hawk.h" 液晶採用晶聯訊電子的JLX19264G-260 #define FEEDDOG() GPIOC->ODR^= GPIO_Pin_0 //LCD IO初始化 void LC

stm32驅動LCD12864液晶驅動程式,親測可行,複製直接能用!

廢話不多說,直接貼程式,你自己複製過去即可,免得我通過把工程上傳的方式,你下載還得需要c幣,這個現在很貴呀!!! 就兩個檔案,LCD12864.h和LCD12864.c,自己複製過去後,改一下引腳即可 (如果你連改引腳都不會,那你看來是初初學者,那你自己百度吧),微控制器

stm32驅動ili9486液晶顯示屏

  這是我接手的第一個小專案,也是第一次我寫的程式碼真正排上用場,雖然不超過50行。但遇到的阻礙,我想確實硬體廠商善意的刁難。這個專案最大的收穫是弄清楚我與軟體工程師最大的不同吧!給我職業生涯上的第一個教訓。下面言歸正傳(驅動見51hei論壇附件TFT資料)。   (一)i

STM32驅動ILI9341控制器控制TFTLCD顯示

point 簡化 draw 光標 索引 hit 數字 nbsp 狀態 STM32驅動ILI9341控制器控制TFTLCD顯示 一、用STM32控制TFTLCD顯示的編程方法,在編程驅動TFTLCD液晶顯示器之前,我們先熟悉以下概念: 1、色彩深度,這是一個與TFTL

STM32驅動超聲波模組測距

 HC-SR04超聲波測距模組可提供2cm到400cm的非接觸式距離感測功能,測距精度可達3mm。 一、基本工作原理 (1)給TRIG引腳至少10us的高電平訊號觸發測距。 (2)模組自動傳送8個40KHz的方波,自動檢測是否有訊號返回 (3)有訊號返回,通過Echo引腳輸

STM32驅動舵機

    舵機控制原理: 提供週期為20ms的pwm訊號,調節pwm的佔空比為0.5ms-2.5ms可使舵機從0-180度線性變化 舵機控制程式: 首先我們要利用stm32定時器產生合適週期的pwm輸出訊號,這裡使用的是PWM高階定時器1的CH1(即PA8),可以通過配

stm32驅動16位ADC(ADS1113)

相關原理圖: 其中VDD:     引腳定義: /* * I2C1 * @ADC_SDA PB7 * @ADC_SCL PB6 * @CU_BE_EN PC8 (1 : ON , 0: OFF) * @CU_BE_SELE

STM32驅動NRF24L01

1. 簡介 NRF24L01是 nordic 的無線通訊晶片,它具有以下特點: 1) 2.4G 全球開放的 ISM 頻段(2.400 - 2.4835GHz),免許可證使用; 2)最高工作速率 2Mbps,高校的 GFSK 調製,抗干擾能力強; 3) 125 個

基於STM32驅動2.4G模組除錯之路

/*  * 您好,歡迎您來到2.4G調式的世界  * 調式之路是非常艱辛和枯燥的  * 如果你沒有一鼓作氣的決心和毅力!  * 請不要來調式,時間不會陪您打魚晒網 */ 雙方配置確保一致(地址,資料位長度,通訊頻率等) 請嚴格按照資料的傳送與接收時間來控制(傳送控制時間和接

stm32 驅動 TFT LCD

#include "ili93xx.h" #include "font.h" #define USE_HORIZONTAL 0 //定義是否使用橫屏 //畫筆顏色,背景顏色 u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF; u16 DeviceCode;

【常用晶片】ULN2003工作原理及中文資料(例項:STM32驅動28BYJ48步進電機)

ULN2003的基本介紹ULN2003的概述ULN2003是高耐壓、大電流複合電晶體陣列,由七個矽NPN 複合電晶體組成。一般採用DIP—16 或SOP—16 塑料封裝。ULN2003的主要特點:ULN2003 的每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓

SPI專題(二)——STM32驅動FLASH(W25Q64)

1.硬體連線 W25Q64 將 8M 的容量分為 128 個塊(Block),每個塊大小為 64K 位元組,每個塊又分為 16個扇區(Sector),每個扇區 4K 個位元組。 W25Q64 的最少擦除單位為一個扇區,也就是每次必須擦除 4K 個位元組。操作需

ADIS16203角度感測器的stm32驅動實現要點

一、前言ADIS16203是一款完整的傾斜角測量系統,採用ADI公司的 iSensor™整合技術製造,全部功能均集成於一個緊湊的封裝中。該器件採用嵌入式訊號處理解決方案來增強ADI公司的 iMEMS®感測器技術,可提供適當格式的工廠校準、感測器數字傾斜角資料,從而利用序列外設

HT1621B驅動液晶LCD連線及程式

   硬體連線:微控制器使用stm8s103k的32腳晶片,來驅動HT1621B顯示LCD。    (1)微控制器與HT1621之間只需連線3根線:CS,WR,DATA。    (2)HT1621的VC和vlcd都直接連線的5V電源。    (3)ht1621與LCD之間

stm32驅動3.2寸觸控式螢幕(包括IO模擬,SPI硬體介面)

#ifndef TOUCH_H #define TOUCH_H #define SPI 0 //通過巨集定義來選擇SPI驅動,還是IO口模擬 #include "stm32f10x.h" #include "stm32f10x_rcc.h" #inc

stm32驅動ov7670 資料轉BMP格式再轉JPEG儲存

一.搞了幾天攝像頭終於搞出來了一點成果,本打算用BMP格式儲存讀出的資料但是資料太大達到225k,後來又將BMP資料轉成JPEG格式就小了很多,jpeg是有失真壓縮圖片會變得不那麼清晰。 搞出來的成果: 二.攝像頭小知識:XCLK是輸入攝像頭的時鐘,看別的原理圖接

stm32 驅動DS18B20溫度感測器

#include "temp.h" #defineu8 uint8_t #defineu16 uint16_t #defineu32 uint32_t #define DS18B20_PORT GPIOA #define DS18B20_PIN     GPIO_Pin_1

STM32驅動Marvell 88W8686 WiFi模組程式碼說明(20180129版)

一、概述88W8686是Marvell公司2007年推出的一款SDIO Wi-Fi晶片,使用簡單的SPI或SDIO協議就可以與微控制器連線起來,操作方便,具有建立無密碼或帶有WEP密碼的Ad-Hoc熱點的功能,以及連線無密碼或帶有WEP、WPA/WPA2密碼的路由器的功能。不過有一點要注意,安卓手機預設是不能

STM32驅動直流電機的程式與電路設計(IR2110S自舉電路+H橋+高階定時器和死區PWM)

本文介紹如何使用STM32F103微控制器,通過官方韌體庫,設定高階定時器TIM1輸出嵌入死區的互補PWM,來驅動直流電機的程式設計與電路設計。硬體電路採用IR2110S晶片作為mos管的驅動,驅動IRF840組成的H橋。IR2110S晶片使用中,有一個比較難理

stm32 驅動 觸控式螢幕

由於智慧手機的發展和大螢幕的興起,觸控式螢幕已經得到了廣泛的應用。觸控式螢幕分為兩種:電阻觸屏   俗稱“軟屏”;電容觸屏俗稱“硬屏”。     電阻觸控式螢幕的屏體部分是一塊多層複合薄膜,由一層玻璃或有機玻璃作為基層,表面塗有一層透明的阻性材料組成的導電層(ITO膜),