| 延时短了就显示成这样了吧 |
非凡科技 发表于 2021-5-31 18:46 很多年没用过164了,现在都用1628, |
|
显示好了代码如下求高手帮助下按键怎么整 怎样读键值 #include<STC15.H> //包含单片机寄存器的头文件 #include<intrins.h> #define uint unsigned int #define uchar unsigned char //74ls164IO口定义 sbit CLK=P3^2; sbit DAT=P3^3; sbit key=P3^4; bit key_1=0,key_2=0; uint num,llxs,temp, Cnt_ms; uchar code tab[]={ 0xBB, 0x28, 0x73, 0x79, 0xE8, 0xD9, 0xDB, 0x38, 0xFB, 0xF9,0xef,0x7f,0xdf,0xef,0Xbf,0xff,0X00, }; uchar G,S,bai,Q; void dispbyte(uchar byte); void delay(uint z); void count(); void delay(uint z) { uint x,y; for(x=0;x<z;x++) for(y=0;y<100;y++); } void dispbyte(uchar byte) { uchar num2,i; num2=tab[byte];//取出段码 for(i=0;i<8;i++) //循环八次送至led数码管 { CLK=0; if(num2&0x01) DAT=1;//判断最高位,并取出最高位 else DAT=0;// CLK=1; //上升沿有效 num2>>=1; //左移一位(每次移动一位,共8次) } } void count() //把每一位数字都单独存到一个变量中 { G = num%10; S = num/10%10; bai = num/100%10; Q = num/1000%10; } void Timer0Init(void) //4毫秒@12.000MHz { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x60; //设置定时初始值 TH0 = 0xF0; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 } main() { Timer0Init(); EA=1; ET0=1; num=0; Cnt_ms=0; while(1) { count(); keysm(); } } /******定时器0中断服务程序******/ void timer0() interrupt 1 { Cnt_ms++; llxs++; if(Cnt_ms>=250) { Cnt_ms=0;} if(llxs>4) {llxs=0;} switch(llxs) { case 0: dispbyte(10); dispbyte(G); break; case 1: dispbyte(12); dispbyte(S); break; case 2: dispbyte(11); dispbyte(bai); break; case 3: dispbyte(14); dispbyte(Q); break; } } |
| 消影一般delay 200ms 就可以了 |
| 目前能显示了 就是消影做不出来 |
| 我见过用一片4017做按键的,单线驱动,用在车载通讯机的手咪上。 |
| 位选也是通过另一块164来选的啊,函数都一样,编码和管脚要再定义,每次只要选中一个而已,你这是共阴的管子,别编错了,就按动态扫描的方式显示。其实51上好多IO,干脆找四个直接位选算了。 |
| 就是位选不知道怎么整 |
这种数码管一般是共阴或共阳的,控制共阴或共阳就可以实现位选
|
| 送段值后送位值了? |