初学12864显示汉字和曲线,不知如何入手,求高手指点
初学12864显示汉字和曲线,不知如何入手,求高手指点,单片机是stm32f103ze,急急 /******************************************************************************** File Name :
* Author :
* Version :
* Date :
* Description :
********************************************************************************
*
*
*
*
*
*
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "LCD.h"
/* Private typedef -----------------------------------------------------------*/
typedef void (*pFunctionr)(void);
typedef uint8_t (*pFunctionw)(void);
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
#define SET_WR GPIO_SetBits(GPIOC,WR)
#define RESET_WR GPIO_ResetBits(GPIOC,WR)
#define SET_CE GPIO_SetBits(GPIOC,CE)
#define RESET_CE GPIO_ResetBits(GPIOC,CE)
#define SET_RD GPIO_SetBits(GPIOC,RD)
#define RESET_RD GPIO_ResetBits(GPIOC,RD)
#define SET_CD GPIO_SetBits(GPIOA,CD)
#define RESET_CD GPIO_ResetBits(GPIOA,CD)
#define SET_RST GPIO_SetBits(GPIOA,RST)
#define RESET_RST GPIO_ResetBits(GPIOA,RST)
#define SET_D0 GPIO_SetBits(GPIOC,D0)
#define RESET_D0 GPIO_ResetBits(GPIOC,D0)
#define SET_D1 GPIO_SetBits(GPIOC,D1)
#define RESET_D1 GPIO_ResetBits(GPIOC,D1)
#define SET_D2 GPIO_SetBits(GPIOC,D2)
#define RESET_D2 GPIO_ResetBits(GPIOC,D2)
#define SET_D3 GPIO_SetBits(GPIOB,D3)
#define RESET_D3 GPIO_ResetBits(GPIOB,D3)
#define SET_D4 GPIO_SetBits(GPIOB,D4)
#define RESET_D4 GPIO_ResetBits(GPIOB,D4)
#define SET_D5 GPIO_SetBits(GPIOB,D5)
#define RESET_D5 GPIO_ResetBits(GPIOB,D5)
#define SET_D6 GPIO_SetBits(GPIOB,D6)
#define RESET_D6 GPIO_ResetBits(GPIOB,D6)
#define SET_D7 GPIO_SetBits(GPIOB,D7)
#define RESET_D7 GPIO_ResetBits(GPIOB,D7)
#define VERTICAL_LENGTH 128
#define VERTICAL_MODULE 16
#define HORIZONTAL_LENGTH 240
#define HORIZONTAL_MODULE 30
#define TextDisRamSize HORIZONTAL_MODULE * VERTICAL_MODULE
#define GrapDisRamSize HORIZONTAL_MODULE * VERTICAL_LENGTH
#define TextRamOffset 0
#define GrapRamOffset HORIZONTAL_MODULE * VERTICAL_LENGTH
#define __Cursor 0x01
#define __CGRAM 0x02
#define __DisBuf 0x04
#define CMDSetAddrPointer 0x20
#define CMDSetTextRamOffset 0x40
#define CMDSetTextRamProperty 0X41
#define CMDSetGrapRamOffset 0x42
#define CMDSetGrapRamProperty 0X43
#define __OR 0x00
#define __XOR 0x01
#define __AND 0x03
#define __Double 0x04
#define CMDSynthetizeRamModel 0x80
#define __EnableCursorFlash 0x01
#define __EnableCursor 0x02
#define __EnableTextDisplay 0x04
#define __EnableGrapDisplay 0x08
#define CMDSetDisplayShape 0x90
#define __OneLine 0x00
#define __TwoLine 0x01
#define __ThreeLine 0x02
#define __FourLine 0x03
#define __Fiveine 0x04
#define __SixLine 0x05
#define __SevenLine 0x06
#define __EightLine 0x07
#define CMDSetCursorModel 0xA0
#define __Write 0x00
#define __Read 0x01
#define __Esc 0x02
#define CMDSetAutoDataTrans 0xB0
#define __WritePlus 0x00
#define __ReadPlus 0x01
#define __WriteSubtract 0x02
#define __ReadSubtract 0x03
#define __WriteNoOffset 0x04
#define __ ReadNoOffset 0x05
#define CMDSetOneTimesDataTrans 0xC0
#define CMDReadOneByteDisRam 0xE0
#define CMDReadOneLineDisRam 0xE8
#define CMDBitWrite 0xF0
#define OneByteTransRdy 0x03
#define AutoWriteTransRdy 0x08
#define AutoReadTransRdy 0x04
/* Private variables ---------------------------------------------------------*/
const uint8_t SetTextRamOffset[] = {TextRamOffset % 256,TextRamOffset >> 8,CMDSetTextRamOffset};
const uint8_t SetTextRamProperty[] = {HORIZONTAL_MODULE % 256,HORIZONTAL_MODULE >> 8,CMDSetTextRamProperty};
const uint8_t SetGrapRamOffset[] = {GrapRamOffset % 256,GrapRamOffset >> 8,CMDSetGrapRamOffset};
const uint8_t SetGrapRamProperty[] = {HORIZONTAL_MODULE % 256,HORIZONTAL_MODULE >> 8,CMDSetGrapRamProperty};
const uint8_t SetSynthetizeRamModel = CMDSynthetizeRamModel | __OR;
const uint8_t SetDisplayShape = CMDSetDisplayShape | //__EnableCursorFlash | __EnableCursor |
__EnableTextDisplay | __EnableGrapDisplay;
const uint8_t SetCursorSetting = CMDSetCursorModel | __TwoLine;
const uint8_t SetAutoTransRead = CMDSetAutoDataTrans | __Read;
const uint8_t SetAutoTransWrite = CMDSetAutoDataTrans | __Write;
const uint8_t SetAutoTransEsc = CMDSetAutoDataTrans | __Esc;
uint8_t SetAddrPointer[] = {0X00,0X00,CMDSetAddrPointer | __DisBuf};
uint8_t SetCursorPointer[] = {0X00,0X00,CMDSetAddrPointer | __Cursor};
uint8_t SetOneTimesDataTrans[] = {0x00,CMDSetOneTimesDataTrans |__WritePlus};
uint8_t TextDisBuf = {0};
uint8_t GrapDisBuf = {0}; //
/* Private function prototypes -----------------------------------------------*/
void SetD0(void)
{GPIO_WriteBit(GPIOC,D0,Bit_SET);}
void ResetD0(void)
{GPIO_WriteBit(GPIOC,D0,Bit_RESET);}
void SetD1(void)
{GPIO_WriteBit(GPIOC,D1,Bit_SET);}
void ResetD1(void)
{GPIO_WriteBit(GPIOC,D1,Bit_RESET);}
void SetD2(void)
{GPIO_WriteBit(GPIOB,D2,Bit_SET);}
void ResetD2(void)
{GPIO_WriteBit(GPIOB,D2,Bit_RESET);}
void SetD3(void)
{GPIO_WriteBit(GPIOB,D3,Bit_SET);}
void ResetD3(void)
{GPIO_WriteBit(GPIOB,D3,Bit_RESET);}
void SetD4(void)
{GPIO_WriteBit(GPIOB,D4,Bit_SET);}
void ResetD4(void)
{GPIO_WriteBit(GPIOB,D4,Bit_RESET);}
void SetD5(void)
{GPIO_WriteBit(GPIOB,D5,Bit_SET);}
void ResetD5(void)
{GPIO_WriteBit(GPIOB,D5,Bit_RESET);}
void SetD6(void)
{GPIO_WriteBit(GPIOB,D6,Bit_SET);}
void ResetD6(void)
{GPIO_WriteBit(GPIOB,D6,Bit_RESET);}
void SetD7(void)
{GPIO_WriteBit(GPIOB,D7,Bit_SET);}
void ResetD7(void)
{GPIO_WriteBit(GPIOB,D7,Bit_RESET);}
uint8_t ReadD0(void) {return (GPIO_ReadInputDataBit(GPIOC,D0) << 0);}
uint8_t ReadD1(void) {return (GPIO_ReadInputDataBit(GPIOC,D1) << 1);}
uint8_t ReadD2(void) {return (GPIO_ReadInputDataBit(GPIOB,D2) << 2);}
uint8_t ReadD3(void) {return (GPIO_ReadInputDataBit(GPIOB,D3) << 3);}
uint8_t ReadD4(void) {return (GPIO_ReadInputDataBit(GPIOB,D4) << 4);}
uint8_t ReadD5(void) {return (GPIO_ReadInputDataBit(GPIOB,D5) << 5);}
uint8_t ReadD6(void) {return (GPIO_ReadInputDataBit(GPIOB,D6) << 6);}
uint8_t ReadD7(void) {return (GPIO_ReadInputDataBit(GPIOB,D7) << 7);}
const pFunctionr wpl = {ResetD0,ResetD1,ResetD2,ResetD3,ResetD4,ResetD5,ResetD6,ResetD7};
const pFunctionr wph = {SetD0,SetD1,SetD2,SetD3,SetD4,SetD5,SetD6,SetD7};
pFunctionr wp = {ResetD0,ResetD1,ResetD2,ResetD3,ResetD4,ResetD5,ResetD6,ResetD7};
const pFunctionw rp= {ReadD0,ReadD1,ReadD2,ReadD3,ReadD4,ReadD5,ReadD6,ReadD7};
/* Private functions ---------------------------------------------------------*/
uint8_t ReadDataBus(void)
{
uint8_t data = 0;
uint8_t index = 0;
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = D0 | D1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = D2 | D3 | D4 | D5| D6 | D7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
for (index = 0; index < 8;index++)
{
data |= rp();
}
return data;
}
void WriteDataBus(uint8_t data)
{
uint8_t index = 0;
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = D0 | D1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = D2 | D3 | D4 | D5| D6 | D7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
for(index = 0;index < 8;index++)
{
wp = (0x01 << index) & data ? wph : wpl;
}
for(index = 0;index < 8;index++)
{
wp();
}
}
uint8_t GetStatusBit()
{
uint8_t temp = 0;
SET_CD;
RESET_RD;
SET_WR;
RESET_CE;
temp = ReadDataBus();
SET_CE;
SET_CD;
SET_RD;
SET_WR;
return temp;
}
void WriteData(uint8_t data)
{
while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
WriteDataBus(data);
RESET_CD;
SET_RD;
RESET_WR;
RESET_CE;
RESET_CE;
SET_CE;
SET_CD;
SET_RD;
SET_WR;
while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
}
void WriteCMD(uint8_t data)
{
while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
WriteDataBus(data);
SET_CD;
SET_RD;
RESET_WR;
RESET_CE;
RESET_CE;
SET_CE;
SET_CD;
SET_RD;
SET_WR;
while((GetStatusBit() & OneByteTransRdy) != OneByteTransRdy);
}
void AutoReadData(uint8_t *p,uint16_t len)
{
uint8_t temp = 0;
WriteCMD(SetAutoTransRead);
while(len-- != 0)
{
while((GetStatusBit() & AutoReadTransRdy) != AutoReadTransRdy);
RESET_CD;
SET_WR;
RESET_RD;
RESET_CE;
temp = ReadDataBus();
*p++ = temp;;
SET_CE;
SET_CD;
SET_RD;
SET_WR;
}
while((GetStatusBit() & AutoReadTransRdy) != AutoReadTransRdy);
WriteCMD(SetAutoTransEsc);
}
void AutoWriteData(uint8_t *p,uint16_t len)
{
WriteCMD(SetAutoTransWrite);
while(len-- != 0)
{
while((GetStatusBit() & AutoWriteTransRdy) != AutoWriteTransRdy);
WriteDataBus(*p++);
RESET_CD;
SET_RD;
RESET_WR;
RESET_CE;
RESET_CE;
SET_CE;
SET_CD;
SET_RD;
SET_WR;
}
while((GetStatusBit() & AutoWriteTransRdy) != AutoWriteTransRdy);
WriteCMD(SetAutoTransEsc);
}
void WriteOneByte(uint8_t data)
{
}
void LCDZeroInit(void)
{
uint16_t index = 0;
/* clr text buffer */
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = TextRamOffset >> 8;
SetAddrPointer = TextRamOffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
for (index = 0;index < TextDisRamSize;index++)
TextDisBuf = 0x00;
AutoWriteData(TextDisBuf,TextDisRamSize);
#ifdef LCD_USER_DEBUG
/* set text buffer */
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = TextRamOffset >> 8;
SetAddrPointer = TextRamOffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
for (index = 0;index < TextDisRamSize;index++)
TextDisBuf = 0x01;
AutoWriteData(TextDisBuf,TextDisRamSize);
/* read text buffer */
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = TextRamOffset >> 8;
SetAddrPointer = TextRamOffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
for (index = 0;index < TextDisRamSize;index++)
TextDisBuf = 0x00;
AutoReadData(TextDisBuf,TextDisRamSize);
for (index = 0;index < TextDisRamSize;index++)
if (TextDisBuf != 0x01)
while(1);
#endif
/* clr grap buffer */
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = GrapRamOffset >> 8;
SetAddrPointer = GrapRamOffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
for (index = 0;index < GrapDisRamSize;index++)
GrapDisBuf = 0x00;
AutoWriteData(GrapDisBuf,GrapDisRamSize);
#ifdef LCD_USER_DEBUG
/* set grap buffer */
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = GrapRamOffset >> 8;
SetAddrPointer = GrapRamOffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
for (index = 0;index < GrapDisRamSize;index++)
GrapDisBuf = 0x81;
AutoWriteData(GrapDisBuf,GrapDisRamSize);
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = GrapRamOffset >> 8;
SetAddrPointer = GrapRamOffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
for (index = 0;index < GrapDisRamSize;index++)
GrapDisBuf = 0x00;
AutoReadData(GrapDisBuf,GrapDisRamSize);
for (index = 0;index < GrapDisRamSize;index++)
if (GrapDisBuf != 0x81)
while(1);
#endif
}
void LCDInit(void)
{
uint32_t index = 0;
for (index = 0;index < 500000;index++)
RESET_RST;
for (index = 0;index < 500000;index++)
SET_RST;
WriteData(SetTextRamOffset);
WriteData(SetTextRamOffset);
WriteCMD(SetTextRamOffset);
WriteData(SetTextRamProperty);
WriteData(SetTextRamProperty);
WriteCMD(SetTextRamProperty);
WriteData(SetGrapRamOffset);
WriteData(SetGrapRamOffset);
WriteCMD(SetGrapRamOffset);
WriteData(SetGrapRamProperty);
WriteData(SetGrapRamProperty);
WriteCMD(SetGrapRamProperty);
WriteCMD(SetSynthetizeRamModel);
WriteCMD(SetDisplayShape);
WriteCMD(SetCursorSetting);
// SetCursorPointer = CMDSetAddrPointer | __Cursor;
// SetCursorPointer = 0x00;//GrapRamOffset >> 8;
// SetCursorPointer = 0x00;//GrapRamOffset % 256;
// WriteData(SetCursorPointer);
// WriteData(SetCursorPointer);
// WriteCMD(SetCursorPointer);
LCDZeroInit();
}
void ReadGrapRam(LCDData *data)
{
uint8_t col_index = 0;
uint8_t row_index = 0;
uint16_t index = 0;
uint8_t src_bit = 0;
uint8_t src_byte = 0;
uint8_t des_bit = 0;
for (row_index = 0;row_index < data->heigth;row_index++)
{
for (col_index = 0;col_index < data->width;col_index++)
{
index = (data->x_pixel + col_index) / 8 + (row_index + data->y_pixel) * HORIZONTAL_MODULE;
src_byte = *(GrapDisBuf + index );
src_bit= (src_byte & (0x80 >> ((data->x_pixel + col_index) % 8)))? 0x80 : 0x00;
des_bit= src_bit >> (col_index % 8);
*(data->data + (col_index + row_index * data->width) / 8) |= (uint8_t)des_bit;
}
}
}
void WriteGrapRam(LCDData *data)
{
uint8_t col_index = 0;
uint8_t row_index = 0;
uint16_t index = 0;
uint8_t src_bit = 0;
uint8_t src_byte = 0;
uint8_t des_bit = 0;
for (row_index = 0;row_index < data->heigth;row_index++)
{
for (col_index = 0;col_index < data->width;col_index++)
{
index = (data->x_pixel + col_index) / 8 + (row_index + data->y_pixel) * HORIZONTAL_MODULE;
src_byte = *(data->data + (col_index + row_index * data->width) / 8 );
src_bit= (src_byte & (0x80 >> ((col_index + row_index * data->width) % 8))) ? 0x80 : 0x00;
des_bit= src_bit >> (data->x_pixel + col_index) % 8;
GrapDisBuf |= (uint8_t)des_bit;
}
}
}
void ClrGrapRam(LCDData *data)
{
uint8_t col_index = 0;
uint8_t row_index = 0;
uint16_t index = 0;
/* clr grap ram */
for (row_index = 0;row_index < data->heigth;row_index++)
{
index = (row_index + data->y_pixel) * HORIZONTAL_MODULE;
GrapDisBuf &= (~(0xFF >> (data->x_pixel % 8)));
GrapDisBuf &=(0xFF >> (data->x_pixel + data->width) % 8);
for (col_index = data->x_pixel / 8 + 1;col_index < (data->x_pixel + data->width) / 8;col_index++)
{
GrapDisBuf = 0;
}
}
}
void CopyClrGrapRam(LCDData *srcdata,LCDData* dstdata)
{
}
void RefurbishLCD(LCDData *data)
{
uint8_t index = 0;
uint8_t length = 0;
uint32_t ramoffset = 0;
uint32_t bufoffset = 0;
for (index = 0;index < data->heigth;index++)
{
if ((data->x_pixel) % 8 == 0 && (data->width) % 8 == 0)
{
bufoffset = data->x_pixel / 8 + (data->y_pixel + index) * HORIZONTAL_MODULE;
ramoffset = GrapRamOffset + bufoffset;
length = data->width / 8;
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = ramoffset >> 8;
SetAddrPointer = ramoffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
AutoWriteData(GrapDisBuf + bufoffset,length);
}
else
{
bufoffset = ((data->x_pixel - (data->x_pixel % 8)) / 8) + (data->y_pixel + index) * HORIZONTAL_MODULE;
ramoffset = GrapRamOffset + bufoffset;
length = ((data->x_pixel + data->width) - ((data->x_pixel + data->width) % 8) + 8) / 8 - (data->x_pixel - (data->x_pixel % 8)) / 8;
SetAddrPointer = CMDSetAddrPointer | __DisBuf;
SetAddrPointer = ramoffset >> 8;
SetAddrPointer = ramoffset % 256;
WriteData(SetAddrPointer);
WriteData(SetAddrPointer);
WriteCMD(SetAddrPointer);
AutoWriteData(GrapDisBuf + bufoffset,length);
}
}
}
#ifdef USER_DEBUG
void CheckGrapRam(void)
{
LCDData __data;
__data.x_pixel = 0;
__data.y_pixel = 0;
__data.width = 240;
__data.heigth= 128;
RefurbishLCD(&__data);
}
#endif
typedef __packed struct LCDDataTag
{
/* 页面关系 */
uint16_t net;
/* 数据区 */
uint8_t x_pixel;
uint8_t y_pixel;
uint8_t width;
uint8_t heigth;
uint8_t* data;
}LCDData; 这是240 128 的 凑合着看吧···
macaroni 发表于 2013-8-27 14:04 static/image/common/back.gif
这是240 128 的 凑合着看吧···
谢谢,非常感谢 /********************************************************/
/********************************************************/
/****12864驱动程序头文件********************/
/********************************************************/
/********************************************************/
#ifndef __LCD_12864_H
#define __LCD_12864_H
/********************************************************/
/********************************************************/
#include "stm32f10x.h"
/********************************************************/
/********************************************************/
#define UP 1
#define DOWN 0
/********************************************************/
/********************************************************/
/*液晶数据端口定义PD口*/
//#define LCD_DATA GPIOD
/********************************************************/
/********************************************************/
/*液晶端口定义*/
#define LCD_CS(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_10);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define LCD_SID(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_11);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define LCD_SCLK(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_12);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_12)
#define LCD_PSB(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_Pin_13);\
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_13)
//#define LCD_RST(a) if (a) \
// GPIO_SetBits(GPIOE,GPIO_Pin_11);\
// else \
// GPIO_ResetBits(GPIOE,GPIO_Pin_11)
/********************************************************/
/***12864驱动文件****************/
/********************************************************/
/********************************************************/
#include"lcd_12864.h"
#include "SYSTICK.h"
/********************************************************/
/********************************************************/
const unsigned char table1[]=" ADC值:";
const unsigned char table2[]="电压值:";
extern u16 adc,adc1;
u8 qian,bai,shi,ge;
u8 ADC_0,ADC_1,ADC_2,ADC_3,ADC_4;
/********************************************************/
/********************************************************/
/*LCD管脚配置*/
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIO的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);
/*选择要用的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/********************************************************/
/********************************************************/
/*以串行协议发送数据*/
void send_bit(u8 byte)
{
u8 x;
for(x=0;x<8;x++)
{
if((byte<<x)&0x80)
{
LCD_SID(UP);
}
else
{
LCD_SID(DOWN);
}
LCD_SCLK(DOWN);
LCD_SCLK(UP);
}
delay_ms(5);
}
/********************************************************/
/********************************************************/
/*写指令函数*/
void write_command(u8 command)
{
LCD_CS(UP);
send_bit(0xf8);
send_bit((u32)command&0xf0);
send_bit(((u32)command<<4)&0xf0);
delay_ms(5);
LCD_CS(DOWN);
}
/********************************************************/
/********************************************************/
/*液晶写数据功能函数函数*/
void write_data(const u8 Data)
{
LCD_CS(UP);
send_bit(0xfa);
send_bit((u32)Data&0xf0);
send_bit(((u32)Data<<4)&0xf0);
delay_ms(5);
LCD_CS(DOWN);
}
/********************************************************/
/********************************************************/
/* 显示字符串 */
void write_zi( u8 *S)
{
while(*S!='\0')
{
write_data(*S);
S++;
delay_ms(5);
}
}
/********************************************************/
/********************************************************/
/*在指定位置写入字符串*/
void write_character(u8 address,const u8 *p)
{
write_command(address);
delay_ms(5);
while(*p!='\0')
{
write_data(*p);
p++;
delay_ms(5);
}
}
/********************************************************/
void lcd_pos(u8 X,u8 Y) //液晶地址设置
{
u8 pos;
if(X==0)
{X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
write_command(pos);
}
/********************************************************/
/*LCD 初始化设定*/
void LCD_init(void)
{
LCD_PSB(DOWN);
write_command(0x30);//设置8位数据接口模式,基本指令操作模式
delay_ms(1);
write_command(0x0c);//开显示,关光标,反白关
delay_ms(1);
write_command(0x01); //写入空格清屏
delay_ms(1);
write_command(0x06);//游标及显示右移一位
delay_ms(1);
}
void display_adc(void)
{
qian=adc/1000;
bai=adc%1000/100;
shi=adc%100/10;
ge=adc%10;
ADC_0=adc1/10000;
ADC_1=adc1%10000/1000;
ADC_2=adc1%1000/100;
ADC_3=adc1%100/10;
ADC_3=adc1%10;
write_character(0x80,table1);
delay_ms(10);
lcd_pos(0,4);
write_data(qian+0x30);
write_data(bai+0x30);
write_data(shi+0x30);
write_data(ge+0x30);
write_character(0x88,table2);
delay_ms(10);
lcd_pos(2,4);
write_data(ADC_0+0x30);
write_zi(".");
write_data(ADC_1+0x30);
write_data(ADC_2+0x30);
write_data(ADC_3+0x30);
write_data(ADC_4+0x30);
}
额,代码好长。。。 12864有好几种,有一种不带字库的默认就是画点的,如果要显示汉字要自己做字模
有一种带字库的默认是显示字,如果想要画点,需要该模式 本坛魏坤示波器,有详细的程序可供参考
建议你移植ZLGGUI 玩过点阵LED就知道汉字怎么显示了,至于曲线,可以用画点实现,也可以用画线实现 先驱动能显示一个点,再用画曲线的函数和字库来实现 qinshiysb 发表于 2013-10-29 08:51
/********************************************************/
/**************************************** ...
为什么用你的代码 液晶还是不显示串行连接的 你的接线方式是什么?驱动程序是否正常。
页:
[1]