📄 1302disp.c
字号:
// if(disp_in_use)return -1;
disp_in_use=1;
if((alt!=0)&&(alt!=IE))
{
disp_in_use=0;
return 0;
}
command(SCREEN_CONTROL1|NP|CM|DC|alt);
disp_in_use=0;
return 1;
}
/****************************************
改变背景色
*****************************************/
int8 color_background(uint16 backcolor)
{
// if(disp_in_use)return -1;
disp_in_use=1;
if(backcolor>7)
{
disp_in_use=0;
return 0;
}
command(COLOR_CONTROL|RB|CC|BC|UC|backcolor);
disp_in_use=0;
return 1;
}
/********************************************
设置子屏位置,输入X,Y坐标,输出:成功1,失败0
*********************************************/
uint8 set_sub_position(uint16 x,uint16 y)
{
if((x>0x1ff)|(y>0xff))return 0;
command(SUB_SCREEN_VERTICAL_POSITION_CONTROL|(y&0x007f)|((y<<1)&0x0100));
command(SUB_SCREEN_HORIZONTAL_POSITION_CONTROL|(x&0x007f)|((x<<1)&0x0300));
return 1;
}
/*uint8 set_sub_position(uint16 x,uint16 y)
{
if((x>0x1ff)|(y>0xff))return 0;
command(SUB_SCREEN_VERTICAL_POSITION_CONTROL|(y&0x007f)|((y<<1)&0x0100)|SGA);
command(SUB_SCREEN_HORIZONTAL_POSITION_CONTROL|(x&0x007f)|((x<<1)&0x0300));
return 1;
}*/
/*********************************************
设置子屏的行数,字符颜色,字符背景颜色
输出:成功1,失败0
**********************************************/
uint8 init_sub_screen(uint16 linenum,uint16 charcolor,uint16 backcolor)
{
if((linenum>7)|(charcolor>7)|(backcolor>7))return 0;
command(SUB_SCREEN_CONTROL|(linenum<<8)|0x0038|backcolor);
return 1;
}
/*uint8 init_sub_screen(uint16 linenum,uint16 charcolor,uint16 backcolor)
{
if((linenum>7)|(charcolor>7)|(backcolor>7))return 0;
command(SUB_SCREEN_CONTROL|(linenum<<8)|(charcolor<<3)|backcolor);
return 1;
}*/
/**************************************
子屏显示字符行定位,输入X坐标,输出:成功1,失败0
***************************************/
int8 sub_gotoxy(uint16 x,uint16 y)
{
uint16 com;
if((x>0x000f)|(y>0x001f))return 0;
_X=x;_Y=y;
com=VRAM_ADDR_SET|VSL;
com|=((_X<<6)&0x0300);
com|=((_X<<5)&0x0060);
com|=_Y<<1;
command(com);
return 1;
}
/*uint8 sub_location(uint16 x)
{
uint16 com;
if(x>0x000f)return 0;
com=VRAM_ADDR_SET|VSL;
com|=((x<<6)&0x0300);
com|=((x<<5)&0x0060);
command(com);
return 1;
}*/
/**************************************
在子屏X行显示1个汉字
输入:行X,列Y,汉字内码,字符颜色,字符背景颜色
***************************************/
int8 sub_display(char x,char y,uint16 gb,uint16 CharColor,uint16 BackColor)
{
if(!sub_gotoxy(x,y))return 0;
command(GbToAddress(gb).char_addr1|CharColor|BackColor|SUB_SCREEN_LINE_CONTROL1);
command(GbToAddress(gb).char_addr2|SUB_SCREEN_LINE_CONTROL2);
return 1;
}
/*uint8 sub_display(uint16 x,uint16 y,uint16 gb,uint16 CharColor,uint16 BackColor)
{
if(!sub_location(x))return 0;
command(GbToAddress(gb).char_addr1|CharColor|BackColor|SUB_SCREEN_LINE_CONTROL1);
command(GbToAddress(gb).char_addr2|SUB_SCREEN_LINE_CONTROL2);
return 1;
}*/
void disp1(void)
{
time_1302_buf0 = (set_1302_buf[6]>>4)+48;
time_1302_buf1 = (set_1302_buf[6]&0x0f)+48;
time_1302_buf2 = (set_1302_buf[5]>>4)+48;
time_1302_buf3 = (set_1302_buf[5]&0x0f)+48;
time_1302_buf4 = (set_1302_buf[4]>>4)+48;
time_1302_buf5 = (set_1302_buf[4]&0x0f)+48;
time_1302_buf6 = (set_1302_buf[3]>>4)+48;
time_1302_buf7 = (set_1302_buf[3]&0x0f)+48;
time_1302_buf8 = (set_1302_buf[2]>>4)+48;
time_1302_buf9 = (set_1302_buf[2]&0x0f)+48;
time_1302_buf10 = (set_1302_buf[1]>>4)+48;
time_1302_buf11 = (set_1302_buf[1]&0x0f)+48;
// strncat(time_1302_buf0,time_1302_buf1,2);
// strncat(time_1302_buf2,time_1302_buf3,2);
// strncat(time_1302_buf4,time_1302_buf5,2);
// strncat(time_1302_buf6,time_1302_buf7,2);
// strncat(time_1302_buf8,time_1302_buf9,2);
// strncat(time_1302_buf10,time_1302_buf11,1);
// disp_1302_buf[6] = (set_1302_buf[6]>>4)*16+set_1302_buf[6]+48;
// disp_1302_buf[5] = (set_1302_buf[5]>>4)*16+set_1302_buf[5]+48;
// disp_1302_buf[4] = (set_1302_buf[4]>>4)*16+set_1302_buf[4]+48;
// disp_1302_buf[3] = (set_1302_buf[3]>>4)*16+set_1302_buf[3]+48;
// disp_1302_buf[2] = (set_1302_buf[2]>>4)*16+set_1302_buf[2]+48;
// disp_1302_buf[1] = (set_1302_buf[1]>>4)*16+set_1302_buf[1]+48;
sprintex(4,0,&time_1302_buf0,C_WHITE,B_WHITE);
sprintex(4,1,&time_1302_buf1,C_WHITE,B_WHITE);
sprintex(4,2,"年",C_WHITE,B_WHITE);
sprintex(4,3,&time_1302_buf4,C_WHITE,B_WHITE);
sprintex(4,4,&time_1302_buf5,C_WHITE,B_WHITE);
sprintex(4,5,"月",C_WHITE,B_WHITE);
sprintex(4,6,&time_1302_buf6,C_WHITE,B_WHITE);
sprintex(4,7,&time_1302_buf7,C_WHITE,B_WHITE);
sprintex(4,8,"日",C_WHITE,B_WHITE);
sprintex(2,0,&time_1302_buf8,C_WHITE,B_WHITE);
sprintex(2,1,&time_1302_buf9,C_WHITE,B_WHITE);
sprintex(2,2,"时",C_WHITE,B_WHITE);
sprintex(2,3,&time_1302_buf10,C_WHITE,B_WHITE);
sprintex(2,4,&time_1302_buf11,C_WHITE,B_WHITE);
sprintex(2,5,"分",C_WHITE,B_WHITE);
sprintex(2,7,"周",C_WHITE,B_WHITE);
sprintex(2,8,&time_1302_buf2,C_WHITE,B_WHITE);
sprintex(2,9,&time_1302_buf3,C_WHITE,B_WHITE);
//sprintex(0,9," ",C_WHITE,B_WHITE);
//sprintex(2,9," ",C_WHITE,B_WHITE);
// sprintex(2,0,"收件箱:3封",C_WHITE,B_WHITE);
// sprintex(4,0,"胖小 LOVE 丫头",C_WHITE,B_WHITE);
// sprintex(7,5,"查看",C_WHITE,B_WHITE);
}
void disp2(void)
{
sprintex(0,5,"第一封",C_WHITE,B_WHITE);
sprintex(4,0,"胖小 LOVE 丫头",C_WHITE,B_WHITE);
sprintex(7,8,"下一封",C_WHITE,B_WHITE);
sprintex(7,0,"上一封",C_WHITE,B_WHITE);
}
void disp3(void)
{
sprintex(0,5,"第二封",C_WHITE,B_WHITE);
sprintex(4,0,"胖小还是 LOVE 丫头",C_WHITE,B_WHITE);
sprintex(7,8,"下一封",C_WHITE,B_WHITE);
sprintex(7,0,"上一封",C_WHITE,B_WHITE);
}
/***************************************/
/*void io0_set(uint8 data)
{
IO0SET=0x00000001<<data;
}
void io0_clr(uint8 data)
{
IO0CLR=0x00000001<<data;
}*/
void io1_set(uint8 data)
{
IO1SET=0x00000001<<data;
}
void io1_clr(uint8 data)
{
IO1CLR=0x00000001<<data;
}
void io3_set(uint8 data)
{
IO3SET=0x00000001<<data;
}
void io3_clr(uint8 data)
{
IO3CLR=0x00000001<<data;
}
void Hold(uint32 dly)
{ uint32 i;
for(; dly>0; dly--);
for(i=0; i<10; i++);
}
void v_InitDS1302(void)
{
IO1DIR = IO1DIR|T_OUTCON1;
IO3DIR = IO3DIR|T_OUTCON3;
}
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uint8 ucDa)
{
uint8 i;
for(i=8; i>0; i--)
{
if((ucDa&0x01) != 0)
io1_set(T_IO);
else
io1_clr(T_IO);
Hold(10);
io3_set(T_CLK);
Hold(20);
io3_clr(T_CLK);
Hold(10);
ucDa >>= 1; /*相当于汇编中的 RRC */
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ucDa
***********************************************************************/
uint8 uc_RTOutputByte(void)
{
uint8 i;
uint8 ucDa=0;
IO1DIR = IO1DIR&T_INCON;
for(i=8; i>0; i--)
{
Hold(10);
ucDa >>= 1; /*相当于汇编中的 RRC */
if((IO1PIN&T_IO_SET) !=0 )///////////////
ucDa += 0x80;
io3_set(T_CLK);
Hold(20);
io3_clr(T_CLK);
Hold(10);
}
IO1DIR = IO1DIR |T_OUTCON1;
return(ucDa);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uint8 ucAddr, uint8 ucDa)
{
io3_clr(T_RST); /*T_RST = 0;*/
io3_clr(T_CLK); /*T_CLK = 0;*/
Hold(40);
io3_set(T_RST); /*T_RST = 1;*/
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
io3_set(T_CLK); /*T_CLK = 1;*/
io3_clr(T_RST); /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uint8 uc_R1302(uint8 ucAddr)
{
uint8 ucDa;
io3_clr(T_RST); /*T_RST = 0;*/
io3_clr(T_CLK); /*T_CLK = 0;*/
Hold(40);
io3_set(T_RST); /*T_RST = 1;*/
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
io3_set(T_CLK); /*T_CLK = 1;*/
io3_clr(T_RST); /*T_RST = 0;*/
Hold(40);
return(ucDa);
}
/********************************************************************
*
* 名称: v_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_BurstW1302T(uint8 *pSecDa)
{
uint8 i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
io3_clr(T_RST); /*T_RST = 0;*/
io3_clr(T_CLK); /*T_CLK = 0;*/
Hold(40);
io3_set(T_RST); /*T_RST = 1;*/
v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
v_RTInputByte(*pSecDa);/* 写1Byte数据*/
pSecDa++;
}
io3_set(T_CLK); /*T_CLK = 1;*/
io3_clr(T_RST); /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uint8 *pSecDa)
{
uint8 i;
io3_clr(T_RST); /*T_RST = 0;*/
io3_clr(T_CLK); /*T_CLK = 0;*/
Hold(40);
io3_set(T_RST); /*T_RST = 1;*/
v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
pSecDa++;
}
io3_set(T_CLK); /*T_CLK = 1;*/
io3_clr(T_RST); /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstW1302R(uint8 *pReDa)
{
uint8 i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
io3_clr(T_RST); /*T_RST = 0;*/
io3_clr(T_CLK); /*T_CLK = 0;*/
Hold(40);
io3_set(T_RST); /*T_RST = 1;*/
v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31;i>0;i--) /*31Byte 寄存器数据 */
{
v_RTInputByte(*pReDa); /* 写1Byte数据*/
pReDa++;
}
io3_set(T_CLK); /*T_CLK = 1;*/
io3_clr(T_RST); /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstR1302R(uint8 *pReDa)
{
uint8 i;
io3_clr(T_RST); /*T_RST = 0;*/
io3_clr(T_CLK); /*T_CLK = 0;*/
Hold(40);
io3_set(T_RST); /*T_RST = 1;*/
v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
pReDa++;
}
io3_set(T_CLK); /*T_CLK = 1;*/
io3_clr(T_RST); /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uint8 *pSecDa)
{
uint8 i;
uint8 ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =0;i<7;i++)
{
v_W1302(ucAddr,((*pSecDa)*16)+*(pSecDa+1)); /* 分 时 日 月 年 */
pSecDa++;
pSecDa++;
ucAddr +=2;
/*if(i==4)
{
ucAddr -=4;
}
else
{
ucAddr -=2;
}*/
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uint8 ucCurtime[])
{
uint8 i;
uint8 ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
/*uint8 set_1302(void)
{
if(Ds1302_Buf[2]==1&&Ds1302_Buf[3]>2) //判断是否大于12月
return 1;
else if(Ds1302_Buf[2]>1) //判断是否月得十位大于1
return 1;
else if(Ds1302_Buf[4]>3) //判断日十位是否大于3
return 1;
else if(Ds1302_Buf[4]>2&&Ds1302_Buf[3]==2) //2月不得有日十位大于2 //判断日十位是否大于3
return 1;
else if(Ds1302_Buf[4]==3&&Ds1302_Buf[2]==0&&(Ds1302_Buf[3]==1||Ds1302_Buf[3]==3||Ds1302_Buf[3]==5||Ds1302_Buf[3]==7||Ds1302_Buf[3]==7)&&Ds1302_Buf[5]>1) //判断大月份在10月内不得大于31天
return 1;
else if(Ds1302_Buf[4]==3&&Ds1302_Buf[2]==1&&(Ds1302_Buf[3]==0||Ds1302_Buf[3]==2)&&Ds1302_Buf[5]>1) //判断大月份在10月外得天数不得大于31天
return 1;
else if(Ds1302_Buf[4]==3&&Ds1302_Buf[2]==0&&(Ds1302_Buf[3]==4||Ds1302_Buf[3]==6||Ds1302_Buf[3]==9)&&Ds1302_Buf[5]>0) //判断小月份在10月内得天数不得大于30天
return 1;
else if(Ds1302_Buf[4]==3&&Ds1302_Buf[2]==1&&Ds1302_Buf[3]==1&&Ds1302_Buf[5]>0) //判断小月份在10月外得不得大于30天
return 1;
else if(Ds1302_Buf[4]==2&&Ds1302_Buf[2]==0&&Ds1302_Buf[3]==2&&(((Ds1302_Buf[0]*10+Ds1302_Buf[1])%4)==0)&&Ds1302_Buf[5]>9) //判断闰年2月不得大于29天
return 1;
else if(Ds1302_Buf[4]==2&&Ds1302_Buf[2]==0&&Ds1302_Buf[3]==2&&(((Ds1302_Buf[0]*10+Ds1302_Buf[1])%4)!=0)&&Ds1302_Buf[5]>8) //判断平年2月不得大于28天
return 1;
else if(Ds1302_Buf[6]>5) //小时十位不能大于5
return 1;
else if(Ds1302_Buf[8]>5) //分钟十位不能大于5
return 1;
v_Set1302(Ds1302_Buf);
return 0;
}*/
int main(void)
{
PINSEL2 = 0x00000034;
IO0DIR =0x00400000;
IO0CLR =0x00400000;
IO1DIR =0x00100000;
IO1CLR =0x00100000;
IO2DIR =0xf0000000;
IO2SET =0xf0000000;
MB90092_REST();/*复位90092*/
init_sub_screen(1,C_YELLOW,B_CYAN);
set_sub_position(511,255);
sub_display(0,0,*(int16 *)" ",C_YELLOW,B_CYAN);
sub_display(1,0,*(int16 *)" ",C_YELLOW,B_CYAN);
init_sub_screen(1,C_YELLOW,B_CYAN);
ondisplay(/*config_table.backcolor&*/B_BLUE&0x0007,0);/*开显示*/
set_main_position(0,27);/*设置主屏左上角位置(2,23)*/
set_text();/*设置显示为文本方式*/
cls();
v_InitDS1302();
time_1302_buf[0]=0;
time_1302_buf[1]=1;
time_1302_buf[2]=1;
time_1302_buf[3]=6;
time_1302_buf[4]=1;
time_1302_buf[5]=5;
time_1302_buf[6]=1;
time_1302_buf[7]=1;
time_1302_buf[8]=0;
time_1302_buf[9]=2;
time_1302_buf[10]=0;
time_1302_buf[11]=7;
time_1302_buf[12]=0;
time_1302_buf[13]=7;
// v_Set1302(time_1302_buf);
// v_Get1302(set_1302_buf);
while(1)
{
v_Get1302(set_1302_buf);
cls();
disp1();
DelayNS(65000);
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -