初级会员

- 积分
- 52
- 金钱
- 52
- 注册时间
- 2012-9-16
- 在线时间
- 0 小时
|
发表于 2012-10-20 09:47:03
|
显示全部楼层
给你一个我用寄存器写的1602程序:#include<stm32f10x_lib.h>
#include"lcd.h"
#include"delay.h"
/********I/O口初始化**************************************************/
void lcdport_init(void)
{
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<4; //使能pb和pc端口
GPIOB->CRH&=0X00000000;
GPIOB->CRH|=0X33333333;//配置pB8-pB15为推挽输出
GPIOC->CRH&=0XFF0000FF;
GPIOC->CRH|=0X00333300;//配置pc10,pc11,pc12,pc13为推挽输出
GPIOC->ODR|=1<<10;
GPIOC->ODR|=1<<11;
GPIOC->ODR|=1<<12;
GPIOC->ODR|=1<<13;
}
//
//
///********宏定义********************************************* **************/
#define LCD_Data (GPIOB->ODR)
//#define Busy 0x80 //用于检测LCD状态字中的Busy标识
/***********写数据********************************************************/
void WriteDataLCD(u8 WDLCD)
{
// ReadStatusLCD(); //检测忙
LCD_RS = 1; //数据
delay_us(5);
LCD_RW = 0; //写入
delay_us(10);
LCD_Data =0xFF00&(WDLCD<<8);
LCD_E = 1;
delay_us(300);
LCD_E = 0;
}
///***********写指令********************************************************/
void WriteCommandLCD(u8 WCLCD) //BuysC为0时忽略忙检测
{
//ReadStatusLCD(); //根据需要检测忙
LCD_RS = 0;//指令
delay_us(5);
LCD_RW = 0;//写入
delay_us(5);
LCD_E = 0;//使能
delay_us(300);
LCD_Data =0xFF00&(WCLCD<<8);
LCD_E = 1;
delay_us(300);
LCD_E = 0;
}
/***********读数据********************************************************/
u8 ReadDataLCD(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
return(LCD_Data);
}
/***********按指定位置读取一个字符*****************************************/
//u8 ReadOneChar(u8 x,u8 y)
//{
// y&= 0x1;
// x &= 0xF;
// if(y)
// {
// x|=0xC0;
// }
// else
// {
// x|=0x80; //算出指令码
// }
//
// WriteCommandLCD(x); //这里不检测忙信号,发送地址码
// ReadDataLCD();
//}
///***********读状态*******************************************************/
//u8 ReadStatusLCD(void)
//{
// LCD_Data = 0xFF;
// LCD_RS = 0;
// LCD_RW = 1;
// LCD_E = 1;
// while (LCD_Data & Busy); //检测忙信号
// return(LCD_Data);
//}
/***********初始化********************************************************/
void LCDInit(void)
{
LCD_Data = 0;
WriteCommandLCD(0x38); //三次模式设置,不检测忙信号
delay_ms(5);
WriteCommandLCD(0x38);
delay_ms(5);
WriteCommandLCD(0x38); //显示模式设置,开始要求每次检测忙信号
delay_ms(5);
WriteCommandLCD(0x08); //关闭显示
delay_ms(10);
WriteCommandLCD(0x01); //显示清屏
delay_ms(200);
WriteCommandLCD(0x06); //显示光标移动设置
delay_ms(10);
WriteCommandLCD(0x0C); //显示开及光标设置
delay_ms(10);
}
/***********按指定位置显示一个字符*******************************************/
void DisplayOneChar(u8 X, u8 Y, u8 DData)
{
Y &= 0x1;
X &= 0xF;
if(Y)
{
X|=0xC0;
}
else
{
X|=0x80; //算出指令码
}
WriteCommandLCD(X); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
/***********按指定位置显示一串字符*****************************************/
void DisplayListChar(u8 X, u8 Y, u8 const *DData)
{
u8 ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
能显示字符串和单个字符的。 |
|