advertisement

2014年12月29日

LCD應用控制 8051 assembly

;------------------------------------------
;     ==================================
;     ==        LCD應用控制         ==
;     ==          2014/12/29          ==
;     ==        蘇偉諺 4A037052       ==
;     ==================================
;------------------------------------------
;於LCD顯示第二列顯示'THIS IS 2ND LINE'並閃爍三次,然後由左而右依序清除

LCD應用控制 8051 assembly

;------------------------------------------
; ==================================
; == lcd應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 ==
; ==================================
;------------------------------------------
;於lcd顯示第二列顯示'THIS IS 2ND LINE'並閃爍三次,然後由左而右依序清除
;-----------------------------------------------------------------------------
; parameter define
;-----------------------------------------------------------------------------
lcd_enable equ p3.7
lcd_rs equ p2.1
lcd_bus equ p0
;-----------------------------------------------------------------------------
; main program
;-----------------------------------------------------------------------------
org 00h
mov sp,#5fh
call initlcd
mov r5,#3
glint: call clrlcd;;;;;;;
mov r7,#20
call delay50ms
mov a,#1
mov b,#0
call goxy
mov dptr,#str
call prtstring
mov r7,#20
call delay50ms
djnz r5,glint
mov r4,#16
mov b,#15
clrrr: mov a,#1
call goxy
mov a,#20h
call wrdr
mov r7,#20
call delay50ms
dec b
djnz r4,clrrr
jmp $
str: db 'THIS IS 2ND LINE','$'
;-----------------------------------------------------------------------------
; go x line, y char
;-----------------------------------------------------------------------------
goxy: anl b,#00001111b
cjne a,#1,chk1
mov a,b
add a,#10000000b;setb a.7 orl 10000000b
call wrir
ret
chk1: mov a,b
add a,#11000000b
call wrir
ret
;-----------------------------------------------------------------------------
; initial lcd
;-----------------------------------------------------------------------------
initlcd: mov a,#38h
call wrir
mov a,#0dh
call wrir
mov a,#06h
call wrir
clrlcd: mov a,#01h
call wrir
mov r7,#40;清除需延遲2ms
call delay
ret
;-------------------------------------------------------------------------------
; delay time=r7*0.05ms
;-------------------------------------------------------------------------------
delay: mov tmod,#00100001b
dloop: mov th0,#high(65536-50)
mov tl0,#low(65536-50)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop
ret
;-------------------------------------------------------------------------------
; delay time=r7*50ms
;-------------------------------------------------------------------------------
delay50ms:
dloop1: mov th0,#high(65536-50000)
mov tl0,#low(65536-50000)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop1
ret
prtstring: push acc
prtloop: clr a
movc a,@a+dptr
cjne a,#'$',next
jmp endprt
next: call wrdr
inc dptr
jmp prtloop
endprt: pop acc
ret
;-----------------------------------------------------------------------------
; write control word to instruction register
;-----------------------------------------------------------------------------
wrir: setb lcd_enable
clr lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
;-----------------------------------------------------------------------------
; write data to data register
;-----------------------------------------------------------------------------
wrdr: setb lcd_enable
setb lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
end

UART、LCD與4x4鍵盤應用

