您的位置:控制工程论坛网论坛 » 教程与手册 » 大家一起来学单片机:LED花样灯

water

water   |   当前状态:离线

总积分:882  2026年可用积分:0

注册时间: 2006-06-09

最后登录时间: 2007-01-25

空间 发短消息加为好友

大家一起来学单片机:LED花样灯

water  发表于 2006/6/13 16:31:53      1615 查看 0 回复  [上一主题]  [下一主题]

手机阅读

恒坚单片机实验软件上的一个程序。注释完整。
<-- #BeginEditable "2" --> LED显示实验:主要掌握单片机的基本VO操作,主要是指如何操作端O。其中含有将操作端O做为8位寄存器寻址方式的操作和按位寻址的操作方式,另外还包含有软件延时:预顶义,存贮单元硬件描术表的建立。
源程序:<-- #EndEditable -->
<-- #BeginEditable "3" -->
beep bit p3.7 ;蜂鸣器定义对应的单片机引脚
led1 bit p1.0 ;第一个数码管对应的引脚
led2 bit p1.1 ;第二个数码管对应的引脚
led3 bit p1.2 ;第三个数码管对应的引脚
led4 bit p1.3 ;第四个数码管对应的引脚
led5 bit p1.4 ;第五个数码管对应的引脚
led6 bit p1.5 ;第六个数码管对应的引脚
led7 bit p1.6 ;第七个数码管对应的引脚
led8 bit p1.7 ;第八个数码管对应的引脚
org 00h;程序开始
jmp main;跳转到主程序
org 030h;主程序从30H开始
main:mov sp,#30h;初始化堆栈,这一条语句不能放到初始化程序里
;否则程序不能正确返回,为什么?
lcall rest ;调用初始化程序,进行初始化
lcall pro_led ;调用LED显示程序
jmp main;返回开始
rest:mov a,#00h ;初始化程序,首先将累加器清零
mov b,#00h;累加器B也请零
mov p0,#0 ;所有P0口置低位,禁止数码管显示
mov p1,0ffh;P1口高位,LED也不显示
mov p2,#255;P2口也高位,禁止数码管显示,
;将立即数写成#255(后面没有H)表示十进制,
;如果写成#0FFH(后面有个H)表示十六进制,
;如果十六进制高位大于9,必须在前面加上0,
;如0A0H,结果还是 A0H(160),0AH(10)否则编译不能通过
clr beep;禁止蜂鸣器发出声音,如果写成setb beep(置位蜂鸣器)
;则蜂鸣器发出声音
ret ;子程序返回
; ******************************************* 注意:注释字符前一定要加上;
***********************
;LED显示程序用来控制LED的显示,通常用在街道霓虹等控制等
;采用两种不同的走灯方式,可以采用不同的策略,组合出不同的走灯花样
;单片机学习的窍门就是多实践,希望大家多从应用程序中得到启示
;不断进步,从而提高自己的单片机应用能力
pro_led: ;LED显示程序开始
setb led1;显示第一个LED
clr led8 ;清除前一个LED
lcall delay  ;延时
setb led2 ;进入第二个循环,显示第二个LED
clr led1 ;清除第一个LED
lcall delay  ;如此反复,直到所有的LED都循环过
setb led3
clr led2
lcall delay
setb led4
clr led3
lcall delay
setb led5
clr led4
lcall delay
setb led6
clr led5
lcall delay
setb led7
clr led6
lcall delay
setb led8
clr led7
lcall delay
again: ;开始另外一种显示方式
setb led7 ;点亮第7个LED
clr led8 ;清除第8个LED
lcall delay;延时 ,然后如此循环
setb led6
clr led7
lcall delay
setb led5
clr led6
lcall delay
setb led4
clr led5
lcall delay
setb led3
clr led4
lcall delay
setb led2
clr led3
lcall delay
setb led1
clr led2
lcall delay
ret;返回,
; **************************************************
delay:push psw;保护PSW寄存器
clr psw.3 ;
setb psw.4 ;重新设置寄存器组别
mov r0,#2 ;延时常数
mov r1,#250;延时常数
mov r2,#2 ;延时常数
dl1:djnz r0,dl1;延时循环1
mov r0,#250;
dl2:djnz r1,dl1;延时循环2
mov r0,#240;
mov r1,#248;
dl3:djnz r2,dl1;这是第三个循环
nop;这个用来修正演示精度
pop psw;恢复PSW寄存器 ret ; 延时子程序返回
; ******************* 下面是 数码管显示的编码 ************************************                                                                                             ;用来对显示的数据所对应的数码管位数进行编码,如 "0",对应 数码管的 a,b,c,d,e,f 写成编码就是 0c0h;
;为了正确显示,请不要修改,如果要显示更多的字符,可以在后面加入,单对应的十六进制代码要改变;
;否则,需要自己另外根据格式定义一组编码表格;
tab_nu: db 0c0h,0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ;不带小数点十六进制数字0--7对应的编码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh;不带小数点十六进制数字8--F对应的编码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h  ;带小数点十六进制数字0--7对应的编码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh  ;带小数点十六进制数字8--F对应的编码

1楼 0 0 回复