當前位置:編程學習大全網 - 源碼下載 - 誰能用51單片機控制12864顯示數字鐘程序!急!不要用ds 1302;;簡單點就好。好答案加分!

誰能用51單片機控制12864顯示數字鐘程序!急!不要用ds 1302;;簡單點就好。好答案加分!

有128564個程序顯示漢字。自己研究吧,不過是msp430控制的。您可以改為更改端口I。

#包含“msp430x26x.h”

#定義uchar無符號字符

#定義uint無符號整數

# defineidat 1//數據標誌

#定義icmd 0//指令標誌

# define lcdb _ rs0x 20//定義四個控制引腳。

#定義LCDb _ RW 0x40

#定義LCDb _ E 0x80

#定義LCDb _ RST 0x 04

#定義lcdb _ l 10x 80//地址的第壹行

#定義lcdb _ L2 0x 90//第二行的地址

#定義lcdb _ L3 0x 88//第三行的地址

#定義lcdb _ l4 0x 98//第四行的地址

# define lcdb _ set _ RS p 1 out | = lcdb _ RS//控制四個控制管腳的操作。

# define LCDb _ SET _ RW p 1 out | = LCDb _ RW

# define LCDb _ SET _ E p 1 out | = LCDb _ E

#定義LCDb _ SET _ RST P8 out | = LCDb _ RST

# define LCDb _ CLR _ RS p 1 out & amp;=~LCDb_RS

# define LCDb _ CLR _ RW p 1 out & amp;=~LCDb_RW

# define LCDb _ CLR _ E p 1 out & amp;=~LCDb_E

#定義LCDb _ CLR _ RST P8OUT & amp;=~LCDb_RST

# define lcdb _ dop4 out//輸出數據總線端口定義

#定義lcdb _ function 0x 38//LCD模式為8位2行5*8字符。

#定義lcdb _ bas cmd 0x 30//基本指令集

#定義lcdb _ cls 01//清除屏幕

# #定義LCDb _ HOME 0x 02///地址返回原點,不改變DDRAM的內容。

# #定義LCDb _ ENTRY 0x 06///設置輸入模式。添加光標時,屏幕不會移動。

# define lcdb _ c2l0x 10//向左移動光標

# define lcdb _ c2r0x 14//向右移動光標。

# define lcdb _ d2l0x 18//屏幕向左移動。

# define lcdb _ d2r0x 1c//屏幕再次移動。

# #定義LCDb _ ON 0x0C///打開顯示。

# #定義LCDb _ OFF 0x 08///關閉顯示。

無符號字符RXData

無符號char Seg_Data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };//數碼管編碼

無符號字符結果[5];//整數轉換成字符串並顯示在LCD上。

無效延遲(單位毫秒)

{

uint i,j;

for(I = 0;我& ltMS;i++)

for(j = 0;j & lt1141;j++);

}

void Delayus(美國)

{

uint I;

US = US * 5/4;

for(I = 0;我& lt我們;i++);

}

void LCD12864_portini()

{

p 1 dir = 0x ff;

P4DIR = 0xFF

P5DIR = 0xFF

P8DIR = 0xFF

P8 out | = LCDb _ RST;

//p 1 out = 0x ff;

}

/*函數名:LCD12864_sendbyte

功能:向12864 LCD寫入壹個字節的數據或指令。

*/

void LCD 12864 _ send byte(uchar dat cmd,uchar dByte)

{

if(dat cmd = = icmd)//指令操作

LCDb _ CLR _ RS

其他

LCDb _ SET _ RS

LCDb _ CLR _ RW//寫操作

LCDb _ SET _ E;

LCDb _ DO = dByte//寫入數據

//dela Yus(500);

delay ms(1);

LCDb _ CLR _ E;

}

/*函數名:LCD12864_sendstr

函數:寫壹個字符串到12864 LCD。

參數:ptString -字符串指針。

返回值:無

*/

void LCD 12864 _ sendstr(uchar * pt string)

{

while((*ptString)!= ' \ 0 ')//壹直寫到字符串結束。

{

LCD12864_sendbyte(iDat,* pt string++);

}

}

/*函數名:LCD12864_clear

功能:12864液晶清晰屏幕

參數:無

返回值:無

*/

void LCD12864_clear(void)

{

LCD12864_sendbyte(iCmd,LCDb _ CLS);

戴萊姆斯(2);//寫完清屏指令後,需要延遲2ms!!!

}

/*

函數名:LCD12864_gotoXY

功能:移動到指定位置

參數:Row -指定的行。

Col -指定的列。

返回值:無

*/

void LCD 12864 _ gotoXY(uchar行,uchar列)

{

switch(row)//選擇壹行。

{

案例二:

LCD12864_sendbyte(iCmd,LCDb _ L2+Col);打破;//寫入第2行的指定列。

案例三:

LCD12864_sendbyte(iCmd,LCDb _ L3+Col);打破;//寫入第3行指定的列。

案例4:

LCD12864_sendbyte(iCmd,LCDb _ L4+Col);打破;//寫入第4行的指定列

默認值:

LCD12864_sendbyte(iCmd,LCDb _ l 1+Col);打破;//寫入第1行的指定列。

}

}

/*

函數名:LCD12864_initial

功能:12864液晶初始化

*/

void LCD 12864 _ initial(void)

{

delayms(100);//等待內部復位

LCD 12864 _ portini();//端口初始化

LCD12864_sendbyte(iCmd,LCDb _ FUNCTION);//功能和模式設置

LCD12864_sendbyte(iCmd,LCDb _ ON);//打開顯示器

LCD 12864 _ clear();//清除屏幕

LCD12864_sendbyte(iCmd,LCDb _ ENTRY);//輸入模式設置

}

void Int_char(int數據)

{

如果(數據/1000)

{

結果[0]=數據/1000+' 0 ';

結果[1]=數據/100% 10+' 0 ';

結果[2]=數據/10% 10+' 0 ';

結果[3]=數據% 10+' 0 ';

結果[4]= 0;

}

else if(數據/100)

{

結果[0]=數據/100+' 0 ';

結果[1]=數據/10% 10+' 0 ';

結果[2]=數據% 10+' 0 ';

結果[3]= 0;

}

else if(數據/10)

{

結果[0]=數據/10% 10+' 0 ';

結果[1]=數據% 10+' 0 ';

結果[2]= 0;

}

其他

{

結果[0]=數據% 10+' 0 ';

結果[1]= 0;

}

}

無符號字符Key_Press(void)

{

P7OUT = 0xF0

如果((P7IN & amp0x 10);& amp(P7IN & amp0x 20)& amp;& amp(P7IN & amp0x 40)& amp;& amp(P7IN & amp0x80))返回0x00

否則返回0xFF

}

無符號字符Get_Keycode(void)

{

while(1)

{

P7OUT = 0xFE//掃描第壹列

如果((P7IN & amp0x10)==0)返回0;

else if((P7IN & amp;0x20)==0)返回4;

else if((P7IN & amp;0x40)==0)返回8;

else if((P7IN & amp;0x80)==0)返回12;

P7OUT = 0xFD//掃描第二列

如果((P7IN & amp0x10)==0)返回1;

else if((P7IN & amp;0x20)==0)返回5;

else if((P7IN & amp;0x40)==0)返回9;

else if((P7IN & amp;0x80)==0)返回13;

P7OUT = 0xFB//掃描第三列

如果((P7IN & amp0x10)==0)返回2;

else if((P7IN & amp;0x20)==0)返回6;

else if((P7IN & amp;0x40)==0)返回10;

else if((P7IN & amp;0x80)==0)返回14;

P7OUT = 0xF7//掃描第四列

如果((P7IN & amp0x10)==0)返回3;

else if((P7IN & amp;0x20)==0)返回7;

else if((P7IN & amp;0x40)==0)返回11;

else if((P7IN & amp;0x80)==0)返回15;

}

}

void Init_compa()

{

cactl 1 = CAON+CAREF _ 2+CARSEL;//使能Comp,ref = 0.5*Vcc = Vin-

CACTL2 = P2CA0//引腳到CA0

p 1 dir | = 0x 01;// P1.0 = o/p方向(CAOUT - LED)

p 1 sel | = 0x 01;// P1.0 - CAOUT,選項選擇

}

