⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 TI公司TMS320VC5509的外设驱动程序
💻 C
字号:
/*
 *  Copyright (C) 2001, Spectrum Digital, Inc.  All Rights Reserved.
 */
 
#include "5509.h"
#include "util.h"

// LCD control pins
#define LCD_BUSY GPIO_4

// LCD command codes (SED1565 command set)
#define LCDCMD_SETCOLL       0x00
#define LCDCMD_SETCOLH       0x10
#define LCDCMD_SETRATIO      0x20
#define LCDCMD_SETPOWER      0x28
#define LCDCMD_SETLINE       0x40
#define LCDCMD_DISPLAY_OFF   0xae
#define LCDCMD_SETBIAS_HI    0xa2
#define LCDCMD_SETBIAS_LO    0xa3
#define LCDCMD_NONE          0xa4
#define LCDCMD_ALL           0xa5
#define LCDCMD_REVERSE_ON    0xa7
#define LCDCMD_REVERSE_OFF   0xa6
#define LCDCMD_DISPLAY_ON    0xaf
#define LCDCMD_SETPAGE       0xb0
#define LCDCMD_RESET         0xe2
#define LCDCMD_SETCOMDIR_FWD 0xc0
#define LCDCMD_SETCOMDIR_REV 0xc8

#define LCD_TEXTROWS         8
#define LCD_TEXTCOLS         21
#define LCD_PIXELROWS        64
#define LCD_PIXELCOLS        128

// Character set, 5 bytes each, starting from ASCII 16 
unsigned char charset[96 * 5 ]= {
    0x00, 0x00, 0x00, 0x00, 0x00, // ASCII 32
    0x00, 0x00, 0x6f, 0x00, 0x00, // ASCII 33, !
    0x00, 0x00, 0x07, 0x00, 0x07, // ASCII 34, "
    0x14, 0x7f, 0x14, 0x7f, 0x14, // ASCII 35, #
    0x24, 0x2a, 0x7f, 0x2a, 0x12, // ASCII 36, $
    0x43, 0x33, 0x08, 0x66, 0x61, // ASCII 37, %
    0x32, 0x4d, 0x59, 0x21, 0x72, // ASCII 38, &
    0x00, 0x00, 0x03, 0x00, 0x00, // ASCII 39, '
    0x00, 0x00, 0x3e, 0x41, 0x00, // ASCII 40, (
    0x00, 0x41, 0x3e, 0x00, 0x00, // ASCII 41, )
    0x0a, 0x0c, 0x07, 0x0c, 0x0a, // ASCII 42, *
    0x08, 0x08, 0x3e, 0x08, 0x08, // ASCII 43, +
    0x00, 0x00, 0xe0, 0x60, 0x00, // ASCII 44, ,
    0x08, 0x08, 0x08, 0x08, 0x08, // ASCII 45, -    
    0x00, 0x00, 0x60, 0x60, 0x00, // ASCII 46, .
    0x40, 0x30, 0x08, 0x06, 0x01, // ASCII 47, /
    0x3e, 0x45, 0x49, 0x51, 0x3e, // ASCII 48, 0
    0x00, 0x42, 0x7f, 0x40, 0x00, // ASCII 49, 1
    0x62, 0x51, 0x49, 0x45, 0x42, // ASCII 50, 2
    0x22, 0x41, 0x49, 0x49, 0x36, // ASCII 51, 3
    0x08, 0x0c, 0x0a, 0x7f, 0x08, // ASCII 52, 4
    0x2f, 0x49, 0x49, 0x49, 0x31, // ASCII 53, 5
    0x3e, 0x49, 0x49, 0x49, 0x32, // ASCII 54, 6
    0x01, 0x71, 0x09, 0x05, 0x03, // ASCII 55, 7
    0x36, 0x49, 0x49, 0x49, 0x36, // ASCII 56, 8
    0x26, 0x49, 0x49, 0x49, 0x3e, // ASCII 57, 9
    0x00, 0x36, 0x36, 0x00, 0x00, // ASCII 58, :
    0x00, 0x00, 0x36, 0x16, 0x00, // ASCII 59, ;
    0x00, 0x08, 0x14, 0x22, 0x00, // ASCII 60, <
    0x00, 0x14, 0x14, 0x14, 0x14, // ASCII 61, =
    0x00, 0x22, 0x14, 0x08, 0x00, // ASCII 62, >
    0x02, 0x01, 0x59, 0x05, 0x02, // ASCII 63, ?
    0x3e, 0x41, 0x5d, 0x55, 0x5e, // ASCII 64, @
    0x7e, 0x09, 0x09, 0x09, 0x7e, // ASCII 65, A
    0x7f, 0x49, 0x49, 0x49, 0x36, // ASCII 66, B
    0x3e, 0x41, 0x41, 0x41, 0x22, // ASCII 67, C
    0x7f, 0x41, 0x41, 0x41, 0x3e, // ASCII 68, D
    0x7f, 0x49, 0x49, 0x49, 0x41, // ASCII 69, E
    0x7f, 0x09, 0x09, 0x09, 0x01, // ASCII 70, F
    0x3e, 0x41, 0x49, 0x49, 0x3a, // ASCII 71, G
    0x7f, 0x08, 0x08, 0x08, 0x7f, // ASCII 72, H
    0x41, 0x41, 0x7f, 0x41, 0x41, // ASCII 73, I
    0x20, 0x40, 0x40, 0x40, 0x3f, // ASCII 74, J
    0x7f, 0x08, 0x14, 0x22, 0x41, // ASCII 75, K
    0x7f, 0x40, 0x40, 0x40, 0x40, // ASCII 76, L
    0x7f, 0x02, 0x0c, 0x02, 0x7f, // ASCII 77, M
    0x7f, 0x04, 0x08, 0x10, 0x7f, // ASCII 78, N
    0x3e, 0x41, 0x41, 0x41, 0x3e, // ASCII 79, O
    0x7f, 0x09, 0x09, 0x09, 0x06, // ASCII 80, P
    0x3e, 0x41, 0x51, 0x21, 0x5e, // ASCII 81, Q
    0x7f, 0x09, 0x19, 0x29, 0x46, // ASCII 82, R
    0x26, 0x49, 0x49, 0x49, 0x32, // ASCII 83, S
    0x01, 0x01, 0x7f, 0x01, 0x01, // ASCII 84, T
    0x3f, 0x40, 0x40, 0x40, 0x3f, // ASCII 85, U
    0x07, 0x18, 0x60, 0x18, 0x07, // ASCII 86, V
    0x1f, 0x60, 0x18, 0x60, 0x1f, // ASCII 87, W
    0x63, 0x14, 0x08, 0x14, 0x63, // ASCII 88, X
    0x07, 0x08, 0x70, 0x08, 0x07, // ASCII 89, Y
    0x61, 0x51, 0x49, 0x45, 0x43, // ASCII 90, Z
    0x00, 0x7f, 0x41, 0x41, 0x00, // ASCII 91, [
    0x01, 0x06, 0x08, 0x30, 0x40, // ASCII 92, 
    0x00, 0x41, 0x41, 0x7f, 0x00, // ASCII 93, ]
    0x04, 0x02, 0x01, 0x02, 0x04, // ASCII 94, ^
    0x40, 0x40, 0x40, 0x40, 0x40, // ASCII 95, _
    0x01, 0x03, 0x00, 0x00, 0x00, // ASCII 96, `
    0x38, 0x44, 0x44, 0x24, 0x78, // ASCII 97, a
    0x7f, 0x44, 0x44, 0x44, 0x38, // ASCII 98, b
    0x38, 0x44, 0x44, 0x44, 0x28, // ASCII 99, c
    0x38, 0x44, 0x44, 0x44, 0x7f, // ASCII 100, d
    0x38, 0x54, 0x54, 0x54, 0x48, // ASCII 101, e
    0x00, 0x08, 0x7e, 0x09, 0x02, // ASCII 102, f
    0x18, 0xa4, 0xa4, 0xa4, 0x78, // ASCII 103, g
    0x7f, 0x04, 0x04, 0x04, 0x78, // ASCII 104, h
    0x00, 0x00, 0x7d, 0x40, 0x00, // ASCII 105, i
    0x40, 0x80, 0x80, 0x7d, 0x00, // ASCII 106, j
    0x00, 0x7f, 0x10, 0x28, 0x44, // ASCII 107, k
    0x00, 0x00, 0x7f, 0x00, 0x00, // ASCII 108, l
    0x78, 0x04, 0x18, 0x04, 0x78, // ASCII 109, m
    0x7c, 0x08, 0x04, 0x04, 0x78, // ASCII 110, n
    0x38, 0x44, 0x44, 0x44, 0x38, // ASCII 111, o
    0xf8, 0x24, 0x24, 0x24, 0x18, // ASCII 112, p
    0x18, 0x24, 0x24, 0x24, 0xf8, // ASCII 113, q
    0x7c, 0x08, 0x04, 0x04, 0x04, // ASCII 114, r
    0x48, 0x54, 0x54, 0x54, 0x24, // ASCII 115, s
    0x04, 0x04, 0x7e, 0x44, 0x04, // ASCII 116, t
    0x3c, 0x40, 0x40, 0x20, 0x7c, // ASCII 117, u
    0x0c, 0x30, 0x40, 0x30, 0x0c, // ASCII 118, v
    0x3c, 0x40, 0x30, 0x40, 0x3c, // ASCII 119, w
    0x44, 0x28, 0x10, 0x28, 0x44, // ASCII 120, x
    0x1c, 0xa0, 0xa0, 0xa0, 0x7c, // ASCII 121, y
    0x44, 0x64, 0x54, 0x4c, 0x44, // ASCII 122, z
    0x08, 0x08, 0x36, 0x41, 0x41, // ASCII 123, {
    0x00, 0x00, 0x77, 0x00, 0x00, // ASCII 124, |
    0x41, 0x41, 0x36, 0x08, 0x08, // ASCII 125, }
    0x02, 0x01, 0x01, 0x02, 0x01, // ASCII 126, ~
    0xaa, 0x55, 0xaa, 0x55, 0xaa  // ASCII 127
};



