?? display.c
字號:
#include<def.h>
#define modeset 0x00 //對于TM1629無效,對于1721都配置為SEG引腳
#define writedatamode_z 0x40 //采用地址自動加一方式寫顯存
#define writedatamode_g 0x44 //采用固定地址方式寫顯存
#define startaddress 0xc0 //起始地址
#define readkeymode 0x42 //讀按鍵
#define leddisconmode 0x8a //LED顯示控制
#define lcddisconmode 0x94 //LCD顯示控制
#define datacount 0x10 //采用地址自動加一方式傳輸數(shù)據(jù)的個數(shù)
uchar code buf_led[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //存放共陰數(shù)碼管的段代碼,不帶小數(shù)點(diǎn)
uchar code buf_ledp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; //存放共陰數(shù)碼管的段代碼,帶小數(shù)點(diǎn)
//money
uchar code buf_lcd[10]= {0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED}; //存放共陰數(shù)碼管的段代碼,不帶小數(shù)點(diǎn)
uchar code buf_lcdp[10]={0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD}; //存放共陰數(shù)碼管的段代碼,帶小數(shù)點(diǎn)
//weight
//uchar code buf_lcd[10]= {0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};
//uchar code buf_lcdp[10]={0xbf,0x07,0x7d,0x5f,0xC7,0xDb,0xFb,0x0f,0xFf,0xDf};
uchar data buf_ser[16]={0}; //存放送到LED驅(qū)動芯片顯存中的值
//------------------------------------------------LED串行寫1BYTE數(shù)據(jù)開始----------------------------------------------------------------------
void indata(char p)
{
unsigned int i;
STB=0; //保證“STB”為低電平,程序不依賴于之前端口的狀態(tài),保證程序在實(shí)際運(yùn)行中不會出現(xiàn)“端口迷失”
for(i=0;i<8;i++)
{
CLK=0; //先將“CLK”清零
if((p&0x01)!=0)
{
DIO=1; //需要傳送的數(shù)據(jù)的低位為“1”,則把“DIO”清零
}
else
{
DIO=0; //需要傳送的數(shù)據(jù)的低位為“0”,則把“DIO”置高
}
CLK=1; //送時鐘的上升沿
p=p>>1; //準(zhǔn)備送下一個BIT
_nop_();
_nop_();
_nop_();
_nop_();
} //送完一個字節(jié)后退出循環(huán)
}
//------------------------------------------------LED串行寫1BYTE數(shù)據(jù)結(jié)束----------------------------------------------------------------------
#ifdef ONKEYSCAN
//------------------------------------------------LED串行讀1BYTE數(shù)據(jù)開始-----------------------------------------------------------------------
//輸出8BIT數(shù)據(jù)
//在時鐘的上升沿通過MCU從LED驅(qū)動IC——TM16xx讀數(shù)據(jù)
unsigned char outdata()
{
unsigned char i,k=0; //i——控制循環(huán)次數(shù),k——臨時保存讀到的數(shù)據(jù)
DIO=1; //釋放DIO為輸入
STB=0; //保證“STB”為低電平,程序不依賴于之前端口的狀態(tài),保證程序在實(shí)際運(yùn)行中不會出現(xiàn)“端口迷失”
for(i=0;i<8;i++)
{
CLK=0; //先將“CLK”清零
k=k>>1;
if(DIO==0)
{
k=k&0x7f; //如果“DIO”為低電平,則把k的最高位清“0”,其他各位保持不變
}
else
{
k=(k|0x80&0xff); //如果“DIO”為高電平,則把k的最高位置“1”,其他各位保持不變
}
CLK=1; //送時鐘的上升沿
} //送完一個字節(jié)后退出循環(huán)
return(k); //返回讀到的1字節(jié)數(shù)據(jù)
}
//------------------------------------------------LED串行讀1BYTE數(shù)據(jù)結(jié)束-----------------------------------------------------------------------
#endif
//------------------------------------------------采用地址自動加一方式傳輸顯示內(nèi)容-------------------------------------------------------------
void ser_display_a()
{
uint j; //j——控制本次需要傳多少個字節(jié)顯示數(shù)據(jù)
uchar tempdis;
tempdis=0;
DIO=1;
CLK=1;
STB=1; //通訊開始前通訊端口全部初始化為“1”
indata(modeset); //傳輸模式設(shè)置命令
STB=1;
indata(writedatamode_z); //傳數(shù)據(jù)設(shè)置命令,設(shè)置采用地址自動加1方式寫顯示數(shù)據(jù)
STB=1; //數(shù)據(jù)設(shè)置命令傳完后需要將“STB”置“1”
indata(startaddress); //傳起始地址
//地址命令傳完后,“STB”保持為“0”繼續(xù)傳需要顯示的數(shù)據(jù)
for(j=0;j<datacount;j++)
{
if((disbit==0)&&(j>5))
{
tempdis=(buf_ser[j]<<4)&0xf0;
buf_ser[j]=(buf_ser[j]>>4)&0x0f;
buf_ser[j]|=tempdis;
}
indata(buf_ser[j]); //在連續(xù)傳顯示的數(shù)據(jù)過程中,STB保持為0
}
STB=1; //傳完所有的顯示數(shù)據(jù)后(最多14BYTE)后,將“STB置“1”
if(disbit==1)
{
indata(leddisconmode); //傳LED顯示控制命令
}
else
{
indata(lcddisconmode); //傳LCD顯示控制命令
}
STB=1; //顯示控制命令傳完后將“STB”置“1”
}
//采用固定地址方式
void ser_display_g(uchar address,uchar disa)
{
DIO=1;
CLK=1;
STB=1; //通訊開始前通訊端口全部初始化為“1”
indata(writedatamode_g); //傳數(shù)據(jù)設(shè)置命令,設(shè)置采用固定地址模式
STB=1;
indata(address); //傳顯示數(shù)據(jù)對應(yīng)的地址
indata(disa); //保持“STB”=“0”,傳1BYTE顯示數(shù)據(jù)
STB=1; //傳完顯示數(shù)據(jù)后將“STB”置“1”
if(disbit==1)
{
indata(leddisconmode); //傳LED顯示控制命令
}
else
{
indata(lcddisconmode); //傳LCD顯示控制命令
}
STB=1; //顯示控制命令傳完后將“STB”置“1”
}
//------------------------------------------上電自檢------------------------------------------------
void discheck()
{
uchar disi,discyc,disdata;
uchar tempdis,tempdisl;
for(discyc=0;discyc<10;discyc++)
{
if(disbit==1)
{
disdata=buf_ledp[discyc];
}
else
{
disdata=buf_lcdp[discyc];
}
DIO=1;
CLK=1;
STB=1; //通訊開始前通訊端口全部初始化為“1”
indata(writedatamode_z); //傳數(shù)據(jù)設(shè)置命令,設(shè)置采用地址自動加1方式寫顯示數(shù)據(jù)
STB=1; //數(shù)據(jù)設(shè)置命令傳完后需要將“STB”置“1”
indata(startaddress); //傳起始地址
//地址命令傳完后,“STB”保持為“0”繼續(xù)傳需要顯示的數(shù)據(jù)
for(disi=0;disi<datacount;disi++)
{
tempdis=disdata;
if((disbit==0)&&(disi>5))
{
tempdis= ((disdata<<4)&0xf0);
tempdisl=((disdata>>4)&0x0f);
tempdis|=tempdisl;
}
indata(tempdis); //在連續(xù)傳顯示的數(shù)據(jù)過程中,“STB”一直保持為”0“
}
STB=1; //傳完所有的顯示數(shù)據(jù)后(最多14BYTE)后,將“STB置“1”
if(disbit==1)
{
indata(leddisconmode); //傳LED顯示控制命令
}
else
{
indata(lcddisconmode); //傳LCD顯示控制命令
}
STB=1; //顯示控制命令傳完后將“STB”置“
adcdata_int=adccon(); //啟動ADC,采集初始數(shù)據(jù)作為每次測量的極小值
}
ser_display_a(); //顯示內(nèi)容初始化
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -