当前位置:文档之家› 单片机课程设计代码

单片机课程设计代码

陈新 2014/7/21 17:32:03QQ可以找到历史记录的陈新 17:33:15无痕的回忆 17:01:52LED_LOOP: MOV R1, #251 ;1s的显示延时(好奇怪,居然不准)LED_LOOP_1: MOV R4, #14 ;使用了寄存器R1,R4(估计可以使用堆栈临时释放)LED_LOOP_2: LCALL DISPLAY_MOVEDJNZ R4, LED_LOOP_2DJNZ R1, LED_LOOP_1RET无痕的回忆 23:10:36ORG 0000HAJMP MAINORG 0030HHC595_SCK BIT P0.4HC595_RCK BIT P0.5HC595_RST BIT P0.6HC595_DAT BIT P0.7MAIN: MOV A, #00HMOV P0, ACLR HC595_RSTLOOP0: MOV R0, #0LOOP1: MOV R1, #100LOOP2: MOV R4, #10LOOP3: LCALL DISPLAYDJNZ R4, LOOP3DJNZ R1, LOOP2INC R0LJMP LOOP1DELEY0: MOV R6, #4 ;1ms延时的子程序DELEY1: MOV R7, #123DELEY2: DJNZ R7, DELEY2DJNZ R6, DELEY1NOPRETDISPLAY: MOV A, R0 MOV B, #100DIV ABMOV B, #10DIV AB;MOV A, #0LCALL SHOW_NUM MOV A, P0ANL A, #0F0HORL A, #1MOV P0, A ;延时LCALL DELEY0 ;延时LCALL DELEY0MOV A, R0 ;有问题MOV B, #100DIV AB;MOV A, #7LCALL SHOW_NUM MOV A, P0ANL A, #0F0HORL A, #2MOV P0, A ;延时LCALL DELEY0 ;延时LCALL DELEY0MOV A, R0MOV B, #100DIV ABXCH A, BMOV B, #10DIV AB;MOV A, #7LCALL SHOW_NUM MOV A, P0ANL A, #0F0HORL A, #4MOV P0, ALCALL DELEY0 ;延时LCALL DELEY0 ;延时MOV A, R0MOV B, #10DIV AB;MOV A, #7LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #8MOV P0, ALCALL DELEY0 ;延时LCALL DELEY0RETSHOW_NUM: MOV DPTR, #SEGMOVC A, @A+DPTRLCALL SEND_BYTERETSEND_BYTE: MOV R2, #8 ;注意这个循环次数控制,有误差则会影响数码管显示MOV R6, #01HSEND_LOOP: MOV R3, AANL A, R6JZ ZEROJNZ NZEROZERO: CLR HC595_DATAJMP NEXTNZERO: SETB HC595_DATNEXT: SETB HC595_SCKCLR HC595_SCKMOV A, R6RL AMOV R6, AMOV A, R3DJNZ R2, SEND_LOOPCLR HC595_RCKSETB HC595_RCKRETSEG: DB 0FCHDB 60HDB 0DAHDB 0F2HDB 66HDB 0BEHDB 0E0HDB 0FEHDB 0F6HEND无痕的回忆 23:10:04int8u tab_abc[] = {0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e};罐头 17:36:46还有那个循环的呢陈新 18:18:36已经发给你了啊DISPLAY: MOV A, KEY ;将KEY转移给ALCALL SHOW_NUMMOV P0, #0FFH ;打开所有的数码管即设置为静态显示MOV P0, ALCALL DELAY_1MS ;延时注意到在动态显示中,点亮每位数码管都需要2秒钟LCALL DELAY_1MS ;延时。

LCALL DELAY_1MS ;延时。

RETDISPLAY: MOV A,KEYMOV B, #100DIV ABMOV B, #10DIV AB;MOV A, #0LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #1MOV P0, A ;延时LCALL DELAY_1MS ;延时LCALL DELAY_1MSMOV A, KEY ;有问题MOV B, #100DIV AB;MOV A, #7LCALL SHOW_NUMANL A, #0F0HORL A, #2MOV P0, A ;延时LCALL DELAY_1MS ;延时LCALL DELAY_1MSMOV A, KEYMOV B, #100DIV ABXCH A, BMOV B, #10DIV AB;MOV A, #7LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #4MOV P0, ALCALL DELAY_1MS;延时LCALL DELAY_1MS;延时MOV A, KEYMOV B, #10DIV ABXCH A, B;MOV A, #7LCALL SHOW_NUMMOV A, P0ANL A, #0F0HORL A, #8MOV P0, ALCALL DELAY_1MS ;延时LCALL DELAY_1MSRETDISPLAY: MOV A, KEY ;将KEY转移给ALCALL SHOW_NUMMOV A, P0 ;打开所有的数码管即设置为静态显示ANL A,#0F0H;ORL A, #15;MOV P0, ALCALL DELAY_1MS ;延时注意到在动态显示中,点亮每位数码管都需要2秒钟LCALL DELAY_1MS ;延时。

