小弟在初学PIC时候遇到了这个难处。
我用PIC扫描时总是不能实现正常显示。以下是我的代码
- unsigned int k;
- void delay(ms)
- {
- int a,b;
- for(a=ms;a>0;a--)
- for(b=11;b>0;b--);
- }
- void main()
- {
- TRISC=0x00; //用C口做片选,D口做段选
- TRISD=0x00;
- TRISB2=0;
- while(1)
- {
- PORTD=0XB0; //D口输出数据表格第1个数据0
- PORTC=0x01; //点亮第1位数码管
- delay(1); //延时一定时间,保证数码管亮度
- PORTD=0XA4; //显示数据1
- PORTC=0x02;
- delay(1);
-
- PORTD=0XF9; //显示数据2
- PORTC=0x04;
- delay(1);
- PORTD=0XC0; //显示数据3
- PORTC=0x08;
- delay(1);
- }
-
- }
复制代码
这样做不能使数码管显示正常,同学说是因为片选改变时间跟段选数据改变时间不一样有关。于是我又换了种方法。
用D口做8位片选输出,每个输出端与锁存器74LS373相连,通过B2口的高低电平控制锁存器输出端何时关闭与开启,来让片选与段选挫开。
- unsigned const char table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; //0,1,2,3,4,5,6,7,8,9
- unsigned const char table1[]={0x08,0x04,0x02,0x01}; //片选 1000,0100,0010,0001四个
- void delay(ms)
- {
- int a,b;
- for(a=ms;a>0;a--)
- for(b=110;b>0;b--);
- }
- void main()
- {
- TRISC=0x00; //C口做片选
- TRISD=0x00; //D口做段选
- TRISB2=0; //用B2口作为控制锁存器是否有效,低电平使锁存器74LS373的(OE)'的有效
- while(1)
- {
- for(k=4;k>0;k--)
- {
- RB2=1; //关闭锁存器的输出
- PORTD=table[k-1];
- PORTC=table1[k-1]; //先片选
- RB2=0; //开启寄存器的输出,开始段选
- delay(1); //延时1ms
- }
复制代码
此帖出自
小平头技术问答
一周热门 更多>