打印

分享TI LM3S811开发板使用心得 之LCD显示篇

[复制链接]
6708|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lilihua0721 于 2011-12-31 18:40 编辑

     TI MCU以前没有接触过,经过这几天的学习,对TI MCU有了初步的认识,个人觉得很好上手,以下是我使用TI MCU操作LCD的全部过程,分别为使用Keil uVision4的建立lcdtest工程项目、工程文件代码展示、硬件连接、LCD显示展示及其它。下面就来讲述下我使用TI LM3S811的过程!分别放在以下连续的四个楼层中,有不足的地方请大家指正!
    附件LM3S811使用心得 之LCD显示篇.pdf是完整的叙述文件且图文显示;lcdTest.rar为keil工程文件;点阵提取软件.rar是点阵提取工具;ST7920c20c.pdf的LCD参考资料!

最终效果展示





一、使用Keil uVision4的建立lcdtest工程项目
(1)首先新建一个文件夹

(2)把要建立的工程项目文件夹进行命名为lcdTest

(3)在文件夹里新建6TXT文件。

(4)分别对6TXT文本命名为mian.cst7920.cst7920.hdelay.cdelay.hType.h
(5)找到TI给的驱动库文件driverlibinc文件夹,然后复制到lcdTest目录下
(6)打开安装好的keil uvision

(7)打开后找到project 栏目,找到new uvision project,点击新建一个工程项目
(8)在刚刚新建的文件夹里新建这个工程项目,工程项目命名为lcdTest
(9)项目找到你对于的CPU,这里选择流明系列为Luminary Micro
(10)选择芯片LM3S811
(11)提示是否需要写入中断列表,点是
(12)项目树列表如下:
(13)在项目数字添加新的组,Target 1右键,选择下列列表中的Add group.
(14)把新建的组命名为:drive. 驱动
(15)在改组中添加文件。点击add files to group""
(16)找到TI给的驱动库文件(也就是刚拷贝在lcdTest目录下的driverlib文件夹),
     点击其中的driverlib文件包,其中里面rvmdk就是KEIL的驱动.lib
(17)打开rvmdk文件包,找到driverlib,lib点击ADD或者双击文件添加。
(18)添加后的工程树目录
(19)然后添加程序
(20)然后添加刚才建立的添加mian.c delay.c、st7920.c

(21)项目建立成功
(22)点击点击Target Options
(23)仿真器选择分别在Debugutilities中设置
(24)双击mian.c函数
(25)mian.c函数添加头文件并加入int mianvoid)函数并编译成功
(26)对于st7920.cst7920.hdelay.cdelay.hType.h的代码编写请参照工程文件。
(27)编辑代码并编译通过后即可点击Download按钮进行下载程序了。
效果展示

IMG_6678.jpg (533.62 KB )

IMG_6678.jpg

ST7920c20c.pdf

1.65 MB

相关帖子

沙发
lilihua0721|  楼主 | 2011-11-18 23:02 | 只看该作者
本帖最后由 lilihua0721 于 2011-12-31 18:42 编辑

二、工程文件代码展示
(1)        main.c
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "st7920.h"
#include "Type.h"
#include "delay.h"

INT32U   TheSysClock;   //定义全局的系统时钟变量

/**************************************************************************************
函数名: int main(void)
功  能: 测试LCD12864单色液晶
说  明: 显示一张图片,分辨率为128*64
输  入:无      
输  出:无
其  他:初始化可分为以下步骤:
                1:防止JTAG死锁
                2:配置系统时钟,保证板子能正常工作起来
                3:使能GPIO端口外设,也就是开GPIO功能。
                4:设置LCD管脚为输出管脚。
                5:初始化LCD,保证LCD正常工作
**************************************************************************************/
int main(void)
{

        /**********JTAG防止死锁*************/
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);              //使能外设GIOPC
           GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);    //设置USER按键所在管脚为输入
    if (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00) //若复位时按下USER按键,则进入
    {
        for (;;);                                         //死循环,以等待JTAG连接
    }
    SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);         //禁止USER按键所在的GPIO端口


           /***********配置系统时钟 *********/
    SysCtlClockSet(SYSCTL_SYSDIV_1 |                                           //不分频
                                   SYSCTL_USE_OSC  |                                           //系统时钟设置
                                   SYSCTL_OSC_MAIN |                                          //采用主振荡器
                   SYSCTL_XTAL_6MHZ);                                          //外接6MHz晶振

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_2 |GPIO_PIN_3|GPIO_PIN_5);
        TheSysClock = SysCtlClockGet();                       //获取当前的系统时钟频率
        open_lcd();                                                                                          //初始化12864液晶

        start_**();                                         //显示显示图片,分辨率为128*64
        /* 向液晶缓冲区写入数据 */
   
    write_char_buf(0, 0,  "TI LM3S811开发板");
    write_char_buf(1, 0,  "TI Stellaris M3 ");                  
    write_char_buf(2, 0,  "    感谢21IC    ");        
    write_char_buf(3, 0,  "    感谢TI      ");                        
        //进入循环处理用户代码
        while(1)
        {
           delay10ms(10);
           lcd();
    }
}
(2)        st7920.c文件
#include <string.h>
#include "st7920.h"
#include "Type.h"
#include "delay.h"


