《匠人手记》推荐网上购书渠道:
  互动出版网(china-pub)   >>>
  当当网(dangdang)   >>>
  卓越亚马逊网    >>>
  淘宝网(taobao)   >>>
  更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴新100贴

载入中...

广告3号位
百宝日历
载入中...

百宝专栏

说明:请先返回首页,再点击下列专栏即可进入。
  • 首页 相册 标签
  • 匠人公告(87)
  • 匠人笔记(144)
  • 匠人文集(167)
  • 写书近况(189)
  • 团队撰写(96)
  • 与非门专栏(566)
  • 比尔熊专栏(12)
  • 网络酷文(492)
  • 程序宝典(477)
  • 程序算法(28)
  • 编程技巧(482)
  • 资料宝藏(280)
  • 硬件技术(178)
  • 汽车电子(52)
  • 藏经宝阁(47)
  • 项目管理(15)
  • 趣味设计(6)
  • 社区热贴(5)
  • 开发工具(19)
  • 电脑应用(66)
  • 供需信息(24)
  • 最新货色

    载入中...

    粉丝评论

    载入中...

    载入中...



    百宝信息

    载入中...

    百宝流量

    (2006-07-01开始)


    匠人手记

    购书攻略勘误表

    开发板专卖——淘宝店

     编程技巧: 优质代码的十诫

    EM78P458单片机应用设计程序参考
    程序匠人 发表于 2005-5-21 23:54:00  阅读全文 | 回复(1) | 引用通告 | 编辑

    EM78P458单片机应用设计
                                  


    ;芯片为EM78P458,振荡模式为4MHz晶振,
    ;看门狗关,指令周期为2个CLOCK.
    ;*******************IO口的定义*********************
    PORT5 EQU 0X05
    PORT6 EQU 0X06
    IOC50 EQU 0X05
    IOC60 EQU 0X06
    ;**************特殊功能寄存器的定义******************
    TCC EQU 0X01
    PC EQU 0X02
    PSW EQU 0X03
    IOCD0 EQU 0X0D
    IOCE0 EQU 0X0E
    IOCF0 EQU 0X0F
    RF EQU 0X0F
    ;***************用户自定义的寄存器*******************
    COUNTER EQU 0X10
    CODE1 EQU 0X11
    CODE2 EQU 0X12
    CODE3 EQU 0X13
    CODE4 EQU 0X14
    LP_CNT0 EQU 0X15
    LP_CNT1 EQU 0X16
    TEMP EQU 0X17
    TEMPCODE EQU 0X18
    REPEAT_COUNTER EQU 0X19
    SEND_DATA EQU 0X1A
    USER_CODE EQU 0X1B
    FLAG EQU 0X1C;0X07
    ;*******************FLAG位定义**********************
    C EQU 0
    Z EQU 2
    TCIF EQU 0
    LEAD EQU 0
    REPEAT EQU 1
    INPUT EQU 6
    OUTPUT EQU 5
      ORG 0X000
     NOP
     NOP
     NOP
     NOP  
      JMP 0X50
    ;********************表格转换子程序程序******************
    TABLE_CONVER:
     CLR TEMP
    TABLE_CONVER_1:
     MOV A,TEMP
     CALL TABLE_CONVERSION_IN
     BC PSW,Z
     XOR A,CODE3
     JBC PSW,Z
     JMP EXIT_5
     INC TEMP
     JMP TABLE_CONVER_1
    EXIT_5:
     CALL TABLE_CONVERSION_OUT
     RET
    ;**********************表格转换程序IN*********************
    TABLE_CONVERSION_IN:
     ADD PC,A
     RETL 0XD0 ;KEY_1
     RETL 0X58 ;KEY_2
     RETL 0XD8 ;KEY_3
     RETL 0X90 ;KEY_4
     RETL 0X18 ;KEY_5
     RETL 0X98 ;KEY_6
     RETL 0XE0 ;KEY_7
     RETL 0X68 ;KEY_8
     RETL 0XE8 ;KEY_9
     RETL 0X28 ;KEY_0
     RETL 0X20 ;KEY_3D
     RETL 0XA0 ;KEY_MUTE
     RETL 0X40 ;KEY_VOCAL
     RETL 0XE2 ;KEY_VOL+
     RETL 0XA2 ;KEY_VOL-
     RETL 0X52 ;KEY_TUNE FWD
     RETL 0X22 ;KEY_TUNE REV
     RETL 0X12 ;KEY_STOP
     RETL 0X80 ;KEY_<|
     RETL 0X82 ;KEY_|>
     RETL 0X02 ;KEY_OK
     RETL 0XF0 ;KEY_TUNER
     RETL 0X78 ;KEY_AM/FM
     RETL 0XF8 ;KEY_SAVE
     RETL 0X50 ;KEY_AUDIO
    ;**********************表格转换程序OUT*********************
    TABLE_CONVERSION_OUT:
     MOV A,TEMP
     ADD PC,A
     RETL 0X35 ;KEY_1
     RETL 0X2D ;KEY_2
     RETL 0X25 ;KEY_3
     RETL 0X1D ;KEY_4
     RETL 0X34 ;KEY_5
     RETL 0X2C ;KEY_6
     RETL 0X24 ;KEY_7
     RETL 0X1C ;KEY_8
     RETL 0X33 ;KEY_9
     RETL 0X2B ;KEY_0
     RETL 0X10 ;KEY_3D
     RETL 0X18 ;KEY_MUTE
     RETL 0X11 ;KEY_VOCAL
     RETL 0X16 ;KEY_VOL+
     RETL 0X15 ;KEY_VOL-
     RETL 0X28 ;KEY_TUNE FWD
     RETL 0X2A ;KEY_TUNE REV
     RETL 0X22 ;KEY_STOP
     RETL 0X31 ;KEY_<|
     RETL 0X21 ;KEY_|>
     RETL 0X29 ;KEY_OK
     RETL 0X2E ;KEY_TUNER
     RETL 0X20 ;KEY_AUX-1
     RETL 0X23 ;KEY_AUX-2
     RETL 0X17 ;KEY_DVD
     
      ORG 0X050
    MAIN:
    ;*********************初始化寄存器**********************
     MOV A,@0B00000000
     IOW IOCE0
     MOV A,@0B01111111
     IOW IOCD0
     MOV A,@0B01000000
     IOW IOC50
     MOV A,@0B00100000
     MOV PORT5,A
     MOV A,@0B00000001
     IOW IOCF0
     CLR FLAG
     CLR TEMPCODE
     CLR COUNTER
     CLR CODE1
     CLR CODE2
     CLR CODE3
     CLR CODE4
     MOV A,@0B10010000
     MOV USER_CODE,A
    ;*********************扫描引导码**********************
    SCAN_LEAD_CODE:
     JBC PORT5,INPUT
     JMP SCAN_LEAD_CODE
     CLR FLAG
     CLR REPEAT_COUNTER
     CLR TEMPCODE
     CALL JUDGE_START_CODE
     JBS FLAG,LEAD
     JMP SCAN_LEAD_CODE
    ;*********************接收数据********************** 
    RECEIVE_DATA_PROCEE:
     CLR TEMPCODE 
     CALL RECEIVE_DATA
     MOV A,TEMPCODE
     MOV CODE1,A
     
     MOV A,@0  ;判断用户码是否是00
     BC PSW,Z
     XOR A,CODE1
     JBS PSW,Z
     JMP SCAN_LEAD_CODE
     
     
     CLR TEMPCODE
     CALL RECEIVE_DATA
     MOV A,TEMPCODE
     MOV CODE2,A
     
     MOV A,@0XFF  ;判断用户码是否是FF
     BC PSW,Z
     XOR A,CODE2
     JBS PSW,Z
     JMP SCAN_LEAD_CODE
     
     CLR TEMPCODE
     CALL RECEIVE_DATA
     MOV A,TEMPCODE
     MOV CODE3,A

     CLR TEMPCODE
     CALL RECEIVE_DATA
     MOV A,TEMPCODE
     MOV CODE4,A 
     CLR FLAG
    ;*********************发送数据**********************
    SEND_DATA_PROCEE:
     JBS USER_CODE,6  ;ST码的次高位反相
     JMP COM_1 ;=0
     JMP COM_2 ;=1
    COM_1:
     BS USER_CODE,6
     JMP VVV
    COM_2:
     BC USER_CODE,6
     JMP VVV
    VVV:
     CALL TABLE_CONVER ;调用码表转换子程序
     MOV CODE3,A
    REP:
     CALL TRANSMIT_DATA
     BS PORT5,OUTPUT
     CALL JUDGE_REPEAT_CODE ;扫描引导码是否在重复?
     JBS FLAG,LEAD
     JMP SCAN_LEAD_CODE
     JBC FLAG,REPEAT
     JMP REP    ;引导码是重复,继续扫描
     JMP RECEIVE_DATA_PROCEE ;引导码不重复,去接收新数据 
    ;****************引导码的检测子程序*****************
    JUDGE_START_CODE:
     CLR COUNTER ;清计数器
    JUDGE_START_CODE_0:
     JBC PORT5,INPUT
     JMP NO_HIGH
     CALL DELAY0.5MS
     JBC PORT5,INPUT
     JMP NO_HIGH
     INC COUNTER
     JMP JUDGE_START_CODE_0
    NO_HIGH:
     MOV A,COUNTER
     BC PSW,C
     SUB A,@20 ;20-A
     JBS PSW,C
     JMP EXIT_0 ;C=1,COUNTER>20
     MOV A,COUNTER
     BC PSW,C
     SUB A,@16 ;16-A
     JBC PSW,C
     JMP EXIT_0 ;C=0,COUNTER<16
     BS FLAG,LEAD
    EXIT_0:
     JBC PORT5,INPUT
     JMP EXIT_0
     INC REPEAT_COUNTER
     RET
    ;****************接收数据子程序**********************
    RECEIVE_DATA: 
     MOV A,@8
     MOV COUNTER,A
     MOV A,@0B00100000
     CONTW   ;停止记数
    CONTINUE_1:
     JBS PORT5,INPUT
     JMP CONTINUE_1
     CLR TCC
     MOV A,@0B00000100
     CONTW   ;TCC开始记数
    CONTINUE_2:
     MOV A,TCC
     MOV TEMP,A
     BC PSW,C
     SUB A,@250
     JBS PSW,C
     JMP SCAN_LEAD_CODE ;C=0,TCC>250

     JBC PORT5,INPUT
     JMP CONTINUE_2
     MOV A,TCC
     MOV TEMP,A
     BC PSW,C
     SUB A,@60;142
     JBC PSW,C
     JMP X1 ;C=1,TCC<60
     JMP X2 ;C=0,TCC>60
    X1:
     BC TEMPCODE,0
     JMP EXIT_1
    X2:
     BS TEMPCODE,0
     JMP EXIT_1
    EXIT_1:
     DJZ COUNTER
     JMP HH
     MOV A,@0B00100000
     CONTW   ;停止记数
     RET
    HH:
     BC PSW,C
     RLC TEMPCODE
     JMP CONTINUE_1

    ;****************发送数据子程序**********************
    TRANSMIT_DATA:
     MOV A,@4
     MOV COUNTER,A
     MOV A,USER_CODE ;@0B10010000 ;发送ST的用户码
     MOV SEND_DATA,A
    CYCLE_1:
     JBS SEND_DATA,7
     JMP SEND_P_0
     JMP SEND_P_1
    SEND_P_1:
     CALL SEND_CODE_1
     JMP EXIT_3
    SEND_P_0:
     CALL SEND_CODE_0
     JMP EXIT_3
    EXIT_3:
     RLC SEND_DATA
     DJZ COUNTER
     JMP CYCLE_1
     
     MOV A,@8
     MOV COUNTER,A
     MOV A,CODE3
     MOV SEND_DATA,A
     RLC SEND_DATA
    CYCLE_2:
     JBS SEND_DATA,7
     JMP SEND_Q_0
     JMP SEND_Q_1
    SEND_Q_1:
     CALL SEND_CODE_1
     JMP EXIT_4
    SEND_Q_0:
     CALL SEND_CODE_0
     JMP EXIT_4
    EXIT_4:
     RLC SEND_DATA
     DJZ COUNTER
     JMP CYCLE_2
     RET
    ;***************发送数据"1"子程序********************
    SEND_CODE_1:
     MOV A,@0B00100000
     CONTW   ;停止记数
     MOV A,@0B00000001 ;允许TCC中断
     IOW IOCF0
     MOV A,@35 ;引导脉冲的预置值
     MOV TCC,A
     MOV A,@0B00000001 ;选择预分频比为1:4
     CONTW
     BC PORT5,OUTPUT
    WAIT_1:
     JBS RF,TCIF
     JMP WAIT_1
     MOV A,@0B00100000
     CONTW   ;停止记数
     BC RF,TCIF
     MOV A,@32 ;代码"1"的预置值
     MOV TCC,A
     MOV A,@0B00000101 ;选择预分频比为1:64
     CONTW
     BS PORT5,OUTPUT
    WAIT_2:
     JBS RF,TCIF
     JMP WAIT_2
     BC RF,TCIF
     MOV A,@0B00100000
     CONTW   ;停止记数
     RET
    ;***************发送数据"0"子程序********************
    SEND_CODE_0:
     MOV A,@0B00100000
     CONTW   ;停止记数
     MOV A,@0B00000001 ;允许TCC中断
     IOW IOCF0
     MOV A,@35 ;引导脉冲的预置值
     MOV TCC,A
     MOV A,@0B00000001 ;选择预分频比为1:4
     CONTW
     BC PORT5,OUTPUT
    WAIT_3:
     JBS RF,TCIF
     JMP WAIT_3
     MOV A,@0B00100000
     CONTW   ;停止记数
     BC RF,TCIF
      
     MOV A,@114 ;代码"0"的预置值
     MOV TCC,A
     MOV A,@0B00000101 ;选择预分频比为1:64
     CONTW
     BS PORT5,OUTPUT
    WAIT_4:
     JBS RF,TCIF
     JMP WAIT_4
     NOP
     BC RF,TCIF
     MOV A,@0B00100000
     CONTW   ;停止记数
     RET
    ;****************重复码的检测子程序******************
    JUDGE_REPEAT_CODE:
     CLR COUNTER ;清计数器
     CLR FLAG
    JUDGE_REPEAT_CODE_0:
     JBC PORT5,INPUT
     JMP JUDGE_REPEAT_CODE_0
    SS: 
     JBC PORT5,INPUT
     JMP JUDGE_REPEAT_CODE_1
     CALL DELAY0.5MS
     JBC PORT5,INPUT
     JMP JUDGE_REPEAT_CODE_1
     INC COUNTER
     JMP SS
    JUDGE_REPEAT_CODE_1:
     MOV A,COUNTER
     BC PSW,C
     SUB A,@20 ;20-A
     JBS PSW,C
     JMP EXIT_2 ;C=1,COUNTER>20
     MOV A,COUNTER
     BC PSW,C
     SUB A,@16 ;16-A
     JBC PSW,C
     JMP EXIT_2 ;C=0,COUNTER<16
     BS FLAG,LEAD
     JMP JUDGE_REPEAT_CODE_2
    EXIT_2:
     RET
    JUDGE_REPEAT_CODE_2:
     CLR COUNTER ;清计数器
    JUDGE_REPEAT_CODE_3:
     JBS PORT5,INPUT
     JMP JUDGE_REPEAT_CODE_4
     CALL DELAY0.5MS
     JBS PORT5,INPUT
     JMP JUDGE_REPEAT_CODE_4
     INC COUNTER
     JMP JUDGE_REPEAT_CODE_3
    JUDGE_REPEAT_CODE_4:
     MOV A,COUNTER
     BC PSW,C
     SUB A,@7 ;7-A
     JBS PSW,C
     JMP NO_REPEAT ;C=0,COUNTER>7
     JMP YES_REPEAT ;C=1,COUNTER<7
    NO_REPEAT:
     BC FLAG,REPEAT
     CLR REPEAT_COUNTER
     RET
    YES_REPEAT:
     BS FLAG,REPEAT
     INC REPEAT_COUNTER
     RET
    ;****************延时0.5mS子程序*********************
    DELAY0.5MS:
     MOV A,@2
     MOV LP_CNT0,A
    DELAY0.5MS_1:
     MOV A,@82
     MOV LP_CNT1,A
    DELAY0.5MS_2:
     NOP
     NOP
     NOP
     DJZ LP_CNT1
     JMP DELAY0.5MS_2
     DJZ LP_CNT0
     JMP DELAY0.5MS_1
     RET

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    回复:EM78P458单片机应用设计程序参考
    星星早知道(游客)发表评论于2006-6-4 15:54:00  个人主页 | 引用 | 返回 | 删除 | 回复

    星星早知道(游客)前辈辛苦了~

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    发表评论:
    载入中...

    芯片专题

    器件专题

    软件专题

    硬件专题

    综合专题

    项目专题

    原创专题

    器件检测
    LCD LED
    按键 触摸键
    E2PROM
    电池 电机
    电阻 电容 电感

    指令系统
    软件算法
    编程规范
    滤波算法
    串行通讯

    PCB设计
    I2C PWM
    红外遥控
    充电技术
    中断 ADC 

    匠人手记
    匠人夜话
    网络心路
    一周热点串烧
    从零开始玩PIC
    DIY旋转时钟

    广告5号位 [投放]

    广告3号位 [投放]

    站内搜索


    站外搜索


    百度  google
    mp3  歌词 
    图片  FLASH 
    知道  文档
    新闻  词典 
    地图  mp3 
    软件  天网 
    雅虎  爱问 
    搜狗  讯雷 
    网讯  华军 
    天空 

    21IC器件搜索
    百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》废站
  • 《匠人的百宝箱》土豆视频站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     

    推荐阅读

     

    友情连接

     [更多酷站连接]

     

     

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [hotpower 的水潭]

    [八楼的呼吸]

    [柔月阁]

    [PIC论坛]

    [SMARTCODE电子书斋]

    [阿摆手记]

    [电子伙伴]

    [xwj的文君阁]

    [所长的BLOG]

    [海边淘沙]

    [单片机开发联盟]

    [数字电视之家]

    [软件开发之窗]

    [unaided的笔记]

    [小飞的笔记]

    [ICC AVR开发网]

    [我爱研发网]

    [infernal的笔记]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [水牛的仓库]

    [逍遥电子]

    [ningpanda的博客]

    [雄鹰的空中加油站]

    [一网见天下]

    [Armoric]

    [股剩是怎样炼成的]

    [嵌入式365]

    [C-Design]

    [AVR猎手的地盘]

    [中国高校自动化网]

    [SunK]

    [工控365网]

    [煮透社]

    [白沙的香烟盒]

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    大学生电子网 

     

     

     

     

     

     

     

     《匠人的百宝箱》