专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
DS12C887时钟实例
2020-01-30 14:08
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
3115
10
10
我也有一个用12864无字库屏+DS12C887的时钟实例,请大家分享。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
miyadai
2020-01-31 00:31
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/* SMG12865K9LCM屏参数 */
sbit _RS = P0^0; //显示数据或控制指令 A0
sbit _RET = P3^4; //复位端 RES
sbit _CS = P3^6; //片选端 CS
sbit _SID = P0^2; //数据输入端 SI
sbit _CLK = P0^1; //同步时钟 SCL
/* 扫描键盘参数定义 */
sbit s1=P3^0; //定义修改时钟的功能键,按下此键进入可以修改时间,从秒、分...年
sbit s2=P3^1; //时间参数增加,每次加1
sbit s3=P3^2; //时间参数减少,每次减1
sbit rd=P3^7; //定义键盘扫描电平信号
/* DS12C887参数定义 */
sbit dscs=P1^4; //片选输入,低电平有效
sbit dsas=P1^5; //地址选通输入,AS 的上升沿将 AD0~AD7
sbit dsrw=P1^6; //读/写输入
sbit dsds=P1^7; //DS/RD:数据选择或读输入
sbit dsirq=P3^3; //DS12C887输出硬中断触发信号
uchar bdata flag,s1_flag; //设置程序标识变量
uchar year,month,day,week,sshi,fen,miao,shi,ge; //定义时间相关参数变量
uchar count,timer_val,s1num; //一般变量
uchar data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask; //设置LCM屏X,Y点位置变量
/* 显示相关函数 */
void send2LCM(bit rs,uchar dat); //向液晶写入一个字节
void lcdclear(uchar dat1,uchar dat2); //写测试数据到LCM全屏
void dishz(uchar x_add,uchar y_add,uchar code *p); //显示汉字
void dischar(uchar x_add,uchar y_add,uchar code *p);//显示字符
void pagelcdclear(uchar page,uchar dat1,uchar dat2);//清空一行内容
/* 显示时间相关函数 */
void write_miao_data(uchar dat); //向LCM写秒数据函数
void write_fen_data(uchar dat); //向LCM写分数据函数
void write_shi_data(uchar dat); //向LCM写时数据函数
void write_day_data(uchar day); //向LCM写天数据函数
void write_week_data(uchar week); //向LCM写星期数据函数
void write_month_data(uchar month); //向LCM写月数据函数
void write_year_data(uchar year); //向LCM写年数据函数
/* 初始化,设置相关 */
void mcu_init(void); //系统初始化
void initlcm(void); //初始化LCM
void read_logo_intr(); //初始化LCM显示内容
void keyscan(); //键盘扫描函数
/* DS12C887 相关函数 */
void ds_init(void);
void write_ds(uchar add,uchar dat);
uchar read_ds(uchar add);
//void set_time();
/* 延时相关函数 */
void delay(void); //LCM延时
void delay_us(uint time); //系统延时
extern uchar code chardot[176];
extern uchar code hzdot[224];
extern uchar code nullhz[];
extern uchar code logohz1[];
extern uchar code logohz2[];
extern uchar code logohz3[];
extern uchar code logohz4[];
extern uchar code logohz5[];
extern uchar code ch11[];
extern uchar code ch12[];
extern uchar code chardot[];
/* 系统初始化函数
函数原型:mcu_init(void)
功能:
*/
void mcu_init(void)
{
/* 11.0,592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
65536-9216=56320(dc00)
TH0=0xdc,TL0=0x00
*/
TMOD = 0x01; //将定时器0设置为方式1即16位定时器
TH0 = 0x4C; //装载定时器0计数初值 *** 11.0592MHz晶振计算出10ms
TL0 = 0x00;
EA = 1; //开总中断
ET0 = 1; //允许定时器0中断
TR0 = 1; //启动定时器0
}
/* DS12C887 初始化函数
函数原型:ds_init(void)
功能:
*/
void ds_init(void)
{
dsas=0;
dsds=0;
dsrw=0;
write_ds(0x0a,0x20); //DS12C887寄存器A功能设置,开启时钟振荡器
// BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
// UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
write_ds(0x0b,0x76); //DS12C887寄存器B功能设置,开启24小时模式
// BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
// SET PIE AIE UIE SQWE DM 24/12 DSE
}
/* DS12C887 设置时间函数
函数原型:set_time()
功能:
void set_time()
{
write_ds(9,11); // 设置年
write_ds(8,11); // 设置月
write_ds(7,19); // 设置天
write_ds(6,7); // 设置星期
write_ds(4,11); // 设置时
write_ds(2,39); // 设置分
write_ds(0,35); // 设置秒
}
*/
/* DS12C887 芯片写函数
函数原型:wirte_ds(uchar add,uchar dat)
功能:
*/
void write_ds(uchar add,uchar dat)
{
dscs=0; //置片选信号为有效
dsas=1; //置地址选通信号有效
dsds=1; //置地址信号有效
dsrw=1; //置写地址信号有效
P0=add; //写入要写数据的地址
dsas=0; //置数据选通信号有效
dsrw=0; //置写数据信号有效
P0=dat; //写入数据
dsrw=1; //置读/写为高
dsas=1; //置地址选通为高
dscs=1; //置片选为高
}
/* DS12C887 芯片读函数
函数原型:read_ds(uchar add)
功能:
*/
uchar read_ds(uchar add)
{
uchar ds_date; //设置临时变量
dsas=1; //置地址选通信号有效
dsds=1; //置数据信号有效
dsrw=1; //置写地址信号有效
dscs=0; //置片选信号为有效
P0=add; //写入要取数据的地址
dsas=0; //置数据选通信号有效
dsds=0; //置数据信号有效
P0=0xff; //送0xff准备取数标识给DS12C887
ds_date=P0; //取对应地址的有效数据
dsds=1; //置地址/数据为高
dsas=1; //置地址选通为高
dscs=1; //置片选为高
return ds_date; //返回所取到的时钟数据
}
/* LCM液晶屏初始化需要的延时函数
函数原型:delay(void)
功能:
*/
void delay(void)
{
uchar i,j;
for (i = 0;i != 0x80;i++)
for (j = 0;j != 0x80;j++) ;
}
/* 延时函数 time:延时长度
函数原型:delay_us(uchar time)
功能:
*/
void delay_us(uint time)
{
uint i;
for (i=0;i<time;i++);
}
/* 写LCM屏指令函数
函数原型:send2LCM(bit rs,uchar dat)
功能:rs=0时写入控制指令,rs=1时写入显示数据
*/
void send2LCM(bit rs,uchar dat)
{
uchar i;
_RS = rs;
_CS = 0;
for (i=0;i<8;i++)
{
_CLK = 0;
if ((dat & 0x80)!=0)
_SID = 1;
else
_SID = 0;
_CLK = 1;
dat = dat<<1;
}
_CS = 1;
}
/* 清LCM数据到LCM屏
函数原型:lcdclear(uchar dat1,uchar dat2)
功能:
*/
void lcdclear(uchar dat1,uchar dat2)
{
uchar i,j;
for(i = 0xb0;i<0xb8;i++)
{
send2LCM(0,i); //写页地址
send2LCM(0,0x10); //写初始列地址
send2LCM(0,0x00);
for(j = 0x00;j<0x41;j++)
{
send2LCM(1,dat1); //写显示数据
send2LCM(1,dat2);
}
}
}
/* 写页清屏数据到LCM屏
函数原型:pagelcdclear(uchar page,uchar dat1,uchar dat2)
功能:
*/
void pagelcdclear(uchar page,uchar dat1,uchar dat2)
{
uchar i,j;
i = page*2 + 0xb0;
send2LCM(0,i); //写页地址
send2LCM(0,0x10); //写初始列地址
send2LCM(0,0x00);
for(j = 0x00;j<0x41;j++)
{
send2LCM(1,dat1); //写显示数据
send2LCM(1,dat2); //写显示数据
}
send2LCM(0,i+1); //写页地址
send2LCM(0,0x10); //写初始列地址
send2LCM(0,0x00);
for(j = 0x00;j<0x41;j++)
{
send2LCM(1,dat1); //写显示数据
send2LCM(1,dat2); //写显示数据
}
}
/* 初始化LCM液晶屏 (SMG12864K9)
函数原型:initlcm(void)
功能:
*/
void initlcm(void)
{
_RET = 0; //硬复位
delay();
_RET = 1;
send2LCM(0,0xe2); //软件复位
delay();
send2LCM(0,0xa2); //LCM BIAS=1/9
send2LCM(0,0xa0); //列地址移动方向:ADC=0(SEG1->SEG132)
send2LCM(0,0xc8); //行扫描方向:SHL=1(COM64->COM1)
delay();
send2LCM(0,0x2f); //电源控制模式:VC,VR,VF=111
delay();
send2LCM(0,0x26); //内部调整电阻比率:R2,R1,R0=111
delay();
send2LCM(0,0x81); //对比度寄存器模式
send2LCM(0,0x18); //对比度寄存器值 修改这个值就可以调节对比度了
send2LCM(0,0x40); //起始行
send2LCM(0,0xe0); //写入数据时列地址自动加1,但读时不变
send2LCM(0,0xaf); //开显示
}
/* 写汉字到LCM函数
函数原型:dishz(uchar x_add,uchar y_add,uchar code *p)
功能:x_add 页地址 y_add 列地址 *p 字模数据地址
*/
void dishz(uchar x_add,uchar y_add,uchar code *p)
{
uchar i,pag,colh,coll;
pag = x_add*2+0xb0;
colh = y_add>>4; //取y_add的高4位
colh = colh | 0xf0;
colh = colh & 0x1f;
coll = y_add & 0x0f; //取y_add的低4位
send2LCM(0,colh);
send2LCM(0,coll);
send2LCM(0,pag);
for (i=0;i<32;i++)
{
if (i == 16)
{
send2LCM(0,pag+1);
send2LCM(0,colh);
send2LCM(0,coll);
}
send2LCM(1,*p++);
}
}
/* 写西文到LCM函数
函数原型:lcdclear(uchar dat1,uchar dat2)
功能:x_add 页地址 y_add 列地址 *p 字模数据地址
*/
void dischar(uchar x_add,uchar y_add,uchar code *p)
{
uchar i,pag,colh,coll;
pag = x_add*2+0xb0;
colh = y_add>>4; //取y_add的高4位
colh = colh | 0xf0;
colh = colh & 0x1f;
coll = y_add & 0x0f; //取y_add的低4位
send2LCM(0,colh);
send2LCM(0,coll);
send2LCM(0,pag);
for (i=0;i<16;i++)
{
if (i == 8)
{
send2LCM(0,pag+1);
send2LCM(0,colh);
send2LCM(0,coll);
}
send2LCM(1,*p++);
}
}
/* 初始化LCM显示内容
函数原型:read_logo_init()
功能:
*/
void read_logo_intr()
{
uchar code *hzcode;
/* 显示年月日 */
pagelcdclear(3,0,0); //清除第3页,准备在第3页显示年月日的内容。显示样例 2011年01月01日
hzcode = chardot; //取数字字模
hzcode = hzcode +2*16; //置字模指针
dischar(3,8,hzcode); //写字模到LCM屏幕指定的位置
hzcode = chardot; //取数字字模
hzcode = hzcode +0*16; //置字模指针
dischar(3,16,hzcode); //写字模到LCM屏幕指定的位置
hzcode = chardot; //取数字字模
hzcode = hzcode +1*16;
dischar(3,24,hzcode);
hzcode = chardot; //取数字字模
hzcode = hzcode +1*16;
dischar(3,32,hzcode);
hzcode = logohz1; //取汉字字模:年
dishz(3,40,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +1*16;
dischar(3,64,hzcode);
hzcode = logohz2; //取汉字字模:月
dishz(3,72,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +1*16;
dischar(3,96,hzcode);
hzcode = logohz3; //取汉字字模:日
dishz(3,104,hzcode);
/* 显示时间 */
pagelcdclear(0,0,0); //清除第0页,准备在第0页显示时间的内容。显示样例 00:00:00
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,40,hzcode);
hzcode = ch11; //取 :字模
dischar(0,48,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,64,hzcode);
hzcode = ch11; //取 :字模
dischar(0,72,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,80,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,88,hzcode);
/* 显示星期 */
pagelcdclear(1,0,0); //清除第1页,准备在第1页显示星期的内容。显示样例 星期日
hzcode = logohz4; //取汉字字模:星
dishz(1,40,hzcode);
hzcode = logohz5; //取汉字字模:期
dishz(1,56,hzcode);
write_week_data(1); //显示实时的星期,由DS12C887芯片自己根据年月日输出的星期
delay();
}
/* 显示秒函数
函数原型:wirte_miao_data(uchar dat)
功能:
*/
void write_miao_data(uchar dat)
{
uchar shi,ge; //设置要显示的秒个位和十位的变量
uchar code *hzcode; //设置字模指针变量
shi=dat/10; //取秒的十位数
ge=dat%10; //取秒的个位数
hzcode = chardot; //取数字字模
hzcode = hzcode +shi*16; //根据十位数置要显示数字的地址指针
dischar(0,80,hzcode); //显示十位数字
hzcode = chardot; //取数字字模
hzcode = hzcode +ge*16; //根据个位数置要显示数字的地址指针
dischar(0,88,hzcode); //显示个位数字
}
/* 显示分函数
函数原型:wirte_fen_data(uchar dat)
功能:
*/
void write_fen_data(uchar dat)
{
uchar shi,ge; //设置要显示的分个位和十位的变量
uchar code *hzcode;
shi=dat/10;
ge=dat%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,64,hzcode);
}
/* 显示时函数
函数原型:wirte_shi_data(uchar dat)
功能:
*/
void write_shi_data(uchar dat)
{
uchar shi,ge; //设置要显示的时个位和十位的变量
uchar code *hzcode;
shi=dat/10;
ge=dat%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,40,hzcode);
}
/* 显示星期函数
函数原型:wirte_week_data(uchar dat)
功能:
*/
void write_week_data(uchar week)
{
uchar code *hzcode;
hzcode=hzdot;
hzcode=hzcode+(week-1)*32;
dishz(1,72,hzcode);
}
/* 显示天函数
函数原型:wirte_day_data(uchar dat)
功能:
*/
void write_day_data(uchar day)
{
uchar shi,ge; //设置要显示的日个位和十位的变量
uchar code *hzcode;
shi=day/10;
ge=day%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,96,hzcode);
}
/* 显示月函数
函数原型:wirte_month_data(uchar dat)
功能:
*/
void write_month_data(uchar month)
{
uchar shi,ge; //设置要显示的月个位和十位的变量
uchar code *hzcode;
shi=month/10;
ge=month%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,64,hzcode);
}
/* 显示年函数
函数原型:wirte_year_data(uchar dat)
功能:
*/
void write_year_data(uchar year)
{
uchar shi,ge; //设置要显示的年个位和十位的变量
uchar code *hzcode;
shi=year/10;
ge=year%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,24,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,32,hzcode);
}
/* 扫描功能键 S16 S17 S18
函数原型:keyscan()
功能:
*/
void keyscan()
{
uchar code *hzcode;
rd=0;
if(s1==0) //判断是否时间设置功能按键按下
{
delay_us(2000);
if(s1==0)
{
P1=0x00; //调试标识
flag=1; //置修改时间标识有效,停止主机向DS12C887取数据
s1num++; //记录s1按下的次数,已选择修改的是那个参数。如:秒、分....年
while(!s1);
if(s1num==1) //s1num为1可以修改秒参数
{
hzcode = nullhz;
dischar(0,88,hzcode);
delay();
hzcode = ch12;
dischar(0,88,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==2) //s1num为2可以修改分参数
{
hzcode = nullhz;
dischar(0,64,hzcode);
delay();
hzcode = ch12;
dischar(0,64,hzcode); //置修改时间标识有效
s1_flag=1;
}
if(s1num==3) //s1num为3可以修改时参数
{
hzcode = nullhz;
dischar(0,40,hzcode);
delay();
hzcode = ch12;
dischar(0,40,hzcode); //置修改时间标识有效
s1_flag=1;
}
if(s1num==4) //s1num为4可以修改日参数
{
hzcode = ch12;
dischar(3,88,hzcode);
delay();
hzcode = ch12;
dischar(3,96,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==5) //s1num为5可以修改月参数
{
hzcode = ch12;
dischar(3,56,hzcode);
delay();
hzcode = ch12;
dischar(3,64,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==6) //s1num为6可以修改年参数
{
hzcode = ch12;
dischar(3,24,hzcode);
delay();
hzcode = ch12;
dischar(3,32,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==7)
{
s1num=0;
flag=0;
s1_flag=0;
write_ds(9,year); // 写入修改后的参数 年
write_ds(8,month); // 写入修改后的参数 月
write_ds(7,day); // 写入修改后的参数 天
write_ds(4,sshi); // 写入修改后的参数 时
write_ds(2,fen); // 写入修改后的参数 分
write_ds(0,miao); // 写入修改后的参数 秒
read_logo_intr(); //刷新LCM屏幕
P1=0xff; //调试标识
}
}
}
if(s1_flag==1)
{
if(s2==0)
{
delay_us(2000);
if(s2==0)
{
while(!s2);
if(s1num==1) //s1num为1可以修改秒参数
{
P1=0x00;
miao++; //每按下一次s1键秒的参数加1
if(miao==60) //当miao参数到60时,置miao参数为0
miao=0;
shi=miao/10;
ge=miao%10;
hzcode = nullhz;
dischar(0,88,hzcode);
delay();
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,80,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,88,hzcode);
}
if(s1num==2) //s1num为2可以修改分参数
{
fen++; //每按下一次s1键分的参数加1
if(fen==60) //当fen参数到60时,置fen参数为0
fen=0;
shi=fen/10;
ge=fen%10;
hzcode = nullhz;
dischar(0,64,hzcode);
delay();
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,64,hzcode);
fen=fen+1;
}
if(s1num==3) //s1num为3可以修改时参数
{
sshi++; //每按下一次s1键时的参数加1
if(sshi==24) //当sshi参数到24时,置sshi参数为0
sshi=0;
shi=sshi/10;
ge=sshi%10;
hzcode = nullhz;
dischar(0,40,hzcode);
delay();
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,40,hzcode);
}
if(s1num==4) //s1num为4可以修改日参数
{
day++; //每按下一次s1键日的参数加1
if(day==31) //当fday参数到31时,置day参数为0
day=0;
shi=day/10;
ge=day%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,96,hzcode);
}
if(s1num==5) //s1num为5可以修改月参数
{
month++; //每按下一次s1键月的参数加1
if(month==12) //当month参数到12时,置month参数为0
month=0;
shi=month/10;
ge=month%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,64,hzcode);
}
if(s1num==6) //s1num为6可以修改年参数
{
year++; //每按下一次s1键年的参数加1
if(year==99) //当year参数到99时,置year参数为0
year=0;
shi=year/10;
ge=year%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,24,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,32,hzcode);
}
}
}
if(s3==0)
{
delay_us(2000);
if(s3==0)
{
while(!s3);
if(s1num==1) //s1num为1可以修改秒参数
{
miao--; //每按下一次s1键秒的参数减1
if(miao==-1) //当miao参数到-1时,置miao参数为59
miao=59;
shi=miao/10;
ge=miao%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,80,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,88,hzcode);
}
if(s1num==2) //s1num为2可以修改分参数
{
fen--; //每按下一次s1键分的参数减1
if(fen==-1) //当fen参数到-1时,置fen参数为59
fen=59;
shi=fen/10;
ge=fen%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,64,hzcode);
}
if(s1num==3) //s1num为3可以修改时参数
{
sshi--; //每按下一次s1键时的参数减1
if(sshi==-1) //当sshi参数到-1时,置sshi参数为23
sshi=23;
shi=sshi/10;
ge=sshi%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,40,hzcode);
}
if(s1num==4) //s1num为4可以修改日参数
{
day--; //每按下一次s1键日的参数减1
if(day==-1) //当day参数到-1时,置day参数为31
day=31;
shi=day/10;
ge=day%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,96,hzcode);
}
if(s1num==5) //s1num为5可以修改月参数
{
month--; //每按下一次s1键月的参数减1
if(month==-1) //当month参数到-1时,置month参数为12
month=12;
shi=month/10;
ge=month%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,64,hzcode);
}
if(s1num==6) //s1num为6可以修改年参数
{
year--; //每按下一次s1键年的参数减1
if(year==-1) //当year参数到-1时,置year参数为99
year=99;
shi=year/10;
ge=year%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,24,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,32,hzcode);
}
}
}
}
}
/* 中断响应函数
函数原型:timer0()
功能:定时刷新LCM屏幕
*/
void timer0() interrupt 1
{
TH0 = 0x4C; //装载定时器0计数初值 *** 11.0592MHz晶振计算出10ms
TL0 = 0x00;
count++;
if(count==timer_val)
{
count=0;
timer_val++;
}
if(timer_val==0x1a)
{
count=0; //将计数器相关暂存数据清零
timer_val=0;
read_logo_intr(); //刷新LCM屏幕
miao=read_ds(0);
fen=read_ds(2);
sshi=read_ds(4);
week=read_ds(6);
day=read_ds(7);
month=read_ds(8);
year=read_ds(9);
delay_us(2000);
write_miao_data(miao);
write_fen_data(fen);
write_shi_data(sshi);
write_week_data(week);
write_day_data(day);
write_month_data(month);
write_year_data(year);
}
}
加载中...
查看其它10个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#define uchar unsigned char
#define uint unsigned int
/* SMG12865K9LCM屏参数 */
sbit _RS = P0^0; //显示数据或控制指令 A0
sbit _RET = P3^4; //复位端 RES
sbit _CS = P3^6; //片选端 CS
sbit _SID = P0^2; //数据输入端 SI
sbit _CLK = P0^1; //同步时钟 SCL
/* 扫描键盘参数定义 */
sbit s1=P3^0; //定义修改时钟的功能键,按下此键进入可以修改时间,从秒、分...年
sbit s2=P3^1; //时间参数增加,每次加1
sbit s3=P3^2; //时间参数减少,每次减1
sbit rd=P3^7; //定义键盘扫描电平信号
/* DS12C887参数定义 */
sbit dscs=P1^4; //片选输入,低电平有效
sbit dsas=P1^5; //地址选通输入,AS 的上升沿将 AD0~AD7
sbit dsrw=P1^6; //读/写输入
sbit dsds=P1^7; //DS/RD:数据选择或读输入
sbit dsirq=P3^3; //DS12C887输出硬中断触发信号
uchar bdata flag,s1_flag; //设置程序标识变量
uchar year,month,day,week,sshi,fen,miao,shi,ge; //定义时间相关参数变量
uchar count,timer_val,s1num; //一般变量
uchar data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask; //设置LCM屏X,Y点位置变量
/* 显示相关函数 */
void send2LCM(bit rs,uchar dat); //向液晶写入一个字节
void lcdclear(uchar dat1,uchar dat2); //写测试数据到LCM全屏
void dishz(uchar x_add,uchar y_add,uchar code *p); //显示汉字
void dischar(uchar x_add,uchar y_add,uchar code *p);//显示字符
void pagelcdclear(uchar page,uchar dat1,uchar dat2);//清空一行内容
/* 显示时间相关函数 */
void write_miao_data(uchar dat); //向LCM写秒数据函数
void write_fen_data(uchar dat); //向LCM写分数据函数
void write_shi_data(uchar dat); //向LCM写时数据函数
void write_day_data(uchar day); //向LCM写天数据函数
void write_week_data(uchar week); //向LCM写星期数据函数
void write_month_data(uchar month); //向LCM写月数据函数
void write_year_data(uchar year); //向LCM写年数据函数
/* 初始化,设置相关 */
void mcu_init(void); //系统初始化
void initlcm(void); //初始化LCM
void read_logo_intr(); //初始化LCM显示内容
void keyscan(); //键盘扫描函数
/* DS12C887 相关函数 */
void ds_init(void);
void write_ds(uchar add,uchar dat);
uchar read_ds(uchar add);
//void set_time();
/* 延时相关函数 */
void delay(void); //LCM延时
void delay_us(uint time); //系统延时
extern uchar code chardot[176];
extern uchar code hzdot[224];
extern uchar code nullhz[];
extern uchar code logohz1[];
extern uchar code logohz2[];
extern uchar code logohz3[];
extern uchar code logohz4[];
extern uchar code logohz5[];
extern uchar code ch11[];
extern uchar code ch12[];
extern uchar code chardot[];
/* 系统初始化函数
函数原型:mcu_init(void)
功能:
*/
void mcu_init(void)
{
/* 11.0,592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
65536-9216=56320(dc00)
TH0=0xdc,TL0=0x00
*/
TMOD = 0x01; //将定时器0设置为方式1即16位定时器
TH0 = 0x4C; //装载定时器0计数初值 *** 11.0592MHz晶振计算出10ms
TL0 = 0x00;
EA = 1; //开总中断
ET0 = 1; //允许定时器0中断
TR0 = 1; //启动定时器0
}
/* DS12C887 初始化函数
函数原型:ds_init(void)
功能:
*/
void ds_init(void)
{
dsas=0;
dsds=0;
dsrw=0;
write_ds(0x0a,0x20); //DS12C887寄存器A功能设置,开启时钟振荡器
// BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
// UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
write_ds(0x0b,0x76); //DS12C887寄存器B功能设置,开启24小时模式
// BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
// SET PIE AIE UIE SQWE DM 24/12 DSE
}
/* DS12C887 设置时间函数
函数原型:set_time()
功能:
void set_time()
{
write_ds(9,11); // 设置年
write_ds(8,11); // 设置月
write_ds(7,19); // 设置天
write_ds(6,7); // 设置星期
write_ds(4,11); // 设置时
write_ds(2,39); // 设置分
write_ds(0,35); // 设置秒
}
*/
/* DS12C887 芯片写函数
函数原型:wirte_ds(uchar add,uchar dat)
功能:
*/
void write_ds(uchar add,uchar dat)
{
dscs=0; //置片选信号为有效
dsas=1; //置地址选通信号有效
dsds=1; //置地址信号有效
dsrw=1; //置写地址信号有效
P0=add; //写入要写数据的地址
dsas=0; //置数据选通信号有效
dsrw=0; //置写数据信号有效
P0=dat; //写入数据
dsrw=1; //置读/写为高
dsas=1; //置地址选通为高
dscs=1; //置片选为高
}
/* DS12C887 芯片读函数
函数原型:read_ds(uchar add)
功能:
*/
uchar read_ds(uchar add)
{
uchar ds_date; //设置临时变量
dsas=1; //置地址选通信号有效
dsds=1; //置数据信号有效
dsrw=1; //置写地址信号有效
dscs=0; //置片选信号为有效
P0=add; //写入要取数据的地址
dsas=0; //置数据选通信号有效
dsds=0; //置数据信号有效
P0=0xff; //送0xff准备取数标识给DS12C887
ds_date=P0; //取对应地址的有效数据
dsds=1; //置地址/数据为高
dsas=1; //置地址选通为高
dscs=1; //置片选为高
return ds_date; //返回所取到的时钟数据
}
/* LCM液晶屏初始化需要的延时函数
函数原型:delay(void)
功能:
*/
void delay(void)
{
uchar i,j;
for (i = 0;i != 0x80;i++)
for (j = 0;j != 0x80;j++) ;
}
/* 延时函数 time:延时长度
函数原型:delay_us(uchar time)
功能:
*/
void delay_us(uint time)
{
uint i;
for (i=0;i<time;i++);
}
/* 写LCM屏指令函数
函数原型:send2LCM(bit rs,uchar dat)
功能:rs=0时写入控制指令,rs=1时写入显示数据
*/
void send2LCM(bit rs,uchar dat)
{
uchar i;
_RS = rs;
_CS = 0;
for (i=0;i<8;i++)
{
_CLK = 0;
if ((dat & 0x80)!=0)
_SID = 1;
else
_SID = 0;
_CLK = 1;
dat = dat<<1;
}
_CS = 1;
}
/* 清LCM数据到LCM屏
函数原型:lcdclear(uchar dat1,uchar dat2)
功能:
*/
void lcdclear(uchar dat1,uchar dat2)
{
uchar i,j;
for(i = 0xb0;i<0xb8;i++)
{
send2LCM(0,i); //写页地址
send2LCM(0,0x10); //写初始列地址
send2LCM(0,0x00);
for(j = 0x00;j<0x41;j++)
{
send2LCM(1,dat1); //写显示数据
send2LCM(1,dat2);
}
}
}
/* 写页清屏数据到LCM屏
函数原型:pagelcdclear(uchar page,uchar dat1,uchar dat2)
功能:
*/
void pagelcdclear(uchar page,uchar dat1,uchar dat2)
{
uchar i,j;
i = page*2 + 0xb0;
send2LCM(0,i); //写页地址
send2LCM(0,0x10); //写初始列地址
send2LCM(0,0x00);
for(j = 0x00;j<0x41;j++)
{
send2LCM(1,dat1); //写显示数据
send2LCM(1,dat2); //写显示数据
}
send2LCM(0,i+1); //写页地址
send2LCM(0,0x10); //写初始列地址
send2LCM(0,0x00);
for(j = 0x00;j<0x41;j++)
{
send2LCM(1,dat1); //写显示数据
send2LCM(1,dat2); //写显示数据
}
}
/* 初始化LCM液晶屏 (SMG12864K9)
函数原型:initlcm(void)
功能:
*/
void initlcm(void)
{
_RET = 0; //硬复位
delay();
_RET = 1;
send2LCM(0,0xe2); //软件复位
delay();
send2LCM(0,0xa2); //LCM BIAS=1/9
send2LCM(0,0xa0); //列地址移动方向:ADC=0(SEG1->SEG132)
send2LCM(0,0xc8); //行扫描方向:SHL=1(COM64->COM1)
delay();
send2LCM(0,0x2f); //电源控制模式:VC,VR,VF=111
delay();
send2LCM(0,0x26); //内部调整电阻比率:R2,R1,R0=111
delay();
send2LCM(0,0x81); //对比度寄存器模式
send2LCM(0,0x18); //对比度寄存器值 修改这个值就可以调节对比度了
send2LCM(0,0x40); //起始行
send2LCM(0,0xe0); //写入数据时列地址自动加1,但读时不变
send2LCM(0,0xaf); //开显示
}
/* 写汉字到LCM函数
函数原型:dishz(uchar x_add,uchar y_add,uchar code *p)
功能:x_add 页地址 y_add 列地址 *p 字模数据地址
*/
void dishz(uchar x_add,uchar y_add,uchar code *p)
{
uchar i,pag,colh,coll;
pag = x_add*2+0xb0;
colh = y_add>>4; //取y_add的高4位
colh = colh | 0xf0;
colh = colh & 0x1f;
coll = y_add & 0x0f; //取y_add的低4位
send2LCM(0,colh);
send2LCM(0,coll);
send2LCM(0,pag);
for (i=0;i<32;i++)
{
if (i == 16)
{
send2LCM(0,pag+1);
send2LCM(0,colh);
send2LCM(0,coll);
}
send2LCM(1,*p++);
}
}
/* 写西文到LCM函数
函数原型:lcdclear(uchar dat1,uchar dat2)
功能:x_add 页地址 y_add 列地址 *p 字模数据地址
*/
void dischar(uchar x_add,uchar y_add,uchar code *p)
{
uchar i,pag,colh,coll;
pag = x_add*2+0xb0;
colh = y_add>>4; //取y_add的高4位
colh = colh | 0xf0;
colh = colh & 0x1f;
coll = y_add & 0x0f; //取y_add的低4位
send2LCM(0,colh);
send2LCM(0,coll);
send2LCM(0,pag);
for (i=0;i<16;i++)
{
if (i == 8)
{
send2LCM(0,pag+1);
send2LCM(0,colh);
send2LCM(0,coll);
}
send2LCM(1,*p++);
}
}
/* 初始化LCM显示内容
函数原型:read_logo_init()
功能:
*/
void read_logo_intr()
{
uchar code *hzcode;
/* 显示年月日 */
pagelcdclear(3,0,0); //清除第3页,准备在第3页显示年月日的内容。显示样例 2011年01月01日
hzcode = chardot; //取数字字模
hzcode = hzcode +2*16; //置字模指针
dischar(3,8,hzcode); //写字模到LCM屏幕指定的位置
hzcode = chardot; //取数字字模
hzcode = hzcode +0*16; //置字模指针
dischar(3,16,hzcode); //写字模到LCM屏幕指定的位置
hzcode = chardot; //取数字字模
hzcode = hzcode +1*16;
dischar(3,24,hzcode);
hzcode = chardot; //取数字字模
hzcode = hzcode +1*16;
dischar(3,32,hzcode);
hzcode = logohz1; //取汉字字模:年
dishz(3,40,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +1*16;
dischar(3,64,hzcode);
hzcode = logohz2; //取汉字字模:月
dishz(3,72,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +1*16;
dischar(3,96,hzcode);
hzcode = logohz3; //取汉字字模:日
dishz(3,104,hzcode);
/* 显示时间 */
pagelcdclear(0,0,0); //清除第0页,准备在第0页显示时间的内容。显示样例 00:00:00
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,40,hzcode);
hzcode = ch11; //取 :字模
dischar(0,48,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,64,hzcode);
hzcode = ch11; //取 :字模
dischar(0,72,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,80,hzcode);
hzcode = chardot;
hzcode = hzcode +0*16;
dischar(0,88,hzcode);
/* 显示星期 */
pagelcdclear(1,0,0); //清除第1页,准备在第1页显示星期的内容。显示样例 星期日
hzcode = logohz4; //取汉字字模:星
dishz(1,40,hzcode);
hzcode = logohz5; //取汉字字模:期
dishz(1,56,hzcode);
write_week_data(1); //显示实时的星期,由DS12C887芯片自己根据年月日输出的星期
delay();
}
/* 显示秒函数
函数原型:wirte_miao_data(uchar dat)
功能:
*/
void write_miao_data(uchar dat)
{
uchar shi,ge; //设置要显示的秒个位和十位的变量
uchar code *hzcode; //设置字模指针变量
shi=dat/10; //取秒的十位数
ge=dat%10; //取秒的个位数
hzcode = chardot; //取数字字模
hzcode = hzcode +shi*16; //根据十位数置要显示数字的地址指针
dischar(0,80,hzcode); //显示十位数字
hzcode = chardot; //取数字字模
hzcode = hzcode +ge*16; //根据个位数置要显示数字的地址指针
dischar(0,88,hzcode); //显示个位数字
}
/* 显示分函数
函数原型:wirte_fen_data(uchar dat)
功能:
*/
void write_fen_data(uchar dat)
{
uchar shi,ge; //设置要显示的分个位和十位的变量
uchar code *hzcode;
shi=dat/10;
ge=dat%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,64,hzcode);
}
/* 显示时函数
函数原型:wirte_shi_data(uchar dat)
功能:
*/
void write_shi_data(uchar dat)
{
uchar shi,ge; //设置要显示的时个位和十位的变量
uchar code *hzcode;
shi=dat/10;
ge=dat%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,40,hzcode);
}
/* 显示星期函数
函数原型:wirte_week_data(uchar dat)
功能:
*/
void write_week_data(uchar week)
{
uchar code *hzcode;
hzcode=hzdot;
hzcode=hzcode+(week-1)*32;
dishz(1,72,hzcode);
}
/* 显示天函数
函数原型:wirte_day_data(uchar dat)
功能:
*/
void write_day_data(uchar day)
{
uchar shi,ge; //设置要显示的日个位和十位的变量
uchar code *hzcode;
shi=day/10;
ge=day%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,96,hzcode);
}
/* 显示月函数
函数原型:wirte_month_data(uchar dat)
功能:
*/
void write_month_data(uchar month)
{
uchar shi,ge; //设置要显示的月个位和十位的变量
uchar code *hzcode;
shi=month/10;
ge=month%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,64,hzcode);
}
/* 显示年函数
函数原型:wirte_year_data(uchar dat)
功能:
*/
void write_year_data(uchar year)
{
uchar shi,ge; //设置要显示的年个位和十位的变量
uchar code *hzcode;
shi=year/10;
ge=year%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,24,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,32,hzcode);
}
/* 扫描功能键 S16 S17 S18
函数原型:keyscan()
功能:
*/
void keyscan()
{
uchar code *hzcode;
rd=0;
if(s1==0) //判断是否时间设置功能按键按下
{
delay_us(2000);
if(s1==0)
{
P1=0x00; //调试标识
flag=1; //置修改时间标识有效,停止主机向DS12C887取数据
s1num++; //记录s1按下的次数,已选择修改的是那个参数。如:秒、分....年
while(!s1);
if(s1num==1) //s1num为1可以修改秒参数
{
hzcode = nullhz;
dischar(0,88,hzcode);
delay();
hzcode = ch12;
dischar(0,88,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==2) //s1num为2可以修改分参数
{
hzcode = nullhz;
dischar(0,64,hzcode);
delay();
hzcode = ch12;
dischar(0,64,hzcode); //置修改时间标识有效
s1_flag=1;
}
if(s1num==3) //s1num为3可以修改时参数
{
hzcode = nullhz;
dischar(0,40,hzcode);
delay();
hzcode = ch12;
dischar(0,40,hzcode); //置修改时间标识有效
s1_flag=1;
}
if(s1num==4) //s1num为4可以修改日参数
{
hzcode = ch12;
dischar(3,88,hzcode);
delay();
hzcode = ch12;
dischar(3,96,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==5) //s1num为5可以修改月参数
{
hzcode = ch12;
dischar(3,56,hzcode);
delay();
hzcode = ch12;
dischar(3,64,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==6) //s1num为6可以修改年参数
{
hzcode = ch12;
dischar(3,24,hzcode);
delay();
hzcode = ch12;
dischar(3,32,hzcode);
s1_flag=1; //置修改时间标识有效
}
if(s1num==7)
{
s1num=0;
flag=0;
s1_flag=0;
write_ds(9,year); // 写入修改后的参数 年
write_ds(8,month); // 写入修改后的参数 月
write_ds(7,day); // 写入修改后的参数 天
write_ds(4,sshi); // 写入修改后的参数 时
write_ds(2,fen); // 写入修改后的参数 分
write_ds(0,miao); // 写入修改后的参数 秒
read_logo_intr(); //刷新LCM屏幕
P1=0xff; //调试标识
}
}
}
if(s1_flag==1)
{
if(s2==0)
{
delay_us(2000);
if(s2==0)
{
while(!s2);
if(s1num==1) //s1num为1可以修改秒参数
{
P1=0x00;
miao++; //每按下一次s1键秒的参数加1
if(miao==60) //当miao参数到60时,置miao参数为0
miao=0;
shi=miao/10;
ge=miao%10;
hzcode = nullhz;
dischar(0,88,hzcode);
delay();
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,80,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,88,hzcode);
}
if(s1num==2) //s1num为2可以修改分参数
{
fen++; //每按下一次s1键分的参数加1
if(fen==60) //当fen参数到60时,置fen参数为0
fen=0;
shi=fen/10;
ge=fen%10;
hzcode = nullhz;
dischar(0,64,hzcode);
delay();
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,64,hzcode);
fen=fen+1;
}
if(s1num==3) //s1num为3可以修改时参数
{
sshi++; //每按下一次s1键时的参数加1
if(sshi==24) //当sshi参数到24时,置sshi参数为0
sshi=0;
shi=sshi/10;
ge=sshi%10;
hzcode = nullhz;
dischar(0,40,hzcode);
delay();
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,40,hzcode);
}
if(s1num==4) //s1num为4可以修改日参数
{
day++; //每按下一次s1键日的参数加1
if(day==31) //当fday参数到31时,置day参数为0
day=0;
shi=day/10;
ge=day%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,96,hzcode);
}
if(s1num==5) //s1num为5可以修改月参数
{
month++; //每按下一次s1键月的参数加1
if(month==12) //当month参数到12时,置month参数为0
month=0;
shi=month/10;
ge=month%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,64,hzcode);
}
if(s1num==6) //s1num为6可以修改年参数
{
year++; //每按下一次s1键年的参数加1
if(year==99) //当year参数到99时,置year参数为0
year=0;
shi=year/10;
ge=year%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,24,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,32,hzcode);
}
}
}
if(s3==0)
{
delay_us(2000);
if(s3==0)
{
while(!s3);
if(s1num==1) //s1num为1可以修改秒参数
{
miao--; //每按下一次s1键秒的参数减1
if(miao==-1) //当miao参数到-1时,置miao参数为59
miao=59;
shi=miao/10;
ge=miao%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,80,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,88,hzcode);
}
if(s1num==2) //s1num为2可以修改分参数
{
fen--; //每按下一次s1键分的参数减1
if(fen==-1) //当fen参数到-1时,置fen参数为59
fen=59;
shi=fen/10;
ge=fen%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,64,hzcode);
}
if(s1num==3) //s1num为3可以修改时参数
{
sshi--; //每按下一次s1键时的参数减1
if(sshi==-1) //当sshi参数到-1时,置sshi参数为23
sshi=23;
shi=sshi/10;
ge=sshi%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(0,32,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(0,40,hzcode);
}
if(s1num==4) //s1num为4可以修改日参数
{
day--; //每按下一次s1键日的参数减1
if(day==-1) //当day参数到-1时,置day参数为31
day=31;
shi=day/10;
ge=day%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,88,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,96,hzcode);
}
if(s1num==5) //s1num为5可以修改月参数
{
month--; //每按下一次s1键月的参数减1
if(month==-1) //当month参数到-1时,置month参数为12
month=12;
shi=month/10;
ge=month%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,56,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,64,hzcode);
}
if(s1num==6) //s1num为6可以修改年参数
{
year--; //每按下一次s1键年的参数减1
if(year==-1) //当year参数到-1时,置year参数为99
year=99;
shi=year/10;
ge=year%10;
hzcode = chardot;
hzcode = hzcode +shi*16;
dischar(3,24,hzcode);
hzcode = chardot;
hzcode = hzcode +ge*16;
dischar(3,32,hzcode);
}
}
}
}
}
/* 中断响应函数
函数原型:timer0()
功能:定时刷新LCM屏幕
*/
void timer0() interrupt 1
{
TH0 = 0x4C; //装载定时器0计数初值 *** 11.0592MHz晶振计算出10ms
TL0 = 0x00;
count++;
if(count==timer_val)
{
count=0;
timer_val++;
}
if(timer_val==0x1a)
{
count=0; //将计数器相关暂存数据清零
timer_val=0;
read_logo_intr(); //刷新LCM屏幕
miao=read_ds(0);
fen=read_ds(2);
sshi=read_ds(4);
week=read_ds(6);
day=read_ds(7);
month=read_ds(8);
year=read_ds(9);
delay_us(2000);
write_miao_data(miao);
write_fen_data(fen);
write_shi_data(sshi);
write_week_data(week);
write_day_data(day);
write_month_data(month);
write_year_data(year);
}
}
一周热门 更多>