INT16U buf_lcd_char[4][8];    // LCD文字显示缓冲区

/**************************************************************************************
名称:void start_**(void)
说明: 开机画面显示
输入:image_**[]    开机画面信息
输出:无
**************************************************************************************/

INT8U const **_image[1024] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xEC,0xF0,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xCD,0xF0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x8C,0xF0,0x06,0x3F,0x73,0x18,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x08,0x70,0x06,0x31,0x32,0x1C,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x18,0x78,0x06,0x30,0x3E,0x1C,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0xFF,0x18,0xF8,0x06,0x3E,0x1C,0x26,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0xFF,0x9B,0xFC,0x06,0x32,0x1C,0x26,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0xFF,0x9B,0xFC,0x06,0x30,0x16,0x7E,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0x93,0xFC,0x06,0x30,0x26,0x43,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0x93,0xFC,0x07,0x3F,0x63,0xC3,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0x81,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x61,0x81,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x81,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x00,0x06,0x61,0x3E,0xFE,0xF8,0xC2,0x60,0xCF,0x98,0x5F,0xCF,0x00,
0x00,0x00,0x7C,0x00,0x06,0x71,0x22,0xB2,0xCC,0xC2,0x71,0xCC,0x1C,0x57,0x59,0x00,
0x00,0x00,0x7C,0x00,0x06,0x79,0x60,0x10,0xC6,0xC2,0x71,0xC8,0x1E,0x42,0x10,0x00,
0x00,0x00,0x3C,0x00,0x06,0x6D,0x3C,0x30,0xCC,0xC2,0x52,0xCF,0x97,0x42,0x1E,0x00,
0x00,0x00,0x1E,0x00,0x06,0x67,0x1E,0x30,0xF8,0xC2,0x5A,0xCF,0x93,0xC2,0x0F,0x80,
0x00,0x00,0x00,0x00,0x06,0x67,0x03,0x10,0xCC,0xC2,0x4C,0xC8,0x11,0xC2,0x01,0x80,
0x00,0x00,0x00,0x00,0x06,0x63,0x43,0x30,0xCC,0xC6,0x4C,0xCC,0x10,0xC2,0x11,0x80,
0x00,0x00,0x00,0x00,0x07,0x61,0x3E,0x30,0xC6,0x7C,0x48,0xCF,0xD8,0x47,0x1F,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

void start_**(void)
{
    //INT8U *ptr_**;
    INT8U i, j;
    INT16U addr;
    INT8U tmp_data[32];
   
    /* 显示信息 */
    //ptr_** = (INT8U *)**_image;
    for (i = 0; i < 32; i++)
    {
        /* 组织数据 */
        addr = i * 16;
        for (j = 0; j < 16; j++)
        {
            tmp_data[j] = **_image[addr + j];
            tmp_data[j+16] = **_image[512+addr+j];
        }
        
        addr = i;
        addr <<= 8;
        write_st7920(ST7920_RAM_GDRAM, addr, tmp_data, 32);
     //  __RESET_WATCHDOG();
    }
   
    /* 开机画面,等待3s */
    delay10ms(300);
}

/**************************************************************************************
名称:void open_st7920(void)
说明: 液晶初始化函数
输入:无
输出:无
**************************************************************************************/

void open_st7920(void)
{
    /* Set function RE = 0 */
    send_cmd_st7920(0x30);
   
    /* Set Entry point */
    send_cmd_st7920(0x06);
   
    /* Turn on display */
    send_cmd_st7920(0x0C);
   
    /* Clear screen */
    send_cmd_st7920(0x01);
   
    /* Set function RE = 1 */
    send_cmd_st7920(0x34);
   
    /* Set SR = 0 */
    send_cmd_st7920(0x20);
}

