中级会员
 
- 积分
- 408
- 金钱
- 408
- 注册时间
- 2016-1-28
- 在线时间
- 72 小时
|

楼主 |
发表于 2016-1-30 15:48:21
|
显示全部楼层
#include "stm32f10x.h"
#include "delay.h"
#include "display12864.h"
#define u16 unsigned short
#define u8 unsigned char
#define DisIOA GPIOA
#define DisIOB GPIOB
#define DisIOC GPIOC
#define DisClkA RCC_APB2Periph_GPIOA
#define DisClkB RCC_APB2Periph_GPIOB
#define DisClkC RCC_APB2Periph_GPIOC
#define DataA GPIO_Pin_8|GPIO_Pin_9
#define DataB GPIO_Pin_14|GPIO_Pin_15
#define DataC GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9
#define RS GPIO_Pin_12 //PA12
#define RW GPIO_Pin_11 //PA11
#define EN GPIO_Pin_10 //PA10
#define PSB GPIO_Pin_13 //PB13
/*********************************************/
GPIO_InitTypeDef GPIOStru;
void IOInitOut(void)
{
GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = DataA|EN|RW|RS;
RCC_APB2PeriphClockCmd(DisClkA,ENABLE);
GPIO_Init(DisIOA,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = PSB|DataB;
RCC_APB2PeriphClockCmd(DisClkB,ENABLE);
GPIO_Init(DisIOB,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = DataC;
RCC_APB2PeriphClockCmd(DisClkC,ENABLE);
GPIO_Init(DisIOC,&GPIOStru);
}
void IOInitIn(void)
{
GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = DataA|RS|RW|EN;
RCC_APB2PeriphClockCmd(DisClkA,ENABLE);
GPIO_Init(DisIOA,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = PSB|DataB;
RCC_APB2PeriphClockCmd(DisClkB,ENABLE);
GPIO_Init(DisIOB,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = DataC;
RCC_APB2PeriphClockCmd(DisClkC,ENABLE);
GPIO_Init(DisIOC,&GPIOStru);
}
void WaitBusy(void)
{
IOInitIn();
GPIO_ResetBits(DisIOA,RS); //RS = 0.
GPIO_SetBits(DisIOA,RW); //RW = 1.
GPIO_SetBits(DisIOA,EN); //EN = 1.
while(GPIO_ReadInputData(DisIOB) & 0x4000);
GPIO_ResetBits(DisIOA,EN); //EN = 0;
IOInitOut();
}
void WriteCmd(u8 cmd)
{
u8 cmdB,cmdB1;
u8 cmdC,cmdC1;
u8 cmdA,cmdA1;
cmdB1=cmd & 0xC0;
cmdB=(cmdB1<<1) | ((cmdB1 & 0x80)>>1);
cmdC1=cmd & 0x3C;
cmdC=((cmdC1 &0x04)<<3) | ((cmdC1 &0x08)<<1) | ((cmdC1 &0x10)>>1) | ((cmdC1 &0x20)>>3);
cmdA1=cmd & 0x03;
cmdA=(cmdA1>>1) | ((cmdA1&0x01)<<1);
WaitBusy();
GPIO_ResetBits(DisIOA,RS); //RS = 0.
GPIO_ResetBits(DisIOA,RW); //RW = 0.
GPIO_SetBits(DisIOA,EN); //EN = 1.
DisIOB->ODR=((DisIOB->ODR & 0x3FFF)| (cmdB<<8));
DisIOC->ODR=((DisIOC->ODR & 0xFc3F)| (cmdC<<4));
DisIOA->ODR=((DisIOA->ODR & 0xFCFF)|(cmdA<<8));
delay_ms(2);
GPIO_ResetBits(DisIOA,EN); //EN = 0;
delay_ms(2);
GPIO_SetBits(DisIOA,EN);
}
void WriteData(u8 data)
{
u8 dataB,dataB1;
u8 dataC,dataC1;
u8 dataA,dataA1;
dataB1=data & 0xC0;
dataB=(dataB1<<1) | ((dataB1 & 0x80)>>1);
dataC1=data & 0x3C;
dataC=((dataC1 &0x04)<<3) | ((dataC1 &0x08)<<1) | ((dataC1 &0x10)>>1) | ((dataC1 &0x20)>>3);
dataA1=data & 0x03;
dataA=(dataA1>>1) | ((dataA1&0x01)<<1);
WaitBusy();
GPIO_SetBits(DisIOA,RS); //RS = 1.
GPIO_ResetBits(DisIOA,RW); //RW = 0.
GPIO_SetBits(DisIOA,EN); //EN = 1.
DisIOB->ODR=((DisIOB->ODR & 0x3FFF)| (dataB<<8));
DisIOC->ODR=((DisIOC->ODR & 0xFc3F)| (dataC<<4));
DisIOA->ODR=((DisIOA->ODR & 0xFCFF)|(dataA<<8));
delay_ms(2);
GPIO_ResetBits(DisIOA,EN); //EN = 0;
delay_ms(2);
GPIO_SetBits(DisIOA,EN);
}
void InitDis(void)
{
IOInitOut();
delay_init(8);
GPIO_SetBits(DisIOB,PSB);
delay_ms(2);
WriteCmd(0x34);
delay_ms(2);
WriteCmd(0x30);
delay_ms(2);
WriteCmd(0x0c);
delay_ms(2);
WriteCmd(0x01);
delay_ms(2);
WriteCmd(0x04);
delay_ms(2);
WriteCmd(0x80);
delay_ms(2);
}
void DisStr(u8 *s)
{
while(*s != '\0')
{
WriteData(*s);
s++;
delay_ms(2);
}
}
void DisInt(long int num)
{
u8 temp[17];
u8 str[17];
int i=0,j=0;
while(num != 0)
{
temp[i] = (num%10)+0x30;
num/=10;
i++;
}
i--;
while(i != -1)
{
str[j] = temp[i];
j++;
i--;
}
str[j]='\0';
DisStr(str);
}
void DisFloat(float fnum)
{
long int num = fnum*10000;
u8 temp[17];
u8 str[17];
int i=0,j=0;
while(num != 0)
{
temp[i] = (num%10)+0x30;
num/=10;
i++;
if(i == 4)
{
temp[i] = '.';
i++;
}
}
i--;
while(i != -1)
{
str[j] = temp[i];
j++;
i--;
}
str[j]='\0';
DisStr(str);
}
void locate16(int row, int col)
{
switch(row)
{
case 1: WriteCmd(0x80+col-1); break;
case 2: WriteCmd(0x90+col-1); break;
case 3: WriteCmd(0x88+col-1); break;
case 4: WriteCmd(0x98+col-1); break;
}
}
void display()
{
unsigned char *p;
unsigned char a[]="oá×ø±ê:";
p=a;
DisStr("éÂÎ÷Î÷°23¤°2′óѧ");
DisStr(p);
DisInt(200);
DisStr("Ã× ");
DisStr("êú×ø±ê:");
DisInt(300);
DisStr("Ã× ");
DisStr("×Y×ø±ê:");
DisInt(200);
DisStr("Ã× ");
WriteCmd(0x98);
DisStr("½Ç¶è:");
DisInt(50);
DisStr(" ¡ã ");
*/
WriteCmd(0x80);
DisInt(1000);
DisStr("abc ");
}
|
|