;------------------------------------------
; ==================================
; == uart、lcd與4x4鍵盤應用 ==
; == 2014/12/28 ==
; == 蘇偉諺 4a037052 ==
; ==================================
;------------------------------------------
;按下按鍵後 該按鍵值會從lcd第一列最右邊慢慢移動至最左邊停止
;-----------------------------------------------------------------------------
; parameter define
;-----------------------------------------------------------------------------
lcd_rs equ p2.1
lcd_enable equ p3.7
lcd_bus equ p0
keyport equ p2
keyflag equ 20h.2
scancode equ 33h
keyno equ 34h;;????
rxdflag equ 20h.3
;-----------------------------------------------------------------------------
; main program
;-----------------------------------------------------------------------------
org 00h
mov sp,#5fh
call initlcd
call uartinit
; mov r0,#15
again: mov r0,#16
call keyin
jnb keyflag,again
call txd0
rrx: call rxd0
jnb rxdflag,rrx;;;這邊要到呼叫rxd0的之方,否則到again的話,或沒一次接收成功,會導致多傳兩次以上 8051可以多接收一位員組資料暫存 所以會傳副接收到暫存的資料
mov r3,a
;--------------------------------------------
; mov b,r0
; mov a,#1
; call goxy
; mov a,r3
; mov dptr,#str;;;;;;
; movc a,@a+dptr
; call wrdr
; mov r7,#??
; call delay
; mov b,r0
; mov a,#1
; call goxy
; mov a,#' '
; call wrdr
;
; mov b,r0
; mov a,#1
; call goxy
; mov a,r3
; mov dptr,#str
; movc a,@a+dptr
; call wrdr
; mov r7,#??
; call delay
; mov b,r0
; mov a,#1
; call goxy
; mov a,#' '
; call wrdr
;--------------------------------------------------
goprint: mov b,r0
mov a,#1
call goxy
mov a,#' '
call wrdr
dec r0
mov b,r0
mov a,#1
call goxy
mov a,r3
mov dptr,#str
movc a,@a+dptr
call wrdr
mov r7,#10
call delay50ms
cjne r0,#0,goprint
jmp again
;-----------string table------------------------
str: db '0123456789abcdef'
;-----------------------------------------------------------------------------
; scan keyboard
;-----------------------------------------------------------------------------
keyin: push 00
push 01
mov r0,#0
mov scancode,#11111110b
keyrow: mov keyport,scancode
mov r7,#4
call delay
mov a,keyport
mov r1,#4
swap a
kcol: rrc a
jnc keypressed
inc r0
djnz r1,kcol
mov a,scancode
rl a
mov scancode,a
jnb acc.4,nokey;;;;;;;;;;;;;;;;;;;;
jmp keyrow
nokey: clr keyflag
jmp keyend
keypressed: mov a,r0
setb keyflag
keyend: pop 01
pop 00
ret
;-----------------------------------------------------------------------------
; go x line, y char
;-----------------------------------------------------------------------------
goxy: anl b,#00001111b
cjne a,#1,chk1
mov a,b
add a,#10000000b;setb a.7 orl 10000000b
call wrir
ret
chk1: mov a,b
add a,#11000000b
call wrir
ret
;-----------------------------------------------------------------------------
; initial lcd
;-----------------------------------------------------------------------------
initlcd: mov a,#38h
call wrir
mov a,#0dh
call wrir
mov a,#06h
call wrir
clrlcd: mov a,#01h
call wrir
mov r7,#40;清除需延遲2ms
call delay
ret
;-------------------------------------------------------------------------------
; delay time=r7*0.05ms
;-------------------------------------------------------------------------------
delay: mov tmod,#00100001b
dloop: mov th0,#high(65536-50)
mov tl0,#low(65536-50)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop
ret
;-------------------------------------------------------------------------------
; delay time=r7*50ms
;-------------------------------------------------------------------------------
delay50ms:
dloop1: mov th0,#high(65536-50000)
mov tl0,#low(65536-50000)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop1
ret
;-----------------------------------------------------------------------------
; write control word to instruction register
;-----------------------------------------------------------------------------
wrir: setb lcd_enable
clr lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
;-----------------------------------------------------------------------------
; write data to data register
;-----------------------------------------------------------------------------
wrdr: setb lcd_enable
setb lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
rxd0: jnb ri,rxdret
mov a,sbuf
clr ri
setb rxdflag
ret
rxdret: clr rxdflag
ret
txd0: clr ti
mov sbuf,a
jnb ti,$
clr ti
ret
;------------------------------------------------------------------------------
; initial uart,timer1,timer0
;12mhz: timer1,th1
;-----------------------------------------------------------------------------
uartinit: mov scon,#01010000b ;uart:mode 1
mov tmod,#00100001b ;timer1:mode 2, timer0:mode 1
mov pcon,#10000000b ;(smod=1)
mov th1,#255 ;baud rate=62500 bits/sec
setb tr1 ;start timer1
; clr tr0
; clr tf0
clr ri
clr ti
ret
end

