;************************************************************************** ; 标题: 查表方式双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++); }

评论