TFT液晶显示时钟程序.docx
《TFT液晶显示时钟程序.docx》由会员分享,可在线阅读,更多相关《TFT液晶显示时钟程序.docx(18页珍藏版)》请在冰豆网上搜索。
TFT液晶显示时钟程序
TFT液晶显示时钟程序
说明:
该程序文件中包含三个.c文件和三个.h文件,方便读者理解程序的层次性和关联性。
该程序的功能是利用51单片机实现逻辑控制,在液晶显示屏上显示动态时钟。
1.shizhong.c(实际上是主程序):
#include"REG51.H"
#include"gui.h"
unsignedcharcount;
#definekeyP1
sbitK=P2^0;
unsignedchara;
unsignedcharb;
unsignedcharc;
unsignedchard;
unsignedchare;
unsignedcharf;
unsignedcharg;
unsignedcharsw;
unsignedcharh1=0;
unsignedcharh2=0;
unsignedcharh3=0;
unsignedintq;
voidKeyboard()
{
unsignedintk;
key=0xf0;
if(key!
=0xf0)
{
for(q=0;q<800;q++);
if(key!
=0xf0)
{
key=0x0f;
switch(key)
{
case(0x0e):
k=0;break;
case(0x0d):
k=4;break;
case(0x0b):
k=8;break;
case(0x07):
k=12;break;
}
key=0xf0;
switch(key)
{
case(0xe0):
k=k;break;
case(0xd0):
k=k+1;break;
case(0xb0):
k=k+2;break;
case(0x70):
k=k+3;break;
}
while(key!
=0xf0);
switch(k)
{
case0:
f++;P0=0x01;if(f==3){f=0;}break;
case1:
e++;P0=0x02;if(f<2){if(e==10){e=0;}}if(f==2){if(e==4){e=0;}}break;
case2:
d++;P0=0x04;if(d==6){d=0;}break;
case3:
c++;P0=0x08;if(c==10){c=0;}break;
case4:
b++;P0=0x10;if(b==6){b=0;}break;
case5:
a++;P0=0x20;if(a==10){a=0;}break;
case6:
sw=0;break;
case7:
sw=1;break;
}
}
}
}
voidjishu()
{
K=1;
if(K==0)
{
for(q=0;q<800;q++);
if(K==0)
{
h1++;
if(h1==10)
{
h1=0;
h2++;
if(h2==10)
{
h2=0;
h3++;
}
}
while(K==0);
}
}
GUI_WriteASCII(0,50,h3,RED,WHITE);
GUI_WriteASCII(16,50,h2,RED,WHITE);
GUI_WriteASCII(32,50,h1,RED,WHITE);
}
voidmain(void)
{
TFT_Init();
TFT_ClearScreen(BLACK);
EA=1;
ET1=1;
TMOD=0x10;
TH1=15536/256;
TL1=15536%256;
TR1=1;
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=10;
count=0;
sw=1;
GUI_WriteASCII(0,50,0,RED,WHITE);
GUI_WriteASCII(16,50,0,RED,WHITE);
GUI_WriteASCII(32,50,0,RED,WHITE);
while
(1)
{
while(sw)
{
TR1=1;
jishu();
if(count>=20)
{
count=0;a++;
if(a==10)
{
a=0;b++;
if(b==6)
{
b=0;c++;
if(c==10)
{
c=0;d++;
if(d==6)
{
d=0;e++;
if(f<2&&e==10)
{
e=0;f++;
}
if(f==2&&e==4)
{f=0;e=0;}
}
}
}
}
GUI_WriteASCII(0,0,f,RED,WHITE);
GUI_WriteASCII(16,0,e,RED,WHITE);
GUI_WriteASCII(32,0,g,RED,WHITE);
GUI_WriteASCII(48,0,d,RED,WHITE);
GUI_WriteASCII(64,0,c,RED,WHITE);
GUI_WriteASCII(80,0,g,RED,WHITE);
GUI_WriteASCII(96,0,b,RED,WHITE);
GUI_WriteASCII(112,0,a,RED,WHITE);
}
Keyboard();
}
Keyboard();
GUI_WriteASCII(0,0,f,RED,WHITE);
GUI_WriteASCII(16,0,e,RED,WHITE);
GUI_WriteASCII(32,0,g,RED,WHITE);
GUI_WriteASCII(48,0,d,RED,WHITE);
GUI_WriteASCII(64,0,c,RED,WHITE);
GUI_WriteASCII(80,0,g,RED,WHITE);
GUI_WriteASCII(96,0,b,RED,WHITE);
GUI_WriteASCII(112,0,a,RED,WHITE);
TR1=0;
}
}
voidTime1(void)interrupt3
{
count++;
TH1=15536/256;
TL1=15536%256;
}
2.gui.c:
#include"gui.h"
#include"charcode.h"
#ifdefUSE_ASCII
voidGUI_WriteASCII(ucharx,uchary,ucharp,uintwordColor,uintbackColor)
{
ucharj,wordByte,wordNum;
uintcolor;
wordNum=p;
TFT_SetWindow(x,y,x+15,y+23);
for(wordByte=0;wordByte<48;wordByte++)
{
color=ASCII16x24[wordNum][wordByte];
for(j=0;j<8;j++)
{
if((color&0x80)==0x80)
{
TFT_WriteData(wordColor);
}
else
{
TFT_WriteData(backColor);
}
color<<=1;
}
}
}
#endif
3.driver.c:
#include"driver.h"
/****************************************************************************
*函数名:
TFT_WriteCmd
*输入:
cmd
*输出:
*功能:
写命令。
****************************************************************************/
voidTFT_WriteCmd(uintcmd)
{
ucharcmdH,cmdL;
cmdH=cmd>>8;
cmdL=cmd&0x00FF;
TFT_WR=1;//初始化WR
TFT_CS=0;//打开片选
TFT_RD=1;//选择写
TFT_RS=0;//选择命令
TFT_DATAPORTH=cmdH;//放置命令数据
TFT_DATAPORTL=cmdL;//放置命令数据
TFT_WR=0;//写入时序
TFT_WR=1;
TFT_CS=1;//关闭片选
}
/****************************************************************************
*函数名:
TFT_WriteCmdData
*输入:
cmd,dat
*输出:
*功能:
写命令,写数据。
****************************************************************************/
voidTFT_WriteData(uintdat)
{
uchardatH,datL;
datH=dat>>8;
datL=dat&0x00FF;
TFT_WR=1;//初始化WR
TFT_CS=0;//打开片选
TFT_RD=1;//选择写
TFT_RS=1;//选择发送数据
TFT_DATAPORTH=datH;//放置命令数据
TFT_DATAPORTL=datL;//放置命令数据
TFT_WR=0;//写入时序
TFT_WR=1;
TFT_CS=1;//关闭片选
}
/****************************************************************************
*函数名:
TFT_Init
*输入:
*输出:
*功能:
初始化TFT。
****************************************************************************/
voidTFT_Init(void)
{
uinti;
TFT_RST=1;
for(i=500;i>0;i--);
TFT_RST=0;
for(i=500;i>0;i--);
TFT_RST=1;
for(i=5000;i>0;i--);
TFT_CS=0;
TFT_WriteCmd(0x11);
TFT_WriteCmd(0xc5);
TFT_WriteData(0xc5);
TFT_WriteCmd(0xf0);
TFT_WriteData(0x5a);
TFT_WriteCmd(0xf2);
TFT_WriteData(0x01);
TFT_WriteCmd(0xe0);
TFT_WriteData(0x00);
TFT_WriteData(0x01);
TFT_WriteData(0x06);
TFT_WriteData(0x2e);
TFT_WriteData(0x2b);
TFT_WriteData(0x0b);
TFT_WriteData(0x1a);
TFT_WriteData(0x02);
TFT_WriteData(0x06);
TFT_WriteData(0x05);
TFT_WriteData(0x0c);
TFT_WriteData(0x0d);
TFT_WriteData(0x00);
TFT_WriteData(0x05);
TFT_WriteData(0x02);
TFT_WriteData(0x05);
TFT_WriteCmd(0xe1);
TFT_WriteData(0x06);
TFT_WriteData(0x23);
TFT_WriteData(0x25);
TFT_WriteData(0x0f);
TFT_WriteData(0x0a);
TFT_WriteData(0x04);
TFT_WriteData(0x02);
TFT_WriteData(0x1a);
TFT_WriteData(0x05);
TFT_WriteData(0x03);
TFT_WriteData(0x06);
TFT_WriteData(0x01);
TFT_WriteData(0x0c);
TFT_WriteData(0x0b);
TFT_WriteData(0x05);
TFT_WriteData(0x05);
TFT_WriteCmd(0x3a);
TFT_WriteData(0x05);
TFT_WriteCmd(0x36);
TFT_WriteData(0xC8);
TFT_WriteCmd(0x29);
}
/****************************************************************************
*函数名:
TFT_SetWindow
*输入:
xStart,yStart,xEnd,yEnd
*输出:
*功能:
设置要操作的窗口。
****************************************************************************/
voidTFT_SetWindow(ucharxStart,ucharyStart,ucharxEnd,ucharyEnd)
{
TFT_WriteCmd(0x2A);
TFT_WriteData(0x00);
TFT_WriteData(xStart);
TFT_WriteData(0x00);
TFT_WriteData(xEnd);
TFT_WriteCmd(0x2b);
TFT_WriteData(0x00);
TFT_WriteData(yStart);
TFT_WriteData(0x00);
TFT_WriteData(yEnd);
TFT_WriteCmd(0x2c);
}
/****************************************************************************
*函数名:
GUI_Clearcreen
*输入:
backColor
*输出:
*功能:
清屏并涂上颜色。
****************************************************************************/
voidTFT_ClearScreen(uintcolor)
{
uinti,j;
TFT_SetWindow(0,0,TFT_XMAX,TFT_YMAX);//作用区域
for(i=0;i<=TFT_XMAX;i++)
{
for(j=0;j<=TFT_YMAX;j++)
{
TFT_WriteData(color);
}
}
}
4.driver.h
#ifndef_DRIVER_H
#define_DRIVER_H
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
//---定义使用的IO口---//
sbitTFT_RST=P3^3;//复位
sbitTFT_CS=P3^2;//片选
sbitTFT_RS=P2^7;//数据命令选择端
sbitTFT_WR=P2^6;//读写控制
sbitTFT_RD=P2^5;//读写控制
#defineTFT_DATAPORTHP1//放置高8位数据
#defineTFT_DATAPORTLP0
//---定义屏的大小---//
#defineTFT_XMAX((uchar)175)////设置TFT屏的大小
#defineTFT_YMAX((uchar)219)//
//---定义颜色的宏---//
#defineWHITE0xFFFF
#defineBLACK0x0000
#defineBLUE0x001F
#defineRED0xF800
#defineMAGENTA0xF81F
#defineGREEN0x07E0
#defineCYAN0x7FFF
#defineYELLOW0xFFE0//定义颜色的宏
//--声明全局函数--//
voidTFT_WriteCmd(uintcmd);
voidTFT_WriteData(uintdat);
voidTFT_Init(void);
voidTFT_SetWindow(ucharxStart,ucharyStart,ucharxEnd,ucharyEnd);
voidTFT_ClearScreen(uintcolor);
#endif
5.gui.h
#ifndef_GUI_H_
#define_GUI_H_
#include"driver.h"
#defineUSE_ASCII
voidGUI_WriteASCII(ucharx,uchary,ucharp,uintwordColor,uintbackColor);
#endif
6.charcode.h
#ifndef__CHARCODE_H
#define__CHARCODE_H
#ifdefUSE_ASCII
constunsignedcharcodeASCII16x24[11][48]=
{
/*--文字:
0--*/
/*--宋体18;此字体下对应的点阵为:
宽x高=12x24--*/
/*--宽度不是8的倍数,现调整为:
宽度x高度=16x24--*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,
0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
0x60,0x60,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},
/*--文字:
1--*/
/*--宋体18;此字体下对应的点阵为:
宽x高=12x24--*/
/*--宽度不是8的倍数,现调整为:
宽度x高度=16x24--*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x3E,0x00,
0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,
0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,},
/*--文字:
2--*/
/*--宋体18;此字体下对应的点阵为:
宽x高=12x24--*/
/*--宽度不是8的倍数,现调整为:
宽度x高度=16x24--*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x80,0x40,0xC0,
0x60,0xC0,0x60,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x04,0x00,0x08,0x00,
0x10,0x40,0x20,0x40,0x40,0x40,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,},
/*--文字:
3--*/
/*--宋体18;此字体下对应的点阵为:
宽x高=12x24--*/
/*--宽度不是8的倍数,现调整为:
宽度x高度=16x24--*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x23,0x00,0x61,0x80,
0x61,0x80,0x61,0x80,0x01,0x80,0x03,0x00,0x0E,0x00,0x01,0x80,0x00,0x80,0x00,0xC0,
0x60,0xC0,0x60,0xC0,0x60,0xC0,0x21,0x80,0x1F,0x00,0x00,0x00,0x00,0x