紫蜂吧 关注:9贴子:85
  • 0回复贴,共1

TFT屏幕驱动

只看楼主收藏回复

/****************************************************************************
* 文 件 名: main.c
* 版 本: SPI TFT V1.0 原创支持多种显示屏驱动
* 描 述: 按下S1显示屏显示不同信息同时LED也变化
****************************************************************************/
#include <ioCC2530.h>
#include <stdio.h>
#include "SPI_TFT.H"
#include "Image.H"
typedef unsigned char uchar;
typedef unsigned int uint ;
#define LED1 P1_0 // 定义P1.0口为LED1控制端
#define LED2 P1_1 // 定义P1.1口为LED2控制端
#define LED3 P1_4 // 定义P1.4口为LED3控制端
#define KEY1 P0_1 // 定义P0.1口为S1控制端
#define ON 0
#define OFF 1
#define SYSCLK_16MHZ 0 // 系统时钟标识
#define SYSCLK_32MHZ 1 // 系统时钟标识
uchar KeyPressed = 0; // 按键按下事件寄存器
/****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<535; j++);
}
/****************************************************************************
* 名 称: LedOnOrOff()
* 功 能: 点亮或熄灭所有LED灯
* 入口参数: mode为0时LED灯亮 mode为1时LED灯灭
* 出口参数: 无
****************************************************************************/
void LedOnOrOff(uchar mode)
{
LED1 = mode;
LED2 = mode;
LED3 = mode; //由于P1.4与仿真器共用,必须拔掉仿真器的插头才能看到LED3的变化
}
/****************************************************************************
* 名 称: InitLed()
* 功 能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
P1DIR |= 0x13; // P1.0、P1.1、P1.4定义为输出
LedOnOrOff(ON); // 使所有LED灯默认为熄灭状态
}
/****************************************************************************
* 名 称: InitKey()
* 功 能: 设置按键相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey()
{
P0SEL &= ~0x02; // 设置P01为普通IO口
P0DIR &= ~0x02; // 按键接在P01口上,设P01为输入模式
P0INP &= ~0x02; // 设置P01为上拉\下拉模式
P2INP &= ~0x02; // P01口设置为上拉模式
P0IEN |= 0x02 ; // P01 设置为中断方式 1:中断使能
PICTL |= 0x01 ; // P0端口下降沿触发
IEN1 |= 0x20 ; // 允许P0口中断;
P0IFG = 0x00 ; // 初始化中断标志位
EA = 1 ; // 打开总中断
}
/****************************************************************************
* 名 称: SetSysClk()
* 功 能: 设置系统时钟
* 参 数: clk_source = SYSCLK_16MHZ设置系统时钟为片上16MHz RC振荡器
* = SYSCLK_32MHZ设置系统时钟为片外32MHz 晶体振荡器
****************************************************************************/
void SetSysClk(uchar clk_source)
{
if(clk_source==SYSCLK_16MHZ)
{
CLKCONCMD |= 0x40; // 设置系统时钟为片上16MHz RC振荡器
CLKCONCMD |= 0x01; // 设置系统时钟速度
}
if(clk_source==SYSCLK_32MHZ)
{
CLKCONCMD &=~0x40; // 设置系统时钟为片外32MHz晶体振荡器
while (!(CLKCONSTA &(~0x40))); // 等待片外32MHz晶体振荡器稳定
CLKCONCMD &=~0x01; // 设置系统时钟速度
}
}
/****************************************************************************
* 名 称: P0_ISR(void) 中断处理函数
* 功 能: 检测是否有按键按下,如果有则进入此中断函数
* 描 述: #pragma vector = 中断向量,紧接着是中断处理程序
****************************************************************************/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG > 0) //按键中断
{
DelayMS(10); //延时去抖
if(P0IFG > 0) //按键中断
{
KeyPressed = 1; //产生中断保存中断状态
}
}
P0IFG = 0; //清中断标志
P0IF = 0; //清端口0中断标志
}
/****************************************************************************
* 名 称: DrawSignal()
* 功 能: 显示信号图标
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void DrawSignal(char value)
{
if(value > 1)
DrawRectFill( 88,12,3,3,GREEN);
if(value > 2)
DrawRectFill( 92,10,3,5,GREEN);
if(value > 3)
DrawRectFill( 96, 8,3,7,GREEN);
if(value > 4)
DrawRectFill(100, 6,3,9,GREEN);
}
/****************************************************************************
* 名 称: DrawBattery()
* 功 能: 显示电池图标
* 入口参数: voltage —电池电压
* 出口参数: 无
****************************************************************************/
void DrawBattery(float voltage)
{
DrawRectFill(103,6,24,12,WHITE);
DrawRect(108,8,3,4,GREEN);
DrawRect(110,6,15,8,GREEN);
if(voltage>3.2)
DrawRectFill(112,8,3,5,GREEN);
if(voltage>3.0)
DrawRectFill(116,8,3,5,GREEN);
if(voltage>2.8)
DrawRectFill(120,8,3,5,GREEN);
}
/****************************************************************************
* 名 称: DisplayLogin()
* 功 能: 显示登陆界面
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void DisplayLogin(void)
{
LCD_clear(WINDOW_BK_COLOR);
DrawRect(9,50,110,51,WINDOW_COLOR); // 画矩形
Color = BLUE ;
Color_BK = WINDOW_BK_COLOR;
LCD_write_CN_string(15, 57,"帐号:");
LCD_write_CN_string(15, 80,"密码:");
DrawRect(54,54,60,20,WINDOW_COLOR); //画账号框
DrawRectFill(55,55,58,18,WHITE);
DrawRect(54,77,60,20,WINDOW_COLOR); //画密码框
DrawRectFill(55,78,58,18,WHITE);
Color_BK = WHITE;
LCD_write_CN_string(60, 57,"安联德");
LCD_write_EN_string(60, 80,"168888");
DrawRectFill(9, 105,110,20 ,WINDOW_COLOR);//画登录框
Color = WHITE ; //字体颜色
Color_BK = WINDOW_COLOR; //字体背景颜色
LCD_write_CN_string(52, 108,"登录");
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
InitLed(); //设置LED灯相应的IO口
InitKey(); //设置KEY相应的IO口
SetSysClk(SYSCLK_32MHZ); //设置系统时钟为32MHz
InitLcd(); //初始化TFT液晶
KeyPressed = 1; //显示初始化界面
while(1)
{
while(!KeyPressed){};//按键按下则显示登录窗口
{
LedOnOrOff(OFF); //关闭D1.D2.D3
DisplayLogin();
ShowImage(gImage_logo);//图片显示示例
KeyPressed = 0;
}
while(!KeyPressed){};//按键按下则显示彩条
{
LedOnOrOff(ON); //点亮D1.D2.D3
DrawRectFill(0, 0,128,10,RED);
DrawRectFill(0, 10,128,10,GREEN);
DrawRectFill(0, 20,128,10,BLUE);
DrawRectFill(0, 30,128,10,WHITE);
DrawRectFill(0, 40,128,10,YELLOW);
DrawRectFill(0, 50,128,10,BLACK);
DrawRectFill(0, 60,128,10,GREY);
DrawRectFill(0, 70,128,10,MAGENTA);
DrawRectFill(0, 80,128,10,DARK_GREY2);
DrawRectFill(0, 90,128,10,CYAN);
DrawRectFill(0,100,128,10,LIGHT_GREY);
DrawRectFill(0,110,128,10,BLUE2);
DrawRectFill(0,120,128, 8,GREY2);
KeyPressed = 0;
}
while(!KeyPressed){};//按键按下则显示正方形
{
LedOnOrOff(OFF); //关闭D1.D2.D3
LCD_clear(WHITE);
DrawSignal(5); //显示信号图标
DrawBattery(3.3); //显示电池图标
DrawRectFill(80, 80,50,50,CYAN);
DrawRectFill(70, 70,50,50,MAGENTA);
DrawRectFill(60, 60,50,50,BLUE2);
DrawRectFill(50, 50,50,50,BLACK);
DrawRectFill(40, 40,50,50,YELLOW);
DrawRectFill(30, 30,50,50,DARK_GREY2);
DrawRectFill(20, 20,50,50,BLUE);
DrawRectFill(10, 10,50,50,GREEN);
DrawRectFill( 0, 0,50,50,RED);
Color = WHITE;
Color_BK = RED;
LCD_write_CN_string( 4, 18,"安联德");
Color = BLACK;
Color_BK = WHITE;
LCD_write_CN_string( 4,112,"强大");
LCD_write_EN_string(32,112,"NO1");
LedOnOrOff(ON); //点亮D1.D2.D3
KeyPressed = 0;
}
while(!KeyPressed){};//按键按下则显示红色
{
LedOnOrOff(ON); //点亮D1.D2.D3
LCD_clear(RED);
KeyPressed = 0;
}
}
}


IP属地:山东1楼2021-10-26 07:39回复