.h
#ifndef _LCD12864_H_
#define _LCD12864_H_
#include "stm32f10x.h"
#include "sys.h"
typedef struct{
u8 c51 ;
u8 num ;
u8 *dat;
}LCD_InitTypeDef;
#define CS GPIO_Pin_1 //RS
#define SID GPIO_Pin_2 //RW
#define CLK GPIO_Pin_3 //EN
#define PSB GPIO_Pin_4 //串并选择 H并 L串
#define CMD_PROT GPIOA
#define CS_HIGH GPIO_SetBits(CMD_PROT,CS)
#define CS_LOW GPIO_ResetBits(CMD_PROT,CS)
#define SID_HIGH GPIO_SetBits(CMD_PROT,SID)
#define SID_LOW GPIO_ResetBits(CMD_PROT,SID)
#define CLK_HIGH GPIO_SetBits(CMD_PROT,CLK)
#define CLK_LOW GPIO_ResetBits(CMD_PROT,CLK)
#define PSB_HIGH GPIO_SetBits (CMD_PROT,PSB)
#define PSB_LOW GPIO_ResetBits(CMD_PROT,PSB)
#define CMD 0XF8
#define DAT 0XFA
void LCD12864_UserConfig(void);
void LCD12864_Write_Init(void);
void LCD12864_Opne(void);
void LCD12864_Shut(void);
void LCD12864_Write_Cmd_Data(u8 cmd,u8 data);
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure);
void LCD12864_Write_Number(u8 c51,u16 num);
#endif
.c
#include "stm32f10x.h"
#include "Delay.h"
#include "LCD12864.h"
void LCD12864_UserConfig(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = CS|SID|CLK|PSB; //CMD
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(CMD_PROT,&GPIO_InitStructure);
}
void LCD12864_Write_Byte(u8 data){
CS_HIGH;
for(u8 i=0;i<8;i++){ // 1000 0000 << 0 >>
((data<<i)&0x80) ? SID_HIGH:SID_LOW;
CLK_LOW;
CLK_HIGH;
}
CS_LOW;
}
void LCD12864_Write_Cmd_Data(u8 cmd,u8 data){
LCD12864_Write_Byte(cmd);
LCD12864_Write_Byte(data&0xf0);//HIGH 0X38 1000 0000 & 1111 0000 1000 <<4
LCD12864_Write_Byte((data<<4)&0xf0);
Delay_ms(2);
}
void LCD12864_Write_Init(void){
PSB_LOW;
LCD12864_Write_Cmd_Data(CMD,0x30);
LCD12864_Write_Cmd_Data(CMD,0x06);
LCD12864_Write_Cmd_Data(CMD,0x0C);
LCD12864_Write_Cmd_Data(CMD,0x01); //清屏
LCD12864_Write_Cmd_Data(CMD,0x80);
}
void LCD12864_Opne(void){
LCD12864_Write_Cmd_Data(CMD,0x0C);
}
void LCD12864_Shut(void){
LCD12864_Write_Cmd_Data(CMD,0x08);
}
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure){
LCD12864_Write_Cmd_Data(CMD,LCD_InitStructure.c51);
for(u8 i=0;i<LCD_InitStructure.num;i++){
LCD12864_Write_Cmd_Data(DAT,*LCD_InitStructure.dat++);
Delay_ms(200);
}
}
void LCD12864_Write_Number(u8 c51,u16 num){
const u8 number[] = {"0123456789"};
LCD12864_Write_Cmd_Data(CMD,c51);
LCD12864_Write_Cmd_Data(DAT,number[num/1000]); //1314 1
LCD12864_Write_Cmd_Data(DAT,number[num%1000/100]);//1314 3
LCD12864_Write_Cmd_Data(DAT,number[num%100/10]); //1314 1
LCD12864_Write_Cmd_Data(DAT,number[num%100%10]); //1314 4
}
main
#include "stm32f10x.h"
#include "LCD12864.h"
#include "Delay.h"
LCD_InitTypeDef LCD_InitStructure;
int main(void){
LCD12864_UserConfig();
LCD12864_Write_Init();
LCD12864_Opne();
LCD_InitStructure.c51 = 0X80; //0X80-0X8F 16 8
LCD_InitStructure.num = 16;
LCD_InitStructure.dat = (u8*)&"胜日寻芳泗水滨,";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.c51 = 0X90; //0X90-0X9F 16 8
LCD_InitStructure.num = 16;
LCD_InitStructure.dat = (u8*)&"无边光景一时新。";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.c51 = 0X88; //0X88-0X8F 16 8
LCD_InitStructure.num = 16;
LCD_InitStructure.dat = (u8*)&"等闲识得东风面,";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.c51 = 0X98; //0X98-0X9F 16 8
LCD_InitStructure.num = 16;
LCD_InitStructure.dat = (u8*)&"万紫千红总是春。";
LCD12864_Write_Word(LCD_InitStructure);
Delay_ms(500);
LCD12864_Write_Cmd_Data(CMD,0x01);
LCD12864_Write_Number(0x80,1314);//u8 0-255 u16 0-65535
while(1){
for(u8 i=0;i<200;i++){
LCD12864_Write_Number(0x90,i);//u8 0-255 u16 0-65535
Delay_ms(200);
}
}
}
|