;*******************************************************************; ;本程序为独立键盘应用程序,每一个按键对应控制数码管的一位,每按一次按键数码管加1 ;实现数字0-9的循环显示,s2 s3 s4 s5对应控制r0-r3内存储的数据 ;并把该四位数据显示在1-4位数码管(s2-s5分别联接p3.4-p3.5) ;P0.0-P0.7控制每位数码管的8段(段选)2.0-P2.3控制前四位数码管(位选) ;********************************************************************; org 0000h ljmp main org 30h;主程序入口地址 main: mov sp,#60h;初始化sp mov r0,#00h mov r1,#00h mov r2,#00h mov r3,#00h process: lcall display ;开始扫描显示 mov p3,#0ffh anl p3,#0f0h;屏蔽P3口的低四位 mov b,p3;读入P3口数据 lcall DELAY10;延世3ms,消抖 anl p3,#0f0h;屏蔽P3口的低四位 mov a,p3;再读入P3口数据 cjne a,b,process;若不相等,则变化为抖动引起,跳回主程序 cjne a,#0e0h,keys3;判断是否为S2键按下,若不是则检测S3键 s2:lcall display ;扫描显示 mov a,p3 cjne a,#0f0h,s2;判断s2是否放开 inc r0;s2每动作一次,r0内数据加1 lcall display;扫描显示 cjne r0,#10,keys3;若r0不超过9,则查询下一个按键 mov r0,#00h;r0超过就9,则清0,实现0-9的循环显示 keys3: cjne a,#0d0h,keys4;判断是否S3键按下,若不是则检测S4键 s3: lcall display mov a,p3 cjne a,#0f0h,s3;判断s3是否放开 inc r1 lcall display cjne r1,#10,keys4 mov r1,#00h keys4: cjne a,#0b0h,keys5;判断是否为S4键按下,若不是则检测S5键 s4: lcall display mov a,p3 cjne a,#0f0h,s4;判断s4是否放开 inc r2 lcall display cjne r2,#10,keys5 mov r2,#00h keys5: cjne a,#70h,process ;判断是否为S5键按下,若不是则S5键按下则跳回主程序重新检测 s5: lcall display mov a,p3 cjne a,#0f0h,s5;判断s5是否放开 inc r3 lcall display cjne r3,#10,process;若r3不超过9,跳回主程序 mov r3,#00h;若r3超过9,则清0 jmp process;跳回主程序 display:;显示子程序 mov dptr,#TABLE mov a,r0 movc a,@a+dptr mov p0,a mov p2,#0feh;选第一位 lcall DELAY10 mov a,r1 movc a,@a+dptr mov p0,a mov p2,#0fdh;选第二位 lcall DELAY10 mov a,r2 movc a,@a+dptr mov p0,a mov p2,#0fbh;选第三位 lcall DELAY10 mov a,r3 movc a,@a+dptr mov p0,a mov p2,#0f7h;选第四位 lcall DELAY10 DELAY10:MOV 71H,#100 ;(延时3ms子程序,晶振12m) LOOP1:MOV 70H,#12;#23;#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 ret TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH end