Huangwenfeng 发表于 2013-8-27 09:44:28

初学12864显示汉字和曲线,不知如何入手,求高手指点

初学12864显示汉字和曲线,不知如何入手,求高手指点,单片机是stm32f103ze,急急

macaroni 发表于 2013-8-27 13:57:53

/*******************************************************************************
* 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

macaroni 发表于 2013-8-27 14:04:02

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;

macaroni 发表于 2013-8-27 14:04:41

这是240 128 的 凑合着看吧···

Huangwenfeng 发表于 2013-8-27 18:04:12

macaroni 发表于 2013-8-27 14:04 static/image/common/back.gif
这是240 128 的 凑合着看吧···

谢谢,非常感谢

qinshiysb 发表于 2013-10-29 08:51:19

/********************************************************/
/********************************************************/
/****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);
   
}

tlsmf 发表于 2013-10-29 14:00:59

额,代码好长。。。

NEWT 发表于 2013-10-29 17:21:51

12864有好几种,有一种不带字库的默认就是画点的,如果要显示汉字要自己做字模
有一种带字库的默认是显示字,如果想要画点,需要该模式

songshanxiaozi 发表于 2014-5-7 15:11:18

本坛魏坤示波器,有详细的程序可供参考
建议你移植ZLGGUI

marshallemon 发表于 2014-5-7 15:34:34

玩过点阵LED就知道汉字怎么显示了,至于曲线,可以用画点实现,也可以用画线实现

shuiluo2 发表于 2014-5-7 16:33:24

先驱动能显示一个点,再用画曲线的函数和字库来实现

zyj 发表于 2014-5-15 14:48:21

qinshiysb 发表于 2013-10-29 08:51
/********************************************************/
/**************************************** ...

为什么用你的代码 液晶还是不显示串行连接的

tigerman520 发表于 2014-5-28 11:19:43

你的接线方式是什么?驱动程序是否正常。
页: [1]
查看完整版本: 初学12864显示汉字和曲线,不知如何入手,求高手指点