#include<c8051F020.h>
#include<absacc.h>
#include<stdio.h>
#include "port.h"
#include "ZM.h"
#include "DS12C887.h"
#include "TLCDA.h"
#define uchar unsigned char
#define uint unsigned int
void delay(uint i)
{
uint j;
while(i)
{
for(j=0;j<50;j++);
i--;
}
}
void clock_init()
{
OSCICN=0x95;
}
/*************************************************
函数名称: sysFred()
函数功能:将内部时钟切换到12M的外部晶体
实现步骤:
1.允许外部振荡器
2.等待至少1ms
3.查询XTLVLD'0'=>'1';
4.将系统时钟切换到外部振荡器
************************************************/
void sysFred(void)
{
int i;
OSCXCN=0x67; // 12MHz
for(i=0;i<256;i++);
while(!(OSCXCN&0x80));//等待外部振荡器稳定
OSCICN=0x88; //切换到外部振荡器,且允许时钟丢失检测
}
/******************************************
函数名称:
函数功能:初始化单片机端口
******************************************/
void IO_config(void)
{
P0MDOUT=0xff; //推挽输出
P1MDOUT=0xff; //推挽输出
P1MDIN=0xff; //数字输出
P2MDOUT=0xff; // 推挽输出
P3MDOUT=0xff; // 推挽输出
P74OUT=0xff;
P7=0xff;
EMI0CF=0x07;
XBR2=0x42; // 外部存储器接口低端口使能位,注意因为LCD采用外部寻址
}
/*****************************************
函数名称:LCD_CMD()
函数功能:向LCD写指令
****************************************/
void LCD_CMD(uchar cmd)
{
uchar flag;
do
{
flag=LCD_COMMAND; // 表明读状态;
flag=flag&0x03;
}while(flag!=0x03); //
LCD_COMMAND=cmd;
}
/*****************************************
函数名称:LCD_DATA()
函数功能:向LCD写数据
****************************************/
void LCD_DAT(uchar data0)
{
uchar flag;
do
{
flag=LCD_COMMAND; // read T6963 STATE;
flag=flag&0x03;
}while(flag!=0x03); //data read or write is ready(STA1)
LCD_DATA=data0;
}
/*****************************************
函数名称:LCD_CMD0()
函数功能:向LCD写无参指令
****************************************/
void LCD_CMD0(uchar cmd0 )
{
LCD_CMD(cmd0);
}
/*****************************************
函数名称:LCD_CMD1()
函数功能:向LCD写单参指令
****************************************/
void LCD_CMD1(uchar data1, uchar cmd1)
{
LCD_DAT(data1);
LCD_CMD(cmd1);
}
/*****************************************
函数名称:LCD_CMD2()
函数功能:向LCD写双参指令
****************************************/
void LCD_CMD2(uchar data1,uchar data2,uchar cmd2)
{
LCD_DAT(data1);
LCD_DAT(data2);
LCD_CMD(cmd2);
}
void LCD_INIT()
{
LCD_CMD2(0x01,0x01,0x21 );
LCD_CMD2(0x00,0x00,0x40); //文本区首地址
LCD_CMD2(0x1e,0x00,0x41); //文本区宽度
LCD_CMD2(0x00,0x10,0x42);//图形区首地址
LCD_CMD2(0x1e,0x00,0x43);//图形区宽度
LCD_CMD0(0xa2); //光标所占的行数
LCD_CMD0(0x9f); //光标显示、闪烁,图形区、文本区打开
LCD_CMD0(0x80); //逻辑或
}
/*****************************************
函数名称:cls()
函数功能:清空图形区
*****************************************/
void cls()
{
unsigned int i;
uchar flag;
LCD_CMD2(0x00,0x10,0x24);//设置光标的位置
do
{
flag=LCD_COMMAND; // 表明读状态;
flag=flag&0x08;
}while(flag!=0x08); //
LCD_CMD0(0xb0); //自动写设置
for(i=0;i<128*30;i++)
{
LCD_DAT(0x00);
}
LCD_CMD0(0xb2); //自动写结束
}
/*****************************************
函数名称:clr()
函数功能:清空文本区
*****************************************/
void clr(void)
{
uint i=0;
LCD_CMD2(0x00,0x00,0x24);
for(i=0;i<480;i++)
{
LCD_CMD1(0x00,0xc0);
}
}
/*****************************************
函数名称:hz8()
函数功能:在图形区显示8×8点阵的汉字
*****************************************/
void HZ8(uchar x,uchar y,uint *p)
{
uint place;
uchar i;
place=y*30+x+4096;
for(i=0;i<8;i++)
{
LCD_DAT(place&0xff);
LCD_DAT(place>>8);
LCD_CMD0(0x24);
LCD_CMD1(p[i],0xc4);
place+=30;
}
}
/*****************************************
函数名称:hz8_16()
函数功能:在图形区显示8×16点阵的汉字
*****************************************/
void HZ8_16(uchar x,uchar y,uint *p)
{
uint place;
uchar i;
place=y*30+x+4096;
for(i=0;i<16;i++)
{
LCD_DAT(place&0xff);
LCD_DAT(place>>8);
LCD_CMD0(0x24);
LCD_CMD1(p[i],0xc4);
place+=30;
}
}
/*****************************************
函数名称:hz16()
函数功能:在图形区显示16×16点阵的汉字
*****************************************/
void HZ16(uchar x,uchar y,uint *p)
{
uint place;
uchar i;
place=y*30+x+4096;
for(i=0;i<16;i++)
{
LCD_DAT(place&0xff);
LCD_DAT(place>>8);
LCD_CMD0(0x24);
LCD_CMD1(p[i*2],0xc0);
LCD_CMD1(p[i*2+1],0xc4);
place+=30;
}
}
/*****************************************
函数名称:hz24()
函数功能:在图形区显示24*24点阵的汉字
*****************************************/
void HZ24(uchar x,uchar y,uint *p)
{
uint place;
uchar i;
place=y*30+x+4096;
for(i=0;i<24;i++)
{
LCD_DAT(place&0xff);
LCD_DAT(place>>8);
LCD_CMD0(0x24);
LCD_CMD1(p[i*3],0xc0);
LCD_CMD1(p[i*3+1],0xc0);
LCD_CMD1(p[i*3+2],0xc4);
place+=30;
}
}
/*****************************************
函数名称:hz32()
函数功能:在图形区显示32*32点阵的汉字
*****************************************/
void HZ32(uchar x,uchar y,uint *p)
{
uint place;
uchar i;
place=y*30+x+4096;
for(i=0;i<32;i++)
{
LCD_DAT(place&0xff);
LCD_DAT(place>>8);
LCD_CMD0(0x24);
LCD_CMD1(p[i*4],0xc0);
LCD_CMD1(p[i*4+1],0xc0);
LCD_CMD1(p[i*4+2],0xc0);
LCD_CMD1(p[i*4+3],0xc4);
place+=30;
}
}
/*****************************************
函数名称:KJJM()
函数功能:开机界面显示函数
*****************************************/
void KJJM()
{
HZ32(5,13,ZM_G);
HZ32(9,13,ZM_HG);
HZ32(13,13,ZM_8);
HZ32(17,13,ZM_0);
HZ32(21,13,ZM_0);
HZ32(2,70,ZM_HUAN);
HZ32(7,70,ZM_YING);
HZ32(12,70,ZM_NIN);
HZ32(17,70,ZM_SHI);
HZ32(22,70,ZM_YONG);
HZ32(26,70,ZM_TH);
}
main()
{
uchar t1=0;
WDTCN = 0xde; // 关闭看门狗
WDTCN = 0xad;
//clock_init();
sysFred();
IO_config();
cls();
clr();
LCD_INIT();
time_set();
LCD_CMD2(0x00,0x10,0x24);
KJJM();
delay(1);
ZX_adjust(0x00);
XW_adjust(0x00);
GY_adjust(0x00);
ZS_adjust(0x00);
while (1)
{
t1=read_second();
HZ8(0,0,SZ_X[t1>>4]);
HZ8(1,0,SZ_X[t1&0x0f]);
}
}