#include "stm32f10x.h"
#include "delay.h"
#include "HT16C22.h"
#define SDA_IN() GPIOA->CRH &= 0xFFFFFFF0; GPIOA->CRL |=0x00000004
#define SDA_OUT() GPIOA->CRH &= 0xFFFFFFF0; GPIOA->CRL |=0x00000003
int8_t disbuf[12];
//¶ÎÂë±í³£Á¿Êý×é
int8_t const table[31]=
{
0x77,/*0*/0x24,/*1*/0x5D,/*2*/0x6D,/*3*/0x2E,/*4*/
0x6B,/*5*/0x7B,/*6*/0x25,/*7*/0x7F,/*8*/0x6F,/*9*/
0x3F,/*A*/0x7A,/*b*/0x58,/*C*/0x7C,/*d*/0x5B,/*E*/
0x1B,/*F*/0x3A,/*h*/0x3E,/*H*/0x78,/*o*/0x1F,/*p*/
0x52,/*L*/0x18,/*r*/0x6E,/*y*/0x08,/*-*/0x40,/*_*/
0x00,/* */
};
//PB9 SCL PB8 SDA
void InitI2C(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//GPIOB Periph clock enable
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9);//SCLH;
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
I2CInitial();//HT16C22 IIC ×ÜÏß³õʼ»¯
}
void Clr_disbuf(void) //DisbufÇåÁã
{
int8_t i;
for(i=0;i<12;i++)
disbuf=0x00;
}
void Setb_disbuf(void) //DisbufÈ«ÖÃ1
{
int8_t i;
for(i=0;i<12;i++)
disbuf=0xff;
}
//»ñÈ¡SDAµÄµ±Ç°Öµ£¬D0
int8_t GetSDA()
{
if( (GPIOB->IDR & GPIO_Pin_8)!=0)
{
return 0x01;
}
else
{
return 0x00;
}
}
//PB9 SCL PB8 SDA
void Start()
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
GPIO_SetBits(GPIOB,GPIO_Pin_9);//SCLH;
__nop();
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//SDAL;
__nop();
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//SCLL;
}
void Stop()
{
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//SCLL;
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//SDAL;
__nop();
GPIO_SetBits(GPIOB,GPIO_Pin_9);//SCLH;
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
}
int8_t TestAck()
{
int8_t ErrorBit;
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
GPIO_SetBits(GPIOB,GPIO_Pin_9);//SCLH;
ErrorBit=GetSDA();
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//SCLL;
return(ErrorBit);
}
void NoAck()
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
GPIO_SetBits(GPIOB,GPIO_Pin_9);//SCLH;
__nop();
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//SCLL;
}
void Ack()
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//SDAL;
GPIO_SetBits(GPIOB,GPIO_Pin_9);//SCLH;
__nop();
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//SCLL;
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
}
void Write8Bit(int8_t input)
{
int8_t temp;
for(temp=8;temp!=0;temp--)
{
if((input&0x80)!=0)
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);//SDAH;
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//SDAL;
}
__nop();;
GPIO_SetBits(GPIOB,GPIO_Pin_9);
__nop();
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
input=input<<1;
__nop();
}
}
void I2CWriteSingle(int8_t I2CData)
{
Start();
Write8Bit(0x7e); //·¢ Êý¾Ý ģʽ(д) оƬµØÖ·
TestAck();
Write8Bit(I2CData);
TestAck();
Stop();
}
void I2CInitial(void) // ³õʼ»¯
{
I2CWriteSingle(0x8c); //ģʽÉèÖà 1/3 Bais ´ò¿ªLCEÏÔʾ ¿ªÊ±ÖÓÕðµ´ ÕñƵÂÊ80HZ
I2CWriteSingle(0x40); //ÄÚ²¿µçѹµ÷Õû SEGÒý½Å ʹÄÜÄÚ²¿µçѹµ÷ÕûÆ÷ VLCDµçѹ Ϊ VDD
I2CWriteSingle(0xc0); //ÉÁ˸ƵÂÊ ¹Ø
}
void LCD_xs (int8_t num)
{
int8_t i;
Start();
Write8Bit(0x7e); //·¢ Êý¾Ý ģʽ(д) оƬµØÖ·
TestAck();
Write8Bit(0x00); //ÆðʼRAMµØÖ· 00
TestAck();
for(i=0;i<num;i++) //·¢ËÍÁ¬ÐøµÄÊý¾Ý
{
Write8Bit(disbuf);//11111111111111111111111
TestAck();
}
Stop();
}
这个我根据数据手册写的代码 但是不知道怎么和屏联系到一块 第一次用LCD |