lcd162a的参考代码:
文件名:lcd162a.h
#ifndef __LCD162A_H
#define __LCD162A_H
#include "sys.h"
#include "stdlib.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板162A驱动代码
//修改日期:2011/07/23
//版本:V0.0.2
/*=====================================================
连接线定义:
DB0-----Pa0 DB4-----Pa4 RS-------Pc8
DB1-----Pa1 DB5-----Pa5 RW-------Pc7
DB2-----Pa2 DB6-----Pa6 E--------Pc6
DB3-----Pa3 DB7-----Pa7 VLCD(Vee)接1K2电阻到GND
VSS-----GND VCC-----+5v
======================================================*/
//-----------------LCD162A端口定义----------------
#define LCD162A_RS PCout(8)
#define LCD162A_RW PCout(7)
#define LCD162A_E PCout(6)
//PB0~7,作为数据线
#define DATAOUT(x) GPIOA->ODR=(GPIOA->ODR&0xff00)|(x&0x00FF); //Pa0-Pa7输出
//lcd162a控制用函数
void lcd162a_Reset(void); //复位lcd162a
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);//在指定位置显示一个字符//x:0~15 //y:0~1
void lcd162a_cls(void); //清屏
void lcd162a_Display(u8 dd); //显示
void lcd162a_Init(void); //初始化lcd162a
void lcd162a_LocateXY(u8 posx,u8 posy); //显示光标位置
void lcd162a_WriteCommand(u8 CMD);
void lcd162a_WriteData(u8 dataW);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr); //显示字符串
#endif
文件名:lcd162a.c
#include "lcd162a.h"
#include "stdlib.h"
#include "delay.h"
#include "stdio.h"
//清屏
////
void lcd162a_cls(void)
{
lcd162a_WriteCommand(0x01); //
}
//显示
void lcd162a_Display(u8 dd)
{
u8 i=0;
for(i=0;i<16;i++)
{
lcd162a_DispOneChar(i,1,dd++);
dd &=0x7f;
if (dd<32) dd=32;
}
}
//显示光标位置
void lcd162a_LocateXY(u8 posx,u8 posy)
{
u8 temp;
temp=posx & 0xf;
posy &= 0x01;
if(posy) temp |=0x40;
temp |=0x80;
lcd162a_WriteCommand(temp);
}
//在指定位置显示一个字符
//x:0~15
//y:0~1
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata)
{
lcd162a_LocateXY(x,y);
lcd162a_WriteData(Wdata);
}
//显示字符串
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr)
{
u8 i,l=0;
while (ptr[l] >31)
{
l++;
};
for (i=0;i<l;i++)
{
lcd162a_DispOneChar(x++,y,ptr);
if ( x == 16 )
{
x = 0;
y ^= 1;
}
}
}
//复位
////
void lcd162a_Reset(void)
{
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
lcd162a_WriteCommand(0x08); //
lcd162a_cls(); //clear device
lcd162a_WriteCommand(0x06); //
lcd162a_WriteCommand(0x0c); //
}
//写入控制字。
//RS=0,
//RW=0
//E=1
//
void lcd162a_WriteCommand(u8 CMD)
{
delay_ms(2); //等待控制器完成指令
LCD162A_RS=0;
LCD162A_RW=0;
LCD162A_E=1;
DATAOUT(CMD); //送控制字
delay_us(2);
LCD162A_E=0;
}
//写入一个字节。
//dataW:要写入的数据/命令
//RS=1
//RW=0
//E=1
//
void lcd162a_WriteData(u8 dataW)
{
delay_ms(2); //等待控制器完成指令
LCD162A_RS=1;
LCD162A_RW=0;
LCD162A_E=1;
DATAOUT(dataW);
delay_us(2);
LCD162A_E=0;
}
//初始化lcd162a
void lcd162a_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟
//RCC->APB2ENR|=1<<0; //开启辅助时钟
//JTAG_Set(SWD_ENABLE);
GPIOA->CRL=0X33333333; //pa0-pa7
GPIOA->ODR|=0X00FF; //全部输出高电平
//pc6-pc9
GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRH|=0X00000033;//
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X03C0;
lcd162a_Reset();
lcd162a_cls();
}
////////////////////////////////////////////////////////////////
文件名:test.c
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd162a.h"
#include "stdio.h"
//
//待显示的字符串
//
u8 *p1="Hello,world.";
int main(void)
{
u8 temp=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
lcd162a_Init(); //初始化与lcd162a连接的硬件接口
lcd162a_cls();
lcd162a_ePutstr(0,0,p1);
delay_ms(1000);
lcd162a_cls();
while(1)
{
temp &= 0x7f; // 只显示ASCII字符
if (temp<32)temp=32; // 屏蔽控制字符,不予显示
lcd162a_Display( temp++ );
delay_ms(400);
}
}
下面是lcd162a显示时的图片(手机拍的,因光线不足,不太清楚):
|