正文

【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 0xfffe0xfffd0xfffb0xfff7 ;状态表   
  •             dw 0xffef0xffdf0xffbf0xff7f  
  •             dw 0x7fff0xbfff0xdfff0xefff  
  •             dw 0xf7ff0xfbff0xfdff0xfeff  
  • 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++);   
  • }

  • 阅读(4219) | 评论(2)


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

    评论

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