Thursday, March 31, 2011

點字

00=黑黑黑黑.黑黑黑黑
01=黑黑黑黑.黑黑黑__
02=黑黑黑黑.黑黑__黑

7 6 5 4 3 2 1 0

Sunday, March 27, 2011

DJNZ的問題

mov A,#80
mov RR1,A
mov A,#2
MOV RR2,A
MOV A,#1
MOV RR3,A //R1 = 80 R2=2
POP A
KO: CLR P3.2
;mov a,#00H
MOVX @DPTR,A
SETB P3.2
INC DPTR
DJNZ R1,KO
DJNZ R2,KO
;DJNZ R3,KO
RET

但當R1跑了80次後,R2-1 = 1 此時R1要從 255開始跑


解法:
用mod概念
假設要480
480 = 255 * 1 + 225
所以r1 設 225
r2設2
就可以得到所求

Friday, March 25, 2011

SP指標位移

考慮下列程式
ORG 0 ;此時(SP)內容值為07H
MOV SP,#9F ;手動將(SP)改設9FH
MOV A,#7 ;A=07H
PUSH A ;(SP)+1 = 0A0H 0A0H=07H
PUSH A ;(SP)+1 = 0A1H 0A1H=07H
POP A ;取值A=07H (SP)-1 = 0A0H
CALL KOO ;設此句CODE為0BH,下句為0EH,則CALL後(SP)+1=0A1H (0A1H)=0EH
(SP)+1=0A2H (0A2H)=00H
KOO: ;假設
MOV A,1
RET ;DPH=(0A1H) (SP)-1 =0A0H DPL=(0A0H) (SP)-1 = 09FH


CALL執行時,會PUSH目前PC值的2BYTES ADDR進(SP)
RET執行時,先POP DPH再POP DPL
0A1H放DPL,0A2H放DPH ,所以完整的RETERN ADDR #000EH

RET

(PC)HIGH <- (sp)
(sp) <- (SP)-1
(PC) LOW <- (SP)
(SP) <- (SP)-1

若(SP) = 09H
PCHIGH = (09H)
PCLOW = (08H)

sp

sp

The Stack Pointer (SP

The Stack Pointer, like all registers except DPTR and PC, may hold an 8-bit (1-byte) value. The Stack Pointer is used to indicate where the next value to be removed from the stack should be taken from.

POINTER指向下一個要被POP出去的東西

When you push a value onto the stack, the 8051 first increments the value of SP and then stores the value at the resulting memory location.

PUSH時,(SP)的值(ADDR)會+1,然後東西會存到(SP)+1的位置

When you pop a value off the stack, the 8051 returns the value from the memory location indicated by SP, and then decrements the value of SP.

POP時,先取值後,才把(SP) -1

This order of operation is important. When the 8051 is initialized SP will be initialized to 07h.

If you immediately push a value onto the stack, the value will be stored in Internal RAM address 08h.

初始的SP值是07H,所以第一個PUSH會被放在08H( INNER RAM )

This makes sense taking into account考慮到 what was mentioned two paragraphs above:

First the 8051 will increment the value of SP (from 07h to 08h) and then will store the pushed value at that memory address (08h).

SP is modified directly by the 8051 by six instructions: PUSH, POP, ACALL, LCALL, RET, and RETI. It is also used intrinsically whenever an interrupt is triggered (more on interrupts later. Dont worry about them for now!).



Thursday, March 24, 2011

SHCHR 未完

input
A : ascii code

------------------------------------
SHCHR: ;SHOW CHAR.
MOV DPTR,#EROW24
;CALCULATE PATTERN POSITION
MOV B,#48 ;48 BYTES FOR ONE CHAR
MOV R6,#24 ;24 rows/Char
MUL AB
;一個ascii 佔48bytes
;dptr = erow24 = 1st ascii (ascii code=0 [0~47])
;a*b = ascii code * 48 = 該字的1st byte address
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A
;計算memory 位置
MOV A,ROW ;row似乎是1
RL A
RL A
RL A ;*8 ;*8仍是1
MOV B,#TOTCOL*3 ;80*3 //*3不知作啥用
MUL AB ;BA=ROW*1920=ROW*(80*24)
ADD A,COL ;col=2 a=1 -?> a=3
MOV R0,A ;r0=3
MOV A,B ;row * 1920的高位
ADDC A,#GBASE/256 ;a = 0 + c
MOV R1,A
PUSH P1
MOV P1,#0FFH

ASCII code table

FLOC

input
A= ascii code
DPTR = TABOUT的1st位置

output
DPTR = TABLOUT + TABNO * 2 的內容 =>TABNO指向的table 位置
==
A<-TABNO ; 取TABNO,table number按鍵表種類
C=0
A<-TABNO*2
B<-A
A<-(TABNO*2 + TABOUT)
;取值到A,TABOUT為addr 0的話,
;每2bytes為一組(因為是用DW存位置)
;所以多一個number,要跳2bytes
A<=>B ;A換成TABNO*2
A<-(TABNO*2+1 + TABOUT)
;取後半byte的值(低)

DPL<-A
DPH<-B


Friday, March 11, 2011

16進制乘法表


http://upload.wikimedia.org/wikipedia/commons/8/8d/Hexidecimal_Multiplication_Table.png

Thursday, March 10, 2011

EROW24

有128個ASCII
全部由DB + 48 bytes 組成

24*16 = 384 = 48 * 8

MUL

(A) <- (A) * (B) 的 bit 0-7 低A
(B) <- (A) * (B) 的 bit 8-15高B

----
A的值 * B的值


----

16bit中 左 8 bit 是低位,右8bit是高位

所以MUL都要先SWAP?

A,ACC

8bits register
ACC是symbolic address
不要直接用A.7, 要用Acc.7作bit address

byte address在 224(E0H)

ref fig 3-3

manual page 3-3

SH1E1

--
Input:
ROW內需有值(row座標,不是address)

Output:




A=07
B=ROW低位*80 + COL座標
丟進parmset

A=08
B=ROW高位*80 + C(低位的進位)
丟進parmset
****************************

A有 8bit , 一個16進制的英文字 = 4 bit
ROW讀進來的8bits 先INC ROW後
分成高4低4

把高4低4交換 why???
低4 bits*80 存到A
高4 bits * 80 存到B
↑錯的

是交換完後,乘完後的高8存B,低8存A
高位是因為低位乘完後超出的部分才放在高位 ,大部分還是在低位
COL有8bit,但COL最大值只有80
若合計值超過 255 則 C = 1 (因為A /8bits 11111111b=255)






****************************
SH1E1:
MOV A,ROW
INC A
SWAP A
MOV B,#80
MUL AB
ADD A,COL
XCH A,B
ADDC A,#0
PUSH A
MOV A,#07H ;CURSOR ADDR. LOW
; MOV B,#0
CALL PARMSET
MOV A,#08H ;CURSOR ADDR. HI
; MOV B,#0
POP B
CALL PARMSET
POP A
POP B
POP DPH
POP DPL
POP RR6
POP RR5
POP RR4
POP RR0
SCRUP: ;DUMMY SCROLL UP. WON'T SCROLL UP IN THIS APPLICATION
RET

ROW

存ROW的memory address

ROW內存的不是address,而是行數

PARMSET

input:
A = 指令種類 (00~08)
B = 指令內容
output:
no return
--------------------------------
PARMSET:
PUSH P1
SETB P3.2 ;DIEN
MOV P1,#LCDSEL
MOV DPTR,#LCDIR ;INDEX REG.
MOVX @DPTR,A
MOV DPTR,#LCDP ;PARAMETER REG.
MOV A,B
MOVX @DPTR,A
POP A
ORL A,#0F0H
MOV P1,A
RET

------------------------