/**************************************************************************************
名称:void send_cmd_st7920(INT8U cmd)
说明: 发送一个命令至st7920
输入:无
输出:无
**************************************************************************************/
                                                                              
void send_cmd_st7920(INT8U cmd)
{
    INT8U sbyte = 0xF8;
    INT8U i = 0;
   
    ST7920_CLK_0();
    ST7920_CS_1();
   
    /* 输入前导字节 */
    for (i = 0; i < 8; i++)
    {
        ST7920_CLK_0();
        if (sbyte & 0x80)
        {
            ST7920_DI_1();
        }
        else
        {
            ST7920_DI_0();
        }
        
        ST7920_CLK_1();
        sbyte <<= 1;
    }

    /* 输入命令码高4位 */
    sbyte = cmd & 0xF0;
    for (i = 0; i < 8; i++)
    {
        ST7920_CLK_0();
        if (sbyte & 0x80)
        {
            ST7920_DI_1();
        }
        else
        {
            ST7920_DI_0();
        }
        
        ST7920_CLK_1();
        sbyte <<= 1;
    }
   
   
    /* 输入命令码低4位 */
    sbyte = cmd << 4;
    for (i = 0; i < 8; i++)
    {
        ST7920_CLK_0();
        if(sbyte & 0x80)
        {
            ST7920_DI_1();
        }
        else
        {
            ST7920_DI_0();
        }
        
        ST7920_CLK_1();
        sbyte <<= 1;
    }
   
    ST7920_CS_0();
   
    /* 等待命令执行 */
    delay1ms(1);
    if (cmd == 0x01)
    {
        delay10ms(1);
    }
}

/**************************************************************************************
名称:void send_data_st7920(INT8U ptr_data, INT8U len)
说明: 写数据至液晶
输入:ptr_data:数据起始地址
     len:数据长度
输出:无
**************************************************************************************/

void send_data_st7920(INT8U *ptr_data, INT8U len)
{
    INT8U sbyte = 0xFA;
    INT8U i = 0;
    INT8U j = 0;
   
    ST7920_CS_1();
   
    /* 输入前导字节 */
    for (i = 0; i < 8; i++)
    {
        ST7920_CLK_0();
        if (sbyte & 0x80)
        {
            ST7920_DI_1();
        }
        else
        {
            ST7920_DI_0();
        }
        
        sbyte <<= 1;
        ST7920_CLK_1();
    }

    /* 输入数据 */
    for (j = 0; j < len; j++)
    {
        
        /* 输入数据字节高4位 */
        sbyte = ptr_data[j] & 0xF0;
        for (i = 0; i < 8; i++)
        {
            ST7920_CLK_0();
            if (sbyte & 0x80)
            {
                ST7920_DI_1();
            }
            else
            {
                ST7920_DI_0();
            }
            
            sbyte <<= 1;
            ST7920_CLK_1();
        }
        
        /* 输入数据字节低4位 */
        sbyte = ptr_data[j] << 4;
        for (i = 0; i < 8; i++)
        {
            ST7920_CLK_0();
            if (sbyte & 0x80)
            {
                ST7920_DI_1();
            }
            else
            {
                ST7920_DI_0();
            }
            
            sbyte <<= 1;
            ST7920_CLK_1();
        }
   
    }
   
    /* 延时等待数据写入完成 */
    delay1ms(1);
   
    ST7920_CS_0();
}

/**************************************************************************************
名称:void init_lcd(void)
说明: 初始化LCD显示
输入:无
输出:无
**************************************************************************************/

void open_lcd(void)
{
    INT8U i, j;
     for (i = 0; i < 4; i++)
     {
        for (j = 0; j < 8; j++)
        {
            buf_lcd_char[j] = 0xA1A0;
        }
     }
    open_st7920();
}


/**************************************************************************************
名称:void write_char_buf(INT8U row, INT8U col,  INT8U *pc)
说明: 装载文字缓冲区
输入:无
输出:无
**************************************************************************************/

