一乐交易区摊主
主题
回帖0
积分69798
阅读权限30
注册时间2009-12-14
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2010-3-10 11:51
|
显示全部楼层
本帖最后由 cosine 于 2010-3-10 12:12 编辑
接好电路确认无误后就编了一段最简单的程序进行的测试,目标就是点亮屏最角上的第一个LED。程序是汇编的,C的等过两天熊再写出来,C51熊正学。代码如下,本贴所有源程序在KEIL 8.05中编译通过:
;===============================
;mcu=89S52 f=11.0592mhz
;实验内容:FU电路板shqi2003LED板测试
;具体实验:点亮LED屏的一个点
;实验日期:2010-3-10
;===============================
;变量定义部分
temp0 equ 10h ;定义延时临时变量,用第2组通用寄存器区
temp1 equ 11h
temp2 equ 12h
;===============================
;端口定义部分
H_MR equ P0.0
H_AB equ P0.1
L_STR equ P0.2
L_CLK equ P0.3
L_R equ P0.4
;===============================
;复位矢量
org 0000h
ajmp main ;转主程序
;===============================
;主程序部分
org 0030h
main:
;-------------------------------
;初始化部分
mov psw,#00h
mov sp,#2fh ;1051 ram only to 40h
mov tmod,#01h ;t0 is mod1
mov tcon,#55h ;tf1 tr1 tf0 tr0 ie1 it1 ie0 it0
mov scon,#50h ;sm0 sm1 sm2 ren tb8 rb8 ti ri
mov pcon,#00h ;smod x x x gf1 gf0 pd idl
mov ie,#00h ;ea x et2 es et1 ex1 et0 ex0
mov ip,#00h ;x x pt2 ps pt1 px1 pt0 px0
;-------------------------------
;程序执行部分
proc:
;清164及595数据
mov temp0,#10h ;清2片164共16行
clr H_AB
setb L_STR ;列移位时钟置低
clear_164:
clr L_STR ;164移位
setb L_STR
djnz temp0,clear_164
clr H_MR ;清595
setb H_MR
clr L_STR ;列数据锁存置0
;595置1移位第1列
setb L_R ;595数据置1
clr L_CLK ;595移位给时钟脉冲
setb L_CLK
;164置1扫描第1行
setb H_AB ;行扫置1
setb L_STR ;595输出
clr L_STR ;行扫移位
loop:
nop
ajmp loop
;===============================
;子程序部分
;===============================
delay1ms: ;11.0592M下延时1ms,每机器周期按1.085微秒计
mov temp0,#02h ;temp0=2
delay10ms_1:
mov temp1,#0e3h ;temp1=227,外层循环DJNZ补上后循环体刚好1ms
djnz temp1,$
nop
djnz temp0,delay10ms_1
ret
;===============================
end
程序除了标准的初始化外,就是先对595和164进行初始化,让屏全灭,然后给595移一位1,再给164移一位1。这样就点亮了一个LED,如图:
看到结果有些意外,本来根据沈老师的电路图认为第一个LED应该亮在左上角,结果现在亮在左下角,这样扫描时数据的提取就要反过来或是干脆把点阵数据就反过来存。 |
|