历史上的今天
今天是:2024年09月20日(星期五)
2019年09月20日 | 51单片机学习笔记(三)
2019-09-20 来源:eefocus
感觉现在每一天写的程序都在增加难度,或者是因为我太心急,书中的一些过渡程序我觉得太简单就只看书上的例程,理解后没有亲自在电脑上调试,结果编写进阶的程序就感觉很困难了。所以以后要一个一个程序慢慢递进,不能太心急了。
今天这个程序是在昨天按键控制led灯的基础上改为按键控制数码管了,要实现按一个键数码管显示的数字加一,按另一个键数码管的数字减一。虽然这个功能简单,但实现起来却很复杂。我调试了一个小时还找不出错误,最后还是打开书本参考了一下例程才豁然开朗。
调试记录:
(1)程序中的,inc count语句我第一次写的时候把它调到去process子程序中,结果是没有任何操作的时候,数码管不断自加,debug的时候程序卡住了,连keil软件都无反应,只好用Ctrl+alt+del强制关闭。原因是按照我的主程序,无论按键处理后收到高电平还是低电平,都会执行放在process中的inc count。也就是不断自加。实验失败。所以以后收集到信息后要第一时间处理,或用内存空间来记录,否则错了还找不出来。
(2)书中已指出的可能会出现的错误,即自加的数据超过99,和为负数的时候会溢出,我设置了一个判断,对数据为99时再加1已不再处理,为0时再减1也不再理会,停在99或0的位置。
(3)如果按照之前控制led灯的程序照抄的话会出现按下键不释放的话数码管会熄灭,于是在不断循环检测按键释放的指令之前,也循环call display,即数码管循环输出原来的数字,保证看起来数码管没有熄灭。
最大的收获:
写这个程序我最大的收获不只是调试的经验,还有一点模块化编程的意识,最后算是比较深刻地区分sjmp和ret的关系吧,感觉汇编的跳转很容易让人头痛,c语言的逻辑性似乎看起来要清晰很多。
附代码如下 :
COUNT EQU 30H
SHIWEI EQU 31H
GEWEI EQU 32H
ORG 0000H
SJMP START
ORG 0030H
START:
MOV SP,#060H
MOV P2,#0FFH
MOV P0,#0FFH
MOV P1,#0FFH
MOV DPTR,#TAB
MOV COUNT,#00H
MAIN:
CALL KEY ;检测按键子程序
CALL PROCESS ;除法,分开个位和十位
CALL DISPLAY ;显示处理后的数字
SJMP MAIN
KEY:
JNB P2.0,K1 ;低电平(按下)跳到k1处理
JNB P2.7,K2 ;另一个按键,同上
RET ;若都是高电平(没有按下)返回主程序
K1:
CALL DELAY ;延时去抖
JB P2.0,MAIN ;若高电平(没有按下)则是干扰信号,返回主程序
;***************确认为低电平(按下),等待按键释放,同时不断显示原来字样 ********
WAIT: CALL DISPLAY ;在等待过程中显示原来的数字,防止数码管灭
JNB P2.0,WAIT ;等待按键释放,
MOV R2,COUNT ;按键已释放,把count中的数据给r2,进行下一步比较
CJNE R2,#99,TIAOZHUAN ;若count不等于99则上加
RET ;等于99直接返回,不操作
TIAOZHUAN: INC COUNT ;count加1
RET
K2:
CALL DELAY
JB P2.7,MAIN
WAIT2: CALL DISPLAY
JNB P2.7,WAIT2
MOV R2,COUNT
CJNE R2,#0,TIAOZHUAN2 ;
RET
TIAOZHUAN2: DEC COUNT
RET
DELAY: ;延时子程序
MOV R0,#25
D1: MOV R1,#100
D2: DJNZ R1,D2
DJNZ R0,D1
RET
PROCESS: ;除法处理数据
MOV A,COUNT ;r把count的值给累加器a
MOV B,#10 ;给b赋值
DIV AB ;a除以b,十位数存在a,个位数存在b
MOV GEWEI,B
MOV SHIWEI,A
RET
DISPLAY:
MOV A,SHIWEI
MOVC A,@A+DPTR ;查表
MOV P0,A ;数据总线输出数据显示信号
CLR P1.0 ;控制总线控制数码管的亮与灭
CALL DELAY
SETB P1.0
MOV A,GEWEI
MOVC A,@A+DPTR
MOV P0,A
CLR P1.1
CALL DELAY
SETB P1.1
RET
TAB:
DB 03FH,006H,05BH,04FH,066H
DB 06DH,07DH,007H,07FH,06FH
END
上一篇:51单片机学习笔记(四)
下一篇:51单片机学习笔记(二)
史海拾趣
|
MP3充电器是最易损坏的配件之一。笔者维修多款充电器后发现,它们基本上都是采用开关电源电路,电路结构大同小异。本文以市面上最常见的昕潮TJ-01型充电器为例,简述其工作原理与常见故障检修,电路见图1。工作原理 (1)开关振荡电路市电经D1~D4整 ...… 查看全部问答> |
|
MSP430优势不用多说,用来做手持设备是不二选择。 介绍一本关于MSP430的书吧,难得国内务实的一本教材:《MSP430系列单片机系统工程设计与实践》,对大家设计低功耗设备很有帮助。 书内先讲解编程风格,大概描述下关键外设使用。最重要的是后面 ...… 查看全部问答> |
|
我们最近在用液晶显示特定的波形,但这需要回读,从液晶(ST7920控制器)资料上看到可以读取DDRAM和GDRAM中的数据,但是没有成功, 由于我们用的是绘图方式,所以需要读取GDRAM中的数据,小弟这里有个网上下的程序,但不太清楚具体的含义,并且回 ...… 查看全部问答> |
|
我用matlab生成的希尔伯特变换器系数,用在DSPLIB的hilb16()函数中,输出的波形都不正确,请问TI有针对该DSPLIB库专门的工具可以生成滤波器系数吗? … 查看全部问答> |




