1178951695 发表于 2015-11-6 22:51:04

如何编写程序,通过数字键盘(0-9)将0x12改成0x36

如题,考虑了很久,还是不知如何搞,现在的问题是ds1302修改时间,
//顺序:秒,分,时,日,月,星期,年;格式:BCD
uchar times={0x50,0x59,0x23,0x06,0x09,0x01,0x15};
定义了一个数组,想通过键盘(0-9)修改一下时间,例如把times=0x06;修改为0x25,程序如何实现呢

little_Monkey 发表于 2015-11-7 00:06:50

temp=(read1302(reg)/16)*10+read1302(reg)%16读取转换成10进制
10进制转换成BCD写入write1302(reg,(temp/10)*16+temp%10)

1178951695 发表于 2015-11-7 11:09:32

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:}

little_Monkey 发表于 2015-11-7 12:04:06

1178951695 发表于 2015-11-7 11:09
你还,仔细想了你的回复,你是将10进制转化为BCD码格式,我想问是通过数字键盘改变的1302数据么 ...

读取到键盘如何得到数据那是你程序需要处理的问题,很简单了,最简单的方法,上次的按键值×10+这次的按键值

spring152 发表于 2015-11-7 12:25:13

你是新手吧,这都搞不定,还是转行吧{:smile:}

1178951695 发表于 2015-11-7 13:24:15

spring152 发表于 2015-11-7 12:25
你是新手吧,这都搞不定,还是转行吧

{:shocked:} ,发段程序来看看

jxchen 发表于 2015-11-7 16:51:04

#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:31

楼主要的不是什么把什么改成什么的程序,而是要一个通过按键设置时间的程序吧。

1178951695 发表于 2015-11-7 17:27:00

hyz_avr 发表于 2015-11-7 16:57
楼主要的不是什么把什么改成什么的程序,而是要一个通过按键设置时间的程序吧。 ...

对啊,请问你有么?贴一段学习下

1178951695 发表于 2015-11-7 17:32:32

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:03:34

本帖最后由 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:}




ThinkARM 发表于 2015-11-7 18:29:54

楼上的为什么不给HEX文件?{:lol:}

1178951695 发表于 2015-11-7 18:34:52

hyz_avr 发表于 2015-11-7 18:03
有,给你个十年前刚自学单片机时写的1602LCD电子钟程序。




牛逼,汇编啊

lingdianhao 发表于 2015-11-7 18:34:59

楼上的为什么不按我的需求,写一个C语言版的,求把源代码改好,

lingdianhao 发表于 2015-11-7 18:36:47

汇编看着太难了,看不懂,最好能把工程文件发出来,我一下到我的板子上就可以运行了!

easier 发表于 2015-11-9 07:56:31

就是-段 十進轉十六進制程式而已!

mcu5i51 发表于 2015-11-9 09:07:35

上面已经有人说思路了,自己想想就好.

bg6agf 发表于 2015-11-9 09:39:39

我觉得.提供思路已经是本坛极限了.还要帮忙改代码?又不是你家长…楼主自己考虑一下是不是适合做这样的事

delazio 发表于 2015-11-9 13:34:07

伸手党……思路都说的很显著了……
那个贴汇编的哥们我觉得已经很显著要表达点代码之外的事儿了

McuPlayer 发表于 2015-11-9 14:00:54

既然你想要代码,而且要简单,呵呵

一按键,就把0x12改成0x36还不简单
if(KeyDownFlag)
{
    if(Param == 0x12)
    {
      param = 0x36;
    }
}
页: [1]
查看完整版本: 如何编写程序,通过数字键盘(0-9)将0x12改成0x36