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 ;调用从内存取数显示一次
sbis PINd,01 ;I/O口的位被置位跳行,检测到PD1按下否
rjmp getseed ; 检测到PD1按下转
dec temp2 ;-1
brne dspfm1 ;不为0转
dec dspn ; 初始画面次数-1
brne dspfm ; 不为0转
rjmp start ;转到显示初始动画
getseed:inc temp ;+`1,根据PD1按下的时间,选择随机数种子
sbis pind,01 ; I/O口的位被置位跳行,检测到PD1按下否
rjmp getseed ; 检测到PD1按下,继续计数
andi temp,0x1f ;按钮松开,取随机数种子与0X0F加
ldi zh,high(randtb*2)
ldi zl,low(randtb*2)
add zl,temp
lpm
mov rdata,r0 ;得到随机数种子
next: ldi dspn,0x08 ;显示8个不同的随机数;
repeet: rcall randm ;调用产生随机数子程序
rcall dspnumber ;调用显示8个不同的随机数
dec dspn ;-1
brne repeet ;dspn不为0转
rcall randm ; 调用产生随机数子程序
guess1: rcall dspnumber ;调用显示同一随机数,直到有键按下
sbIC pind,01 ;松开后再往下执行(I/O口清零跳行)
rjmp guess1 ;转显示同一随机数,直到有键按下
wait: rcall dspnumber ;
sbis pind,01
rjmp wait ;等待按钮按下
ldi rdata9,0x03 ;显示动画三次
start0: ldi dspn,0x06 ;每次显示六幅画面
上一页 [1] [2] [3] [4] 下一页
本文关键字:单片机 AVR单片机,单片机-工控设备 - AVR单片机