欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
從51上修改而來(lái),基于stm32f103,帶字庫(kù)LCD12864液晶的驅(qū)動(dòng)程序,串行和并行都有
[打印本頁(yè)]
作者:
qur泉
時(shí)間:
2017-9-9 15:36
標(biāo)題:
從51上修改而來(lái),基于stm32f103,帶字庫(kù)LCD12864液晶的驅(qū)動(dòng)程序,串行和并行都有
從51單片機(jī)平臺(tái)上修改而來(lái)的帶字庫(kù)LCD12864液晶的驅(qū)動(dòng)程序,串行和并行都有,各個(gè)函數(shù)均帶有注釋。親測(cè)可用,使用時(shí)注意修改宏定義里對(duì)管腳的定義以及引腳初始化程序
單片機(jī)源程序如下:
#include <stm32f10x.h>
#include "12864.h"
#include "delay.h"
void LCD12864_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
delay_init();
/*--------------------LCD基本指令-----------------------*/
delay_ms(2);
Write_LCD_Command(0x30); //30--基本指令動(dòng)作
delay_ms(2);
Write_LCD_Command(0x0c); //光標(biāo)右移畫(huà)面不動(dòng)
delay_ms(2);
Write_LCD_Command(0x01); //清屏
delay_ms(5); //清屏?xí)r間較長(zhǎng)
Write_LCD_Command(0x06); //顯示打開(kāi),光標(biāo)開(kāi),反白關(guān)
delay_ms(2);
Draw_Clear(); // 清屏
}
/*********************************************************
函數(shù)名:Send_Byte()
返回值:無(wú)
功 能: 寫(xiě)數(shù)據(jù)到LCD
*********************************************************/
void Send_Byte(u8 zdata)
{
u16 i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
SID_H;
else
SID_L;
SCLK_H;
SCLK_L;
}
}
/*********************************************************
函數(shù)名:Receive_Byte()
返回值:temp1+temp2
功 能: 讀LCD數(shù)據(jù)
*********************************************************/
u8 Receive_Byte(void)
{
u8 i,temp1,temp2,value;
temp1=0;
temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
SCLK_L;
SCLK_H;
SCLK_L;
if(PAout(7)==1)
{
temp1++;
}
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
SCLK_L;
SCLK_H;
SCLK_L;
if(PAout(7)==1)
{
temp2++;
}
}
temp1=0xf0&temp1;
temp2=0x0f&temp2;
value=temp1+temp2;
return value ;
}
/*********************************************************
函數(shù)名:Check_Busy()
返回值:無(wú)
功 能: LCD忙檢查
*********************************************************/
void Check_Busy(void)
{
do
Send_Byte(0xfc); //11111,RW(1),RS(0),0
while(0x80&Receive_Byte());
}
/*********************************************************
函數(shù)名: Write_LCD_Command()
返回值:無(wú)
功 能: 寫(xiě)命令到LCD
*********************************************************/
void Write_LCD_Command(u8 cmdcode)
{
CS_H;
Check_Busy();
Send_Byte(0xf8);
Send_Byte(cmdcode & 0xf0);
Send_Byte((cmdcode << 4) & 0xf0);
delay_ms(2);
CS_L;
}
/*********************************************************
函數(shù)名: Write_LCD_Data()
返回值:無(wú)
功 能: 寫(xiě)顯示內(nèi)容到LCD
*********************************************************/
void Write_LCD_Data(u8 Dispdata)
{
CS_H;
Check_Busy();
Send_Byte(0xfa); //11111,RW(0),RS(1),0
Send_Byte(Dispdata & 0xf0);
Send_Byte((Dispdata << 4) & 0xf0);
delay_ms(2);
CS_L;
}
/*********************************************************
函數(shù)名: Read_LCD_Data()
返回值:LCD收到的數(shù)據(jù)
功 能: 讀取LCD顯示內(nèi)容
*********************************************************/
u8 Read_Data(void)
{
Check_Busy();
Send_Byte(0xfe); //11111,RW(1),RS(1),0 LCD->MCU
return Receive_Byte();
}
/*********************************************************
函數(shù)名: LCD_Clear_Txt
返回值:無(wú)
功 能: 文本區(qū)清除
*********************************************************/
void LCD_Clear_TXT( void )
{
u8 i;
Write_LCD_Command(0x30); //8BitMCU,基本指令集合
Write_LCD_Command(0x80); //AC歸起始位
for(i=0;i<64;i++)
{
Write_LCD_Data(0x20);
}
}
/*********************************************************
函數(shù)名: LCD_Clear_BMP
返回值:無(wú)
功 能: 圖片區(qū)清除
*********************************************************/
void LCD_Clear_BMP( void )
{
u8 i,j;
Write_LCD_Command(0x34); //8Bit擴(kuò)充指令集,即使是36H也要寫(xiě)兩次
Write_LCD_Command(0x36); //繪圖ON,基本指令集里面36H不能開(kāi)繪圖
for(i=0;i<32;i++) //12864實(shí)際為256x32
{
Write_LCD_Command(0x80|i); //行位置
Write_LCD_Command(0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
Write_LCD_Data(0);
}
}
/*********************************************************
函數(shù)名: Display_LCD_Pos
返回值:無(wú)
功 能:設(shè)置顯示位置
*********************************************************/
void Display_LCD_Pos(u8 x,u8 y)
{
u8 pos;
switch(x)
{
case 0: x=0x80;break;
case 1: x=0x90;break;
case 2: x=0x88;break;
case 3: x=0x98;break;
}
pos=x+y;
Write_LCD_Command(pos);
}
/*********************************************************
函數(shù)名:Display_LCD_String()
返回值:無(wú)
功 能:顯示字符串
*********************************************************/
void Display_LCD_String(u8 *s)
{
while(*s != '\0')
{
Write_LCD_Data(*s);
s++;
delay_ms(2); //控制每一個(gè)字符之間顯示的時(shí)間 間隔
}
}
/*************************************************************
* 函數(shù)名稱 :PutBMP
**************************************************************/
void PutBMP(const u8 *puts)
{
u16 x=0;
u8 i,j;
Write_LCD_Command(0x34); //8Bit擴(kuò)充指令集,即使是36H也要寫(xiě)兩次
Write_LCD_Command(0x36); //繪圖ON,基本指令集里面36H不能開(kāi)繪圖
for(i=0;i<32;i++) //12864實(shí)際為256x32
{
Write_LCD_Command(0x80|i); //行位置
Write_LCD_Command(0x80); //列位置
for(j=0;j<16;j++) //256/8=32 byte
{ //列位置每行自動(dòng)增加
Write_LCD_Data(puts[x]);
x++;
}
}
for(i=0;i<32;i++) //12864實(shí)際為256x32
{
Write_LCD_Command(0x80|i); //行位置
Write_LCD_Command(0x88); //列位置
for(j=0;j<16;j++) //256/8=32 byte
{ //列位置每行自動(dòng)增加
Write_LCD_Data(puts[x]);
x++;
}
}
}
void PHO_Display(const u8 *s)
{
u8 COUNT3 = 0X02,COUNT1,COUNT2,LCD_X = 0X80,LCD_Y;
for (;COUNT3 != 0;COUNT3 --)
{
LCD_Y = 0X80;
COUNT2 = 0X20;
for(;COUNT2 != 0;COUNT2 --)
{
//COUNT1 = 0X10;//全屏
COUNT1 = 0X08;//半屏
Write_LCD_Command(0x34);
Write_LCD_Command(LCD_Y);
Write_LCD_Command(LCD_X);
Write_LCD_Command(0x30);
for (;COUNT1 != 0;COUNT1 --)
{
Write_LCD_Data(*s ++);
}
LCD_Y += 1;
}
LCD_X = 0X88;
}
Write_LCD_Command(0x36);
Write_LCD_Command(0x30);
}
/*-------------------------------------------------
LCD顯示緩存
--------------------------------------------------*/
u16 LCD12864_Buffer[64][16] = {0};
const u8 m_ch4x5[][6] =
{
{0x06,0x09,0x09,0x09,0x06,5}, // 0,字符寬度5點(diǎn)陣
{0x02,0x06,0x02,0x02,0x07,5}, // 1
{0x06,0x09,0x02,0x04,0x0F,5}, // 2
{0x06,0x09,0x02,0x09,0x06,5}, // 3
{0x02,0x06,0x0A,0x0F,0x02,5}, // 4
{0x0E,0x08,0x0E,0x01,0x0E,5}, // 5
{0x06,0x08,0x0E,0x09,0x06,5}, // 6
{0x0F,0x01,0x02,0x04,0x04,5}, // 7
{0x06,0x09,0x06,0x09,0x06,5}, // 8
{0x06,0x09,0x07,0x01,0x06,5}, // 9
{0x00,0x00,0x00,0x00,0x01,2}, // .
{0x00,0x01,0x00,0x01,0x00,2}, // :
{0x00,0x00,0x00,0x00,0x00,5}, // 空格
};
/*------------------------------------------------------------------------------
功能:畫(huà)點(diǎn)
參數(shù):
x:橫坐標(biāo)
y:縱坐標(biāo)
color:顏色,0不顯示,1顯示
------------------------------------------------------------------------------*/
const u16 DrawDotsTable[] = {0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001};
void Draw_Dots(u8 x, u8 y, u8 color)
{
u8 i0, y0;
u16 value;
// 獲得坐標(biāo)
if ( y >= 32 )
{
y0 = y-32;
i0 = x/16+8;
}
else
{
y0 = y;
i0 = x/16;
}
value = DrawDotsTable[x%16];
if (color == 0)
{
LCD12864_Buffer[y0][i0] &= ~value;
}
else
{
LCD12864_Buffer[y0][i0] |= value;
}
}
/*------------------------------------------------------------------------------
功能:刷新顯示
------------------------------------------------------------------------------*/
void Draw_Update(void)
{
u8 x, y;
for (y=0; y<64; y++)
{
Write_LCD_Command(0x80|y);
Write_LCD_Command(0x80);
for (x=0; x<16; x++)
{
Write_LCD_Data(LCD12864_Buffer[y][x]>>8);
Write_LCD_Data(LCD12864_Buffer[y][x]);
}
}
}
/*------------------------------------------------------------------------------
功能:顯示清屏
------------------------------------------------------------------------------*/
void Draw_Clear(void)
{
u8 x, y;
for (y=0; y<64; y++)
{
for (x=0; x<16; x++)
{
LCD12864_Buffer[y][x] = 0;
}
}
}
/*------------------------------------------------------------------------------
功能:顯示4*5字符
參數(shù):
x:寫(xiě)出橫坐標(biāo)
y:寫(xiě)出縱坐標(biāo)
value:字符
------------------------------------------------------------------------------*/
void Draw_Char4x5(u8 x, u8 y, u8 value)
{
u8 i, j, p, z, a;
a = m_ch4x5[value][5];
for (i=0; i<5; i++)
{
p = 0x10>>(5-a);
for (j=0; j<a; j ++)
{
z = m_ch4x5[value][i];
if ( z & p )
{
Draw_Dots(j+x, i+y, 1);
}
p >>= 1;
}
}
}
/*--------------------------------------------------------
功能:顯示一行4*5字符
參數(shù):
x:寫(xiě)出橫坐標(biāo)
y:寫(xiě)出縱坐標(biāo)
value:字符串
len:長(zhǎng)度
---------------------------------------------------------*/
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
12864.rar
(6.83 KB, 下載次數(shù): 368)
2017-9-9 15:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
yezhongmang
時(shí)間:
2018-6-4 22:15
這程序?qū)懙糜悬c(diǎn)奇怪,注釋不太完整
作者:
hengfeb
時(shí)間:
2018-6-5 16:46
感謝分享
作者:
jiangkeqin_sy
時(shí)間:
2018-6-17 17:10
下載看看
作者:
lyjbbc
時(shí)間:
2018-7-14 08:58
來(lái)看看
作者:
609763691
時(shí)間:
2018-9-13 20:41
就是請(qǐng)問(wèn)一下,你的那個(gè)PAout(7)這是什么管腳哦,是它等于1的作用是什么,還要就是我在寫(xiě)串行的時(shí)候,我去掉忙函數(shù)之后沒(méi)什么影響,但是stm32在寫(xiě)并行的時(shí)候沒(méi)寫(xiě)忙函數(shù)出現(xiàn)了一些問(wèn)題
作者:
小螞蟻123
時(shí)間:
2019-4-23 20:03
下來(lái)試試,好用回來(lái)追評(píng)
作者:
1653359726
時(shí)間:
2019-7-20 20:41
感覺(jué)挺怪的
作者:
莊周的小燕
時(shí)間:
2019-7-21 12:39
感謝分享!
作者:
348565004
時(shí)間:
2019-12-31 12:00
謝謝!!!!參考一下!
作者:
lyMarvin
時(shí)間:
2020-2-6 10:23
學(xué)習(xí)分享!!!
作者:
htzsz
時(shí)間:
2020-2-19 21:23
謝謝分享,學(xué)習(xí)學(xué)習(xí)!
作者:
特別的旋律
時(shí)間:
2021-7-11 19:14
怎么沒(méi)看到主函數(shù)
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1