4x4按鍵與LCD應用 8051 assembly

;------------------------------------------
; ==================================
; == 4x4按鍵與lcd應用 ==
; == 2014/12/28 ==
; == 蘇偉諺 4a037052 ==
; ==================================
;------------------------------------------
;
;於lcd的第一列顯示'0123456789abcdef'並利用4x4keyport按鍵,按下數字後其lcd上相對應的數字會往下跳至第二列
lcd_rs equ p2.1
lcd_enable equ p3.7
lcd_bus equ p0
keypor equ p2
keyflag equ 20h.2
scancode equ 33h
keyno equ 34h
org 00h
mov sp,#5fh
call initlcd
mov dptr,#str
call prtstring
again: call keyin
jnb keyflag,again
push acc;;;;;;;;;;;;;;
mov b,a
mov a,#1
call goxy
mov a,#20h
call wrdr
mov a,#2
call goxy
pop acc;;;;;;;;;;;;;;
mov dptr,#str;;;;;;
movc a,@a+dptr
call wrdr
jmp again
str: db '0123456789ABCDEF','$'
keyin: push 00
push 01
mov r0,#0
mov scancode,#11111110b
keyrow: mov keyport,scancode
mov r7,#4
call delay
mov a,keyport
mov r1,#4
swap a
kcol: rrc a
jnc keypressed
inc r0
djnz r1,kcol
mov a,scancode
rl a
mov scancode,a
jnb acc.4,nokey;;;;;;;;;;;;;;;;;;;;
jmp keyrow
nokey: clr keyflag
jmp keyend
keypressed: mo a,r0
setb keyflag
keyend: pop 01
pop 00
ret
goxy: anl b,#00001111b
cjne a,#1,chk1
mov a,b
add a,#10000000b;setb a.7 orl 10000000b
call wrir
ret
chk1: mov a,b
add a,#11000000b
call wrir
ret
prtstring: push acc
prtloop: clr a
movc a,@a+dptr
cjne a,#'$',next
jmp endprt
next: call wrdr
inc dptr
jmp prtloop
endprt: pop acc
ret
initlcd: mov a,#38h
call wrir
mov a,#0dh
call wrir
mov a,#06h
call wrir
clrlcd: mov a,#01h
call wrir
mov r7,#40;清除需延遲2ms
call delay
ret
delay: mov tmod,#00010001b
dloop: mov th0,#high(65536-50)
mov tl0,#low(65536-50)
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r7,dloop
ret
wrir: setb lcd_enable
clr lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
wrdr: setb lcd_enable
setb lcd_rs
mov lcd_bus,a
clr lcd_enable
mov r7,#1
call delay
ret
end

喇叭與七段應用控制 8051 assembly