void write_char_buf(INT8U row, INT8U col,  INT8U *pc)
{
    INT8U r = row & 0x03u;
    INT8U c = col & 0x07u;
    INT8U i;
    INT8U k;
    INT8U len;

    if (pc == NULL)
        return;
        len = strlen(pc);                                 
    for (i=0,k=c; 2*i<len;i++)         
    {                                             
   
            /* #if  0
      buf_lcd_char[r][k]    = (pc[2*i]<<8);      
      buf_lcd_char[r][k++] +=  pc[2*i+1];      
      if(len%2==1&&i==(len/2-1))
      {
        buf_lcd_char[r][k]    = (pc[2*i+2]<<8);      
      }  
          #endif   */
      buf_lcd_char[r][k]    = pc[2*i];      
      buf_lcd_char[r][k++] +=  (pc[2*i+1]<<8);      
      if(len%2==1&&i==(len/2-1))
      {
        buf_lcd_char[r][k]    = pc[2*i+2];      
      }            
    }
}


/**************************************************************************************
名称:void lcd(void)
说明: LCD显示模块接口程序
输入:buf_lcd_char[]     LCD文字显示缓冲区
输出:无
**************************************************************************************/

void lcd(void)
{
    INT8U static ddram_row = 0;  /* 刷新行号,每次刷新一行 */
    INT8U *ptr_data;
    INT8U lcd_row = 0;
    INT8U lcd_col = 0;
    /* ASCII字符码转 GB字符码 */
    for (lcd_row = 0; lcd_row < 4; lcd_row++)
    {
        for (lcd_col = 0; lcd_col < 8; lcd_col++)
        {
            if (   buf_lcd_char[lcd_row][lcd_col] <= 125
                && buf_lcd_char[lcd_row][lcd_col] >= 32   )
            {
                buf_lcd_char[lcd_row][lcd_col] += 0xA380;
            }
        }
    }
    /* 选择行 */
    switch (ddram_row)
    {
        case 0:    /* LCD缓冲区 0行对应DDRAM 0行 */
            lcd_row = 0;
            break;
            
        case 1:    /* LCD缓冲区 1行对应DDRAM 2行 */
            lcd_row = 2;
            break;
            
        case 2:    /* LCD缓冲区 2行对应DDRAM 1行 */
            lcd_row = 1;
            break;
            
        case 3:    /* LCD缓冲区 3行对应DDRAM 3行 */
            lcd_row = 3;
            break;
            
        default:
            break;
    }
    ptr_data = (INT8U *)buf_lcd_char[lcd_row];
   
    write_st7920(ST7920_RAM_DDRAM, ddram_row * 8, ptr_data, 16);
    ddram_row++;
    if (ddram_row >= 4)
    {
        ddram_row = 0;
    }

}

使用特权

评论回复
板凳
lilihua0721|  楼主 | 2011-11-18 23:02 | 只看该作者
本帖最后由 lilihua0721 于 2011-11-20 10:59 编辑

(3)        st7920.h文件
#ifndef _12864_H
#define _12864_H
#include "Type.h"
#include "driverlib/gpio.h"
#include "inc/hw_memmap.h"

#define    ST7920_CLK_PIN    GPIO_PIN_2 // GPIO管脚2的位表示(0x04)
#define    ST7920_CS_PIN     GPIO_PIN_3 // GPIO管脚3的位表示(0x08)
#define    ST7920_DI_PIN     GPIO_PIN_5 // GPIO管脚5的位表示(0x20)

//由于外部电平转换电路是反向的,这个程序也作了反向,具体如下!
#define    ST7920_CLK_0()     (GPIOPinWrite(GPIO_PORTA_BASE,
                ST7920_CLK_PIN,  ST7920_CLK_PIN),delay10us(1))
#define    ST7920_CLK_1()     (GPIOPinWrite(GPIO_PORTA_BASE,
               ST7920_CLK_PIN, ~ST7920_CLK_PIN),delay10us(1))

#define    ST7920_CS_0()      (GPIOPinWrite(GPIO_PORTA_BASE,
              ST7920_CS_PIN,  ST7920_CS_PIN),delay10us(1))
#define    ST7920_CS_1()      (GPIOPinWrite(GPIO_PORTA_BASE,
              ST7920_CS_PIN, ~ST7920_CS_PIN),delay10us(1))

#define    ST7920_DI_0()      (GPIOPinWrite(GPIO_PORTA_BASE,
               ST7920_DI_PIN,  ST7920_DI_PIN),delay10us(1))
#define    ST7920_DI_1()      (GPIOPinWrite(GPIO_PORTA_BASE,
               ST7920_DI_PIN, ~ST7920_DI_PIN),delay10us(1))



/* 操作接口变量定义 */
extern INT16U buf_lcd_char[4][8];

