/******************************************************************************
自己写的 但是没有显示 lcd1602数据位我是直接街道PB口的 不知道行不?求解
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/fpu.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/adc.h"
#include "inc/hw_gpio.h"
void LCD_Init(void);
void LCD_write_com(uint8_t com);
void LCD_write_dat(uint8_t dat);
void LCD_disp_char(uint8_t x,uint8_t y,uint8_t dat);
void delay_n40us(uint32_t n);
void writeDataLcd(uint8_t dat);
uint8_t ttt[]="Circuits";
uint8_t kkk[]="Zhang ning";
int main(void)
{
//设置系统时钟为50MHz (400/2/4=50)
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
while(1)
{
uint32_t i=0;
LCD_Init();
LCD_write_com(0x80);//0x80第一行从顶头开始显示,加n,后移n位显示
for (i=0;i<16;i++)
{
writeDataLcd(ttt[i]);
delay_n40us(15000);
}
delay_n40us(30000);
delay_n40us(30000);
delay_n40us(50000);
LCD_write_com(0x80+64);//0x80+64,第二行从顶头开始显示,加64再加n,第二行从n开始显示。
for (i=0;i<16;i++)
{
writeDataLcd(kkk[i]);
delay_n40us(15000);
}
LCD_write_com(0x80);
LCD_disp_char(2,1,' ');
delay_n40us(20000);
}
}
/******************************************************************************
* 函 数 名 : LCD12864_Busy
* 函数功能: 检测LCD是否忙
* 输 入 : 无
* 输 出 : 1或0?1表示不忙?0表示忙?
*******************************************************************************
uchar LCD12864_Busy(void)
{
uchar i = 0;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_3 );//RS=0,RW=1
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
while((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7) & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return 0; //超过等待时间返回0表示失败
}
}
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return 1;
}*/
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void LCD_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);//PA2,3,4设为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
LCD_write_com(0x38);//设置8位格式,2行,5x7
LCD_write_com(0x0c);//整体显示,关光标,不闪烁
LCD_write_com(0x06);//设定输入方式,增量不移位--------------
LCD_write_com(0x01);//清除屏幕显示----------------
delay_n40us(100);
}
/**************************************************
*名称:void write_com(uchar com)
*功能:向1602写指令
*入口参数:com
*出口参数:无
**************************************************/
void LCD_write_com(uint8_t com)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,~GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,~GPIO_PIN_3);//RS=0,RW=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, com); //PB=com
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_n40us(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_n40us(1);
}
/**************************************************
*名称:void write_dat(uchar dat)
*功能:向1602写数据
*入口参数:dat
*出口参数:无
**************************************************/
void LCD_write_dat(uint8_t dat)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,~GPIO_PIN_3);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,GPIO_PIN_2);//RS=1,RW=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat); //PB=dat
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4); //E=1
delay_n40us(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_n40us(1);
}
/******************************************************************************
* 函 数 名 : LCD12864_ReadData
* 函数功能 : 读取数据
* 输 入 : 无
* 输 出: 读取到的8位数据
********************************************************/
/*------------------------------------------------------------------------------------
uchar LCD12864_ReadData(void)
{
uchar readValue;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,GPIO_PIN_3);//RS=1,RW=1
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输入
readValue =GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return readValue;
}
------------------------------------------------------------------------------------------*/
//写入字符串函数
void writeDataLcd(uint8_t dat)// 写入数据
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,GPIO_PIN_2 );//RS=1,RW=0
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,~GPIO_PIN_3);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat); //PB=dat
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4); //E=1
delay_n40us(10);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
}
//*******显示一个字符函数*********
void LCD_disp_char(uint8_t x,uint8_t y,uint8_t dat)
{
uint8_t address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_com(address);
LCD_write_dat(dat);
}
void delay_n40us(uint32_t n)
{ uint32_t i;
uint8_t j;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
}
此帖出自
小平头技术问答
一周热门 更多>