;------------------------------------------
; ===================================
; == 喇叭與七段應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 4a037052 ==
; ===================================
;------------------------------------------
;控制喇叭及七段顯示器
;
spk equ p1.7; 定義spk等於p1.7
seg equ p1; 定義seg等於p1,p1等於7段顯示器
temp_h equ 30h;定義temp_h等於30h
temp_l equ 31h;定義temp_l等於31h
mov sp,#5fh;把5fh內的資料複製到sp
main: mov r0,#8;把8的值複製到r0
mov dptr,#table_seg_tone;把table_seg的值複製到dptr,dptr=16位元暫存
loop: clr a
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a
mov seg,a;把a的值複製到seg,使7段顯示器顯示功能
inc dptr
clr a
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a
mov temp_h,a;把a的值複製到temp_h
inc dptr
clr a
movc a,@a+dptr;從rom把dptr的值取出和a的值相加,把相加的值放回a
mov temp_l,a;把a的值複製到temp_l
call music;呼叫music副程式
mov r7,#100;把100的值複製到r7
call delay;呼叫delay副程式
inc dptr;將r1加1
djnz r0,loop;將r0減1,若r0不為0就跳到loop
jmp main;程式結束
music: mov tmod,#00010001b;將timer1跟timer0都設定成mode1:16位元 計時/計數器
mov r3,#160;把160的值複製到r3
lpmusic1:
mov th1,temp_h;把temp_h的值複製到th1
mov tl1,temp_l;把temp_l的值複製到tl1
setb tr1;將tr1設定成1
wait1: jnb tf1,wait1;若tf1不為1就跳到wait1
clr tr1;清除tr1
clr tf1;清除tf1
cpl p1.7;清除p1.7
djnz r3,lpmusic1;把r3減1,若r3不為0就跳到lpmusic1
ret
delay: mov th0,#high(65536-10000);將(65536-10000)的值放到th0,為了延遲0.01ms
mov tl0,#low(65536-10000);將(65536-10000)的值放到tl0,為了延遲0.01ms
setb tr0;將tr0設定成1
wait0: jnb tf0,wait0;若tf0不為1就跳到wait0
clr tf0;清除tf0
clr tr0;清除tr0
djnz r7,delay;把r7減1,若r7不為0就跳到delay
ret
table_seg_tone:
db 0xf9;7段顯示器顯示1 ,0
dw 0fc44h ;do:a=0 1
db 0xa4;7段顯示器顯示2 ,1
dw 0fcadh ;re:a=2 3
db 0xb0;7段顯示器顯示3 ,2
dw 0fd0ah ;mi:a=4 5
db 0x99;7段顯示器顯示4 ,3
dw 0fd34h ;fa:a=6 7
db 0x92;7段顯示器顯示5 ,4
dw 0fd84h ;so:a=8 9
db 0x82;7段顯示器顯示6 ,5
dw 0fdc8h ;la:a=10 11
db 0xd8;7段顯示器顯示7 ,6
dw 0fe0bh ;si:a=12 13
db 0x80;7段顯示器顯示8 ,7
dw 0fe23h ;do:a=14 15
end
view raw speaker_ssd.asm hosted with ❤ by GitHub

LCD 應用控制 8051 assembly

