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

📄 usart.asm

📁 AVR开发板例子源代码
💻 ASM
字号:
;********************************************************************************
;*                                                                              *
;*    File       : 实验板uart.asm                                               *
;*    Function   : uart应用练习                                                 *
;*    Date       : 2006-05-07                                                   *
;*    Version    : 1.0                                                          *
;*                                                                              *
;*    Author     : 开关电源              hongtusy@163.com                       *
;*    Company    : 电子信息技术咨询网    http://www.itsn.cn                     *
;*                                                                              *
;****************************描述与记事******************************************
;实验板的AVR程序,uart应用,和计算机通讯,用LED显示接收的数据。
;接线定义:SW1~8打开,SW2-1,2,3,4,打开,SW2-6为LED的电源,SW3-8为系统复位脚。
;          PD0-RXD(SW6-7)    PD1-TXD(SW6-8) 打开
;记事:本程序旨在对usart的理解与演示,程序适合初学者使用。具体电路可参照使用指南里的说明。
;使用器件:ATMEGA8535,可更换。          使用片外8MHz晶振,注意熔丝位的设置。
;说明:使用串口调试器,波特率调整为9600,采用十六进制发送和接收模式。刚上电,串口可以接收到0x0208
;     然后在发送串口输入你要发送的数字,十六进制的,比如0x05,且数字不能大于19,否则LED不能显示。
;     尔后可以在接收窗口看到你刚才发送的数据返回来了,并且也显示在学习板的第一位LED数码管上了。
;********************************************************************************
.include "m8535def.inc"                     ;定义头文件。
.org 0x0000                                ;指定开始地址。
            rjmp       reset               ;转移到“reset”句。
.org 0x000b
            rjmp       uasrt_sev           ;串口接收中断服务程序
.org 0x0030
reset:      ldi        r16,high(ramend)    ;定义堆栈指针
            out        sph,r16
			ldi        r16,low(ramend)
			out        spl,r16
;----------------------------------------------     
			ldi        r16,0xff
			out        ddrc,r16            ;PC口为输出,数码管的段码端
			out        ddrd,r16            ;PD口为输出,74138的数据端和串行口。
      ;------------设置串口---------------
	        cli    ;关闭全局中断
            ldi        r16,51               ;9600bps,8MHz晶振
			out        ubrrl,r16            ;ubrr是波特率寄存器
			ldi        r16,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE) ;接收结束中断使能,RXD&TXD使能
			out        ucsrb,r16             ;
            sei    ;开中断
;------------------------------------------
            ldi        r16,0x02             ;串口发送0x0208到PC机
			rcall      uasrt_send
			ldi        r16,0x08
			rcall      uasrt_send

            rjmp       start         ;LED扫描显示,当有串口接收中断后进入中断服务程序。










;---------------串口接收中断服务程序-----简便起见,这里的发送和接收全部采用十六进制形式,
;                                        并且数字不大于19,否则LED不能显示。
uasrt_sev:   in         r16,UDR       ;读数据
             mov        r20,r16       ;将接收到的数据送第一位LED显示缓冲区。
			 rcall      uasrt_send    ;回送数据
			 reti

;------------------串口发送一字节数据--------------------
uasrt_send:  out        UDR,r16       ;发送一个数据,发送的数据是刚刚接收到的数据。
wait:        sbis       ucsra,udre    ;等待发送完毕
			 rjmp       wait          ;继续等待
			 ret


;***********************************************
;函 数 名:    /
;功    能:    使用138驱动PNP管作共阳数码管的公共脚。可以驱动8位数码管加8位条形LED。
;输入参数:     /
;输出参数:    /
;描    述:    LED数码管显示指定的8位数字且让条形LED显示50%的示意。
;开关位置:    SW1~8打开,SW2-1,2,3,4,打开,SW2-6为LED的电源,SW3-8为系统复位脚。
;使用口资源:PC口和PD口,共12位。本程序浅显易懂,可在实际中应用。查表显示需要显示的内容。
;注意SW2-4(PD7)口既是138的使能端又是条形LED的驱动端,高时数码管亮,低时条形LED亮。
;和bb段不同,这里将要显示的内容建立一个表格,通过查表来显示内容,是真正的显示子程序。
;r20-r28单元是显示存储区,只要把数据装入这些寄存器,调动态扫描程序就可以显示了。
;***********************************************
start:      ldi        r20,3            ;0
			ldi        r21,1            ;1
			ldi        r22,1            ;1
			ldi        r23,0            ;0
			ldi        r24,8            ;8
			ldi        r25,5            ;5
			ldi        r26,8            ;8
			ldi        r27,1            ;1
;################led动态扫描显示子程序,使用前把显示数据装入显示存储器中###使用138############
;可显示的字符包括:0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、-、_、P、X、
display:	ldi        r16,0B10000000      ;作共阴的公共脚。
			out        portd,r16           ;位号,第1位。
			mov        r16,r20             ;数据1
			rcall      dxaa                ;显示
     ;----------------------------
            ldi        r16,0B10010000
			out        portd,r16           ;位号,第2位。
			mov        r16,r21             ;数据2
			rcall      dxaa                ;显示 
     ;----------------------------
            ldi        r16,0B10100000
			out        portd,r16           ;位号,第3位。
			mov        r16,r22             ;数据3
			rcall      dxaa                ;显示 
     ;----------------------------
            ldi        r16,0B10110000
			out        portd,r16           ;位号,第4位。
			mov        r16,r23             ;数据4
			rcall      dxaa                ;显示 
     ;----------------------------
            ldi        r16,0B11000000
			out        portd,r16           ;位号,第5位。
			mov        r16,r24             ;数据5
			rcall      dxaa                ;显示 
     ;----------------------------
            ldi        r16,0B11010000
			out        portd,r16           ;位号,第6位。
			mov        r16,r25             ;数据6
			rcall      dxaa                ;显示 
    ;----------------------------
            ldi        r16,0B11100000
			out        portd,r16           ;位号,第7位。
			mov        r16,r26             ;数据7
			rcall      dxaa                ;显示 
     ;----------------------------
            ldi        r16,0B11110000
			out        portd,r16           ;位号,第8位。
			mov        r16,r27             ;数据8
			rcall      dxaa                ;显示 
      ;----------------------------
			rjmp       display
;------取码/延迟/消隐多功能程序,输入参数r16,查表偏移量---------
dxaa:       ldi        zh, high(Table_1<<1); 初始化Z指针
            ldi        zl, low(Table_1<<1)
            clc                            ;清进位标志
			add        r30,r16             ;r16放的是要显示的数据,处理低字节数据
            clr        r16                 ;r16清0
			adc        r31,r16             ;处理高字节数据
            lpm        r16,z               ;从程序存储器中装入Z指针(r31:r30)指向的常量
			out        portc,r16
			rcall      londel              ;长延时
            ser        r16                 ;消隐
			out        portc,r16
			rcall      del
			ret
        ;------------------------
Table_2:
.db  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x08,0x73,0x00
;共阴  0   1    2     3   4    5     6    7    8    9   A    b    C    d    E    F    -    _    P    X
Table_1:
.db  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x40,0x08,0x8C,0xFF
;共阳  0   1    2     3   4    5     6    7    8    9   A    b    C    d    E    F    -    _    P    X
;***************************************************************************************************



;#################短延迟程序##################
del:        ldi        r16,0x5F    
Loop1:      dec        r16               
            brne       Loop1       
			nop
			ret
;###################钳套的延迟程序################
londel:     ldi        r17,0x03
Loop2:      rcall      del
            rcall      del
            dec        r17
			brne       Loop2
            ret
;##################end###############







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -