📄 usart.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 + -