;************************************************************************** ; 标题: 查表方式流水灯(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.2.21 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过,查表方式可以任意在表中定义流动的方式 ; 采用a不变,dptr自加的方式 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start start: mov dptr,#table ;数据表地址送入dptr mov 30h,#8 ;30单元作为循环计数器 lop: mov a,#0 ;acc清零 movc a,@a+dptr ;查数据表中的值并送入a mov p1,a ;查表结果送和P1口 lcall delay100ms ;延时100ms inc dptr ;数据指针加1 djnz 30h,lop ;未到8次继续查表取值 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: db 07eh, 0bdh, 0dbh, 0e7h, 0e7h, 0dbh, 0bdh, 07eh end ;************************************************************************** ; 标题: 查表方式流水灯(汇编) ; 作者: wentao http://blog.liuwentao.net ; http://wentao.programfan.com ; 日期: 2007.2.21 ; 软件: Keil A51 V8.00 ; 芯片: AT89X51 ; 说明: 实验板实测通过,查表方式可以任意在表中定义流动的方式 ; 采用dptr不变,a自加的方式 ; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途! ;************************************************************************** org 0000h ajmp start start: mov dptr,#table ;数据表地址送入dptr mov 30h,#0 ;30单元作为循环计数器 lop: mov a,30h ;30单元除作计数器外,还有变址作用 movc a,@a+dptr ;查数据表中的值并送入a mov p1,a ;查表结果送和P1口 lcall delay100ms ;延时100ms inc 30h ;计数器加1 mov a,30h ;30单元值送入a cjne a,#8,lop ;未到8次继续查表取值 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: db 0feh, 0fdh, 0fbh, 0f7h, 0efh, 0dfh, 0bfh, 07fh end /************************************************************************** * 标题: 查表方式流水灯(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 uchar state[8] = {0xe7, 0xdb, 0xbd, 0x7e, //状态表 0x7e, 0xbd, 0xdb, 0xe7}; void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 void main() { uchar i; // 循环控制变量,还起变址作用 while(1) { for(i = 0; i < 8; i++) { P1 = state[i]; // 查表并将结果送入P1口 delay_ms(100); // 延时100ms } } } void delay_ms(uchar ms) { uchar i; while(ms--) for(i = 0; i < 124; i++); }

评论