如何编写程序,通过数字键盘(0-9)将0x12改成0x36
如题,考虑了很久,还是不知如何搞,现在的问题是ds1302修改时间,//顺序:秒,分,时,日,月,星期,年;格式:BCD
uchar times={0x50,0x59,0x23,0x06,0x09,0x01,0x15};
定义了一个数组,想通过键盘(0-9)修改一下时间,例如把times=0x06;修改为0x25,程序如何实现呢 temp=(read1302(reg)/16)*10+read1302(reg)%16读取转换成10进制
10进制转换成BCD写入write1302(reg,(temp/10)*16+temp%10) little_Monkey 发表于 2015-11-7 00:06
temp=(read1302(reg)/16)*10+read1302(reg)%16读取转换成10进制
10进制转换成BCD写入write1302(reg,(temp/1 ...
你还,仔细想了你的回复,你是将10进制转化为BCD码格式,我想问是通过数字键盘改变的1302数据么{:smile:} 1178951695 发表于 2015-11-7 11:09
你还,仔细想了你的回复,你是将10进制转化为BCD码格式,我想问是通过数字键盘改变的1302数据么 ...
读取到键盘如何得到数据那是你程序需要处理的问题,很简单了,最简单的方法,上次的按键值×10+这次的按键值 你是新手吧,这都搞不定,还是转行吧{:smile:} spring152 发表于 2015-11-7 12:25
你是新手吧,这都搞不定,还是转行吧
{:shocked:} ,发段程序来看看 #defineuchar unsigned char
uchar times={0x50,0x59,0x23,0x06,0x09,0x01,0x15};
uchar read_key(void)
{
// return key value
}
void chk_key(uchar key)
{
switch( key )
{
case 0: //key 0
times=0x25;
case 1: //key 1
case 2: //key 2
case 3: //key 3
case 4: //key 4
case 5: //key 5
case 6: //key 6
case 7: //key 7
case 8: //key 8
case 9: //key 9
default:
break;
}
}
void main(void)
{
uchar i;
i=read_key();
chk_key(i);
}
楼主要的不是什么把什么改成什么的程序,而是要一个通过按键设置时间的程序吧。 hyz_avr 发表于 2015-11-7 16:57
楼主要的不是什么把什么改成什么的程序,而是要一个通过按键设置时间的程序吧。 ...
对啊,请问你有么?贴一段学习下 jxchen 发表于 2015-11-7 16:51
#defineuchar unsigned char
uchar times={0x50,0x59,0x23,0x06,0x09,0x01,0x15};
uchar read_key(v ...
谢谢,你这的确可以变成0x25,但我需要的是通过按键2和按键5实现它,而不是人为的定义一个0x25,请问你还有其他的方法么 本帖最后由 hyz_avr 于 2015-11-7 18:10 编辑
1178951695 发表于 2015-11-7 17:27
对啊,请问你有么?贴一段学习下
有,给你个十年前刚自学单片机时写的1602LCD电子钟程序。
ORG 0000H;
LJMP START;
ORG 000BH;时间定时
AJMP TIME;
ORG 001BH;调时闪烁定时
LJMP SETTIME;
ORG 0030H;
START:
RS EQU P0.4 ;RS EQU P3.7
RW EQU P0.5 ;RW EQU P3.6
E EQU P0.6 ;E EQU P3.5
MOV p2,#01H;;清除屏幕
ACALL ENABLE
MOV p2,#38H;8位点阵方式
ACALL ENABLE
MOV p2,#0CH;开显示
ACALL ENABLE
MOV p2,#06H;移动光标
ACALL ENABLE
MOV 2AH,#7FH;赋初值
MOV 2CH,#00H;
MOV 20H,#00H;
MOV 21H,#00;
MOV 22H,#00;
MOV 23H,#00;
MOV 24H,#20;
MOV 25H,#01;
MOV 26H,#06;
MOV 43H,#08;
MOV 46H,#00;
MOV R5,#06H;
SETB EA;
SETB ET0;
MOV TMOD,#11H;
MOV TL0,#0B0H;
MOV TH0,#3CH;
MOV TL1,#0B0H;
MOV TH1,#3CH;
SETB TR0;
MOV SP,#50H;
MOV R2,#02H;
MOV R1,#0C6H;
MOV DPTR,#TABLE;
YCL:MOV p2,R1;显示时间\日期的间隔符号
LCALL ENABLE;
MOV A,#3AH;
LCALL WRITE2;
MOV R1,#0C9H;
DJNZ R2,YCL;
MOV R2,#02H;
MOV R1,#87H;
YCL2:MOV p2,R1;
LCALL ENABLE;
MOV A,#2dH;
LCALL WRITE2;
MOV R1,#8AH;
DJNZ R2,YCL2;
MOV R2,#02H;
MOV R1,#83H;
MOV A,#'2';显示年的前两位
YCL3:MOV p2,R1;
LCALL ENABLE;
LCALL WRITE2;
MOV A,#'0';
MOV R1,#84H;
DJNZ R2,YCL3;
LOOP:LCALL DISP;
LCALL KEY;
JZ LOOP;
LCALL ANKEY;
AJMP LOOP;
TIME:
PUSH ACC;
PUSH PSW;
MOV TL0,#0DCH;定时器初始值50ms(50000us)(可以自己更改)
MOV TH0,#37H;
INC 20H;
MOV A,20H;
CJNE A,#18,RETI1;
MOV 20H,#00H;
MOV A,21H;秒计数
INC A;
MOV 21H,A;
SETB 2AH.2;
CJNE A,#60,RETI1;
MOV 21H,#00H;
MOV A,22H;分计数
INC A;
MOV 22H,A;
SETB 2AH.1;
CJNE A,#60,RETI1;
MOV 22H,#00H;
MOV A,23H;时计数
INC A;
MOV 23H,A;
SETB 2AH.0;
CJNE A,#24,RETI1;
MOV 23H,#00H;
MOV A,24H;日计数
INC A;
MOV 24H,A;
SETB 2AH.3;
CJNE A,40H,RETI1;
MOV 24H,#01;
MOV A,25H;月计数
INC A;
MOV 25H,A;
SETB 2AH.4;
CJNE A,#13,RETI1;
MOV 25H,#01;
MOV A,26H;年计数
INC A;
MOV 26H,A;
SETB 2AH.5;
CJNE A,#99,RETI1;
MOV 26H,#00;
RETI1:
MOV 2CH,#00H;
POP PSW;
POP ACC;
RETI;
NOP
NOP
NOP
;闪动调时程序
SETTIME:PUSH ACC;
PUSH PSW;
MOV TL1,#0B0H;定时器1赋初值
MOV TH1,#3CH;
DJNZ R5,OUTSET;0.3秒未到,退出
MOV R5,#06H;
MOV A,2CH; ------------------放入相应的闪动熄灭符
JB 2BH.0,SETN;
JB 2BH.1,SETY;
JB 2BH.2,SETR;
JB 2BH.3,SETS;
JB 2BH.4,SETF;
JB 2BH.5,SETM;
AJMP SETOUT;
OUTSET:LJMP SETOUT;
SETN:
ANL A,#01H;
MOV 2CH,A;
CPL 2CH.0;
SETB 2AH.5;
MOV 36H,#20H;
MOV 37H,#20H;
AJMP SETOUT;
SETY:
ANL A,#02H;
MOV 2CH,A;
CPL 2CH.1;
SETB 2AH.5
SETB 2AH.4;
MOV 38H,#20H;
MOV 39H,#20H;
AJMP SETOUT;
SETR:
ANL A,#04H;
MOV 2CH,A;
CPL 2CH.2;
SETB 2AH.4;
SETB 2AH.3;
MOV 4AH,#20H;
MOV 4BH,#20H;
AJMP SETOUT;
SETS:
ANL A,#08H;
MOV 2CH,A;
CPL 2CH.3;
SETB 2AH.3;
SETB 2AH.0;
MOV 30H,#20H;
MOV 31H,#20H;
AJMP SETOUT;
SETF:
ANL A,#16;
MOV 2CH,A;
CPL 2CH.4;
SETB 2AH.0;
SETB 2AH.1;
MOV 32H,#20H;
MOV 33H,#20H;
AJMP SETOUT;
SETM:
ANL A,#32;
MOV 2CH,A;
CPL 2CH.5;
SETB 2AH.1;
SETB 2AH.2;
MOV 34H,#20H;
MOV 35H,#20H;
SETOUT:LCALL DISP;
POP PSW;
POP ACC;
RETI;
NOP
NOP
NOP
;按键检测与处理
KEY:MOV 46H,#00H;
MOV A,P3;
CPL A;
ANL A,#3FH;
JZ KEYOUT1;
LCALL D20MS;
MOV A,P3;
CPL A;
ANL A,#3FH;
MOV 46H,A;
KEEY22:
MOV A,P3;
CPL A;
ANL A,#3FH;
JNZ KEEY22;
KEYOUT1:MOV A,46H;
RET;
KEY2:MOV 46H,#00H;按键检测
MOV A,P3;
CPL A;
ANL A,#3FH;
JZ KEY2;
LCALL D20MS;消抖
MOV A,P3;
CPL A;
ANL A,#3FH;
JZ KEY2;
MOV 46H,A;
KEEY2: ;-------等待按键释放
MOV A,P3;
CPL A;
ANL A,#3FH;
JNZ KEEY2;
ANKEY:; -------------------按键处理
MOV A,46H;
JB ACC.3,L2;-----------是加1键跳转到L2
JB ACC.1,L3;-----------减1键跳转到L3
JB ACC.4,GL_L;
AJMP KEY2;
GL_L:LJMP GL;----------------功能键处理
L2:JB 2BH.0,NJ1;-------------加1键处理
JB 2BH.1,YJ1;
JB 2BH.2,RJ1;
JB 2BH.3,SJ1;
JB 2BH.4,FJ1;
JB 2BH.5,MJ1;
AJMP KEY2;
L3:JB 2BH.0,NJJ1;------------减1键处理
JB 2BH.1,YJJ1;
JB 2BH.2,RJJ10;
JB 2BH.3,SJJ10;
JB 2BH.4,FJJ10;
JB 2BH.5,MJJ10;
AJMP KEY2;
RJJ10:LJMP RJJ1;
SJJ10:LJMP SJJ1;
FJJ10:LJMP FJJ1;
MJJ10:LJMP MJJ1;
NJ1:MOV A,26H;---------------年加1
INC A;
CJNE A,#100,NOUT;
MOV A,#00H;
NOUT:
MOV 26H,A;
SETB 2AH.5;
AJMP KEY2;
YJ1:MOV A,25H;-------------- 月加1
INC A;
CJNE A,#13,YOUT;
MOV A,#01H;
YOUT:
MOV 25H,A;
SETB 2AH.4;
AJMP KEY2;
RJ1:MOV A,24H;----------------日加1
INC A;
CJNE A,40H,ROUT;
MOV A,#01H;
ROUT:
MOV 24H,A;
SETB 2AH.3;
AJMP KEY2;
SJ1:MOV A,23H;---------------时加1
INC A;
CJNE A,#24,SOUT;
MOV A,#00H;
SOUT:
MOV 23H,A;
SETB 2AH.0;
AJMP KEY2;
FJ1:MOV A,22H;---------------分加1
INC A;
CJNE A,#60,FOUT;
MOV A,#00H;
FOUT:
MOV 22H,A;
SETB 2AH.1;
AJMP KEY2;
MJ1:MOV A,21H;--------------秒加1
INC A;
CJNE A,#60,MOUT;
MOV A,#00H;
MOUT:
MOV 21H,A;
SETB 2AH.2;
AJMP KEY2;
NOP
NOP
;-----------------------------------------------------减1键处理----------------
NJJ1:MOV A,26H;
DEC A;
CJNE A,#0FFH,NJJ;
MOV A,#99;
NJJ:
MOV 26H,A;
SETB 2AH.5;
AJMP KEY2;
YJJ1:MOV A,25H;
DEC A;
CJNE A,#00H,YJJ;
MOV A,#12;
YJJ:
MOV 25H,A;
SETB 2AH.4;
AJMP KEY2;
RJJ1:MOV A,24H;
DEC A;
CJNE A,#00H,RJJ;
MOV 48H,40H;
DEC 48H;
MOV A,48H;
RJJ:
MOV 24H,A;
SETB 2AH.3;
AJMP KEY2;
SJJ1:MOV A,23H;
DEC A;
CJNE A,#0FFH,SJJ;
MOV A,#23;
SJJ:
MOV 23H,A;
SETB 2AH.0;
AJMP KEY2;
FJJ1:MOV A,22H;
DEC A;
CJNE A,#0FFH,FJJ;
MOV A,#59;
FJJ:
MOV 22H,A;
SETB 2AH.1;
AJMP KEY2;
MJJ1:MOV A,21H;
DEC A;
CJNE A,#0FFH,MJJ;
MOV A,#59;
MJJ:
MOV 21H,A;
SETB 2AH.2;
AJMP KEY2;
;-----------------功能键处理----------------------
GL:CLR ET0;
CLR TR0;
SETB ET1;
SETB TR1;
JB 2BH.0,YTZ;
JB 2BH.1,RTZ;
JB 2BH.2,STZ;
JB 2BH.3,FTZ;
JB 2BH.4,MTZ;
JB 2BH.5,KEYOUT;
NTZ:MOV 2BH,#01H;
AJMP KEY2;
YTZ:MOV 2BH,#02H;
AJMP KEY2;
RTZ:MOV 2BH,#04H;
AJMP KEY2;
STZ:MOV 2BH,#08H;
AJMP KEY2;
FTZ:MOV 2BH,#16;
AJMP KEY2;
MTZ:MOV 2BH,#32;
AJMP KEY2;
KEYOUT:;------------------按键退出
CLR ET1;
CLR TR1;
MOV 2AH,#7FH;
MOV 2BH,#00H;
MOV 2CH,#00H;
SETB ET0;
SETB TR0;
RET;
NOP
NOP
DISP:MOV DPTR,#TABLE;
JNB 2AH.5,Y_CL;年更新缓存?
MOV A,26H;
MOV B,#04;计算是否闰年
DIV AB;
MOV A,B;
JZ NCL;
MOV 41H,#29;不是闰年2月有28天
AJMP NYX;
NCL:MOV 41H,#30;闰年2月有29天
NYX:MOV A,26H;
MOV B,#10;
DIV AB;
JB 2CH.0,NSD; 年显示是否熄灭
MOV 36H,A;
MOV 37H,B;
NSD:
CLR 2AH.5;
MOV R4,#02;
MOV R0,#86H;
MOV A,37H;
NCL1:MOV p2,R0;
ACALL ENABLE;
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,36H;
DEC R0;
DJNZ R4,NCL1;
Y_CL:JNB 2AH.4,RCL;月更新缓存?
MOV A,25H;
CJNE A,#02,Y_CL_1;不是二月,跳转Y_CL2
MOV 40H,41H;把2月份天数送到40H,
AJMP SYY;
Y_CL_1:MOV A,25H;8月以上双月31天,8月以下单月31天
CLR C;
SUBB A,43H;
JC DXCL;
SETB 2AH.7;
AJMP Y_CL2;
DXCL: CLR 2AH.7;8月以上2AH.7=0..
Y_CL2:
JB 2AH.7,SY2; 计算是大月还是小月(31天还是30天)
MOV A,25H;
MOV B,#02;
DIV AB;
MOV A,B;
JZ XY30;双月跳转
AJMP DY31;
SY2:
MOV A,25H;
MOV B,#02;
DIV AB;
MOV A,B;
JZ DY31;双月跳转
AJMP XY30;
DY31:MOV 40H,#32;有31天
AJMP SYY;
XY30:MOV 40H,#31;30天
SYY:JB 2CH.1,YSD;
MOV A,25H;
MOV B,#10;
DIV AB;
MOV 38H,A;
MOV 39H,B;
YSD: CLR 2AH.4;
MOV R4,#02;
MOV R0,#89H;
MOV A,39H;
Y_CL1:MOV p2,R0;
ACALL ENABLE;
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,38H;
DEC R0;
DJNZ R4,Y_CL1;
RCL:JNB 2AH.3,SCL;日更新缓存?
JB 2CH.2,RSD;
MOV A,24H;
MOV B,#10;
DIV AB;
MOV 4AH,A;
MOV 4BH,B;
RSD:CLR 2AH.3;
MOV R4,#02;
MOV R0,#8CH;
MOV A,4BH;
RCL1:MOV p2,R0;
ACALL ENABLE;
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,4AH;
DEC R0;
DJNZ R4,RCL1;
SCL:JNB 2AH.0,FCL;时更新缓存?
JB 2CH.3,SSD;
MOV A,23H;
MOV B,#10;
DIV AB;
MOV 31H,B;
MOV 30H,A;
SSD:CLR 2AH.0;
MOV R4,#02H;
MOV R0,#0C5H;显示位置
MOV A,31H;
SCL1:MOV p2,R0;
ACALL ENABLE
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,30H;
DEC R0;
DJNZ R4,SCL1;
FCL:JNB 2AH.1,MCL;分更新缓存?
JB 2CH.4,FSD;
MOV A,22H;
MOV B,#10;
DIV AB;
MOV 33H,B;
MOV 32H,A;
FSD:CLR 2AH.1;
MOV A,33H;
MOV R0,#0C8H;显示位置
MOV R4,#02H;
FCL1:MOV p2,R0;
ACALL ENABLE
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,32H;
DEC R0;
DJNZ R4,FCL1;
MCL:
JNB 2AH.2,NEXTX;秒更新缓存?
JB 2CH.5,MSD;
MOV A,21H;
MOV B,#10;
DIV AB;
MOV 35H,B;
MOV 34H,A;
MSD:CLR 2AH.2;
MOV R0,#0CBH;显示位置
MOV R4,#02H;
MOV A,35H;
MCL1:MOV p2,R0;
ACALL ENABLE
MOVC A,@A+DPTR;
LCALL WRITE2;
MOV A,34H;
DEC R0;
DJNZ R4,MCL1;
NEXTX: RET
NOP
NOP
WRITE2:
mov p2,a
setb rs
clr rw
clr e
call delay
setb e
ret
;写指令子程序
ENABLE:
CLR RS
CLR RW
CLR E
ACALL DELAY
SETB E
RET
delay:
mov r7,#25
d1: mov r6,#255
d2: djnz r6,$
djnz r7,d1
ret
D20MS:MOV R7,#25;
D11: MOV R6,#30;
DJNZ R6,$;
DJNZ R7,D11;
RET;
TABLE: DB'0123456789'
END
; 2006.5.18/2006.6.27修改~
最后上照片{:lol:}
楼上的为什么不给HEX文件?{:lol:} hyz_avr 发表于 2015-11-7 18:03
有,给你个十年前刚自学单片机时写的1602LCD电子钟程序。
牛逼,汇编啊 楼上的为什么不按我的需求,写一个C语言版的,求把源代码改好, 汇编看着太难了,看不懂,最好能把工程文件发出来,我一下到我的板子上就可以运行了! 就是-段 十進轉十六進制程式而已! 上面已经有人说思路了,自己想想就好. 我觉得.提供思路已经是本坛极限了.还要帮忙改代码?又不是你家长…楼主自己考虑一下是不是适合做这样的事 伸手党……思路都说的很显著了……
那个贴汇编的哥们我觉得已经很显著要表达点代码之外的事儿了 既然你想要代码,而且要简单,呵呵
一按键,就把0x12改成0x36还不简单
if(KeyDownFlag)
{
if(Param == 0x12)
{
param = 0x36;
}
}
页:
[1]