日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

keil c语言 1602时钟代码,带详细注释的单片机1602液晶时钟经典代码+仿真图

發布時間:2025/5/22 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 keil c语言 1602时钟代码,带详细注释的单片机1602液晶时钟经典代码+仿真图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//實例84:液晶時鐘設計

#include? ? //包含單片機寄存器的頭文件

#include? ?//包含隨機函數rand()的定義文件

#include??//包含_nop_()函數定義的頭文件

sbit RS=P2^0;? ? //寄存器選擇位,將RS位定義為P2.0引腳

sbit RW=P2^1;? ? //讀寫選擇位,將RW位定義為P2.1引腳

sbit E=P2^2;? ???//使能信號位,將E位定義為P2.2引腳

sbit BF=P0^7;? ? //忙碌標志位,,將BF位定義為P0.7引腳

unsigned char code digit[ ]={"0123456789"}; //定義字符數組顯示數字

unsigned char code string[ ]={"BeiJing Time"}; //定義字符數組顯示提示信息

unsigned char count;? ?//定義變量統計中斷累計次數

unsigned char s,m,h;? ?//定義變量儲存秒、分鐘和小時

/*****************************************************

函數功能:延時1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒

***************************************************/

void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函數功能:延時若干毫秒

入口參數:n

***************************************************/

void delay(unsigned char n)

{

unsigned char i;

for(i=0;i

delay1ms();

}

/*****************************************************

函數功能:判斷液晶模塊的忙碌狀態

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

unsigned char BusyTest(void)

{

bit result;

RS=0;? ?? ? //根據規定,RS為低電平,RW為高電平時,可以讀狀態

RW=1;

E=1;? ?? ???//E=1,才允許讀寫

_nop_();? ?//空操作

_nop_();

_nop_();

_nop_();? ?//空操作四個機器周期,給硬件反應時間

result=BF;??//將忙碌標志電平賦給result

E=0;? ?? ?? ?//將E恢復低電平

return result;

}

/*****************************************************

函數功能:將模式設置指令或顯示地址寫入液晶模塊

入口參數:dictate

***************************************************/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0;? ?? ?? ?? ?? ?? ?//根據規定,RS和R/W同時為低電平時,可以寫入指令

RW=0;

E=0;? ?? ?? ?? ?? ?? ? //E置低電平(根據表8-6,寫指令時,E為高脈沖,

// 就是讓E從0到1發生正跳變,所以應先置"0"

_nop_();

_nop_();? ?? ?? ?? ? //空操作兩個機器周期,給硬件反應時間

P0=dictate;? ?? ?? ?? ?//將數據送入P0口,即寫入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();? ?? ?? ?? ?? ?//空操作四個機器周期,給硬件反應時間

E=1;? ?? ?? ?? ?? ?? ? //E置高電平

_nop_();

_nop_();

_nop_();

_nop_();? ?? ?? ?? ?? ?//空操作四個機器周期,給硬件反應時間

E=0;? ?? ?? ?? ?? ?? ?//當E由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*****************************************************

函數功能:指定字符顯示的實際地址

入口參數:x

***************************************************/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"

}

/*****************************************************

函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊

入口參數:y(為字符常量)

***************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1;? ?? ?? ???//RS為高電平,RW為低電平時,可以寫入數據

RW=0;

E=0;? ?? ?? ?? ?//E置低電平(根據表8-6,寫指令時,E為高脈沖,

// 就是讓E從0到1發生正跳變,所以應先置"0"

P0=y;? ?? ?? ???//將數據送入P0口,即將數據寫入液晶模塊

_nop_();

_nop_();

_nop_();

_nop_();? ?? ? //空操作四個機器周期,給硬件反應時間

E=1;? ?? ?? ? //E置高電平

_nop_();

_nop_();

_nop_();

_nop_();? ?? ???//空操作四個機器周期,給硬件反應時間

E=0;? ?? ?? ?? ?//當E由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*****************************************************

函數功能:對LCD的顯示模式進行初始化設置

***************************************************/

void LcdInitiate(void)

{

delay(15);? ?? ?? ?? ? //延時15ms,首次寫指令時應給LCD一段較長的反應時間

WriteInstruction(0x38);??//顯示模式設置:16×2顯示,5×7點陣,8位數據接口

delay(5);? ?? ?? ?? ?? ?//延時5ms ,給硬件一點反應時間

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38); //連續三次,確保初始化成功

delay(5);

WriteInstruction(0x0c);??//顯示模式設置:顯示開,無光標,光標不閃爍

delay(5);

WriteInstruction(0x06);??//顯示模式設置:光標右移,字符不移

delay(5);

WriteInstruction(0x01);??//清屏幕指令,將以前的顯示內容清除

delay(5);

}

/******************************************************************************

函數功能:顯示小時

******************************************************************************/

void DisplayHour()

{

unsigned char i,j;

i=h/10;? ?? ?? ?? ?? ? //取整運算,求得十位數字

j=h%10;? ?? ?? ?? ?? ? //取余運算,求得各位數字

WriteAddress(0x44);? ?//寫顯示地址,將十位數字顯示在第2行第5列

WriteData(digit[i]);??//將十位數字的字符常量寫入LCD

WriteData(digit[j]);??//將個位數字的字符常量寫入LCD

}

/******************************************************************************

函數功能:顯示分鐘

******************************************************************************/

void DisplayMinute()

{

unsigned char i,j;

i=m/10;? ?? ?? ?? ?? ? //取整運算,求得十位數字

j=m%10;? ?? ?? ?? ?? ? //取余運算,求得各位數字

WriteAddress(0x47);? ?//寫顯示地址,將十位數字顯示在第2行第8列

WriteData(digit[i]);??//將十位數字的字符常量寫入LCD

WriteData(digit[j]);??//將個位數字的字符常量寫入LCD

}

/******************************************************************************

函數功能:顯示秒

******************************************************************************/

void DisplaySecond()

{

unsigned char i,j;

i=s/10;? ?? ?? ?? ?? ? //取整運算,求得十位數字

j=s%10;? ?? ?? ?? ?? ? //取余運算,求得各位數字

WriteAddress(0x4a);? ?//寫顯示地址,將十位數字顯示在第2行第11列

WriteData(digit[i]);??//將十位數字的字符常量寫入LCD

WriteData(digit[j]);??//將個位數字的字符常量寫入LCD

}

/*********************************************************************

main function

***********************************************************************/

void main(void)

{

unsigned char i;

LcdInitiate();??//調用LCD初始化函數

TMOD=0x01;? ?? ?? ?? ?? ? //使用定時器T0的模式1

TH0=(65536-46083)/256;? ? //定時器T0的高8位設置初值

TL0=(65536-46083)%256;? ? //定時器T0的低8位設置初值

EA=1;? ?? ?? ?? ?? ?? ?? ?//開總中斷

ET0=1;? ?? ?? ?? ?? ?? ???//定時器T0中斷允許

TR0=1;? ?? ?? ?? ?? ?? ???//啟動定時器T0

count=0;? ?? ?? ?? ???//中斷次數初始化為0

s=0;? ?? ?? ?? ?? ?? ?//秒初始化為0

m=0;? ?? ?? ?? ?? ?? ?//分鐘初始化為0

h=0;? ?? ?? ?? ?? ?? ?//小時初始化為0

WriteAddress(0x03);? ?? ?? ? //寫地址,從第1行第4列開始顯示

i=0;? ?? ?? ?? ???//從字符數組的第1個元素開始顯示

while(string[i]!='\0')? ?//只要沒有顯示到字符串的結束標志'\0',就繼續

{

WriteData(string[i]); //將第i個字符數組元素寫入LCD

i++;? ?? ?? ?? ?? ???//指向下一個數組元素

}

WriteAddress(0x46);? ???//寫地址,將第二個分號顯示在第2行第7列

WriteData(':');? ?? ?? ?//將分號的字符常量寫入LCD

WriteAddress(0x49);? ???//寫地址,將第二個分號顯示在第2行第10列

WriteData(':');? ?? ?? ?//將分號的字符常量寫入LCD

while(1)? ?? ?? ?? ?//無限循環

{

DisplayHour();? ?? ?? ?? ?//顯示小時

delay(5);? ?? ?? ?//給硬件一點反應時間

DisplayMinute();? ?//顯示分鐘

delay(5);? ?? ?? ?//給硬件一點反應時間

DisplaySecond();? ?//顯示秒

delay(5);? ?? ?? ?? ?//給硬件一點反應時間

}

}

/*******************************************************

函數功能:定時器T0的中斷服務函數

********************************************************/

void Time0(void ) interrupt 1 using 1 //定時器T0的中斷編號為1,使用第1組工作寄存器

{

count++;??//每產生1次中斷,中斷累計次數加1

if(count==20)??//如果中斷次數計滿20次

{

count=0;??//中斷累計次數清0

s++;? ?? ?//秒加1

}

if(s==60)? ?//如果計滿60秒

{

s=0;? ???//秒清0

m++;? ???//分鐘加1

}

if(m==60)? ? //如果計滿60分

{

m=0;? ?//分鐘清0

h++;? ? //小時加1

}

if(h==24)??//如果計滿24小時

{

h=0;? ?//小時清0

}

TH0=(65536-46083)/256;? ?//定時器T0高8位重新賦初值

TL0=(65536-46083)%256;? ?//定時器T0低8位重新賦初值

}

總結

以上是生活随笔為你收集整理的keil c语言 1602时钟代码,带详细注释的单片机1602液晶时钟经典代码+仿真图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。