char hexstr[16] = {'0', '1', '2', '3' ,'4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

void LCD_Write(int a0, unsigned short data)
{
    PC55XX_GPIO pGPIO = (PC55XX_GPIO)C55XX_GPIO_ADDR;

    // Wait for display if busy
    while (!(pGPIO -> iodata & LCD_BUSY));
    
    // Write a byte to the display
    Logic_WriteDisplay(a0, data);
}

void LCD_SetPos(int col, int page)
{
    LCD_Write(0, LCDCMD_SETPAGE | page);
    LCD_Write(0, LCDCMD_SETCOLH | ((col >> 4) & 0xf));
    LCD_Write(0, LCDCMD_SETCOLL | (col & 0xf));
}

void LCD_SetReverse(int rev)
{
    LCD_Write(0, LCDCMD_REVERSE_ON | rev);
}

void LCD_SetStartLine(int row)
{
    LCD_Write(0, LCDCMD_SETLINE | row);
}

LCD_SetRatio(int ratio)
{
    LCD_Write(0, LCDCMD_SETRATIO | ratio);
}

void LCD_Raw(unsigned char *pdata, int len)
{
    int i;
    
    for (i = 0; i < len; i++)
        LCD_Write(1, *pdata++);
}

void LCD_RawPos(int x, int y, unsigned char *pdata, int len)
{
    LCD_SetPos(x, y);
    LCD_Raw(pdata, len);
}

void LCD_Char(char ch)
{
    int i;
    unsigned char *pdata;
    
    if (ch < 32)
        ch = 32;
    pdata = &charset[(ch - 32) * 5];
    
    for (i = 0; i < 5; i++)
        LCD_Write(1, *pdata++);
    LCD_Write(1, 0);
}

void LCD_CharPos(int x, int y, char ch)
{
    LCD_SetPos(x * 6, y);
    LCD_Char(ch);
}

void LCD_Text(char *str)
{
    while (*str & 0xff)
        LCD_Char(*str++);
}

void LCD_TextPos(int x, int y, char *str)
{
    LCD_SetPos(x * 6, y);
    LCD_Text(str);
}

void LCD_Hex(unsigned short hexnum)
{
    int i;
    char hextext[5];
    
    // Build a ASCII hex string
    for (i = 3; i >= 0; i--)
    {
        hextext[i] = hexstr[hexnum & 0xf];
        hexnum = hexnum >> 4; 
    }
    hextext[4] = 0;
    
    // Display the hex number
    LCD_Text(hextext); 

}

void LCD_HexPos(int x, int y, unsigned short int hexnum)
{
    LCD_SetPos(x * 6, y);
    LCD_Hex(hexnum);    
}

void LCD_FillScreen(unsigned char value)
{
    int x, y;
    
    for (y = 0; y < LCD_TEXTROWS; y++)
    {
        LCD_SetPos(0, y);
        for (x = 0; x < LCD_PIXELCOLS; x++)
            LCD_Write(1, value);
    }
}

void LCD_ClearRow(int row)
{
	int i;
	LCD_SetPos(0,row);
	for ( i = 0 ; i<128 ; i++ )
		LCD_Write(1,0);
}

void LCD_ClearScreen()
{
    LCD_FillScreen(0);
}

void LCD_Init()
{
    PC55XX_GPIO pGPIO = (PC55XX_GPIO)C55XX_GPIO_ADDR;

    // Configure LCD_BUSY/GPIO_4 for input
    ClearMask(pGPIO -> iodir, LCD_BUSY);

    // Configure the display
    LCD_Write(0, LCDCMD_RESET);          // Reset the display    
    LCD_Write(0, LCDCMD_SETPOWER | 7);   // Turn internal voltage regulator/booster on
    LCD_Write(0, LCDCMD_SETRATIO | 4);   // Set contrast ratio to 4
    LCD_Write(0, LCDCMD_SETBIAS_HI);     // Set LCD bias high
    LCD_Write(0, LCDCMD_DISPLAY_ON);     // Turn display on
    LCD_Write(0, LCDCMD_SETCOMDIR_REV);  // Reverse the row addressing so 0,0 is in upper left

    // Set the first line to 0 (normal mode)    
    LCD_SetStartLine(0);
    
    // Clear the screen
    LCD_ClearScreen();
}

void LCD_Charset()
{
    int x, y;
 
    for (y = 0; y < 6; y++)
        for (x = 0; x < 16; x++)
            LCD_CharPos(x + 2, y + 1, 32 + (y << 4) + x);
}

void LCD_Fill1(int value)
{
    int i, j, middlescreen;

    middlescreen = LCD_PIXELCOLS >> 1;
    for (i = 0; i < middlescreen; i+=1)
    {
        for (j = 0; j < LCD_TEXTROWS; j++)
        {
            LCD_SetPos(middlescreen - i - 1, j);
            LCD_Write(1, value);
            LCD_SetPos(middlescreen + i, j);
            LCD_Write(1, value);
        }
        SWDelayMsec(20);
    }
}

unsigned short LCD_Test()
{
    int i;
    
    // Initialize the display
    LCD_Init();

    // Set all pixels on and off to check for dead pixels
    for (i = 0; i < 12; i++)
    {
        LCD_FillScreen(0x00);
        SWDelayMsec(50);
        LCD_FillScreen(0xff);
        SWDelayMsec(50);
    }
    LCD_ClearScreen();

    // Draw lines across the screen to check addressability
    LCD_Fill1(0xff);
    LCD_Fill1(0x00);
    LCD_ClearScreen();
    
    return 0;
}

void LCD_Debug()
{
    LCD_Init();
    
//    while(1)
//        LCD_Write(1, 0xa5);
    
    LCD_Charset();
    while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -