while(1)
scanner(); }
void debouncer(void) //延时程序 { int i;
for(i=0;i<3600;i++); //约30ms延时 }
void scanner(void) //{ char col,row; // char scan,keyin,kcode; // scan=0xef;
for(col=0;col<4;col++)
{ P1=scan; //P1 keyin=rowkey(); //
_nop_(); _nop_(); _nop_();
if(keyin!=0) // { for(row=0;row<3;row++) { if(keyin==(0x01< { kcode=row+3*col; // digit=digit*10+kcode; digit=digit00; // break; // } } while(rowkey()!=0) debouncer(); } scan=(scan<<1)|0x01; } } char m=0; void T1_100us(void)interrupt 3 { TH1=TH_M1;TL1=TL_M1; dig[0]=digit; dig[1]=(digit0)/10; dig[2]=(digit00)/100; dig[3]=digit/1000; P2=TAB[dig[m]] & disp[m]; 扫描函数 声明行和列 声明扫描信号,列按键值,扫描码 按键扫描 读入第col行的列按键值 三个_nop_();作用为让 P1 口的状态稳定若有按键按下 计算出按键码 //扫描码写入七段数码管数组 取输入的后四位,输入不够四位高位为零 离开第row列扫描 //等按键放开 防抖动函数 产生左一位扫描信号 //T1中断子程序开始,显示四位数码管 22 // // // m=(m<3)? m+1:0; } 4.2倒计时程序设计 4.2.1倒计时流程图 开始 计数值初值 计数值输出 延时1s 上次计数值取出 计数值减1 判断是否为0 倒数结束 图4-3倒计时程序流程图 23 4.2.2倒计时仿真电路 图4-4 倒计时显示电路 4.2.3倒计时程序: #include char TAB[10]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9}; char disp[4]={0x8f,0x4f,0x2f,0x1f}; //数码管控制显示 unsigned int digit=4321; //数值显示 char dig[4]; #define TH0_M0 (65536-20000)/256 #define TL0_M0 (65536-20000)%6 #define TH1_M1 (65536-1000)/256 #define TL1_M1 (65536-1000)%6 main() { TMOD=0x01; //定时器0,模式1 TH0=TH0_M0; TL0=TH0_M0; IE= 0x82; //打开中断 TR0=1; //启动计数器TR0 EA=1; 24 ET1=1; TMOD=0X10; //定时器1,模式1 TH1=TH1_M1;TL1=TL1_M1; TR1=1; while(1); } /********************************/ /* 定时中断 */ /********************************/ int m0=50; void t0_1s(void)interrupt 1 //定时中断TR0 { TH0=TH0_M0;TL0=TH0_M0; m0--; if(m0==0) {digit=(digit>0)? digit-1:4321; m0=50; } } char m1=0; void T1_100us(void)interrupt 3 //T1中断子程序开始,显示四位数码管 { TH1=TH1_M1;TL1=TL1_M1; dig[0]=digit; dig[1]=(digit0)/10; dig[2]=(digit00)/100; dig[3]=digit/1000; P2=TAB[dig[m1]] & disp[m1]; m1=(m1<3)? m1+1:0; } 25 4.3步进电机控制程序设计 4.3.1步进电机流程图 开始 取第一个值 延时 取第二个值 延时 取第三个值 延时 取第四个值 图4-5步进电机程序流程图 26