• 我的8*8点阵led做螺旋流水灯


    代码
    1 #include <reg52.h>
    2
    3 sbit Diola=P2^5;
    4 sbit Dula=P2^6;
    5 sbit Wela=P2^7;
    6
    7
    8 typedef unsigned int uint;
    9 typedef unsigned char uchar;
    10 typedef void (*fun)(void*);
    11  struct funNode;
    12 typedef struct funNode funNode;
    13 struct funNode{
    14 fun me;
    15 uint interval;
    16 void* param;
    17 uint val;
    18 funNode* next;
    19 };
    20
    21
    22 funNode* head;
    23 uint Delay=0;
    24
    25 void setInterval(funNode* fnode){
    26 funNode* node=head;
    27 funNode* newNode=fnode;
    28 //find the final node
    29 if(node){
    30 while(node->next){
    31 node=node->next;
    32 }
    33 //link the new node
    34 node->next=newNode;
    35 }else{
    36 //let the new node be the head
    37 head=newNode;
    38 }
    39 newNode->val=newNode->interval;
    40 newNode->next=0;
    41 }
    42
    43 void cleanInterval(funNode* fnode){
    44 funNode* node=head;
    45 funNode* preNode=0;
    46 if(!node)goto CleanIntervalEnd;
    47 while(node!=fnode){
    48 if(node->next){
    49 preNode=node;
    50 node=node->next;
    51 }else{
    52 goto CleanIntervalEnd;
    53 }
    54 }
    55 //the first one is going to remove
    56 if(!preNode){
    57 head=node->next;
    58 }else{
    59 preNode->next=node->next;
    60 }
    61 CleanIntervalEnd:
    62 {}
    63 }
    64
    65
    66 void initT0(){
    67 TH0=(65536-1000)/256;
    68 TL0=(65536-1000)%256;
    69 EA=1;
    70 ET0=1;
    71 TR0=1;
    72 TMOD=0x01;
    73 }
    74
    75
    76 void delay(uint ms){
    77 Delay=ms;
    78 while(Delay>0);
    79 }
    80
    81 void time0() interrupt 1{
    82 funNode* node=head;
    83 if(Delay>0){
    84 --Delay;
    85 }
    86 while(node){
    87 if(node->val>0){
    88 --node->val;
    89 }else{
    90 node->me(node->param);
    91 node->val=node->interval;
    92 }
    93 node=node->next;
    94 }
    95
    96 TH0=(65536-1000)/256;
    97 TL0=(65536-1000)%256;
    98 }
    99
    100
    101 void init(){
    102 initT0();
    103
    104 P0=0xff;
    105 Wela=1;
    106 Wela=0;
    107 P0=0x00;
    108 Diola=1;
    109 Diola=0;
    110 }
    111 uchar code dTable[]={
    112 1,2,4,8,
    113 16,32,64,128
    114 };
    115
    116 uchar showInfo[]={
    117 0x00,0x00,0x00,0x00,
    118 0x00,0x00,0x00,0x00
    119 };
    120
    121 uchar direct='o';
    122 bit light=1;
    123 uchar r,c;
    124
    125 void setBit(uchar* base,uchar d,bit val){
    126 uchar temp=0;
    127 if(val){
    128 temp=dTable[d];
    129 temp=(*base)|temp;
    130 }else{
    131 temp=~dTable[d];
    132 temp=(*base)&temp;
    133 }
    134 *base=temp;
    135 }
    136
    137 void goNext(void* p){
    138
    139 switch(direct){
    140 case 'o':
    141 setBit(&showInfo[0],0,light);
    142 break;
    143 case 'u':
    144 setBit(&showInfo[--r],c,light);
    145 break;
    146 case 'd':
    147 setBit(&showInfo[++r],c,light);
    148 break;
    149 case 'l':
    150 setBit(&showInfo[r],--c,light);
    151 break;
    152 case 'r':
    153 setBit(&showInfo[r],++c,light);
    154 break;
    155 }
    156
    157 switch(r*10+c){
    158 case 0:
    159 direct='r';
    160 break;
    161 case 7:
    162 direct='d';
    163 break;
    164 case 77:
    165 direct='l';
    166 break;
    167 case 70:
    168 direct='u';
    169 break;
    170 case 10:
    171 direct='r';
    172 break;
    173 case 16:
    174 direct='d';
    175 break;
    176 case 66:
    177 direct='l';
    178 break;
    179 case 61:
    180 direct='u';
    181 break;
    182 case 21:
    183 direct='r';
    184 break;
    185 case 25:
    186 direct='d';
    187 break;
    188 case 55:
    189 direct='l';
    190 break;
    191 case 52:
    192 direct='u';
    193 break;
    194 case 32:
    195 direct='r';
    196 break;
    197 case 34:
    198 direct='d';
    199 break;
    200 case 44:
    201 direct='l';
    202 break;
    203 case 43:
    204 direct='o';
    205 r=0;
    206 c=0;
    207 light=(light==1?0:1);
    208 break;
    209 }
    210
    211 }
    212
    213 void showRow(uchar row,uchar show){
    214 P0=0;
    215 Diola=1;
    216 Diola=0;
    217
    218 P0=show;
    219 Dula=1;
    220 Dula=0;
    221
    222 P0=dTable[row];
    223 Diola=1;
    224 Diola=0;
    225
    226 delay(1);
    227 }
    228
    229 void show(){
    230 uchar i=0;
    231 while(1){
    232 for(i=0;i<8;++i){
    233 showRow(i,~showInfo[i]);
    234 }
    235 }
    236 }
    237
    238 void main(){
    239 funNode f;
    240 init();
    241 f.me=goNext;
    242 f.interval=50;
    243 f.param=0;
    244 setInterval(&f);
    245 show();
    246 cleanInterval(&f);
    247 }
    248

  • 相关阅读:
    devpress 的gridview 控件的行拖拽 z
    JAVA常见算法题(八)
    JAVA常见算法题(七)
    JAVA常见算法题(六)
    JAVA常见算法题(五)
    JAVA常见算法题(四)
    JAVA常见算法题(三)
    JAVA常见算法题(二)
    JAVA常见算法题(一)
    SpringBoot 框架整合webservice
  • 原文地址:https://www.cnblogs.com/gibbon/p/1917829.html
Copyright © 2020-2023  润新知