RETDISPLAY: MOV A, KEY ;将KEY转移给A; LCALL SHOW_NUMMOV DPTR, #SEGMOVC A, @A+DPTRMOV P0, ALCALL DELAY_1MS ;延时注意到在动态显示中,点亮每位数码管都需要2秒钟LCALL DELAY_1MS ;延时。

RETSEG: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH7.26课程设计最终版代码;---------------------------------------------------------------------;---------------------------------------------------------------------;************华南理工大学电子与信息学院信息工程2班**************;************ ************** ;************ 第二组************** ;************ ************** ;************ 高文冠刘翠玲王志健**************;************ ************** ;************ 单片机课程设计**************;---------------------------------------------------------------------;---------------------------------------------------------------------; --------------------------------------------------------------------;分配各地址;---------------------------------------------------------------------KEY EQU 40HAJMP STARTORG 0003H ; 入口地址AJMP JINT0 ;外部中断0入口ORG 0013H ;AJMP JINT1 ; 外部中断1入口地址ORG 0030H ;; --------------------------------------------------------------------;定义这个实验中所需要的管脚,其中HCHC595是八位移位寄存器,BEEP是蜂鸣器;---------------------------------------------------------------------HC595_SCK BIT P0.4HC595_RCK BIT P0.5HC595_RST BIT P0.6HC595_DAT BIT P0.7BEEP BIT P1.3 ;定义蜂鸣器的管脚; --------------------------------------------------------------------;程序以及初始化硬件代码,主要是对中断以及一些端口进行初始化;---------------------------------------------------------------------START: MOV A,#00H ;先将数码管的所有段均置0,即都不选; SETB BEEP ;关闭蜂鸣器MOV P0, ACLR HC595_RSTMOV SP,#60H ;堆栈地址为60HSETB EA ;允许全局中断SETB EX0 ; 允许外部中断0SETB EX1 ; 允许外部中断1SETB PX1 ;设外部中断1为高优先级SETB IT1 ; 设外部中断1边沿触发CLR IT0 ; 设外部中断0低电平触发; --------------------------------------------------------------------;判断是否按键按下,并且赋予键值的键盘扫描代码;---------------------------------------------------------------------GWG0: NOPMOV P2,#0FFH ; 判第0行是否有键按下CLR P2.0 ; 将P2.0清零MOV A,P2ANL A,#0F0H ; 屏蔽低4位,即消除行线的影响XRL A,#0F0HJZ NOKEY0 ;A为0,转向NOKEY0LCALL DELAY_10MS ; 延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NOKEY0 ; A为0,转向NOKEY0,表示第一行没有按键按下MOV A,P2 ; 判哪一个键按下ANL A,#0F0HCJNE A,#0E0H,NEXT1MOV KEY,#0 ; 按下的键值是0LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ;继续检测NEXT1: CJNE A,#0D0H,NEXT2MOV KEY,#1 ; 按下的键值是1LCALL DISPLAYLJMP GWG0 ;继续检测NEXT2: CJNE A,#0B0H,NEXT3MOV KEY,#2 ; 按下的键值是2LCALL DISPLAYLJMP GWG0 ;继续检测NEXT3: CJNE A,#70H,NOKEY0MOV KEY,#3 ;按下的键值是3LCALL DISPLAYLJMP GWG0 ;继续检测NOKEY0: MOV P2,#0FFH ; 判第1行是否有键按下CLR P2.1 ; 将P2.1清零MOV A,P2ANL A,#0F0H ;屏蔽低4位,即行线的影响XRL A,#0F0HJZ NOKEY1 ;A为0,转向NOKEY1LCALL DELAY_10MS ;延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NOKEY1 ;A为0,转向NOKEY1MOV A,P2 ;判断哪个按键按下ANL A,#0F0HCJNE A,#0E0H,NEXT5MOV KEY,#4 ;按下的键值是4LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ; 继续检测NEXT5: CJNE A,#0D0H,NEXT6MOV KEY,#5 ; 按下的键值是5LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT6: CJNE A,#0B0H,NEXT7MOV KEY,#6 ;按下的键值是6LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT7: CJNE A,#70H,NOKEY1MOV KEY,#7 ;按下的键值是7LCALL DISPLAYLJMP GWG0 ; 继续检测NOKEY1: MOV P2,#0FFH ;判第2行是否有键按下CLR P2.2 ;将P2.2清零MOV A,P2ANL A,#0F0H ;屏蔽掉低四位,即消除行线的影响XRL A,#0F0HJZ NOKEY2 ;A为0,转向NOKEY2LCALL DELAY_10MS ;延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NOKEY2 ;A为0,转向NOKEY2MOV A,P2 ;判哪一个键按下ANL A,#0F0HCJNE A,#0E0H,NEXT9MOV KEY,#8 ;按下的键是8LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ;继续检测NEXT9: CJNE A,#0D0H,NEXT10MOV KEY,#9 ;按下的键值是9LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT10: CJNE A,#0B0H,NEXT11MOV KEY,#10 ;按下的键值是10LCALL DISPLAYLJMP GWG0 ; 继续检测NEXT11: CJNE A,#70H,NOKEY2MOV KEY,#11 ;按下的键值是11LCALL DISPLAYLJMP GWG0 ; 继续检测NOKEY2: MOV P2,#0FFH ;判第2行是否有键按下CLR P2.3 ;将P2.3清零MOV A,#P2ANL A,#0F0H ; 屏蔽高4位XRL A,#0F0HJZ NEXT16 ; A为0,转向NEXT16LCALL DELAY_10MS ; 延时,去抖动MOV A,P2 ; 再确认一次ANL A,#0F0HXRL A,#0F0HJZ NEXT16 ;A为0,转向NEXT16MOV A,P2 ;判哪一个键按下ANL A,#0F0HCJNE A,#0E0H,NEXT13MOV KEY,#12 ;按下的键值是12LCALL DISPLAY ;根据按键在数码管上和LED上显示键值LJMP GWG0 ;继续检测NEXT13: CJNE A,#0D0H,NEXT14MOV KEY,#13 ;按下的键值是13LCALL DISPLAYLJMP GWG0 ;继续检测NEXT14: CJNE A,#0B0H,NEXT15MOV KEY,#14 ;按下的键值是14LCALL DISPLAYLJMP GWG0 ;继续检测NEXT15: CJNE A,#70H,NEXT16MOV KEY,#15 ;按下的键值是15LCALL DISPLAYLJMP GWG0 ;继续检测NEXT16:LJMP GWG0; --------------------------------------------------------------------;外部中断0服务程序,即实现功能3闪烁显示ERR-和拓展功能蜂鸣器播放音乐; --------------------------------------------------------------------JINT0: NOPLCALL SMG_ERROR_1s ;显示ERR-LCALL DELAY_1S ;延时MOV A,#00H ;熄灭所有数码管,达到闪烁的效果MOV P0, ALCALL DELAY_1S ;延时LCALL SMG_ERROR_1s ;第二次显示ERR-LCALL DELAY_1S ;延时1sMOV P0,#00H ;再次熄灭所有数码管LCALL DELAY_1S ;延时1sLCALL SMG_ERROR_1s ;第三次显示ERR-LCALL DELAY_1S ;延时1sMOV P0,#00H ;对P0端口和R4寄存器进行清0MOV R4,#0RETI; --------------------------------------------------------------------; 外部中断1服务程序,即实现功能4,跑马灯; --------------------------------------------------------------------JINT1: MOV R1,#10 ;控制跑马灯的次数为10次JJHH: MOV P0,#0FFH ;将LED全部置1,MOV A,#0FEH ;点亮第一个LEDMOV R4,#8 ;控制左移次数为8次,即依次点亮8个LEDLOOP_PMD:MOV P0, ALCALL DELAY_1S ;在动态显示中,点亮每位数码管都需要2MSRL A ;对A左移进行左移,实现流水灯的效果DJNZ R4,LOOP_PMD;R4不为0,则对A继续进行左移,直到所有的LED都被点亮为止DJNZ R1,JJHH ;R1不为0,则继续进行跑马灯显示,总共10次LCALL DELAY_1SLCALL DELAY_1SRETI; --------------------------------------------------------------------;根据按键在数码管上和LED上显示键值,即实现功能一、二; --------------------------------------------------------------------DISPLAY:LCALL DISPLAY_SMG ;转向显示程序LCALL DISPLAY_LED ;转向显示程序MOV P0, #00H ;将数码管的所有位均置0,即都不选CLR HC595_RSTRET; --------------------------------------------------------------------;根据按键在数码管上显示键值,采用动态显示的方式; --------------------------------------------------------------------DISPLAY_SMG: MOV R1,#8DISPLAY_SMG_1:MOV R4,#255 ;使用了寄存器R4DISPLAY_SMG_2:MOV A, KEY ;将KEY转移给ALCALL SHOW_NUM_SMGMOV A,P0 ;打开所有的数码管即静态显示模式ANL A,#0F0H;ORL A,#8MOV P0,ALCALL DELAY_1MS ;在动态显示中,点亮每位数码管都需要2MSLCALL DELAY_1MS ;延时。

相关主题