;------------------------------------------
; ===================================
; == lcd 應用控制 ==
; == 2014/12/29 ==
; == 蘇偉諺 4a037052 ==
; ===================================
;------------------------------------------
;開機後,lcd第一列顯示'0123456789abcdef',並閃爍3次,接著每個字元依序跳至第二列顯示
;-----------------------------------------------------------------------------
; parameter define
;-----------------------------------------------------------------------------
lcd_enable equ p3.7
lcd_rs equ p2.1
lcd_bus equ p0
;-----------------------------------------------------------------------------
; main program
;-----------------------------------------------------------------------------
org 00h
mov sp,#5fh
call initlcd
; call clrlcd
; mov r7,#20
; call delay50ms
; mov dptr,#str
; call prtstring
; mov r7,#20
; call delay50ms
; call clrlcd
; mov r7,#20
; call delay50ms
; mov dptr,#str
; call prtstring
; mov r7,#20
; call delay50ms
; call clrlcd
; mov r7,#20
; call delay50ms
; mov dptr,#str
; call prtstring
; mov r7,#20
; call delay50ms
mov r5,#3
glint: call clrlcd;;;;;;;
mov r7,#20
call delay50ms
mov dptr,#str
call prtstring
mov r7,#20
call delay50ms
djnz r5,glint
; mov a,#1
; mov b,#0
; call goxy
; mov a,#20h
; call wrdr
; mov a,#2
; mov b,#0
; call goxy
; mov dptr,#str
; mov a,#0
; movc a,@a+dptr
; call wrdr
; mov a,#1
; mov b,#1
; call goxy
; mov a,#20h
; call wrdr
; mov a,#2
; mov b,#1
; call goxy
; mov dptr,#str
; mov a,#1
; movc a,@a+dptr
; call wrdr
mov r3,#0
mov dptr,#str
appear: mov a,#1
mov b,r3
call goxy
mov a,#20h
call wrdr
mov a,#2
mov b,r3
call goxy
mov a,r3
movc a,@a+dptr
call wrdr
inc r3
mov r7,#20
call delay50ms
cjne r3,#16,appear
jmp $
str: db '0123456789abcdef','$'
;-----------------------------------------------------------------------------
; display string
;-----------------------------------------------------------------------------
prtstring: push acc ;
prtloop: clr a ;
movc a,@a+dptr ;
cjne a,#'$',next ;
sjmp endprt ;
next: acall wrdr ;
inc dptr ;
jmp prtloop ;
endprt: pop acc ;
ret ;
;-----------------------------------------------------------------------------
; initial lcd
;-----------------------------------------------------------------------------
initlcd: mov a,#38h
call wrir
mov a,#0dh
call wrir
mov a,#06h
call wrir
clrlcd: mov a,#01h
call wrir
mov r7,#40;清除需延遲2ms
call delay
ret
;-----------------------------------------------------------------------------
; go x line, y char
;-----------------------------------------------------------------------------
goxy: anl b,#00001111b ;
cjne a,#1,chk1 ;
mov a,b ;
add a,#10000000b ;
call wrir ;
ret ;
chk1: mov a,b ;
add a,#11000000b ;
call wrir ;
ret ;
;-----------------------------------------------------------------------------
; write control word to instruction register
;-----------------------------------------------------------------------------
wrir: clr lcd_rs ;
setb lcd_enable ;
mov lcd_bus,a ;
clr lcd_enable ;
mov r7,#1 ;
call delay ;delay 50us
ret ;
;-----------------------------------------------------------------------------
; write data to data register
;-----------------------------------------------------------------------------
wrdr: setb lcd_rs ;
setb lcd_enable ;
mov lcd_bus,a ;
clr lcd_enable ;
mov r7,#1 ;
call delay ;delay 50us
ret ;
;-------------------------------------------------------------------------------
; delay time=r7*0.05ms
;-------------------------------------------------------------------------------
delay: mov tmod,#00010001b ;timer 0 : mode 1
loopdy: mov th0,#high(65536-50);
mov tl0,#low(65536-50);
setb tr0 ;
wait: jnb tf0,wait ;
clr tf0 ;
clr tr0 ;
djnz r7,loopdy ;
ret ;
;-------------------------------------------------------------------------------
; delay time=r7*50ms
;-------------------------------------------------------------------------------
delay50ms:
loopdy1: mov th0,#high(65536-50000)
mov tl0,#low(65536-50000)
setb tr0
jnb tf0,$
clr tf0
clr tr0
djnz r7,loopdy1
ret
end
view raw lcd.asm hosted with ❤ by GitHub

七段與MINIKEY應用控制 8051 assembly

;------------------------------------------
;     ===================================
;     ==     七段與MINIKEY應用控制     ==
;     ==          2014/12/29           ==
;     ==        蘇偉諺 4A037052        ==
;     ===================================
;------------------------------------------
; 以MINIKEY的4個按鍵來控制七段顯示器的動作,按S1、S2、S3、S4分別顯示“┌” 、 “┐” 、“└” 、“┘”。;-----------------------------------------------------------------------------

喇叭與MINIKEY應用控制 8051 assembly

;------------------------------------------
;     ===================================
;     ==     喇叭與MINIKEY應用控制     ==
;     ==          2014/12/29           ==
;     ==        蘇偉諺 4A037052        ==
;     ===================================
;以MINIKEY的4個按鍵來控制喇叭,按S1、S2、S3、S4分別讓喇叭發出1kHz、2kHz、4kHz、8kHz聲響。

