正文

【027】查表方式双IO口流水灯2007-05-02 15:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/25470.html

分享到:

;**************************************************************************    ; 标题: 查表方式双IO口流水灯(汇编)    ; 作者: wentao     http://blog.liuwentao.net    ;                  http://wentao.programfan.com    ; 日期: 2007.2.21    ; 软件: Keil A51 V8.00     ; 芯片: AT89X51    ; 说明: 实验板实测通过,两个IO口当做一个用,采用a不变,dptr自加的方式    ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!     ;**************************************************************************                   org   0000h               ajmp  start    start:      mov   dptr,#table ;数据表地址送入dptr                mov   30h,#16     ;30单元作为循环计数器    lop:        mov   a,#0        ;acc清零                movc  a,@a+dptr   ;查数据表中的值并送入a                mov   p2,a        ;查表结果(dw的前字节)送入P2口                inc   dptr        ;数据指针加1                mov   a,#0        ;acc清零                movc  a,@a+dptr   ;查数据表中下个值送入a                mov   P0,a        ;查表结果(dw的后字节)送入P0口                inc   dptr        ;数据指针加1                lcall delay100ms  ;延时100ms                djnz  30h,lop     ;未到16次继续查表取值                ajmp  start       ;到了则重新循环       delay100ms: mov   r5,#195     ;1+(1+2*255)*195+2*195=100.036ms@12M    temp:       mov   r6,#255     ;1+2*255                djnz  r6,$                djnz  r5,temp                ret      table:      dw 0xfffe, 0xfffd, 0xfffb, 0xfff7 ;状态表                dw 0xffef, 0xffdf, 0xffbf, 0xff7f               dw 0x7fff, 0xbfff, 0xdfff, 0xefff               dw 0xf7ff, 0xfbff, 0xfdff, 0xfeff   end  /**************************************************************************   * 标题: 查表方式双IO口流水灯(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 实验板实测通过,用"/"取高字节,"%"取低字节   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       #define uchar unsigned char    #define uint unsigned int       void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255       uint state[16] = {0xfffe, 0xfffd, 0xfffb, 0xfff7, //状态表                      0xffef, 0xffdf, 0xffbf, 0xff7f,                      0x7fff, 0xbfff, 0xdfff, 0xefff,                      0xf7ff, 0xfbff, 0xfdff, 0xfeff};       void main()    {        uchar i;   // 循环控制变量,兼有变址作用                while(1)        {            for(i = 0; i < 16; i++)            {                P2 = state[i] / 256;   // 查表将高字节送入P2口                P0 = state[i] % 256;   // 查表将低字节送入P0口                delay_ms(100);         // 延时100ms            }        }    }    void delay_ms(uchar ms)    {        uchar i;        while(ms--)            for(i = 0; i < 124; i++);    } /**************************************************************************   * 标题: 查表方式双IO口流水灯(C51)   * 作者: wentao     http://blog.liuwentao.net                      http://wentao.programfan.com   * 日期: 2007.2.21   * 软件: Keil C51 V8.02   * 芯片: AT89X51   * 说明: 定义一个unsigned char型指针变量p,则p所指为一个字节           而数组state中元素为unsigned int, 是一个字,所以用这个8位的指针来操作           16位的元素时,用*p取出的是高字节,*(p+1)可取出低字节。实验板实测通过。   * 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!    **************************************************************************/      #include <reg51.h>       #define uchar unsigned char    #define uint unsigned int       uint state[16] = {0xfffe, 0xfffd, 0xfffb, 0xfff7, //状态表                      0xffef, 0xffdf, 0xffbf, 0xff7f,                      0x7fff, 0xbfff, 0xdfff, 0xefff,                      0xf7ff, 0xfbff, 0xfdff, 0xfeff};       void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255       void main()    {        uchar i;   // 循环控制变量      uchar *p;  // 指针p用于将数组中的字元素拆成字节分别取出                while(1)        {            p = state; // 使p指向数组首地址            for(i = 0; i < 16; i++)            {                P2 = *p;       // 查表将结果高字节送入P2口                P0 = *(p+1);   // 查表将结果低字节送入P0口                delay_ms(100); // 延时100ms                p = p + 2;     // 指向下一个字(数组元素)            }        }    }    void delay_ms(uchar ms)    {        uchar i;        while(ms--)            for(i = 0; i < 124; i++);    }

阅读(4370) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册