我这样怎么点不亮不带字库的12864,哪里出问题了?求指导
[mw_shl_code=c,true]//lcd.h
#ifndef __LCD_H
#define __LCD_H
#include "stm8l15x.h"
#include "stm8l15x_gpio.h"
#define RW_H() (GPIO_SetBits(GPIOA, GPIO_Pin_6))
#define RW_L() (GPIO_ResetBits(GPIOA, GPIO_Pin_6))
#define E_H() (GPIO_SetBits(GPIOA, GPIO_Pin_7))
#define E_L() (GPIO_ResetBits(GPIOA, GPIO_Pin_7))
#define RS_H() (GPIO_SetBits(GPIOD, GPIO_Pin_2))
#define RS_L() (GPIO_ResetBits(GPIOD, GPIO_Pin_2))
#define CS1_H() (GPIO_SetBits(GPIOE, GPIO_Pin_1))
#define CS1_L() (GPIO_ResetBits(GPIOE, GPIO_Pin_1))
#define CS2_H() (GPIO_SetBits(GPIOE, GPIO_Pin_2))
#define CS2_L() (GPIO_ResetBits(GPIOE, GPIO_Pin_2))
#define DATA_GPIO_PORT GPIOB //数据接口接PB0-PB7
#define DATA (GPIO_Pin_0|GPIO_Pin_1\
|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4\
|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 )
void gpio_config(void)
{
GPIO_Init(GPIOA, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Slow); /*初始化数据输入引脚DI*/
GPIO_Init(GPIOA, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow); /*初始化读写端引脚RW*/
GPIO_Init(GPIOA, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow); /*初始化使能端引脚EN*/
GPIO_Init(GPIOE, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Slow); /*初始化片选CS1*/
GPIO_Init(GPIOE, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow); /*初始化片选CS2*/
GPIO_Init(GPIOD, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow); /*初始化复位引脚RST*/
/*初始化数据引脚*/
GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Slow);
GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow);
}
#endif
//main.c
#include "stm8l15x.h"
#include "lcd.h"
#define uchar unsigned char
/*Ms 延时*/
void DelayMs(unsigned int ms)
{
unsigned int i,j;
while(ms !=0 )
{
for(i=0;i<250;i++);
for(j=0;j<75;j++);
ms--;
}
}
void DelayUs2x(unsigned int t)//延时nus
{
while(--t);
}
void check_busy(void)
{
RS_L();
RW_H();
E_H();
while(GPIO_ReadInputData(GPIOB) & 0x80); //只要位7的值,位7是忙标志位。
E_L();
}
/*液晶写命令*/
void write_cmd(unsigned char cmd)
{
check_busy();
RW_L();
RS_L();
// DATA=cmd;
/**此处,只有直接操作寄存器才能
*达到,只改变输出数据寄存器ODR的低8位,其它位
*不变的目的。因为,只有低8位是数据引脚,
*其它位可能是控制引脚,不能改变。
*/
// GPIOB->ODR=((GPIOB->ODR & 0X00)|cmd);
GPIO_Write(GPIOB,GPIO_Pin_0|GPIO_Pin_1\
|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4\
|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
E_H();
// DelayMs(2);
E_L();
// DelayMs(2);
}
/*液晶写数据*/
void write_data(unsigned char data)
{
check_busy();
RW_L();
RS_H();
// DATA=data;
// GPIOB->ODR=((GPIOB->ODR & 0X00)|data);
GPIO_Write(GPIOB,GPIO_Pin_0|GPIO_Pin_1\
|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4\
|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
E_H();
// DelayMs(2);
E_L();
// DelaKyMs(2);
}
/*
*选择左右屏 case 0:代表左屏
* case 1:代表右屏
*/
void cs_select(unsigned char cs)
{
switch(cs)
{
case 0:
CS1_L();
CS2_H();
break;
case 1:
CS1_H();
CS2_L();
break;
}
}
/*液晶清屏*/
void lcd_clear(void)
{
unsigned char i=0,j=0;
CS1_L();
CS2_L();
for(i=0;i<8;i++)
{
write_cmd(0xb8+i);
write_cmd(0x40);
for(j=0;j<64;j++)
{
write_data(0x00);
}
}
}
/*液晶初始化*/
void lcd_init(void)
{
E_L();
CS1_L();
CS2_L();
lcd_clear();
write_cmd(0x3f); //开显示
write_cmd(0xc0); //要显示的起始行
}
//void Init_12864(void)
//{
//// DelayMs(40); //大于40MS的延时程序
//// PSB=1; //设置为8BIT并口工作模式
// DelayMs(1); //延时
// RS_L(); //复位
// DelayMs(1); //延时
// RS_H(); //复位置高
// DelayMs(10);
// write_cmd(0x30); //选择基本指令集
// DelayUs2x(50); //延时大于100us
// write_cmd(0x30); //选择8bit数据流
// DelayUs2x(20); //延时大于37us
// write_cmd(0x0c); //开显示(无游标、不反白)
// DelayUs2x(50); //延时大于100us
// write_cmd(0x01); //清除显示,并且设定地址指针为00H
// DelayMs(15); //延时大于10ms
// write_cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
// DelayUs2x(50); //延时大于100us
//}
/**X代表横坐标,范围0-8
*Y代表纵坐标,范围1-4
*/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s)
{
switch(y)
{
case 1: write_cmd(0x80+x);break;
case 2: write_cmd(0x90+x);break;
case 3: write_cmd(0x88+x);break;
case 4: write_cmd(0x98+x);break;
default:break;
}
while(*s>0)
{
write_data(*s);
s++;
DelayMs(1);
}
}
/**********************************
选择页 设置X地址
**********************************/
void setline(uchar line) //12864总共有8页(0~7),每页有8行
{
line=line&0x07; //只取后三位xxxx x111 ,这3个是要改变位置的数据
line=line|0xb8; //0xb8 为1011 1000固定格式,后面3位(D2-D0)可根据要写入的页具体修改
write_cmd(line);
}
/**********************************
选择列 设置Y地址
**********************************/
void setcolum(uchar colum) //12864每半屏有64列(0~63),分为左右2屏,共128列
{
colum=colum&0x3f; //xx11 1111,这个是要改变Y位置的数据
colum=colum|0x40; //0x40 为0100 0000固定格式,后面6位(D5-D0)可跟据要写入的列具体修改
write_cmd(colum);
}
/**********************************
选择起始行
**********************************/
//void setstartline(uchar startline)
//{
// startline=startline&0x3f;//xx11 1111,这个是要改变x位置的数据
// startline=startline|0xc0;//11xxxxxx,是起始行设置的固定指令
// write_cmd(startline);
//}
void main(void)
{
uchar i;
lcd_init(); //液晶初始化
cs_select(0); //选择左半屏
setline(0); //从第一页开始显示
setcolum(0); //从第一列开始显示
for(i=0;i<64;i++) //左半屏有64列,循环64次
{
write_data(0x55);
DelayMs(1000);
}
lcd_clear();
}
[/mw_shl_code]
|