eor temp,temp1 ;异或通过进位位左循环移位
rol temp ; 通过进位位左循环移位
rol ddata ; 通过进位位左循环移位
rol udata ; 通过进位位左循环移位
ret ;子程序返回
7.3.8 按钮猜数程序
源程序:SLAVR738.ASM
许多场合如按钮猜数(电脑摇奖,电脑选出幸运号),游戏开始按钮等待一个不规则且不定序的数据产生,即须要随机数发生器。随机数的种子由程序设定(也可外接开关设定),启动种子后,由移位寄存器以互斥的异或逻辑组合返回循环产生。产生随机数的原理图如下:
16位移位产生随机数原理图
8~16位移位寄存器产生随机数循环组合
位 数 循环输入组合 S=2^n-1 Qn XOR Qm
8 Q2 ⊕ Q3 ⊕ Q4 ⊕ Q8 (现程序按钮猜数采用8位数)
9 Q5 ⊕ Q9
10 Q7 ⊕ Q10
11 Q9 ⊕ Q11
12 Q2 ⊕ Q10 ⊕ Q11 ⊕ Q12
13 Q1 ⊕ Q11 ⊕ Q12 ⊕ Q13
14 Q2 ⊕ Q12 ⊕ Q13 ⊕ Q14
15 Q14 ⊕ Q15
16 Q4 ⊕ Q13 ⊕ Q15 ⊕ Q16
以8X8
LED阵列,开机时为了避免被使用者预测出压按时间对应随机数的变化值,故LED字幕以广告动画画面显示,并令随机数随着变化使无法预测随机数起始值,广告动画面共有四张,每张有8位数据。见”org
dpfstb”;
由按钮(PD1)按下,AVR用8位数据产生随机数,由PORTA 口及PORTC 口输出随机数,在8X8 LED上显示好玩的真实的按钮猜数。
.include "8515def.inc"
.def peed =r16
.def DSPn =r17 ;存显示初始动画次数
.def temp2 =r18
.def temp1 =r19
.def temp =r20
.def scndp =r21
.def cnt =r22
.def rdata =r23 ;存随机种子数
.def rdata9 =r24
.equ dpfstb =0x01e0 ;大小矩形图表首址
.equ randtb =0x0210 ;随机数种子表首址
.equ numbertb=0x0240 ;0-9数字表首址
.org $0000
rjmp RESET ;Reset Handle
.cseg
.org $0010
RESET: ldi peed,high(RAMEND) ;设置堆栈$25F,见器件配置文件"8515def.inc"
out SPH,peed
ldi peed,low(RAMEND)
out SPL,peed
ldi peed,0xff ;对口初始化,
out ddra,peed ;设A口为输出
out ddrc,peed ;设C口为输出
ldi peed,0xfd ;PD1作输入,且接内部上拉电阻
out ddrd,peed ;PD1为输入,其余为输出
ldi peed,0xff ;关D口
out portd,peed
ldi peed,0x13 ;显示画面次数
start: ldi dspn,0x06 ;显示初始动画
ldi zh,high(dpfstb*2)
ldi zl,low(dpfstb*2)
dspFM: rcall ldtb8 ;调用程序区数送到内存RAM
ldi temp2,0xa0 ;显示动画面次数
dspfm1: rcall sCAN1 ;调用从内存取数显示一次
上一页 [1] [2] [3] [4] [5] 下一页
本文关键字:单片机 AVR单片机,单片机-工控设备 - AVR单片机