/*

* *函數名:初始化函數

*/

無效初始化_IIC(無效)

{

P3SEL | = 0x06//將I2C引腳分配給USCI_B0

UCB 0 CTL 1 | = UCS wrst;//啟用軟件復位

UCB 0 CTL 0 = UC MST+UC mode _ 3+UC sync;// I2C主機,同步模式

UCB 0 CTL 1 = UCS sel _ 2+UCS wrst;//使用SMCLK,保持軟件復位

UCB 0 br 0 = 12;//fSCL = sm clk/12 = ~ 100 khz

UCB 0 br 1 = 0;

UC B0 I2C sa = 0x 50;//從機地址是048h

UCB 0 CTL 1 & amp;= ~ UCSWRST//清除軟件復位,恢復運行

IE2 | = UCB0RXIE//使能RX中斷

_ BIS _ SR(GIE);

//rx compare = 0x 0;//用於檢查傳入的數據

}

/* *函數名:字節寫函數

*/

void EEPROM_Write(無符號字符高位地址、無符號字符低位地址、無符號字符字)

{

while(UCB 0 CTL 1 & amp;UCTXSTP);//確保總線空閑。

UCB 0 CTL 1 | = uct xstt+UCTR;//發送起始位,確定為發送方式。

UCB 0 tx buf = high _ Address;//發送高位地址

而((IFG2 & ampUCB 0 txi fg)= = 0);//判斷傳輸是否結束。

UCB 0 tx buf = low _ Address;//發送低位地址

而((IFG2 & ampUCB 0 txi fg)= = 0);//判斷傳輸是否結束。

UCB 0 tx buf = Word;//發送數據

而((IFG2 & ampUCB 0 txi fg)= = 0);//判斷傳輸是否結束。

UCB 0 CTL 1 | = uct xstp;//發送停止位

while((UCB 0 CTL 1 & amp;UCTXSTP)= = 1);//判斷停止位是否已經發送。

}

/**

* *函數名:字節讀取函數

*/

void EEPROM_readmore()

{

UCB 0 CTL 1 & amp;= ~ UCTR;//確認閱讀

while(UCB 0 CTL 1 & amp;UCTXSTP);//公交車是否閑置?

UCB 0 CTL 1 | = uct xstt;//發送起始位

}

/*

* *函數名:字節寫入函數

**/

void EEPROM_read(無符號字符高位地址,無符號字符低位地址)

{

while(UCB 0 CTL 1 & amp;UCTXSTP);//確保發送了停止條件

UCB 0 CTL 1 | = uct xstt+UCTR;//發送起始位,確認為寫。

UCB 0 tx buf = high _ Address;//發送高位地址位

而((IFG2 & ampUCB 0 txi fg)= = 0);//判斷傳輸是否結束。

UCB 0 tx buf = low _ Address;//發送地址位低

而((IFG2 & ampUCB 0 txi fg)= = 0);//判斷傳輸是否結束。

UCB 0 CTL 1 & amp;= ~ UCTR;//確認接收

while(UCB 0 CTL 1 & amp;UCTXSTP);//

UCB 0 CTL 1 | = uct xstt;

while((UCB 0 CTL 1 & amp;UCTXSTT)= = 1);

for(無符號字符i = 0x0我& lt0x2fi++);//延時確認數據已經發出。

UCB 0 CTL 1 | = UCTXSTP+UCTXNACK;//發送停止位和NACK位。

}

/*

* *函數名:接收中斷函數

**/

// USCI_B0數據ISR

#pragma vector = USCIAB0TX_VECTOR

_ _中斷void USCIAB0TX_ISR(void)

{

rx data = UCB 0 rx buf;//獲取接收數據

int _ char(RXData);

LCD12864_gotoXY(2,0);//第2行,第1列顯示

LCD12864_sendstr(結果);

/*

key _ code[0]= RXData % 10+' 0 ';

key _ code[1]= 0;

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD 12864 _ sendstr(key _ code);

*/

//_ _ BIC _ SR _ register _ on _ exit(CPU off);//退出LPM0

}

void Init_UART()

{

P3OUT & amp= ~(bit 4+bit 5+bit 6+bit 7);

P3SEL = 0xF0// P3.4,5,6,7 = USCI _ A0 TXD/RXD USCI _ a 1 TXD/RXD

UCA 0 CTL 1 | = UCSSEL _ 1;// CLK = ACLK

UCA 0 br 0 = 0x 03;// 32kHz/9600 = 3.41

UCA 0 br 1 = 0x 00;//

UCA 0 mctl = ucbrs 1+ucbrs 0;//調制UCBRSx = 3

UCA 0 CTL 1 & amp;= ~ UCSWRST//**初始化USCI狀態機* *

IE2 | = UCA0RXIE//使能USCI_A0接收中斷

UCA 1 CTL 1 | = UCSSEL _ 1;// CLK = ACLK

UCA 1br 0 = 0x 03;// 32kHz/9600 = 3.41

UCA 1br 1 = 0x 00;//

UCA 1 mctl = ucbrs 1+ucbrs 0;//調制UCBRSx = 3

UCA1CTL1。= ~ UCSWRST//**初始化USCI狀態機* *

UC 1IE | = UC 1r Xie;//使能USCI_A0接收中斷

_ BIS _ SR(GIE);//啟用中斷

}

void Init_ADC()

{

ADC 12 CTL 0 = sht 0 _ 2+ADC 12ON;//設置采樣時間,開啟ADC12

ADC 12 CTL 1 = SHP;//使用采樣計時器

ADC 12IE = 0x 01;//啟用中斷

ADC 12 CTL 0 | = ENC;//轉換已啟用

P6DIR & amp= 0x 01;// P6.0,i/p

P6SEL | = 0x 01;// P6.0-ADC選項選擇

_ BIS _ SR(GIE);//啟用中斷

}

void Start_ADC()

{

ADC 12 CTL 0 | = ADC 12SC;//啟動convn,軟件控制

}

# pragma vector = USCIAB0RX _ VECTOR

_ _中斷void USCI0RX_ISR(void)

{

而(!(IFG2 & ampUCA 0 txfg));// USCI_A0發送緩沖器準備好了嗎?

UCA 0 txbuf = UCA 0 rx buf;//TX-& gt;接收字符

LCD12864_sendbyte(iDat,UCA 0 rx buf);

}

# pragma VECTOR = uscia 1RX _ VECTOR

_ _中斷void USCI1RX_ISR(void)

{

而(!(UC 1 IFG & amp;UCA 1 txi fg));// USCI_A0發送緩沖器準備好了嗎?

UCA 1 txbuf = UCA 1 rx buf;//TX-& gt;接收字符

LCD12864_sendbyte(iDat,UCA 0 rx buf);

//UCA 1 txbuf = ' z ';

}

// ADC12中斷服務程序

# pragma VECTOR = ADC 12 _ VECTOR

_ _中斷void ADC12_ISR (void)

{

int I = ADC 12 mem 0;

int _ char(I);

LCD12864_gotoXY(2,0);//第1行,第1列顯示

LCD12864_sendstr(結果);

/*

key _ code[0]= I/1000+' 0 ';

key _ code[1]= I/100% 10+' 0 ';

key _ code[2]= I/10% 10+' 0 ';

key _ code[3]= I % 10+' 0 ';

key _ code[4]= 0;

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD 12864 _ sendstr(key _ code);

*/

}

void Init_all()

{

LCD 12864 _ initial();//LCD初始化,包括數碼管和LED燈的初始化。

P7DIR = 0x0F//鍵盤掃描初始化

P7REN = 0xF0//輸入上拉電阻使能,輸出上拉電阻不使能。

P7OUT = 0xF0//輸入上拉

init _ UART();//串口初始化

init _ compa();//比較器初始化

init _ ADC();//ADC初始化

初始化IIC();//IIC初始化

}

無效測試_Led()

{

無符號字符I = 0;

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD 12864 _ sendstr(" 1。test _ LED ");

for(;我& lt16;i++)

{

P8 out = 0xf 0 | I;

戴萊姆斯(50);

}

}

void Test_Seg()

{

int I;

LCD12864_gotoXY(1,0);//第1行,第1列顯示。

LCD12864_sendstr("2。test _ SEG ");

for(I = 0;我& lt500;i++)

{

//4,3,2,1

p 1輸出和輸出。= ~ 0x02

p 1 out | = 0x 10 | 0x 08 | 0x 04;

P5OUT = Seg _ Data[9];//清除數碼管顯示

delay ms(1);

p 1輸出和輸出。= ~ 0x04

p 1 out | = 0x 10 | 0x 08 | 0x 02;

P5OUT = Seg _ Data[8];//清除數碼管顯示

delay ms(1);

p 1輸出和輸出。= ~ 0x08

p 1 out | = 0x 10 | 0x 04 | 0x 02;

P5OUT = Seg _ Data[7];//清除數碼管顯示

delay ms(1);

p 1輸出和輸出。= ~ 0x 10;

p 1 out | = 0x 08 | 0x 04 | 0x 02;

P5OUT = Seg _ Data[6];//清除數碼管顯示

delay ms(1);

}

P5OUT = 0x00//關閉所有數碼管。

}

void Test_Key()

{

無符號字符I = 0;

LCD12864_gotoXY(1,0);//第1行,第1列顯示。

LCD12864_sendstr("3。test _ KEY ");

LCD12864_gotoXY(2,0);//第2行,第1列顯示

LCD 12864 _ sendstr(" key:");

for(;我& lt16;i++)

{

int _ char(Get _ key code());

LCD12864_gotoXY(2,3);

LCD 12864 _ sendstr(" ");

LCD12864_gotoXY(2,3);

LCD12864_sendstr(結果);

delayms(100);//防抖

}

}

void Test_Uart()

{

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD12864_sendstr("4。test _ UART ");

LCD12864_gotoXY(2,0);//第2行,第1列顯示

}

void Test_Compa()

{

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD12864_sendstr("5。test _ COMPA ");

}

void Test_ADC()

{

int I = 0;

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD12864_sendstr("6。test _ ADC ");

for(;我& lt200;i++)

{

start _ ADC();

delay ms(10);

}

}

無效測試_IIC()

{

LCD12864_gotoXY(1,0);//第1行,第1列顯示

LCD12864_sendstr("7。測試_ IIC”);

EEPROM_Write(0x00,0x40,7);//字節寫入

delay ms(10);

EEPROM_read(0x00,0x 40);

}

無效總管(無效)

{

//停止看門狗定時器以防止超時復位

wdt CTL = wdt pw+WDTHOLD;//關閉看門狗

init _ all();

while(1){

test _ Led();//1.測試LED

LCD12864_gotoXY(2,0);//第1行,第1列顯示

LCD12864_sendstr("請按16!");

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

test _ Seg();//2.測試數碼管

LCD12864_gotoXY(2,0);//第1行,第1列顯示

LCD12864_sendstr("請按16!");

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

test _ Key();//3.測試鍵掃描

LCD12864_gotoXY(2,0);//第1行,第1列顯示

LCD12864_sendstr("請按16!");

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

LCD12864_gotoXY(3,0);//第3行,第1列顯示。

LCD12864_sendstr("請按16!");

test _ Uart();//4.測試串行端口

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

test _ Compa();//5.測試比較儀

LCD12864_gotoXY(2,0);//第2行,第1列顯示

LCD12864_sendstr("請按16!");

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

test _ ADC();//6.測試ADC

LCD12864_gotoXY(3,0);//第3行,第1列顯示。

LCD12864_sendstr("請按16!");

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

測試_ IIC();//7.測試IIC

delayms(100);

LCD12864_gotoXY(3,0);//第3行,第1列顯示。

LCD12864_sendstr("測試完成");

而(!(Get _ key code()= = 15));//按最後壹個鍵測試下壹個示例。

LCD 12864 _ clear();

}

}

  • 上一篇:怎麽修改網頁?
  • 下一篇:物理加速技術的Havok
  • copyright 2024編程學習大全網