求TM4c123驱动lcd1602代码

2019-03-24 08:32发布

/******************************************************************************
自己写的 但是没有显示 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次循环,

}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
academic
2019-03-24 13:53
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章