比较简单,最主要的目的是熟悉TimerA的使用。
第一步:TimerA定时产生1s的秒信号。
(1)选择时钟ACLK,32768Hz,设置位UP模式:TACTL = TASSEL_1 + MC_1;
(2)计数个数32786,即得到1s时间:CCR0 = 32768 - 1;
(3)使能CCR0和总中断:CCTL0 |= CCIE;_EINT();
第二步:时间处理。
中断到来,秒计数加1.做过51单片机的时钟,照搬即可。
第三步:显示。
12864的3个函数:
(1)显示汉字:
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
(2)显示字符串:
函数名称:DispStr
功 能:在制定位置显示字符串
void DispStr(uchar addr,uchar *str)
{
Write_Cmd(addr);
while(*str != '\0')
{
Write_Data(*str);
str ++;
}
}
(3)显示数字(两位)
函数名称:Dips_Digit
功 能:控制液晶显示数字
参 数:addr--显示位置的首地址
hang--在第几行显示
digit--显示数字
void Disp_Digit(uchar addr,uchar hang,uchar digit)
{
uchar shi,ge;
shi = digit/10;
ge = digit;
if(hang == 0) //第1行
Write_Cmd(0x80 + addr);
else if(hang == 1) //第2行
Write_Cmd(0x90 + addr);
else if(hang == 2) //第3行
Write_Cmd(0x88 + addr);
else //第4行
Write_Cmd(0x98 + addr);
Write_Data(0x30 + shi);
Write_Data(0x30 + ge );
}
另:
画点函数,验证可行:
函数名称:Draw_Dots
功 能:画点
描 述:先读出不打点位置数据,打完点后把读到的数据送回原处
void Draw_Dots(uchar x,uchar y)
{
uchar row,xlabel,xlabel_bit;
uchar read_h,read_l; //读LCD中的数据
Write_Cmd(0x34); //扩充指令
Write_Cmd(0x36); //打开绘图指令
xlabel = x >> 4; //取16*16首地址
xlabel_bit = x & 0x0f; //计算该点在16位数据中的第几位
if(y < 32) //显示上半屏
{ row = y; }
else //显示下半屏
{
row = y - 32;
xlabel += 8; //规定显示下半屏
}
Write_Cmd(0x80 + row); //送垂直地址
Write_Cmd(0x80 + xlabel); //再送水平地址
ReadByte(); //读取当前GDRAM数据前需要进行一次空读,接下来才可以读取数据
read_h = ReadByte(); //读高8位
read_l = ReadByte(); //读低8位
Write_Cmd(0x80 + row); //送垂直地址
Write_Cmd(0x80 + xlabel); //再送水平地址
if(xlabel_bit < 8)
{
Write_Data(read_h | (0x01 << (7 - xlabel_bit)));
Write_Data(read_l);
}
else
{
Write_Data(read_h); //把数据写入GDRAM
Write_Data(read_l | (0x01 << (15 - xlabel_bit)));
}
Write_Cmd(0x30); //回到普通模式
}
有一方法很好:#define SetTime(H,M,S) {hour = H;min = M;sec = S;}可以方便的设置时钟初始值。