没有经过实际验证的代码,全靠空想
- /****************************************************************
- *****************************************************************/
- void tubeDate(uint8_t a);
- void selectBit(int a);
- void setTube(uint8_t *bitData,uint32_t toggle,uint32_t point);
- void timerDriver();
- #define BIT_NUM 8//8位数码管
- #define TIMER_CYCLE 5//ms调用一次 timerDriver 放在定时器中 该参数应该根据实际显示亮度调整
- #define TUBE_TOGGLE_CYCLE 300//ms 闪烁半周期
- #define TUBE_OFF_VALUE 0//数码管全暗对应的段选值
- #define TUBE_ON_VALUE 0xff//数码管全亮对应的段选值
- #define PONIT_BIT 0X80//只亮数码管小数点段选值
- uint8_t bit_data[BIT_NUM];
- uint32_t bit_toggle=0;//bit置1该位闪烁
- //放在定时器中 调用周期要与TIMER_CYCLE值一致
- void timerDriver()
- {
- static char i=0;
- static int cnt=0;
- selectBit(i);
- if(cnt*TIMER_CYCLE<TUBE_TOGGLE_CYCLE && bit_toggle&(1<<i))
- {
- tubeDate(TUBE_OFF_VALUE);
- }
- else
- {
- tubeDate(bit_data[i]);
- }
- i = i<BIT_NUM ? i+1 : 0
- cnt = cnt<2*TUBE_TOGGLE_CYCLE/TIMER_CYCLE ? cnt+1 : 0;
- }
- /*
- 设置数码管显示
- *bitData 段选值
- toggle 闪烁位 置1闪烁
- point 小数点位 置1点亮小数点
- */
- void setTube(uint8_t *bitData,uint32_t toggle,uint32_t point)
- {
- for(i=0;i<BIT_NUM;i++)
- {
- bit_data[i] = bitData[[i];
- if(point&(0x01<<p)) bit_data[i] |= PONIT_BIT;
- }
- bit_toggle = toggle;
- }
- //位选 应该尽量减少该函数的执行时间
- void selectBit(int a)
- {
- switch(a)
- {
- case 0:
- //只选中第0位的代码
- break;
- case 1:
- //只选中第1位的代码
- break;
- case 2:
- //只选中第2位的代码
- break;
- case 3:
- //只选中第3位的代码
- break;
- case 4:
- //只选中第3位的代码
- break;
- case 5:
- //只选中第3位的代码
- break;
- case 6:
- //只选中第3位的代码
- break;
- case 7:
- //只选中第3位的代码
- break;
- }
- }
- //段选 应该尽量减少该函数的执行时间
- void tubeDate(uint8_t a)
- {
- //根据a值驱动段选IO
- }
- /*-------------应用------------------------------------*/
- //字符对应的段选值 根据实际
- uint8_t tableValue[]={
- /*0~9*/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- /*A*/0x88,
- /*E*/0x86,
- /*H*/0x89,
- /*|-*/0x8f,
- /*三*/0xb6,
- /*||*/0xc9,
- /*|_|*/0xc1,
- /*r*/ 0xaf,
- /*b*/0x83,
- /*k*/0x88,
- /*F*/0x8e,
- /*-*/0xbf,
- /*L*/ 0xc7
- };
- void main()
- {
- uint8_t b[]={1,2,3,4,5,6,7,8,9,0};
- uint8_t a,i;
- while(1)
- {
- setTube(b,4,8);
- delayms(2000);
- a=b[0];
- for(i=0,i<9;i++)
- {
- b[i]=b[i+1];
- }
- b[i]=a;
- }
- }
复制代码
|