/* RAM区域定义 */
#define ST7920_RAM_DDRAM   0
#define ST7920_RAM_IRAM    1
#define ST7920_RAM_CGRAM   2
#define ST7920_RAM_GDRAM   4

/* 接口函数定义 */
void open_st7920(void);
void write_st7920(INT8U ram, INT16U addr, INT8U *p_data, INT8U len);
void send_cmd_st7920(INT8U cmd);
void open_lcd(void);
void write_char_buf(INT8U row, INT8U col,  INT8U *pc);
void start_**(void);
void lcd(void);
#endif

(4)        delay.c文件
#include "Type.h"
#include "driverlib/sysctl.h"
#include "delay.h"

extern  INT32U   TheSysClock;

/**************************************************************************************
函数名: void delay10ms(INT16U time)
功  能: 延时10ms
说  明: 无
输  入:time      
输  出:无
返  回:无
其  他:无
**************************************************************************************/

void delay10ms(INT16U time)
{
  INT16U i;
  for(i=0;i<time;i++)
  {
    delay1ms(10);
  }
}

/**************************************************************************************
函数名: void Cpu_Delay100US(INT16U time)
功  能: 延时100us
说  明: 无
输  入:无
输  出:无
返  回:无
其  他:无
**************************************************************************************/

void delay1ms(INT16U time)
{
   INT16U i;
   for(i=0;i<time;i++)
   {
         SysCtlDelay(TheSysClock/3000);
   }
}

void delay10us(INT16U time)
{
   INT16U i;
   for(i=0;i<time;i++)
   {
         SysCtlDelay(TheSysClock/300000);
   }
}
(5)        delay.h文件

#ifndef _delay_H                  
#define _delay_H


void delay10ms(INT16U time);
void delay1ms (INT16U time);
void delay10us(INT16U time);

#endif

(6)        Type.h文件
#ifndef _TYPE_H
#define _TYPE_H

/* 类型定义 */
typedef unsigned char       INT8U;     /* 无符号8位数  */
typedef signed   char       INT8S;     /* 有符号8位数  */
typedef unsigned short int  INT16U;    /* 无符号16位数 */
typedef signed   short int  INT16S;    /* 有符号16位数 */
typedef unsigned long  int  INT32U;    /* 无符号32位数 */
typedef signed   long  int  INT32S;    /* 有符号32位数 */
typedef float               FP32;      /* 单精度浮点数 */
typedef double              FP64;      /* 双精度浮点数 */
typedef unsigned char       tBoolean;

#endif

使用特权

评论回复
地板
lilihua0721|  楼主 | 2011-11-18 23:03 | 只看该作者
本帖最后由 lilihua0721 于 2011-11-20 10:51 编辑

三、TI LM3S811板与LCD128*64硬件接口连接
我使用的这个屏工作电压是5V,而LM3S811  IO输出电压为3.3V,所以两者通讯电平不一致,无法完成通讯,在此为了完成测试,采用万能板手动焊接了个简易电路,原理图为:
这个电平转换电路有个地方需要注意:电平转换是反向的,以第一个为例,当M19_PA2为3.3时,LCD_CLK电平为0V,当M19_PA2为0V时,LCD_CLK电平为5V
焊接电平转换万能板的正面展示:
焊接电平转换万能板的背面展示:
四、 LCD显示展示
(1)        图片显示

(2)        文字显示


五、其他
(1)JTAG防止死锁
Stellaris 系列 ARM 一般都采用 JTAG 接口,在调试过程中有可能偶尔出现芯片的 JTAG 接口连接失效的问题,即遇到用调试器再也无法连接的情况。导致芯片 JTAG 接口连接失效的原因有多种,如与 JTAG 接口复用的 GPIO 管脚被占用、程序中已启用看门狗定时器(总是在不断复位,干扰调试)等等,但最常见的原因还是与 JTAG 接口复用的 GPIO 管脚被占用,从而导致上电后 JTAG 调试器来不及与芯片连接。表 1.2 列出了与 JTAG 接口复用的 GPIO 管脚
如果出现JTAG接口连接失效的情况,可以通过LMFlashProgrammer编程工具软件来解
锁。
解锁操作的具体步骤是:
运行 LMFlashProgrammer 软件,把 JTAG Speed(Hz)调到 100,000 以下;点击在 Flash Utilties 选项卡里的 Erase 按钮进行擦除操作,看能否恢复连接;如果不行,则切换到 Other Utilties 选项卡,在 Debug Port Unlock 复选框里选择芯片的家族:LM3S1000 以下的为 Sandstorm(沙暴)家族,LM3S1000 以上的为 Fury(狂暴)和 DustDevil(尘魔)家族;先按住复位键不松手,再点击 Other Utilties 选项卡里的 Unlock 按钮进行解锁操作;操作完成后重新复位芯片即完成解锁操作,同时片内 Flash 内容也被擦除。
需要当心的是:对于 Sandstorm 家族(即 LM3S100、300、600、800 等),一旦 JTAG
接口因为误将其无防护地配置为 GPIO 接口而被锁定,则有可能再也无法恢复。为了防患于未然,我们建议在编写每一个应用程序时都必须要在 main( )函数的开始处插入一段能够预防 JTAG 失效的代码(对于 Fury 和 DustDevil 家族也推荐这样做)。在 lcdTest 例程中 主函数mian.c下面一段代码(        
/**********JTAG防止死锁*************/
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);              //使能外设GIOPC
           GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);    //设置USER按键所在管脚为输入
    if (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00) //若复位时按下USER按键,则进入
    {
        for (;;);                                         //死循环,以等待JTAG连接
    }
    SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);         //禁止USER按键所在的GPIO端口)
就是预防 JTAG 失效的范例代码,请参考。该段代码的工作原理是:
        将能够有效预防 JTAG 失效的代码插入到 main( )函数的开始处;
        芯片正常复位时,由于USER按键没有被按下,因此会直接运行后面的代码,此段防JTAG失效代码不影响正常的操作;
        当需要 JTAG 连接时,先按住USER按键不松手,再复位,则程序进入一个死循环,以等待 JTAG 连接,在此状态下连接是非常可靠的。
有了 防JTAG失效代码的保障,我们就可以放心大胆地使用与 JTAG 接口复用的 GPIO 了,不必担心 JTAG 接口再被锁死的问题了!另外,我们还可以充分利用 JTAG 接口的这一特性来为自己的程序加密,以防非法复制。
(2)图片点阵提取
单色LCD 128*64液晶显示图片只能是128*64像素的,一般提取点阵首先要将图片转换为128*64像素,然后用画图工具(开始->所有程序->附件->画图)打开,将其保存为单色位图,最后用点阵提取工具提取点阵。

使用特权

评论回复
5
abby_| | 2011-11-19 00:19 | 只看该作者
是真的容易上手吗?我也只是初学者,真的还没开始学的初学者。

使用特权

评论回复
6
yirongfu| | 2011-11-19 11:04 | 只看该作者
不错,:victory:

使用特权

评论回复
7
xiazhifei| | 2011-11-19 13:59 | 只看该作者
MARK

使用特权

评论回复
8
wintryer| | 2011-11-21 22:49 | 只看该作者
挺厉害的

使用特权

评论回复
9
keken| | 2011-11-22 07:13 | 只看该作者
我喜欢

使用特权

评论回复
10
keken| | 2011-11-22 07:13 | 只看该作者
很有参考价值

使用特权

评论回复
11
aass1| | 2011-11-22 07:15 | 只看该作者
心得很酷

使用特权

评论回复
12
aass1| | 2011-11-22 07:15 | 只看该作者
赞一个

使用特权

评论回复
13
lfzhou1006| | 2011-11-22 23:50 | 只看该作者
真的太酷了,很有参考价值!!

使用特权

评论回复
14
lzlong| | 2011-11-23 15:44 | 只看该作者
太好看了 我也要好好地学习 争取有楼主那么厉害

使用特权

评论回复
15
jzhjt29| | 2011-11-23 17:35 | 只看该作者
楼主给力 啊    希望以后这种东西多发点

使用特权

评论回复
16
liangpingyy| | 2011-11-23 21:40 | 只看该作者
写得很仔细,但是手头上的东西不多,有点困难,准备慢慢来

使用特权

评论回复
17
小庄001| | 2011-11-23 21:54 | 只看该作者
好,好!

使用特权

评论回复
18
lcq07| | 2011-11-24 21:33 | 只看该作者
防止jtag连接失效最简单就是芯片一复位什么也不做就空跑一段时间

使用特权

评论回复
19
lilihua0721|  楼主 | 2011-11-24 22:51 | 只看该作者
18# lcq07
若复位就让他空跑一段时间的话很不实用的,正常复位的情况下是有些场合是不允许空跑的!!

使用特权

评论回复
20
cooran| | 2011-11-25 11:26 | 只看该作者
非常详细的操作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

470

帖子

2

粉丝