📄 bank1.c.svn-base
字号:
#include "reg51.h"
#include "../include/bank1.h"
ucharx DefMoreThan20[]={"批量总数已达20条"};//16
ucharc MaxnumTable[]={0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x49,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x09};
ucharc t9table01[10][4] =
{
0x20,0x20,0x20,0x20, //for key0
0x20,0x20,0x20,0x20, //for key1
0x61,0x62,0x63,0x20, //for key2
0x64,0x65,0x66,0x20, //for key3
0x67,0x68,0x69,0x20, //for key4
0x6a,0x6b,0x6c,0x20, //for key5
0x6d,0x6e,0x6f,0x20, //for key6
0x70,0x71,0x72,0x73, //for key7
0x74,0x75,0x76,0x20, //for key8
0x77,0x78,0x79,0x7a, //for key9
};
ucharc t9table04[17][10] =
{
//for "0" "*" " " "+" "-" " " " " " "
0x30,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //for key0
//for "1" "y" "z" "#" "9" "Y" "Z" "#"
0x31,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x3a,0x3b,0x3c, //for key1
//for "2" "a" "b" "c" "@" "2" "A" "B" "C" "@"
0x32,0x61,0x62,0x63,0x40,0x32,0x41,0x42,0x43,0x40, //for key2
//for "3" "d" "e" "f" "#" "3" "D" "E" "F" "#"
0x33,0x64,0x65,0x66,0x23,0x33,0x44,0x45,0x46,0x23, //for key3
//for "4" "g" "h" "i" "$" "4" "G" "H" "I" "$"
0x34,0x67,0x68,0x69,0x24,0x34,0x47,0x48,0x49,0x24, //for key4
//for "5" "j" "k" "l" "%" "5" "J" "K" "L" "%"
0x35,0x6a,0x6b,0x6c,0x25,0x35,0x4a,0x4b,0x4c,0x25, //for key5
//for "6" "m" "n" "o" "^" "6" "M" "N" "O" "^"
0x36,0x6d,0x6e,0x6f,0x5e,0x36,0x4d,0x4e,0x4f,0x5e, //for key6
//for "7" "p" "q" "r" "s" "7" "P" "Q" "R" "S"
0x37,0x70,0x71,0x72,0x73,0x37,0x50,0x51,0x52,0x53, //for key7
//for "8" "t" "u" "v" "&" "8" "T" "U" "V" "&"
0x38,0x74,0x75,0x76,0x26,0x38,0x54,0x55,0x56,0x26, //for key8
//for "9" "w" "x" "y" "z" "9" "W" "X" "Y" "Z"
0x39,0x77,0x78,0x79,0x7a,0x39,0x57,0x58,0x59,0x5a, //for key9
0,0,0,0,0,0,0,0,0,0, //for space to key dot
0,0,0,0,0,0,0,0,0,0, //for space to key dot
0,0,0,0,0,0,0,0,0,0, //for space to key dot
0,0,0,0,0,0,0,0,0,0, //for space to key dot
0,0,0,0,0,0,0,0,0,0, //for space to key dot
0,0,0,0,0,0,0,0,0,0, //for space to key dot
//for "." "," "!" "?" "(" ")" "/" "\" "'" """
0x2e,0x3d,0x3e,0x3f,0x40,0x5b,0x5c,0x5d,0x5e,0x5f, //for keydot
};
uintc LunarDateCode01[] = {0xa1a1,0xcaae};//uintc LunarDateCode01[] = {0xa1a1,'十'};
uintc LunarDateCode02[] = {0xd2bb,0xb6fe,0xc8fd,0xcbc4,0xcee5,0xc1f9,0xc6df,0xb0cb,0xbec5,0xcaae};
//uintc LunarDateCode02[] = {'一','二','三','四','五','六','七','八','九','十'};
uintc LunarDateCode03[] = {0xb3f5,0xcaae,0xdba5,0xdba6};//uintc LunarDateCode03[] = {'初','十','廿','卅'};
ucharc LunarLeapMonth[] =
{
0X00, //2000
0X40, 0X02, 0X07, 0X00, 0X50, 0X04, 0X09, 0X00, 0X60, 0X04, //2020
0X00, 0X20, 0X60, 0X05, 0X00, 0X30, 0Xb0, 0X06, 0X00, 0X50, //2040
0X02, 0X07, 0X00, 0X50, 0X03, //2050
};
uchar GetMonthLength(uchar year, uchar month)
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
break;
case 4:case 6:case 9:case 11:
return 30;
break;
case 2:
//如果是闰年
if((year % 4) == 0)
return 29;
else
return 28;
break;
}
return -1;
}
uchar AllRefresh(calendarx *properties_point)
{
uchar solar[3];
ucharx lunar[10];
uint holday[2];
ucharx counter,length,i,j,weekday,monthlength,dateAlength;
ucharx dateA[42],numberA[2],calendarA[12],holdayA[4]; //={0xc,0x13,0x0,0x7,2,9,28,02,20,12,16,16}
uchar rtcA[7];
ucharx weekA[14];
ucharx lunar_date[14];
ucharc arrayA[]={0xc5,0xa9,0xc0,0xfa,0xa1,0xa1,0xbe,0xc5,0xd4,0xc2,0xb3,0xf5,0xc1,0xf9};
ucharc weekA_array[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9};
length=0;
properties_point->SelectNum=5;
properties_point->date_input.box_bottom=32;
properties_point->date_input.box_left=0;
properties_point->date_input.box_right=60;
properties_point->date_input.box_top=19;
properties_point->date_input.chr_type=Date_Type;
properties_point->date_input.chr_disp_mode=0x0b;
properties_point->date_input.chr_dir=0;
properties_point->date_input.length_flex=0;
properties_point->date_input.chr_len=6;
properties_point->time_input.box_bottom=31;
properties_point->time_input.box_left=90;
properties_point->time_input.box_right=124;
properties_point->time_input.box_top=19;
properties_point->time_input.chr_type=Time_Type;
properties_point->time_input.chr_disp_mode=0x0b;
properties_point->time_input.chr_dir=0;
properties_point->time_input.length_flex=0;
properties_point->time_input.chr_len=4;
for(i=0;i<14;i++)
{
weekA[i]=weekA_array[i];
}
for(i=0;i<14;i++)
{
lunar_date[i]=arrayA[i];
}
YjsReadRTclock(&rtcA[0]); //读rtc里的年、月、日、星期、时、分
for(i=0;i<3;i++)
{
solar[i]=(rtcA[i]/16)*10+rtcA[i]%16;
}
CalFnSolDate2LunDate(solar, lunar, holday);
j=0; //uint To uchar
for(i=0;i<4;) //节气转换
{
holdayA[i++]=(holday[j] & 0xff00)>>8;
holdayA[i++]=holday[j++] & 0x00ff;
}
for(i = 4; i < 14;i++)
lunar_date[i] = lunar[i - 4];
BCDInRam_ASCExRam(6,(uchar *)&rtcA[0],(ucharx *)(&properties_point->date_input.chr[0]));
for(i=0;i<4;i++)
{
properties_point->time_input.chr[i]=properties_point->date_input.chr[i+8];
}
Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
CursorEnable=0; // 0 disable,1 enable //yy
j=4;
for(i=0;i<6;i++)
{
if(i==3) ;
else calendarA[j++]=((rtcA[i]/16)*10)+(rtcA[i]%16);
}
YJHDrawRectangle(0,34,18,113,0x51);
YJHDrawRectangle(110,34,127,113,0x51);
if(holdayA[0] != 0xa1)
YJHDrawRectangle(99,114,127,127,0x73);
YJHDrawLine(0,34,127,34,0x03);
YJHDrawLine(0,50,127,50,0x03);
YJHDrawLine(0,114,127,114,0x03);
YJHStringDisplay(0xff,36, 0x5, 0x63,&weekA[0],7); //显示星期日,1,2,3,4,5,6,
YJHStringDisplay(0,115, 0x45, 0x03,&lunar_date[0],7); //显示农历日期
YJHStringDisplay(102,115, 0x35, 0x10,&holdayA[0],2); //显示节气
weekday=GetDayNumPosition(calendarA[4],calendarA[5],1); //取某月1号的星期数
if(weekday >= 7) weekday=0;
else if(weekday > 4) dateAlength=42;
else dateAlength=35;
for(counter=0;counter<weekday;counter++) //显示之前的空白项(weekday长度)
{
dateA[counter]=0x00;
}
monthlength=GetMonthLength(calendarA[4],calendarA[5]);
for(counter=0;counter < monthlength;counter++) //显示数据项 (monthlength长度)
{
dateA[weekday+counter]=((counter+1)/10)*16+((counter+1)%10); //转换成压缩BCD码,因为从rtc里读出的数值是BCD格式
}
i=dateAlength-(weekday+monthlength);
for(counter=0;counter < i;counter++) //填补多余的空白项 (i 长度)
{
dateA[weekday+monthlength+counter]=0x00;
}
for(i=0;i<dateAlength;i++) //显示5×7数字
{
if(!(i%7)) j=0;
if(dateA[i] != 0x00)
{
if(dateA[i] < 16) numberA[0]=0x20;
else numberA[0]=(dateA[i]/0x10)+0x30;
numberA[1]=(dateA[i]%0x10)+0x30;//计算需反白的当前日期
if((((j*6) == (((weekday+calendarA[6])%7-1)*18)) || ((j*6) == (((weekday+calendarA[6]-1)%7)*18))) && ((i/7) == ((weekday+calendarA[6]-1)/7)))
{
length=0x00;
counter=0x73;
YJHDrawRectangle((3+j*6),(51+(i/7)*10),(15+j*6),(59+(i/7)*10),0x73);
}
else
{
length=0x03;
counter=0x3;
}
}
else
{
j=j+3;
continue;
}
YJHDisplayString5_7((4+j*6),(52+(i/7)*10),length,counter,(ucharx*)numberA,2);
j+=3;
}
return(NOKEY);
}
// calendar function solar date to lunar date
void CalFnSolDate2LunDate(uchar *psolar, ucharx *plunar, uint *pholday)
{
uintx spandays = 0;
uintx tmpuint;
ucharx tmpuchar;
ucharx tmparuchar[4];
uint targetsolaryear = 2000 + (*psolar); //solar target year //samuel 20021109
uchar targetsolarmonth = *(psolar + 1); //solar target month
uchar targetsolardate = *(psolar + 2); //solar target date
uint lunaryear;
uchar lunarmonth, lunardate, leapmonth;
//first: calculate solar span days
for(tmpuint = START_YEAR; tmpuint < targetsolaryear; tmpuint ++)
//solar year
spandays += CalFnCalcSYDays(tmpuint);
for(tmpuchar = 1; tmpuchar < targetsolarmonth; tmpuchar ++)
//solar month
spandays += CalFnCalcSMDays(targetsolaryear, tmpuchar);
spandays += targetsolardate - 1; //solar date
spandays -= 46; //attention
//second: calculate lunar date
for(lunaryear = START_YEAR; spandays >= CalFnCalcLYDays(lunaryear); lunaryear ++)
//lunar year
spandays -= CalFnCalcLYDays(lunaryear);
for(lunarmonth = 1; spandays >= CalFnCalcLMDays(lunaryear, lunarmonth); lunarmonth ++)
//lunar month
spandays -= CalFnCalcLMDays(lunaryear, lunarmonth);
leapmonth = CalFnGetLYLeapMonth(lunaryear);
if(leapmonth != 0) //leap month!
if(lunarmonth > leapmonth)
lunarmonth --;
lunardate = 1 + spandays; //lunar date
//restore lunar month
YJHReadFlashToExterMem( LunarDataPage, 6,
(ucharx *)(lunarmonthAdd + (lunarmonth - 1) * 6),
(ucharx *)plunar);
YJHReadFlashToExterMem( LunarDataPage, 4,
(ucharx *)(lunardateAdd + (lunardate - 1) * 4),
(ucharx *)(plunar + 6));
//third: process holday
*pholday = 0xa1a1;
*(pholday + 1) = 0xa1a1; //init holday[]
// tmpuchar = LunarHolDay[*psolar][targetsolarmonth - 1];
YJHReadFlashToExterMem( LunarDataPage, 1,
(ucharx *)(LunarHolDayAddrOrg + (*psolar * 12) + targetsolarmonth - 1),
(ucharx *)(&tmpuchar));
if(15 - targetsolardate == (tmpuchar >> 4)) { //"jieqi"
// *pholday = LunarHolDayCode[targetsolarmonth - 1][0];
// *(pholday + 1) = LunarHolDayCode[targetsolarmonth - 1][1];
YJHReadFlashToExterMem( LunarDataPage, 4,
(ucharx *)(LunarHolDayCdAd + (targetsolarmonth - 1) * 8),
tmparuchar );
*pholday = tmparuchar[0] * 0x0100 + tmparuchar[1];
*(pholday + 1) = tmparuchar[2] * 0x0100 + tmparuchar[3];
}
if(targetsolardate - 15 == (tmpuchar & 0x0f)) { //"zhongqi"
YJHReadFlashToExterMem( LunarDataPage, 4,
(ucharx *)(LunarHolDayCdAd + (targetsolarmonth - 1) * 8 + 4),
tmparuchar );
*pholday = tmparuchar[0] * 0x0100 + tmparuchar[1];
*(pholday + 1) = tmparuchar[2] * 0x0100 + tmparuchar[3];
}
}
uchar GetDayNumPosition(uchar year,uchar month,uchar date)
{
//数组元素monthday[i]表示第i个月以前的总天数除以7的余数
ucharx monthday[]={0,3,3,6,1,4,6,2,5,0,3,5};
uint weeknum,InYear;
InYear=2000+year;
weeknum = (InYear-1)%7 + (InYear-1)/4 - (InYear-1)/100 +(InYear-1)/400;
weeknum += (monthday[month-1] +date);
//如果iYear是闰年
if((((year % 4) == 0)) && month>2) weeknum++;
//返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六
weeknum=weeknum%7;
return ((uchar)weeknum); //return weekday
}
// calendar function calculate solar year days
uint CalFnCalcSYDays(uint solaryear)
{
if((solaryear % 4) == 0) //leap year
return 366;
else
return 365;
}
// calendar function calculate solar month days
uchar CalFnCalcSMDays(uint solaryear, uchar solarmonth)
{
switch(solarmonth) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
return 31; //longer month
case 2:
if((solaryear % 4) == 0) //leap year
return 29;
else
return 28;
case 4: case 6: case 9: case 11:
return 30; //shorter month
default:
return 0;
}
}
// calendar function calculate lunar year days
uint CalFnCalcLYDays(uint lunaryear)
{
uchar i, monthnumber = 12;
uint days = 0;
if(CalFnGetLYLeapMonth(lunaryear) != 0) //there is leap month in the year
monthnumber ++;
for(i = 1; i <= monthnumber; i ++)
days += CalFnCalcLMDays(lunaryear, i);
return days;
}
uchar CalFnCalcLMDays(uint lunaryear, uchar lunarmonth)
{
ucharx tmpuchar[2];
uintx symbol;
YJHReadFlashToExterMem( LunarDataPage, 2,
(ucharx *)(LunarMonthDayAd + (uchar)(lunaryear - START_YEAR) * 2),
tmpuchar);
symbol = tmpuchar[0] * 0x0100 + tmpuchar[1];
symbol &= 0x8000 >> (lunarmonth - 1);
if(symbol == 0)
return 29;
else
return 30;
}
// calendar function get lunar year leap month
uchar CalFnGetLYLeapMonth(uint lunaryear)
{
uchar tmp, spanyear;
spanyear = lunaryear - START_YEAR;
tmp = LunarLeapMonth[spanyear / 2];
tmp >>= ((lunaryear % 2) * 4);
return tmp & 0x0f;
}
uchar Calendar_ctrl(calendarx *properties_point,uchar key)
{
uchar length,i;
uchar rtcA[7];
length = 0;
switch (key) {
case MsgShowTimer: //可优化
YjsReadRTclock(&rtcA[0]); //读rtc里的时、分
if (rtcA[6] == 0) {
if ((properties_point->time_input.chr[0] == 0x32)&&
(properties_point->time_input.chr[1] == 0x33)&&
(properties_point->time_input.chr[2] == 0x35)&&
(properties_point->time_input.chr[3] == 0x39)) {
return(KEYBCAKAGAIBN);
}
}
BCDInRam_ASCExRam(2,(uchar *)&rtcA[4],
(ucharx *)(&properties_point->time_input.chr[0]));
Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
CursorEnable = 0;
TimerType = TimerKeyOff;
TimerVar = 10;
return(key);
case KEYREFRSH:
AllRefresh(properties_point);
TimerVar = 10;
TimerType = TimerKeyOff;
return KEYREFRSH;
case KEYSELECT:
if ((properties_point->SelectNum == 1) ||
(properties_point->SelectNum == 5)) { //时间调整时按select
CursorEnable = 1; // 0 disable,1 enable
properties_point->date_input.cur_flash_flag = 1; //01--有光标,00--无光标
if ((properties_point->SelectNum == 1)&&
(Edit_Ctrl(&properties_point->date_input, KEYENTER) == KEYENTER)) {
Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
properties_point->SelectNum=0;
}
else {
YjsReadRTclock(&rtcA[0]); //读rtc里的年、月、日、星期、时、分
BCDInRam_ASCExRam(6,(uchar *)&rtcA[0],(ucharx *)(&properties_point->date_input.chr[0]));
for (i = 0; i < 6; i++) {
properties_point->Date_Time[i]=properties_point->date_input.chr[i]; //保存当前日期数据
}
Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
properties_point->SelectNum = 1;
}
}
else { //时间调整时按select
CursorEnable = 1; // 0 disable,1 enable
properties_point->time_input.cur_flash_flag = 1; //01--有光标,00--无光标
if (Edit_Ctrl(&properties_point->time_input, KEYENTER) != KEYENTER) {
YjsReadRTclock(&rtcA[0]); //读rtc里的年、月、日、星期、时、分
BCDInRam_ASCExRam(6,(uchar *)&rtcA[0],(ucharx *)(&properties_point->date_input.chr[0]));
for (i = 0; i < 4; i++) {
properties_point->Date_Time[i] = properties_point->date_input.chr[i]; //保存当前时间数据
properties_point->time_input.chr[i] = properties_point->date_input.chr[i+8];
}
Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
(properties_point->SelectNum) = 0;
}
else {
Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
properties_point->SelectNum=1;
}
}
break;
case KEYESC:
if (properties_point->SelectNum == 5) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -