?? xians164old.c
字號:
/*********************************************
1.功能: 本程序針對74x164的LED顯示驅動程序
2.I/O腳使用
io_74x164clk; // 串行通信時鐘,上升沿有效
io_74x164data; // 串行數據,單向通信
3.調試環境:12M晶振(51系列12時鐘模式)
若為其他時鐘則作如下修改:
(1)
(2)
3.程序大小(ROM估計):
4.數據大小(RAM估計):
5.運行時間(與調用函數有關):
***********************************************/
#ifdef __XIANS164_DEBUG__
#include<wywcomm.h>
#include<reg51.h>
sbit io_74x164clk =P0^7; // 串行通信時鐘,上升沿有效
sbit io_74x164data=P0^6; // 串行數據,單向通信
//此模塊調用其它模塊的外部變量和函數的聲明(此程序無)
#else
#include "system.h" //所有的項目用相同的系統頭文件,但存放的路徑不同,各自存放在對應的項目文件夾。
#endif
//此模塊的宏定義(常數等)
//此模塊必要的庫函數包含(include)
#include<intrins.h>
#include<math.h>
//全局變量(靜態或一般)的定義
//以下為函數定義
//***********寫164************************
static void write(uint8 data *shu)
{
int8 x,d;
for(x=7;x >= 0;x--)
{
uint8 i;
i=shu[x];
for(d=8;d>0;d--)
{
io_74x164clk=0;
if(i & 0x80) io_74x164data=1;
else io_74x164data=0;
i <<= 1 ;
io_74x164clk=1;
}
}
}
//****************清屏***************//
void v_74x164Ini_f(void)
{
uint8 i;
for(i=64;i>0;i--)
{
io_74x164clk=0;
io_74x164data=0;
io_74x164clk=1;
}
}
void v_74x164WriteNumber_f(uint8 xd,int16 shuju)
//**************************************************************************************
//功能: 顯示六位以下的帶小數點的數字
//說明: 輸入xd(16進制)x表示:指出個位顯示位置, 取值范圍:0~2。
// d表示:小數點相對數字的顯示位置 ,取值范圍:0~4。(超出范圍不顯示)
// 輸入shuju 表示:顯示任意有符號16位整數, 取值范圍:-32768~32767。
//***************************************************************************************
{
uint8 data u8_HuanCun8_a[8];
uint8 x,d,k=0;
uint16 i,j;
bit zf=1;
uint8 code yima[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};/*0,1,2,3,4,5,6,7,8,9,-,*/
x=xd>>4; d=xd&0x0f;
if(shuju >= 0) zf=0;
j=abs(shuju); //取絕對值
i = j/10000;
j = j%10000;
if(i|(d==4)) {u8_HuanCun8_a[x+4] = yima[i]; k++;}
else u8_HuanCun8_a[x+4] = 0;
i = j/1000;
j = j%1000;
if(i|k|(d==3)) {u8_HuanCun8_a[x+3] = yima[i];k++;}
else u8_HuanCun8_a[x+3] = 0;
i = j/100;
j = j%100;
if(i|k|(d==2)) {u8_HuanCun8_a[x+2] = yima[i];k++;}
else u8_HuanCun8_a[x+2] = 0;
i = j/10;
j = j%10;
if(i|k|(d==1)) {u8_HuanCun8_a[x+1] = yima[i];k++;}
else u8_HuanCun8_a[x+1] = 0;
u8_HuanCun8_a[x] = yima[j]; k++;
//????if(k != 5)
u8_HuanCun8_a[x+5] = 0; //判斷寫入負號
if(zf) u8_HuanCun8_a[x+k] = 0x02;
if(d < 5 ) u8_HuanCun8_a[x+d] |= 1; //寫入小數點
write(u8_HuanCun8_a); //寫入
}
void v_74x164WriteOneSegment_f(uint8 x,bit xians_bz)
//x表示:指出段顯示的地址(取值范圍:0~63)
//xians_bz表示:該段是亮還是滅,“0”表示亮,“1”表示滅,取值范圍:0~1
{
uint8 data u8_HuanCun8_a[8];
switch(x%8)
{
case 0:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0x7e;//滅
else u8_HuanCun8_a[x/8] |= 0x80;//亮
break;}
case 1:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xbe;
else u8_HuanCun8_a[x/8] |= 0x40;
break;}
case 2:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xde;
else u8_HuanCun8_a[x/8] |= 0x20;
break;}
case 3:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xee;
else u8_HuanCun8_a[x/8] |= 0x10;
break;}
case 4:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xf6;
else u8_HuanCun8_a[x/8] |= 0x08;
break;}
case 5:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfa;
else u8_HuanCun8_a[x/8] |= 0x04;
break;}
case 6:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfc;
else u8_HuanCun8_a[x/8] |= 0x02;
break;}
case 7:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfe;
else u8_HuanCun8_a[x/8] |= 0x01;
break;}
}
write(u8_HuanCun8_a);
}
void v_BC7281AWriteOneDig_f(uint8 reg_add,uint8 write_data)
//reg_add 表示:指出位顯示的地址(取值范圍:0~15)
//write_data 表示:寫入的數據(不譯碼)
{
uint8 data u8_HuanCun8_a[8];
u8_HuanCun8_a[reg_add] = write_data;
write(u8_HuanCun8_a);
}
#ifdef __XIANS164_DEBUG__
void main()
{
v_74x164Ini_f();
v_BC7281AWriteOneDig_f(7,0xff);
v_74x164WriteNumber_f(0x14,-4560) ;
v_74x164WriteNumber_f(0x21,-40) ;
v_74x164WriteNumber_f(0x00,-450) ;
v_74x164WriteNumber_f(0x04,-4560) ;
v_74x164WriteNumber_f(0x35,-40) ;
v_74x164WriteNumber_f(0x41,-450) ;
v_BC7281AWriteOneDig_f(7,0x00);
v_BC7281AWriteOneDig_f(6,0x0f);
v_BC7281AWriteOneDig_f(4,0xfe);
v_74x164WriteOneSegment_f(24,0);
v_74x164WriteOneSegment_f(0,1);
v_74x164WriteOneSegment_f(0,0);
v_74x164WriteOneSegment_f(63,0);
while(1) ;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -