⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chinese_led.asm

📁 AVR开发板例子源代码
💻 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 + -