DS12C887时钟实例
我也有一个用12864无字库屏+DS12C887的时钟实例,请大家分享。 我的附件是C51test11.rar咋总是不能上传呀??? /******** 基于STC89C52RC的万年历 ********
功能:
LCM显示使用太阳人SMG12864K9无字库显示屏和
使用新型时钟日历芯片 DS12C887作为实时电子时钟时源
(该芯片可以保留时间为10年)
定义P0口为DS12C887芯片的复用地址数据总线
P1口为DS12C887芯片的控制总线
P3和P1口为LCM显示屏和DS12C887的控制总线
作者:戴志波
版本:Ver 1.0.0
日期:2011.11.20
备注:
硬件平台基于哈工大的郭天祥老师的学习试验版TX-1C环境下
此程序为学习版本,仅供学员参考使用。
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit BGC = P3^6; //控制背光灯的按钮
sbit _BG = P3^5; //控制屏幕背光的控制指令
uchar bdata bgc_flag;
uchar code *hzcode;
extern uchar count,year,month,day,week,sshi,fen,miao;
extern uchar bdata flag;
extern void mcu_init(void); //系统初始化
extern void initlcm(void); //初始化LCM
extern void lcdclear(uchar dat1,uchar dat2); //写测试数据到LCM全屏
extern void read_logo_intr();
extern void keyscan(); //键盘扫描函数
extern void delay_us(uint time);
extern void dishz(uchar x_add,uchar y_add,uchar code *p);//显示汉字
extern void dischar(uchar x_add,uchar y_add,uchar code *p);//显示字符
extern void pagelcdclear(uchar page,uchar dat1,uchar dat2);//清空一行内容
extern void write_miao_data(uchar dat); //显示 秒函数
extern void write_fen_data(uchar dat); //显示 分函数
extern void write_shi_data(uchar dat); //显示 时函数
extern void write_day_data(uchar day); //显示 天函数
extern void write_week_data(uchar week); //显示 星期函数
extern void write_month_data(uchar month); //显示 月函数
extern void write_year_data(uchar year); //显示 年函数
///// DS12C887 相关函数 //////////////
extern void ds_init(void);
extern void write_ds(uchar add,uchar dat);
extern uchar read_ds(uchar add);
//extern void set_time();
void main()
{
dula=0; //关闭P0口上的LED
wela=0; // 关闭P0口上的LED
mcu_init(); //系统初始化
ds_init(); // 初始化DS12C887芯片
initlcm(); // 初始化SMG12864K9LCM液晶屏
lcdclear(0x00,0x00); // 打开液晶屏的背光灯
_BG = 0;
bgc_flag=0;
read_logo_intr();
//set_time();
while(1)
{
keyscan();
if(flag==0)
{
miao=read_ds(0); //读取秒数据 参考 DS12C887的DATASHEET第13页
fen=read_ds(2); //读取分数据 Table 2A. Time, Calendar, and Alarm Data Modes—BCD Mode (DM = 0)
sshi=read_ds(4); //读取时数据
week=read_ds(6); //读取星期数据
day=read_ds(7); //读取日数据
month=read_ds(8); //读取月数据
year=read_ds(9); //读取年数据
delay_us(2000); //20ms
write_miao_data(miao); //向LCM屏幕写秒数据
write_fen_data(fen); //向LCM屏幕写分数据
write_shi_data(sshi); //向LCM屏幕写是数据
write_week_data(week); //向LCM屏幕写星期数据
write_day_data(day); //向LCM屏幕写日数据
write_month_data(month); //向LCM屏幕写月数据
write_year_data(year); //向LCM屏幕写年数据
}
if (bgc_flag == 0)
{
if (BGC == 0) //判断背光控制按钮是否按下
{
delay_us(2000); //20ms
if (BGC == 0)
{
while (!BGC);
_BG = 1;
bgc_flag = 1;
}
}
}
if (bgc_flag == 1)
{
if (BGC == 0) //判断背光控制按钮是否按下
{
delay_us(2000); //20ms
if (BGC == 0)
{
while (!BGC);
_BG = 0;
bgc_flag = 0;
}
}
}
}
} #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;
extern uchar code hzdot;
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功能设置,开启时钟振荡器
// BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
// UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0
write_ds(0x0b,0x76); //DS12C887寄存器B功能设置,开启24小时模式
// BIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0
// SET PIE AIE UIE SQWEDM 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);
}
} #include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//对齐方式:左上
//纵向取模 高位在下
//字体:宋体 大小17*16点阵 取模大小16*16点阵
// 显示空格字模
uchar code nullhz[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
// 汉字年月日星期字模
uchar code logohz1[]=
{
/*年 CC4EA */
0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
};
uchar code logohz2[]=
{
/*月 CD4C2 */
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,
};
uchar code logohz3[]=
{
/*日 CC8D5 */
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
};
uchar code logohz4[]=
{
/*星 CD0C7 */
0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,
0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,
};
uchar code logohz5[]=
{
/*期 CC6DA */
0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00,
};
// :字模
uchar code ch11[]={
/*: CHAR_3A */
0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,
};
// 修改时间标识字模方块
uchar code ch12[] = {
/* CHAR_01 */
0x00,0xFC,0xFC,0x0C,0x0C,0xFC,0xFC,0x00,0x00,0x0F,0x0F,0x0C,0x0C,0x0F,0x0F,0x00,
};
// 数字字模
uchar code chardot = {
/*0 CHAR_30 */
0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,
/*1 CHAR_31 */
0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
/*2 CHAR_32 */
0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,
/*3 CHAR_33 */
0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
/*4 CHAR_34 */
0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,
/*5 CHAR_35 */
0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
/*6 CHAR_36 */
0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
/*7 CHAR_37 */
0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
/*8 CHAR_38 */
0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
/*9 CHAR_39 */
0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
/*, CHAR_2C */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
/*. CHAR_2E */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,
};
// 汉字星期字模
uchar code hzdot = {
/*日 CC8D5 */
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
/*一 CD2BB */
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*二 CB6FE */
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
/*三 CC8FD */
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
/*四 CCBC4 */
0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,
/*五 CCEE5 */
0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,
/*六 CC1F9 */
0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,
}; 怎么这么多啊 ? 怎么不能传一个压缩包 书写很规范啊,赞一个 写了那么多,慢慢看,先顶一个。 哈哈 cool
页:
[1]