1樓:生活如歌
tcnta equ 30h;定義一個變數tcnta,這個變數的地址是30h,後面的一個意思
tcntb equ 31h
sec equ 32h
keycnt equ 33h
sp1 bit p3.5;這裡是定義一個位變數sp1,代表p3.5
org 00h;程式從0000h單元
ljmp start;跳轉到start標號處org 0bh;000bh是定時器0中斷服務程式入口地下ljmp int_t0;直接跳轉到int_t0處start:mov keycnt,#00h;keycnt變數清0mov sec,#00h;sec變數清0(這應該是一個秒計數變數)mov a,sec;sec變數中的值送到a中mov b,#10;b賦值為10
div ab;a/10後十位在a,個位在bmov dptr,#table;段碼錶表頭地址送dptrmovc a,@a+dptr;查表,把a中的數的段碼找出來mov p0,a;段碼送到p0口
mov a,b;剛才的個位數送到a
mov dptr,#table;繼續查表與前同movc a,@a+dptr
mov p2,a
mov tmod,#02h;定時器工作模式設為定時器0工作在定時模式2
setb et0;啟動定時器0
setb ea;開放cpu中斷
wt: jb sp1,wt
lcall dely10ms
jb sp1,wt
inc keycnt
mov a,keycnt
cjne a,#01h,kn1
setb tr0
mov th0,#06h
mov tl0,#06h
mov tcnta,#00h
mov tcntb,#00h
ljmp dkn
2樓:浪花飄零
這個微控制器功能是一個只顯示2位秒值的電子秒錶,最大計數為99秒,有一個按鍵,兼做啟動、停止和復位
按鍵一次,啟動秒錶
按鍵二次,停秒錶
按鍵三次,清初值復位
tcnta equ 30h ;定義一個名為tcnta的變數,它表示為30h的地址,雙位元組10進位制計數器
tcntb equ 31h ;定義一個名為tcntb的變數,它表示為31h的地址
sec equ 32h ;定義一個名為sec的變數,它表示為32h的地址,秒計數
keycnt equ 33h ;定義一個名為keycnt 的變數,它的表示為33h的地址,按鍵計數
sp1 bit p3.5 ;sp1表示p3.5這個位
org 00h ;主程式入口向量,微控制器啟動後從此開始執行
ljmp start ;轉到主程式
org 0bh ;t0中斷向量,發生t0中斷時程式轉入這裡執行
ljmp int_t0 轉移到中斷處理程式
start:mov keycnt,#00h ; 主程式
mov sec,#00h ;取秒值
mov a,sec
mov b,#10 ;b存放除數
div ab ;a/10 a中存放十位數,b中存放個位數
mov dptr,#table ;取7段顯示碼錶首地址
movc a,@a+dptr ;十位數查錶轉換為顯示段碼
mov p0,a ;送顯示
mov a,b ;個位數
mov dptr,#table
movc a,@a+dptr 個位數查錶轉換為顯示段碼
mov p2,a ;送顯示
mov tmod,#02h ;定時器工作模式設為定時器0工作在8位定時模式2
setb et0 ;啟動定時器0
setb ea ;開中斷
wt: jb sp1,wt ;按鈕按下
lcall dely10ms ;延時10ms
jb sp1,wt ;再次測試,按鍵去抖
inc keycnt ;確定有按鈕輸入
mov a,keycnt ;按鈕計數器+1
cjne a,#01h,kn1 ;第一次按下按鈕
setb tr0 ;啟動計數器
mov th0,#06h ;初值=6
mov tl0,#06h ;計數初值=6
mov tcnta,#00h ;清雙位元組10進位制計數器低位
mov tcntb,#00h ;清雙位元組10進位制計數器高位
ljmp dkn ;跳轉到dkn
kn1: cjne a,#02h,kn2 ;第二次按下按鈕
clr tr0 ;關閉定時器
ljmp dkn ;跳轉到dkn
kn2: cjne a,#03h,dkn ;第三次按下按鈕
mov sec,#00h ;秒清0
mov a,sec ;取秒
mov b,#10 ;除數位10
div ab ;a/10,a為十位,b為個位
mov dptr,#table ;
movc a,@a+dptr
mov p0,a
mov a,b
mov dptr,#table
movc a,@a+dptr
mov p2,a
mov keycnt,#00h ;按鈕計數清0
dkn: jnb sp1,$ ;按鈕鬆開?未鬆開,等待
ljmp wt ;已鬆開,轉到等待下一次操作
dely10ms:
mov r6,#20 ;這段程式是10ms延時程式
d1: mov r7,#248
djnz r7,$
djnz r6,d1
retint_t0:
inc tcnta ;tcnta+1
mov a,tcnta ;
cjne a,#100,next ;計數到100否?未到,轉移到next
mov tcnta,#00h ;已到,tcnta=0
inc tcntb ;進位到tcntb
mov a,tcntb ;
cjne a,#4,next ;計數器計滿400個數(到一秒)
mov tcntb,#00h ;tcntb=0
inc sec ;秒+1
mov a,sec ;
cjne a,#100,done ;沒到100秒。轉移到更新顯示
mov sec,#00h ;秒清0
done: mov a,sec ;後面同上,是重新整理顯示
mov b,#10 ;
div ab
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,b
mov dptr,#table
movc a,@a+dptr
mov p2,a
next: reti
table: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;數字01234567890七段碼end
3樓:圖圖
org 000h,00h復位入口
ajmp跳轉到主
org 000bh;入口定時器0中斷
ljmp pt0j;。跳過pt0j
org 0100h;主要主程式入口
main:mov tmod,#05h;模式暫存器配置定時器0作為16位計數器,計數器的脈衝輸入p3.4
mov th0 ,#0ffh;配置計數器的初始值0ff9ch,計數100個脈衝,只是在時間溢位,中斷產生
mov tl0,#9ch;
clr f0;明確的共同標誌setb tr0;啟動計數器setb et0;啟用定時器0中斷的
setb ea;總允許中斷
這裡,這裡aj
微控制器組合語言程式設計,全國微控制器組合語言程式設計師
org 0000h main mov dptr,3000h clr r0 clr r1 clr r2 mov r3,100 loop mov a,dptr clr c cjne a,0h,loop1 inc r0 djnz r3,loop loop1 rl a jc fushu inc r1 djn...
組合語言微控制器,組合語言怎麼寫入微控制器
rlc 是帶進位的迴圈左移,rlc a即將a的內容左移一位,將進位位c中的值移到累加器a的最低位,a的最高位移到c裡。譬如說 設a 01000001,c 1 則如果執行rl 則a 10000010,c 1 a所有位左移一位,最低位補零,c不參加移位操作,保持原值不變 如果執行rlc後,則a 1000...
微控制器組合語言的幾個疑問
靈若伊雪 1 r1 20h 不是一條指令,而只是一種說明,表明r1暫存器中的內容是20h。這個20h是地址還是資料,與這個說明無關。2 在指令 mov r1,40h 中,r1 是間接定址方式,表明r1中的內容是地址,指令的功能表明是將立即數40h傳送到r1指定的地址中。3 在指令中容易混淆的是立即數...