七段應用控制 8051 assembly

;------------------------------------------
;     ===================================
;     ==         七段應用控制          ==
;     ==          2014/12/29               ==
;     ==        蘇偉諺 4A037052     ==
;     ===================================
;------------------------------------------
;依序點亮七段顯示器的燈管a、燈管b、燈管c…燈管g;點亮的同時依序閃爍1次、2次、3次…7次。

2014年12月26日

2014/12/26進階微控制器應用

需下載
FreeRTOS  v7.6.0程式源碼
在source資料夾
list.c
task.c
在source/portable/SDCC/Cygnal/資料夾=>for 8051

2014年12月21日

2014年12月19日

Debian WPA Wireless how to use

# vi /etc/network/interfaces
auto eth1
iface eth1 inet dhcp
wpa-ssid [EESID]
wpa-psk [passowd key]
# ifup eth1

root@Lenovo-B480:/home/clementyan# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=11.7 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=46 time=12.8 ms
64 bytes from 8.8.8.8: icmp_req=4 ttl=46 time=12.5 ms

2014/12/19 進階微控制器應用

http://static.grumpycoder.net/pixel/uC-sdk-doc/index.html

在freeRTOS中每一個工作均以一個TCB來代表,所以建立一個新的工作,實際就是建立一個新的TCB資料。

新的TCB均需加入工作就緒列表(pxReadyTaskLists),如果是第一個工作,則就需被執行,否則需等待排程。

建立一個新的TCB主要是初化TCB堆疊區,回顧TCB之資料結構

2014年12月16日

Debian 64位元作業系統 裝 32位元套件 安裝 skype

# dpkg --add-architecture i386
# apt-get update;apt-get upgrade
# apt-get install ia32-libs
此行只限於wheezy squeeze,jessie不用裝--2015/06/08
# dpkg -i skype-debian_4.3.0.37-1_i386.deb
# apt-get install -f
# dpkg -i skype-debian_4.3.0.37-1_i386.deb


# apt-get install pulseaudio

$ skype &

若還是不行試試下面的指令
$ LD_PRELOAD=/usr/lib/mesa-diverted/i386-linux-gnu/libGL.so.1 skype &
2016/05/27

2014年12月12日

2014/12/12 進階微控制器應用

主要記憶體有二

  1. stack堆疊-儲存區域變數、全域變數=>managed(受管理的),無記憶體洩漏(編譯時已知道的變數)
  2. heap記憶堆-儲存動態變數(大量)使用malloc(配置),free(釋放),使用過後需要把他free釋放,否則造成記憶體洩漏(編譯時不知道的變數)
freeRTOS有三種記憶體堆
  1. keap_1只配置不釋放(適合當你的應用程式是固定的動態記憶體,或者已經知道最多所需使用的動態記憶體微多少)
  2. keep_2可配置可釋放,使用簡易方法執行配置、釋放,可能會造成記憶體碎斷(fragmentation):假設第一筆資料100bytes,第二筆50bytes,第三筆30bytes,若第二筆被釋放,則要在新增大於50bytes的資料,則會無法放入,只能放置在第三筆之後,稱記憶體碎斷,使記憶體存取速度下降,則需使用記憶體重整。
  3. keep_3完整之配置釋放,並且會記憶體重整,較常用較耗時

2014年12月5日

2014/12/05 進階微控制器應用

critical section(緊要區):當程式進入緊要區時有兩種可能(該區程式不可太長),目的:希望緊要區內的程式不被其他程式打斷

  1. 所有中斷被除能(disable)
  2. 部份中斷被除能(需包含系統滴答中斷的除能,則不會文本切換),保留部份硬體中斷仍可致能,被致能之中斷需能被控制到不切割緊要區之程式,程式進入緊要區後,執行緊要區程式後,要離開緊要區時,需重新致能被除能之中斷