📄 chinese_led.asm
字号:
;********************************************************************************
;* *
;* File : 扩展板汉字LED.asm *
;* Function : 点阵汉字LED显示练习 两个汉字显示 *
;* Date : 2006-09-18 *
;* Version : 1.0 *
;* *
;* Author : 开关电源 hongtusy@163.com *
;* Company : 电子信息技术咨询网 http://www.itsn.cn *
;* *
;****************************描述与记事******************************************
;扩展实验板的AVR程序,使用595驱动点阵汉字LED的练习。
;记事:本程序旨在对汉字LED驱动的理解与演示,程序适合初学者使用。
;描述:74HC595是串行输入,并行输出带锁存器的有较大驱动能力的芯片。驱动电流可达70mA。内部有移位和输出两个寄存器。
;在SRCLK串行时钟上升沿,数据经SER移位进入,或经QH’输出。在RCLK上升沿,数据进入并行输出寄存器。
;SRCLK’和OE’分别是复位和允许输出控制,分别接电源和地。
;除了系统复位SW3-8外其余平拨开关需要关闭
;接线定义:PD4=数据,PD5=RCLK并行输出时钟,PD6=SRCLK串行时钟,PD7=OE,PD0=A,PD1=B,PD2=C,PD3=D
;********************************************************************************
.include"8535def.inc" ;定义头文件。
.org 0x0000 ;指定开始地址。
rjmp reset ;转移到“RESET”句。
.org 0x0010
reset: ldi r16,high(ramend)
out sph,r16
ldi r16,low(ramend)
out spl,r16
;---------以上是定义堆栈指针-----------
ldi r16,0xff ;加载立即数作数据方向参数。
out ddrd,r16 ;PD口为输出,595的输入控制部分,只使用末3位
;------------------------------------------
;-------------------------滚动显示4个汉字,修改指针r7---------------------------
star: ldi r16,32 ;显示欢迎
mov r6,r16
ldi r16,0
mov r7,r16 ;指针
bbb: rcall display1
inc r7
inc r7
dec r6
dec r6
mov r16,r6
cpi r16,0 ;与立即数0比较,由于CPI指令只允许R16至R31。
brne bbb ;不为0,继续发送下一列。
rjmp star
;---r4为真正的指针------r7放的是备份的指针----r5为显示次数指针---------
display1: ldi r16,5 ;显示x次作为一屏画面。调节滚动速度。
mov r5,r16
aaa: mov r4,r7 ;重新赋值给指针
rcall display ;显示
dec r5
mov r16,r5
cpi r16,0
brne aaa
ret
;------------------------显示以屏画面子程序--------------------------------
;--输入参数:表格指针。-------------------
display: sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
cbi portd,1 ;B
cbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
cbi portd,1 ;B
cbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
sbi portd,1 ;B
cbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
sbi portd,1 ;B
cbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
cbi portd,1 ;B
sbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
cbi portd,1 ;B
sbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
sbi portd,1 ;B
sbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
sbi portd,1 ;B
sbi portd,2 ;C
sbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
;-------------------
sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
cbi portd,1 ;B
cbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
cbi portd,1 ;B
cbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
sbi portd,1 ;B
cbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
sbi portd,1 ;B
cbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi 0x12,7 ;OE=1,消隐
cbi 0x12,0 ;A
cbi 0x12,1 ;B
sbi 0x12,2 ;C
cbi 0x12,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
cbi portd,1 ;B
sbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
cbi portd,0 ;A
sbi portd,1 ;B
sbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
sbi portd,7 ;OE=1,消隐
sbi portd,0 ;A
sbi portd,1 ;B
sbi portd,2 ;C
cbi portd,3 ;D
rcall out_595
rcall del
cbi portd,7 ;OE=1,输出
rcall londel
ret
;-------------显示子程序--行数据已经在R0,R1,R2,R3中了。-----------
out_595: rcall cabiao ;首先生成最新的数据。
mov r17,r3 ;行数据到显示缓存,先送最末位的数据。
rcall wr_595 ;移位输出
mov r17,r2
rcall wr_595
mov r17,r1
rcall wr_595
mov r17,r0
rcall wr_595
sbi 0x12,5 ;并行输出锁存器rclk=1,portd=0x12,上升沿移位
nop
nop
cbi 0x12,5 ;rclk=0,portd=0x12
ret
;------查表取码程序,初始值在r4(指针)中,结果在R0,R1,R2,R3中---------
;工作原理;首先将表格首地址放到16位寄存器Z中,然后把要查表显示的数据个数(当前是第几个)(即R6的值)和
;Z相加,结果仍放到Z中,然后使用LPM命令,将数据存储器的内容读入到指定的寄存器中。注意只可以读到字地址。
cabiao: ldi zh, high(Table_1<<1);初始化Z指针
ldi zl, low(Table_1<<1)
clc ;清进位标志c
add r30,r4 ;r4中放的是要显示的数据个数的初始值,处理低字节数据
clr r16 ;r16清0
adc r31,r16 ;处理高字节数据,带C加。
lpm r0,z ;从程序存储器中装入Z指针(r31:r30)指向的常量
inc r4 ;加1得到下一个字节数据
ldi zh, high(Table_1<<1); 初始化Z指针
ldi zl, low(Table_1<<1)
clc ;清进位标志c
add r30,r4 ;r4中放的是要显示的数据个数的初始值,处理低字节数据
clr r16 ;r16清0
adc r31,r16 ;处理高字节数据,带C加。
lpm r1,z ;从程序存储器中装入Z指针(r31:r30)指向的常量
ldi r16,63
add r4,r16 ;新的指针,中间加了31,实际就是获得了下一个字的地址。
;---------------------------------
ldi zh, high(Table_1<<1)
ldi zl, low(Table_1<<1)
clc
add r30,r4
clr r16
adc r31,r16
lpm r2,z
inc r4
ldi zh, high(Table_1<<1)
ldi zl, low(Table_1<<1)
clc
add r30,r4
clr r16
adc r31,r16
lpm r3,z
ldi r16,63
sub r4,r16 ;得到正确的下个地址指针。
ret
;-------移位寄存器接收数据,数据在r17中--------------
wr_595: ldi r16,0x08 ;8位数据
wr0: ror r17 ;带C循环左移。高位先出。
brbc 0,w0 ;若C为0跳转,输出0。
rjmp w1 ;否则肯定为1,输出1。
w0: sbi 0x12,4 ;I/Oout=0,输出0。portd=0x12
rjmp wr1 ;转移
w1: cbi 0x12,4 ;I/Oout=1,输出1。portd=0x12
nop
wr1: sbi 0x12,6 ;srclk=1,portd=0x12,上升沿移位
nop
cbi 0x12,6 ;srclk=0,portd=0x12
dec r16 ;寄存器减1
cpi r16,0 ;与立即数0比较
brne wr0 ;不为0,继续发送下一位。
ret
;#################短延迟程序##################
del: ldi r16,0x01f
Loop1: dec r16 ;减一操作。算术运算指令
brne Loop1 ;条件跳转,不相等跳转,就是新TEMP不等于旧REMP转移,否则继续往下执行
nop
ret
;###################钳套的延迟程序################
londel: ldi r17,0x03
Loop2: rcall del
rcall del
dec r17
brne Loop2
ret
Table_1:
;欢
.db 0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40
.db 0x18,0x40,0x18,0x60,0x24,0xA0,0x24,0x90,0x41,0x18,0x86,0x0E,0x38,0x04,0x00,0x00
;迎
.db 0x01,0x00,0x21,0x10,0x19,0x18,0x0D,0x10,0x09,0x20,0x01,0x04,0x7F,0xFE,0x04,0x40
.db 0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x42,0x08,0x42,0x10,0x42,0x20,0x3E,0x40,0x00
;--------
;迎
.db 0x40,0x00,0x21,0x80,0x36,0x7C,0x24,0x44,0x04,0x44,0x04,0x44,0xE4,0x44,0x24,0x44
.db 0x25,0x44,0x26,0x54,0x24,0x48,0x20,0x40,0x20,0x40,0x50,0x00,0x8F,0xFE,0x00,0x00
;临
.db 0x01,0x00,0x09,0x80,0x09,0x00,0x49,0xFE,0x4A,0x20,0x4A,0x10,0x4C,0x10,0x49,0x04
.db 0x49,0xFE,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x09,0xFC,0x09,0x04,0x00,0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -