[mw_shl_code=c,true]求指点,为什么我的代码不能驱动1602液晶!![/mw_shl_code]
[mw_shl_code=c,true]在线等。。。[/mw_shl_code]
[mw_shl_code=c,true]
#include "1602.h"
[mw_shl_code=c,true]#define L1602_RS_1 GPIO_SetBits(GPIOB, GPIO_Pin_0)
#define L1602_RS_0 GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define L1602_RW_1 GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define L1602_RW_0 GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define L1602_E_1 GPIO_SetBits(GPIOB, GPIO_Pin_2)
[/mw_shl_code]
#define L1602_E_0 GPIO_ResetBits(GPIOB, GPIO_Pin_2)[/mw_shl_code]
[mw_shl_code=c,true]void delay_us(u16 us)
{
u8 i;
while(us--)
for(i=0;i<6;i++);
}
void delay_ms(u16 ms)
{
while(ms--)
delay_us(1000);
}
void busy_wait()//检查LCD是否忙,如果忙等待
{
L1602_E_0;
L1602_RW_1;//读
L1602_RS_0;//状态
L1602_E_1;//
GPIOA->ODR=0XFF;//(GPIOA->ODR&0XFF00)|
delay_us(1);
while(GPIOA->ODR>>7);// dddddddd判断PA0~7 状态 &0xffff
L1602_E_0;
}
void write_cmd(u8 cmd)//向1602发送一条命令
{
L1602_E_0;
L1602_RS_0;//命令或数据
L1602_RW_0;//写
GPIOA->ODR=(cmd&0X7F);//命令(GPIOA->ODR&0XFF00)|
delay_us(1);//>40ns
L1602_E_1;//执行
delay_ms(1);//>150ns
L1602_E_0;
delay_us(1);//>250ns
}
void set_ddram(u8 add)//设置DDRAM的地址--显示地址
{
L1602_E_0;
L1602_RS_0;//命令或数据
L1602_RW_0;//写
GPIOA->ODR=(add|0X80);//地址(GPIOA->ODR&0XFF00)|
delay_us(1);//>40ns
L1602_E_1;//执行
delay_ms(1);//>150ns
L1602_E_0;
delay_us(1);//>250ns
}
void write_dat(u8 asc)//向1602写入数据--asc码
{
L1602_E_0;
L1602_RS_1;//命令或数据
L1602_RW_0;//写
GPIOA->ODR=asc;//命令(GPIOA->ODR&0XFF00)|
delay_us(1);//>40ns
L1602_E_1;//执行
delay_ms(1);//>150ns
L1602_E_0;
delay_us(1);//>250ns
}
void show_asc(u8 add,u8 asc)//在LCD上显示一个ASC字符
{
busy_wait();
set_ddram(add);
busy_wait();
write_dat(asc);
}
void show_string(u8 add,u8 *p)//显示一个字符串
{
busy_wait();
set_ddram(add);
while(*p)
{
busy_wait();
write_dat(*p++);
}
}
void show_number(u8 add,u16 n)//在LCD 上显示一个数
{
char s[6];
s[0]=(n/10000)+48;//(0~9)+48===48~57 得到万位的asc码
s[1]=(n%10000/1000)+48;
s[2]=(n%1000/100)+'0';
s[3]=(n%100/10)+'0';
s[4]=(n%10)+'0';
s[5]='\0';// \转义符
show_string(add,(u8 *)s);
}
void show_float(u8 add,float n)//在LCD 上显示小数
{
char s[10];
sprintf (s, "%04.3f", n);//按照指定 格式 打印 一个 字符串 n按照浮点型格式打印到asc码中
/* 调用这个函数是因为我们要把这个数字按照字符串的格式打印到数组中去 然后调用字符串显示函数 */
show_string(add,(u8 *)s);
}
/*
void show_float(u8 add,float t)//在LCD 上显示一个数
{
char s[7];
u16 n;
n=t*100;
s[0]=(n/10000)+48;//(0~9)+48===48~57 得到万位的asc码
s[1]=(n%10000/1000)+48;
s[2]='.';
s[3]=(n%1000/100)+'0';
s[4]=(n%100/10)+'0';
s[5]=(n%10)+'0';
s[6]='\0';// \转义符
show_string(add,s);
}
*/
void LCD_init()//初始化1602
{
RCC->APB2ENR=0x0000000c;
GPIOB->CRL=0x0111;
GPIOA->CRL=0x11111111;
delay_us(15);
write_cmd(0X38);
delay_us(5);
write_cmd(0X38);
delay_us(5);
write_cmd(0X38);//00111000 --8位接口,2行显示,5*7
busy_wait();
write_cmd(0X38);
busy_wait();
write_cmd(0X08);
busy_wait();
write_cmd(0X01);//清屏--填为空格
busy_wait();
// write_cmd(0X0F);//开显示,开光标
write_cmd(0X0C);//开显示,关光标
busy_wait();
write_cmd(0X06);//地址自动加1,不移动
}
[/mw_shl_code]
|